From 92e3ab7e401e4bb77846e05d030f4077243280f4 Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Wed, 2 Mar 2022 13:05:33 +0500 Subject: [PATCH 01/59] utils integrated --- packages/optimizely-sdk/jest.config.js | 17 + .../core/audience_evaluator/index.tests.js | 2 +- .../lib/core/bucketer/index.tests.js | 2 +- .../optimizely-sdk/lib/core/bucketer/index.ts | 2 +- .../index.tests.js | 2 +- .../lib/core/decision_service/index.tests.js | 2 +- .../lib/core/decision_service/index.ts | 2 +- .../lib/core/notification_center/index.ts | 4 +- .../lib/core/project_config/index.tests.js | 2 +- .../lib/core/project_config/index.ts | 2 +- .../project_config_manager.tests.js | 2 +- .../project_config/project_config_manager.ts | 2 +- .../lib/optimizely/index.tests.js | 2 +- .../optimizely-sdk/lib/optimizely/index.ts | 2 +- .../optimizely_user_context/index.tests.js | 2 +- .../forwarding_event_processor.ts | 2 +- .../lib/plugins/logger/index.react_native.ts | 2 +- packages/optimizely-sdk/lib/shared_types.ts | 2 +- .../utils/attributes_validator/index.tests.js | 2 +- .../lib/utils/attributes_validator/index.ts | 2 +- .../lib/utils/config_validator/index.tests.js | 2 +- .../lib/utils/config_validator/index.ts | 2 +- .../optimizely-sdk/lib/utils/enums/index.ts | 2 +- .../lib/utils/event_tag_utils/index.tests.js | 2 +- .../utils/event_tags_validator/index.tests.js | 2 +- .../lib/utils/event_tags_validator/index.ts | 2 +- .../optimizely-sdk/lib/utils/fns/index.ts | 2 +- .../json_schema_validator/index.tests.js | 2 +- .../lib/utils/json_schema_validator/index.ts | 2 +- .../index.tests.js | 2 +- .../user_profile_service_validator/index.ts | 2 +- .../modules/utils/__tests__/utils.spec.ts | 123 + .../optimizely-sdk/modules/utils/index.d.ts | 36 + .../optimizely-sdk/modules/utils/index.js | 156 + packages/optimizely-sdk/package-lock.json | 8525 ++++++++++++----- packages/optimizely-sdk/package.json | 11 +- packages/optimizely-sdk/rollup.config.js | 2 +- 37 files changed, 6609 insertions(+), 2323 deletions(-) create mode 100644 packages/optimizely-sdk/jest.config.js create mode 100644 packages/optimizely-sdk/modules/utils/__tests__/utils.spec.ts create mode 100644 packages/optimizely-sdk/modules/utils/index.d.ts create mode 100644 packages/optimizely-sdk/modules/utils/index.js diff --git a/packages/optimizely-sdk/jest.config.js b/packages/optimizely-sdk/jest.config.js new file mode 100644 index 000000000..322f646e0 --- /dev/null +++ b/packages/optimizely-sdk/jest.config.js @@ -0,0 +1,17 @@ +module.exports = { + // "roots": [ + // "./src" + // ], + "transform": { + "^.+\\.tsx?$": "ts-jest" + }, + "testRegex": "(/modules/*/__tests__/.*|(\\.|/)(test|spec))\\.tsx?$", + "moduleFileExtensions": [ + "ts", + "tsx", + "js", + "jsx", + "json", + "node" + ], +} \ No newline at end of file diff --git a/packages/optimizely-sdk/lib/core/audience_evaluator/index.tests.js b/packages/optimizely-sdk/lib/core/audience_evaluator/index.tests.js index 06b993ea5..06d759d46 100644 --- a/packages/optimizely-sdk/lib/core/audience_evaluator/index.tests.js +++ b/packages/optimizely-sdk/lib/core/audience_evaluator/index.tests.js @@ -16,7 +16,7 @@ import sinon from 'sinon'; import { assert } from 'chai'; import { getLogger } from '@optimizely/js-sdk-logging'; -import { sprintf } from '@optimizely/js-sdk-utils'; +import { sprintf } from '../../../modules/utils'; import { createAudienceEvaluator } from './index'; import * as conditionTreeEvaluator from '../condition_tree_evaluator'; diff --git a/packages/optimizely-sdk/lib/core/bucketer/index.tests.js b/packages/optimizely-sdk/lib/core/bucketer/index.tests.js index 62aa43a84..c24bc4e9c 100644 --- a/packages/optimizely-sdk/lib/core/bucketer/index.tests.js +++ b/packages/optimizely-sdk/lib/core/bucketer/index.tests.js @@ -16,7 +16,7 @@ import sinon from 'sinon'; import { assert, expect } from 'chai'; import { cloneDeep } from 'lodash'; -import { sprintf } from '@optimizely/js-sdk-utils'; +import { sprintf } from '../../../modules/utils'; import * as bucketer from './'; import { diff --git a/packages/optimizely-sdk/lib/core/bucketer/index.ts b/packages/optimizely-sdk/lib/core/bucketer/index.ts index 4b689df42..b26e30893 100644 --- a/packages/optimizely-sdk/lib/core/bucketer/index.ts +++ b/packages/optimizely-sdk/lib/core/bucketer/index.ts @@ -17,7 +17,7 @@ /** * Bucketer API for determining the variation id from the specified parameters */ -import { sprintf } from '@optimizely/js-sdk-utils'; +import { sprintf } from '../../../modules/utils'; import murmurhash from 'murmurhash'; import { LogHandler } from '@optimizely/js-sdk-logging'; import { diff --git a/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.tests.js b/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.tests.js index c254866cd..d4b165ab0 100644 --- a/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.tests.js +++ b/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.tests.js @@ -15,7 +15,7 @@ ***************************************************************************/ import sinon from 'sinon'; import { assert } from 'chai'; -import { sprintf } from '@optimizely/js-sdk-utils'; +import { sprintf } from '../../../modules/utils'; import { LOG_LEVEL, diff --git a/packages/optimizely-sdk/lib/core/decision_service/index.tests.js b/packages/optimizely-sdk/lib/core/decision_service/index.tests.js index 57a7ef344..4cdea9988 100644 --- a/packages/optimizely-sdk/lib/core/decision_service/index.tests.js +++ b/packages/optimizely-sdk/lib/core/decision_service/index.tests.js @@ -16,7 +16,7 @@ import sinon from 'sinon'; import { assert } from 'chai'; import cloneDeep from 'lodash/cloneDeep'; -import { sprintf } from '@optimizely/js-sdk-utils'; +import { sprintf } from '../../../modules/utils'; import { createDecisionService } from './'; import * as bucketer from '../bucketer'; diff --git a/packages/optimizely-sdk/lib/core/decision_service/index.ts b/packages/optimizely-sdk/lib/core/decision_service/index.ts index 3ec800593..02fe0f9e8 100644 --- a/packages/optimizely-sdk/lib/core/decision_service/index.ts +++ b/packages/optimizely-sdk/lib/core/decision_service/index.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * * limitations under the License. * ***************************************************************************/ -import { sprintf } from '@optimizely/js-sdk-utils'; +import { sprintf } from '../../../modules/utils'; import { LogHandler } from '@optimizely/js-sdk-logging'; import fns from '../../utils/fns'; diff --git a/packages/optimizely-sdk/lib/core/notification_center/index.ts b/packages/optimizely-sdk/lib/core/notification_center/index.ts index c28504947..2ad08b0ea 100644 --- a/packages/optimizely-sdk/lib/core/notification_center/index.ts +++ b/packages/optimizely-sdk/lib/core/notification_center/index.ts @@ -13,9 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { objectValues } from '@optimizely/js-sdk-utils'; +import { objectValues } from '../../../modules/utils'; import { LogHandler, ErrorHandler } from '@optimizely/js-sdk-logging'; -import { NOTIFICATION_TYPES as notificationTypesEnum } from '@optimizely/js-sdk-utils'; +import { NOTIFICATION_TYPES as notificationTypesEnum } from '../../../modules/utils'; import { NotificationListener, ListenerPayload } from '../../shared_types'; import { diff --git a/packages/optimizely-sdk/lib/core/project_config/index.tests.js b/packages/optimizely-sdk/lib/core/project_config/index.tests.js index 2c3f06c1b..ff98cd630 100644 --- a/packages/optimizely-sdk/lib/core/project_config/index.tests.js +++ b/packages/optimizely-sdk/lib/core/project_config/index.tests.js @@ -17,7 +17,7 @@ import sinon from 'sinon'; import { assert } from 'chai'; import { forEach, cloneDeep } from 'lodash'; import { getLogger } from '@optimizely/js-sdk-logging'; -import { sprintf } from '@optimizely/js-sdk-utils'; +import { sprintf } from '../../../modules/utils'; import fns from '../../utils/fns'; import projectConfig from './'; diff --git a/packages/optimizely-sdk/lib/core/project_config/index.ts b/packages/optimizely-sdk/lib/core/project_config/index.ts index 2ea2b8b41..a92089e01 100644 --- a/packages/optimizely-sdk/lib/core/project_config/index.ts +++ b/packages/optimizely-sdk/lib/core/project_config/index.ts @@ -18,7 +18,7 @@ import { objectEntries, objectValues, sprintf -} from '@optimizely/js-sdk-utils'; +} from '../../../modules/utils'; import fns from '../../utils/fns'; import { diff --git a/packages/optimizely-sdk/lib/core/project_config/project_config_manager.tests.js b/packages/optimizely-sdk/lib/core/project_config/project_config_manager.tests.js index f9c85c47b..20188f2d2 100644 --- a/packages/optimizely-sdk/lib/core/project_config/project_config_manager.tests.js +++ b/packages/optimizely-sdk/lib/core/project_config/project_config_manager.tests.js @@ -17,7 +17,7 @@ import sinon from 'sinon'; import { assert } from 'chai'; import { cloneDeep } from 'lodash'; -import { sprintf } from '@optimizely/js-sdk-utils'; +import { sprintf } from '../../../modules/utils'; import * as logging from '@optimizely/js-sdk-logging'; import * as datafileManager from '@optimizely/js-sdk-datafile-manager'; diff --git a/packages/optimizely-sdk/lib/core/project_config/project_config_manager.ts b/packages/optimizely-sdk/lib/core/project_config/project_config_manager.ts index 174a92c32..58ec462f0 100644 --- a/packages/optimizely-sdk/lib/core/project_config/project_config_manager.ts +++ b/packages/optimizely-sdk/lib/core/project_config/project_config_manager.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { sprintf } from '@optimizely/js-sdk-utils'; +import { sprintf } from '../../../modules/utils'; import { getLogger } from '@optimizely/js-sdk-logging'; import { ERROR_MESSAGES } from '../../utils/enums'; diff --git a/packages/optimizely-sdk/lib/optimizely/index.tests.js b/packages/optimizely-sdk/lib/optimizely/index.tests.js index 3b874ae3a..c4573967d 100644 --- a/packages/optimizely-sdk/lib/optimizely/index.tests.js +++ b/packages/optimizely-sdk/lib/optimizely/index.tests.js @@ -15,7 +15,7 @@ ***************************************************************************/ import { assert, expect } from 'chai'; import sinon from 'sinon'; -import { sprintf, NOTIFICATION_TYPES } from '@optimizely/js-sdk-utils'; +import { sprintf, NOTIFICATION_TYPES } from '../../modules/utils'; import eventProcessor from '../plugins/event_processor'; import * as logging from '@optimizely/js-sdk-logging'; diff --git a/packages/optimizely-sdk/lib/optimizely/index.ts b/packages/optimizely-sdk/lib/optimizely/index.ts index 58bc0e712..3fc3d8dd6 100644 --- a/packages/optimizely-sdk/lib/optimizely/index.ts +++ b/packages/optimizely-sdk/lib/optimizely/index.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * * limitations under the License. * ***************************************************************************/ -import { find, sprintf, objectValues, NotificationCenter } from '@optimizely/js-sdk-utils'; +import { find, sprintf, objectValues, NotificationCenter } from '../../modules/utils'; import { LoggerFacade, ErrorHandler } from '@optimizely/js-sdk-logging'; import { EventProcessor } from '@optimizely/js-sdk-event-processor'; diff --git a/packages/optimizely-sdk/lib/optimizely_user_context/index.tests.js b/packages/optimizely-sdk/lib/optimizely_user_context/index.tests.js index b6542f6e3..39a9ef21b 100644 --- a/packages/optimizely-sdk/lib/optimizely_user_context/index.tests.js +++ b/packages/optimizely-sdk/lib/optimizely_user_context/index.tests.js @@ -17,7 +17,7 @@ import { assert } from 'chai'; import sinon from 'sinon'; import * as logging from '@optimizely/js-sdk-logging'; -import { sprintf, NOTIFICATION_TYPES } from '@optimizely/js-sdk-utils'; +import { sprintf, NOTIFICATION_TYPES } from '../../modules/utils'; import OptimizelyUserContext from './'; import { createLogger } from '../plugins/logger'; diff --git a/packages/optimizely-sdk/lib/plugins/event_processor/forwarding_event_processor.ts b/packages/optimizely-sdk/lib/plugins/event_processor/forwarding_event_processor.ts index 1e8b00ef0..12abe13d5 100644 --- a/packages/optimizely-sdk/lib/plugins/event_processor/forwarding_event_processor.ts +++ b/packages/optimizely-sdk/lib/plugins/event_processor/forwarding_event_processor.ts @@ -18,7 +18,7 @@ import { EventProcessor, ProcessableEvent, } from '@optimizely/js-sdk-event-processor'; -import { NotificationCenter } from '@optimizely/js-sdk-utils'; +import { NotificationCenter } from '../../../modules/utils'; import { EventDispatcher } from '../../shared_types'; import { NOTIFICATION_TYPES } from '../../utils/enums'; diff --git a/packages/optimizely-sdk/lib/plugins/logger/index.react_native.ts b/packages/optimizely-sdk/lib/plugins/logger/index.react_native.ts index 5cdf9100d..aa0e2a24f 100644 --- a/packages/optimizely-sdk/lib/plugins/logger/index.react_native.ts +++ b/packages/optimizely-sdk/lib/plugins/logger/index.react_native.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { LogLevel } from '@optimizely/js-sdk-logging'; -import { sprintf } from '@optimizely/js-sdk-utils'; +import { sprintf } from '../../../modules/utils'; import { NoOpLogger } from './index'; function getLogLevelName(level: number): string { diff --git a/packages/optimizely-sdk/lib/shared_types.ts b/packages/optimizely-sdk/lib/shared_types.ts index 93f955d14..e4fd2f8d3 100644 --- a/packages/optimizely-sdk/lib/shared_types.ts +++ b/packages/optimizely-sdk/lib/shared_types.ts @@ -16,7 +16,7 @@ import { ErrorHandler, LogHandler, LogLevel, LoggerFacade } from '@optimizely/js-sdk-logging'; import { EventProcessor } from '@optimizely/js-sdk-event-processor'; -import { NotificationCenter } from '@optimizely/js-sdk-utils'; +import { NotificationCenter } from '../modules/utils'; export interface BucketerParams { experimentId: string; diff --git a/packages/optimizely-sdk/lib/utils/attributes_validator/index.tests.js b/packages/optimizely-sdk/lib/utils/attributes_validator/index.tests.js index 91dfaef55..2d121a849 100644 --- a/packages/optimizely-sdk/lib/utils/attributes_validator/index.tests.js +++ b/packages/optimizely-sdk/lib/utils/attributes_validator/index.tests.js @@ -14,7 +14,7 @@ * limitations under the License. */ import { assert } from 'chai'; -import { sprintf } from '@optimizely/js-sdk-utils'; +import { sprintf } from '../../../modules/utils'; import * as attributesValidator from './'; import { ERROR_MESSAGES } from '../enums'; diff --git a/packages/optimizely-sdk/lib/utils/attributes_validator/index.ts b/packages/optimizely-sdk/lib/utils/attributes_validator/index.ts index e3c475390..aa0dd97af 100644 --- a/packages/optimizely-sdk/lib/utils/attributes_validator/index.ts +++ b/packages/optimizely-sdk/lib/utils/attributes_validator/index.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { sprintf } from '@optimizely/js-sdk-utils'; +import { sprintf } from '../../../modules/utils'; import { ObjectWithUnknownProperties } from '../../shared_types'; import fns from '../../utils/fns'; diff --git a/packages/optimizely-sdk/lib/utils/config_validator/index.tests.js b/packages/optimizely-sdk/lib/utils/config_validator/index.tests.js index 65c4c24d9..afce34b71 100644 --- a/packages/optimizely-sdk/lib/utils/config_validator/index.tests.js +++ b/packages/optimizely-sdk/lib/utils/config_validator/index.tests.js @@ -14,7 +14,7 @@ * limitations under the License. */ import { assert } from 'chai'; -import { sprintf } from '@optimizely/js-sdk-utils'; +import { sprintf } from '../../../modules/utils'; import configValidator from './'; import { ERROR_MESSAGES } from '../enums'; diff --git a/packages/optimizely-sdk/lib/utils/config_validator/index.ts b/packages/optimizely-sdk/lib/utils/config_validator/index.ts index ef156555a..14b0c509f 100644 --- a/packages/optimizely-sdk/lib/utils/config_validator/index.ts +++ b/packages/optimizely-sdk/lib/utils/config_validator/index.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { sprintf } from '@optimizely/js-sdk-utils'; +import { sprintf } from '../../../modules/utils'; import { ObjectWithUnknownProperties } from '../../shared_types'; import { diff --git a/packages/optimizely-sdk/lib/utils/enums/index.ts b/packages/optimizely-sdk/lib/utils/enums/index.ts index fa6bcec6e..3d4882f40 100644 --- a/packages/optimizely-sdk/lib/utils/enums/index.ts +++ b/packages/optimizely-sdk/lib/utils/enums/index.ts @@ -14,7 +14,7 @@ * limitations under the License. * ***************************************************************************/ -import { NOTIFICATION_TYPES as notificationTypesEnum } from '@optimizely/js-sdk-utils'; +import { NOTIFICATION_TYPES as notificationTypesEnum } from '../../../modules/utils'; /** * Contains global enums used throughout the library diff --git a/packages/optimizely-sdk/lib/utils/event_tag_utils/index.tests.js b/packages/optimizely-sdk/lib/utils/event_tag_utils/index.tests.js index 3189fae51..86fe53923 100644 --- a/packages/optimizely-sdk/lib/utils/event_tag_utils/index.tests.js +++ b/packages/optimizely-sdk/lib/utils/event_tag_utils/index.tests.js @@ -15,7 +15,7 @@ */ import sinon from 'sinon'; import { assert } from 'chai'; -import { sprintf } from '@optimizely/js-sdk-utils'; +import { sprintf } from '../../../modules/utils'; import * as eventTagUtils from './'; diff --git a/packages/optimizely-sdk/lib/utils/event_tags_validator/index.tests.js b/packages/optimizely-sdk/lib/utils/event_tags_validator/index.tests.js index 4dde65d18..5363f8d30 100644 --- a/packages/optimizely-sdk/lib/utils/event_tags_validator/index.tests.js +++ b/packages/optimizely-sdk/lib/utils/event_tags_validator/index.tests.js @@ -14,7 +14,7 @@ * limitations under the License. */ import { assert } from 'chai'; -import { sprintf } from '@optimizely/js-sdk-utils'; +import { sprintf } from '../../../modules/utils'; import { validate } from './'; import { ERROR_MESSAGES } from'../enums'; diff --git a/packages/optimizely-sdk/lib/utils/event_tags_validator/index.ts b/packages/optimizely-sdk/lib/utils/event_tags_validator/index.ts index 6e97c0fd6..306e31e1e 100644 --- a/packages/optimizely-sdk/lib/utils/event_tags_validator/index.ts +++ b/packages/optimizely-sdk/lib/utils/event_tags_validator/index.ts @@ -17,7 +17,7 @@ /** * Provides utility method for validating that event tags user has provided are valid */ -import { sprintf } from '@optimizely/js-sdk-utils'; +import { sprintf } from '../../../modules/utils'; import { ERROR_MESSAGES } from '../enums'; diff --git a/packages/optimizely-sdk/lib/utils/fns/index.ts b/packages/optimizely-sdk/lib/utils/fns/index.ts index 59be164a9..7eb5bd6dc 100644 --- a/packages/optimizely-sdk/lib/utils/fns/index.ts +++ b/packages/optimizely-sdk/lib/utils/fns/index.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { generateUUID as uuid, keyBy as keyByUtil } from '@optimizely/js-sdk-utils'; +import { generateUUID as uuid, keyBy as keyByUtil } from '../../../modules/utils'; const MAX_SAFE_INTEGER_LIMIT = Math.pow(2, 53); diff --git a/packages/optimizely-sdk/lib/utils/json_schema_validator/index.tests.js b/packages/optimizely-sdk/lib/utils/json_schema_validator/index.tests.js index 58b550a7e..322624a3d 100644 --- a/packages/optimizely-sdk/lib/utils/json_schema_validator/index.tests.js +++ b/packages/optimizely-sdk/lib/utils/json_schema_validator/index.tests.js @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { sprintf } from '@optimizely/js-sdk-utils'; +import { sprintf } from '../../../modules/utils'; import { assert } from 'chai'; import { validate } from './'; diff --git a/packages/optimizely-sdk/lib/utils/json_schema_validator/index.ts b/packages/optimizely-sdk/lib/utils/json_schema_validator/index.ts index 7fa16c05e..48d0a92af 100644 --- a/packages/optimizely-sdk/lib/utils/json_schema_validator/index.ts +++ b/packages/optimizely-sdk/lib/utils/json_schema_validator/index.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { sprintf } from '@optimizely/js-sdk-utils'; +import { sprintf } from '../../../modules/utils'; import { validate as jsonSchemaValidator } from 'json-schema'; import { ERROR_MESSAGES } from '../enums'; diff --git a/packages/optimizely-sdk/lib/utils/user_profile_service_validator/index.tests.js b/packages/optimizely-sdk/lib/utils/user_profile_service_validator/index.tests.js index 33aaa077c..155ce7c06 100644 --- a/packages/optimizely-sdk/lib/utils/user_profile_service_validator/index.tests.js +++ b/packages/optimizely-sdk/lib/utils/user_profile_service_validator/index.tests.js @@ -15,7 +15,7 @@ ***************************************************************************/ import { assert } from 'chai'; -import { sprintf } from '@optimizely/js-sdk-utils'; +import { sprintf } from '../../../modules/utils'; import { validate } from './'; import { ERROR_MESSAGES } from '../enums'; diff --git a/packages/optimizely-sdk/lib/utils/user_profile_service_validator/index.ts b/packages/optimizely-sdk/lib/utils/user_profile_service_validator/index.ts index ea59c8220..4c2de4f46 100644 --- a/packages/optimizely-sdk/lib/utils/user_profile_service_validator/index.ts +++ b/packages/optimizely-sdk/lib/utils/user_profile_service_validator/index.ts @@ -18,7 +18,7 @@ * Provides utility method for validating that the given user profile service implementation is valid. */ -import { sprintf } from '@optimizely/js-sdk-utils'; +import { sprintf } from '../../../modules/utils'; import { ObjectWithUnknownProperties } from '../../shared_types'; import { ERROR_MESSAGES } from '../enums'; diff --git a/packages/optimizely-sdk/modules/utils/__tests__/utils.spec.ts b/packages/optimizely-sdk/modules/utils/__tests__/utils.spec.ts new file mode 100644 index 000000000..8867d50e5 --- /dev/null +++ b/packages/optimizely-sdk/modules/utils/__tests__/utils.spec.ts @@ -0,0 +1,123 @@ +/// +import { isValidEnum, groupBy, objectEntries, objectValues, find, keyBy, sprintf } from '../' + +describe('utils', () => { + describe('isValidEnum', () => { + enum myEnum { + FOO = 0, + BAR = 1, + } + + it('should return false when not valid', () => { + expect(isValidEnum(myEnum, 2)).toBe(false) + }) + + it('should return true when valid', () => { + expect(isValidEnum(myEnum, 1)).toBe(true) + expect(isValidEnum(myEnum, myEnum.FOO)).toBe(true) + }) + }) + + describe('groupBy', () => { + it('should group values by some key function', () => { + const input = [ + { firstName: 'jordan', lastName: 'foo' }, + { firstName: 'jordan', lastName: 'bar' }, + { firstName: 'james', lastName: 'foxy' }, + ] + const result = groupBy(input, item => item.firstName) + + expect(result).toEqual([ + [ + { firstName: 'jordan', lastName: 'foo' }, + { firstName: 'jordan', lastName: 'bar' }, + ], + [{ firstName: 'james', lastName: 'foxy' }], + ]) + }) + }) + + describe('objectEntries', () => { + it('should return object entries', () => { + expect(objectEntries({ foo: 'bar', bar: 123 })).toEqual([['foo', 'bar'], ['bar', 123]]) + }) + }) + + describe('objectValues', () => { + it('should return object values', () => { + expect(objectValues({ foo: 'bar', bar: 123 })).toEqual(['bar', 123]) + }) + // TODO test for enumerable properties only + }) + + describe('find', () => { + it('should return the value if found in an array', () => { + const input = [ + { firstName: 'jordan', lastName: 'foo' }, + { firstName: 'jordan', lastName: 'bar' }, + { firstName: 'james', lastName: 'foxy' }, + ] + + expect(find(input, item => item.firstName === 'jordan')).toEqual({ + firstName: 'jordan', + lastName: 'foo', + }) + }) + + it('should return undefined if NOT found in an array', () => { + const input = [ + { firstName: 'jordan', lastName: 'foo' }, + { firstName: 'jordan', lastName: 'bar' }, + { firstName: 'james', lastName: 'foxy' }, + ] + + expect(find(input, item => item.firstName === 'joe')).toBeUndefined() + }) + }) + + describe('keyBy', () => { + it('return an object with keys generated from the key function', () => { + const input = [ + { key: 'foo', firstName: 'jordan', lastName: 'foo' }, + { key: 'bar', firstName: 'jordan', lastName: 'bar' }, + { key: 'baz', firstName: 'james', lastName: 'foxy' }, + ] + + expect(keyBy(input, item => item.key)).toEqual({ + foo: { key: 'foo', firstName: 'jordan', lastName: 'foo' }, + bar: { key: 'bar', firstName: 'jordan', lastName: 'bar' }, + baz: { key: 'baz', firstName: 'james', lastName: 'foxy' }, + }) + }) + }) + + describe('sprintf', () => { + it('sprintf(msg)', () => { + expect(sprintf('this is my message')).toBe('this is my message') + }) + + it('sprintf(msg, arg1)', () => { + expect(sprintf('hi %s', 'jordan')).toBe('hi jordan') + }) + + it('sprintf(msg, arg1, arg2)', () => { + expect(sprintf('hi %s its %s', 'jordan', 'jon')).toBe('hi jordan its jon') + }) + + it('should print undefined if an argument is missing', () => { + expect(sprintf('hi %s its %s', 'jordan')).toBe('hi jordan its undefined') + }) + + it('should evaluate a function', () => { + expect(sprintf('hi %s its %s', 'jordan', () => 'a function')).toBe('hi jordan its a function') + }) + + it('should work with numbers', () => { + expect(sprintf('hi %s', 123)).toBe('hi 123') + }) + + it('should not error when passed an object', () => { + expect(sprintf('hi %s', { foo: 'bar' })).toBe('hi [object Object]') + }) + }) +}) diff --git a/packages/optimizely-sdk/modules/utils/index.d.ts b/packages/optimizely-sdk/modules/utils/index.d.ts new file mode 100644 index 000000000..a6e6630b2 --- /dev/null +++ b/packages/optimizely-sdk/modules/utils/index.d.ts @@ -0,0 +1,36 @@ +export declare function generateUUID(): string; +export declare type Omit = Pick>; +export declare function getTimestamp(): number; +/** + * Validates a value is a valid TypeScript enum + * + * @export + * @param {object} enumToCheck + * @param {*} value + * @returns {boolean} + */ +export declare function isValidEnum(enumToCheck: { + [key: string]: any; +}, value: any): boolean; +export declare function groupBy(arr: K[], grouperFn: (item: K) => string): Array; +export declare function objectValues(obj: { + [key: string]: K; +}): K[]; +export declare function objectEntries(obj: { + [key: string]: K; +}): [string, K][]; +export declare function find(arr: K[], cond: (arg: K) => boolean): K | undefined; +export declare function keyBy(arr: K[], keyByFn: (item: K) => string): { + [key: string]: K; +}; +export declare function sprintf(format: string, ...args: any[]): string; +export declare enum NOTIFICATION_TYPES { + ACTIVATE = "ACTIVATE:experiment, user_id,attributes, variation, event", + DECISION = "DECISION:type, userId, attributes, decisionInfo", + LOG_EVENT = "LOG_EVENT:logEvent", + OPTIMIZELY_CONFIG_UPDATE = "OPTIMIZELY_CONFIG_UPDATE", + TRACK = "TRACK:event_key, user_id, attributes, event_tags, event" +} +export interface NotificationCenter { + sendNotifications(notificationType: NOTIFICATION_TYPES, notificationData?: any): void; +} diff --git a/packages/optimizely-sdk/modules/utils/index.js b/packages/optimizely-sdk/modules/utils/index.js new file mode 100644 index 000000000..f90d987cf --- /dev/null +++ b/packages/optimizely-sdk/modules/utils/index.js @@ -0,0 +1,156 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +/** + * Copyright 2019, Optimizely + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var uuid_1 = require("uuid"); +function generateUUID() { + return uuid_1.v4(); +} +exports.generateUUID = generateUUID; +function getTimestamp() { + return new Date().getTime(); +} +exports.getTimestamp = getTimestamp; +/** + * Validates a value is a valid TypeScript enum + * + * @export + * @param {object} enumToCheck + * @param {*} value + * @returns {boolean} + */ +function isValidEnum(enumToCheck, value) { + var found = false; + var keys = Object.keys(enumToCheck); + for (var index = 0; index < keys.length; index++) { + if (value === enumToCheck[keys[index]]) { + found = true; + break; + } + } + return found; +} +exports.isValidEnum = isValidEnum; +function groupBy(arr, grouperFn) { + var grouper = {}; + arr.forEach(function (item) { + var key = grouperFn(item); + grouper[key] = grouper[key] || []; + grouper[key].push(item); + }); + return objectValues(grouper); +} +exports.groupBy = groupBy; +function objectValues(obj) { + return Object.keys(obj).map(function (key) { return obj[key]; }); +} +exports.objectValues = objectValues; +function objectEntries(obj) { + return Object.keys(obj).map(function (key) { return [key, obj[key]]; }); +} +exports.objectEntries = objectEntries; +function find(arr, cond) { + var found; + for (var _i = 0, arr_1 = arr; _i < arr_1.length; _i++) { + var item = arr_1[_i]; + if (cond(item)) { + found = item; + break; + } + } + return found; +} +exports.find = find; +function keyBy(arr, keyByFn) { + var map = {}; + arr.forEach(function (item) { + var key = keyByFn(item); + map[key] = item; + }); + return map; +} +exports.keyBy = keyBy; +function sprintf(format) { + var args = []; + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + var i = 0; + return format.replace(/%s/g, function () { + var arg = args[i++]; + var type = typeof arg; + if (type === 'function') { + return arg(); + } + else if (type === 'string') { + return arg; + } + else { + return String(arg); + } + }); +} +exports.sprintf = sprintf; +/* + * Notification types for use with NotificationCenter + * Format is EVENT: + * + * SDK consumers can use these to register callbacks with the notification center. + * + * @deprecated since 3.1.0 + * ACTIVATE: An impression event will be sent to Optimizely + * Callbacks will receive an object argument with the following properties: + * - experiment {Object} + * - userId {string} + * - attributes {Object|undefined} + * - variation {Object} + * - logEvent {Object} + * + * DECISION: A decision is made in the system. i.e. user activation, + * feature access or feature-variable value retrieval + * Callbacks will receive an object argument with the following properties: + * - type {string} + * - userId {string} + * - attributes {Object|undefined} + * - decisionInfo {Object|undefined} + * + * LOG_EVENT: A batch of events, which could contain impressions and/or conversions, + * will be sent to Optimizely + * Callbacks will receive an object argument with the following properties: + * - url {string} + * - httpVerb {string} + * - params {Object} + * + * OPTIMIZELY_CONFIG_UPDATE: This Optimizely instance has been updated with a new + * config + * + * TRACK: A conversion event will be sent to Optimizely + * Callbacks will receive the an object argument with the following properties: + * - eventKey {string} + * - userId {string} + * - attributes {Object|undefined} + * - eventTags {Object|undefined} + * - logEvent {Object} + * + */ +var NOTIFICATION_TYPES; +(function (NOTIFICATION_TYPES) { + NOTIFICATION_TYPES["ACTIVATE"] = "ACTIVATE:experiment, user_id,attributes, variation, event"; + NOTIFICATION_TYPES["DECISION"] = "DECISION:type, userId, attributes, decisionInfo"; + NOTIFICATION_TYPES["LOG_EVENT"] = "LOG_EVENT:logEvent"; + NOTIFICATION_TYPES["OPTIMIZELY_CONFIG_UPDATE"] = "OPTIMIZELY_CONFIG_UPDATE"; + NOTIFICATION_TYPES["TRACK"] = "TRACK:event_key, user_id, attributes, event_tags, event"; +})(NOTIFICATION_TYPES = exports.NOTIFICATION_TYPES || (exports.NOTIFICATION_TYPES = {})); diff --git a/packages/optimizely-sdk/package-lock.json b/packages/optimizely-sdk/package-lock.json index 3477e6298..bf2c46f53 100644 --- a/packages/optimizely-sdk/package-lock.json +++ b/packages/optimizely-sdk/package-lock.json @@ -401,6 +401,12 @@ "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", "dev": true }, + "@types/jest": { + "version": "23.3.14", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-23.3.14.tgz", + "integrity": "sha512-Q5hTcfdudEL2yOmluA1zaSyPbzWPmJ3XfSWeP3RyoYvS9hnje1ZyagrZOuQ6+1nQC1Gw+7gap3pLNL3xL6UBug==", + "dev": true + }, "@types/json-schema": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", @@ -428,6 +434,12 @@ "@types/node": "*" } }, + "@types/uuid": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.10.tgz", + "integrity": "sha512-BgeaZuElf7DEYZhWYDTc/XcLZXdVgFkVSTa13BqKvbnmUrxr3TJFKofUxCtDO9UQOdhnV+HPOESdHiHKZOJV1A==", + "dev": true + }, "@typescript-eslint/eslint-plugin": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.10.1.tgz", @@ -686,6 +698,12 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, + "abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "dev": true + }, "accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -702,12 +720,36 @@ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true }, + "acorn-globals": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz", + "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==", + "dev": true, + "requires": { + "acorn": "^6.0.1", + "acorn-walk": "^6.0.1" + }, + "dependencies": { + "acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true + } + } + }, "acorn-jsx": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz", "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==", "dev": true }, + "acorn-walk": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz", + "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==", + "dev": true + }, "after": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", @@ -859,6 +901,12 @@ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true }, + "array-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", + "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", + "dev": true + }, "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", @@ -871,6 +919,12 @@ "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", "dev": true }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", @@ -997,165 +1051,90 @@ "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==", "dev": true }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", - "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 - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "dev": true, "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" }, "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "kind-of": "^6.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "ansi-regex": "^2.0.0" } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true } } }, - "base64-arraybuffer": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", - "dev": true - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, - "base64id": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", - "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "better-assert": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", - "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", - "dev": true, - "requires": { - "callsite": "1.0.0" - } - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "binary-extensions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", - "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", - "dev": true - }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, - "blob": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", - "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", - "dev": true - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "bn.js": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", - "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==", - "dev": true - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "dev": true, - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "dev": true, + "requires": { + "babel-code-frame": "^6.26.0", + "babel-generator": "^6.26.0", + "babel-helpers": "^6.24.1", + "babel-messages": "^6.23.0", + "babel-register": "^6.26.0", + "babel-runtime": "^6.26.0", + "babel-template": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "convert-source-map": "^1.5.1", + "debug": "^2.6.9", + "json5": "^0.5.1", + "lodash": "^4.17.4", + "minimatch": "^3.0.4", + "path-is-absolute": "^1.0.1", + "private": "^0.1.8", + "slash": "^1.0.0", + "source-map": "^0.5.7" }, "dependencies": { "debug": { @@ -1167,1635 +1146,1647 @@ "ms": "2.0.0" } }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "dev": true } } }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", "dev": true, "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.7", + "trim-right": "^1.0.1" + }, + "dependencies": { + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "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 + } } }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", "dev": true, "requires": { - "fill-range": "^7.0.1" + "babel-runtime": "^6.22.0", + "babel-template": "^6.24.1" } }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "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 - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "babel-jest": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-23.6.0.tgz", + "integrity": "sha512-lqKGG6LYXYu+DQh/slrQ8nxXQkEkhugdXsU6St7GmhVS7Ilc/22ArwqXNJrf0QaOBjZB0360qZMwXqDYQHXaew==", "dev": true, "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "babel-plugin-istanbul": "^4.1.6", + "babel-preset-jest": "^23.2.0" } }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", "dev": true, "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" + "babel-runtime": "^6.22.0" } }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "babel-plugin-istanbul": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz", + "integrity": "sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==", "dev": true, "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" + "babel-plugin-syntax-object-rest-spread": "^6.13.0", + "find-up": "^2.1.0", + "istanbul-lib-instrument": "^1.10.1", + "test-exclude": "^4.2.1" }, "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.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" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "istanbul-lib-coverage": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", + "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz", + "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==", + "dev": true, + "requires": { + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.2.1", + "semver": "^5.3.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "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" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "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-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 + }, + "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 + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true + }, + "test-exclude": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.3.tgz", + "integrity": "sha512-SYbXgY64PT+4GAL2ocI3HwPa4Q4TBKm0cwAVeKOt/Aoc0gSpNRjJX8w0pA1LMKZ3LBmd8pYBqApFNQLII9kavA==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "micromatch": "^2.3.11", + "object-assign": "^4.1.0", + "read-pkg-up": "^1.0.1", + "require-main-filename": "^1.0.1" + } } } }, - "browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "babel-plugin-jest-hoist": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz", + "integrity": "sha1-5h+uBaHKiAGq3uV6bWa4zvr0QWc=", + "dev": true + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", + "dev": true + }, + "babel-preset-jest": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz", + "integrity": "sha1-jsegOhOPABoaj7HoETZSvxpV2kY=", "dev": true, "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "babel-plugin-jest-hoist": "^23.2.0", + "babel-plugin-syntax-object-rest-spread": "^6.13.0" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "dev": true, + "requires": { + "babel-core": "^6.26.0", + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "home-or-tmp": "^2.0.0", + "lodash": "^4.17.4", + "mkdirp": "^0.5.1", + "source-map-support": "^0.4.15" }, "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", "dev": true, "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "source-map": "^0.5.6" } } } }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, - "browserslist": { - "version": "4.16.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", - "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001219", - "colorette": "^1.2.2", - "electron-to-chromium": "^1.3.723", - "escalade": "^3.1.1", - "node-releases": "^1.1.71" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, - "browserstack": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.5.3.tgz", - "integrity": "sha512-AO+mECXsW4QcqC9bxwM29O7qWa7bJT94uBFzeb5brylIQwawuEziwq20dPYbins95GlWzOawgyDNdjYAo32EKg==", + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", "dev": true, "requires": { - "https-proxy-agent": "^2.2.1" + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" } }, - "browserstack-local": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/browserstack-local/-/browserstack-local-1.4.8.tgz", - "integrity": "sha512-s+mc3gTOJwELdLWi4qFVKtGwMbb5JWsR+JxKlMaJkRJxoZ0gg3WREgPxAN0bm6iU5+S4Bi0sz0oxBRZT8BiNsQ==", + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", "dev": true, "requires": { - "https-proxy-agent": "^4.0.0", - "is-running": "^2.1.0", - "ps-tree": "=1.2.0", - "temp-fs": "^0.9.9" + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" }, "dependencies": { - "agent-base": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", - "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", - "dev": true - }, - "https-proxy-agent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", - "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "agent-base": "5", - "debug": "4" + "ms": "2.0.0" } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "dev": true, "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" }, "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", "dev": true } } }, - "buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "dev": true, - "requires": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true - }, - "buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", "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==", + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", "dev": true }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, - "builtin-modules": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", - "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", - "dev": true - }, - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" }, "dependencies": { - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "yallist": "^3.0.2" + "is-descriptor": "^1.0.0" } }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } } } }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "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" - } - }, - "callsite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", - "dev": true - }, - "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==", + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", "dev": true }, - "caniuse-lite": { - "version": "1.0.30001230", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001230.tgz", - "integrity": "sha512-5yBd5nWCBS+jWKTcHOzXwo5xzcj4ePE/yjtkZyUV1BTUmrBaA9MRGC+e7mxnqXSA90CmCA8L3eKLaSUkt099IQ==", + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", "dev": true }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "base64id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", + "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", "dev": true }, - "chai": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", - "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "dev": true, "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^3.0.1", - "get-func-name": "^2.0.0", - "pathval": "^1.1.0", - "type-detect": "^4.0.5" + "tweetnacl": "^0.14.3" } }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "callsite": "1.0.0" } }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", "dev": true }, - "chokidar": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", - "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", "dev": true, + "optional": true, "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.1.2", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.4.0" + "file-uri-to-path": "1.0.0" } }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "blob": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", "dev": true }, - "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } + "bn.js": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", + "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==", + "dev": true }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", "dev": true, "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" }, "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "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 + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true } } }, - "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 + "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" + } }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { - "restore-cursor": "^3.1.0" + "fill-range": "^7.0.1" } }, - "cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", "dev": true }, - "cliui": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", - "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", "dev": true, "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^6.2.0" + "resolve": "1.1.7" }, "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" - } + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true } } }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - } + "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 }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "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==", + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "dev": true, "requires": { - "color-name": "1.1.3" + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" } }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "colorette": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", - "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", - "dev": true - }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", "dev": true, "requires": { - "delayed-stream": "~1.0.0" + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, - "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 - }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", - "dev": true - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", - "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 - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } } }, - "connect": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", - "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", "dev": true, "requires": { - "debug": "2.6.9", - "finalhandler": "1.1.2", - "parseurl": "~1.3.3", - "utils-merge": "1.0.1" + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, "requires": { - "ms": "2.0.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true } } }, - "console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "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==", + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "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 - } + "pako": "~1.0.5" } }, - "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", - "dev": true - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "browserslist": { + "version": "4.16.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", + "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==", "dev": true, "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" + "caniuse-lite": "^1.0.30001219", + "colorette": "^1.2.2", + "electron-to-chromium": "^1.3.723", + "escalade": "^3.1.1", + "node-releases": "^1.1.71" } }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "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 - }, - "coveralls": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.1.0.tgz", - "integrity": "sha512-sHxOu2ELzW8/NC1UP5XVLbZDzO4S3VxfFye3XYCznopHy02YjNkHcj5bKaVw2O7hVaBdBjEdQGpie4II1mWhuQ==", + "browserstack": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.5.3.tgz", + "integrity": "sha512-AO+mECXsW4QcqC9bxwM29O7qWa7bJT94uBFzeb5brylIQwawuEziwq20dPYbins95GlWzOawgyDNdjYAo32EKg==", "dev": true, "requires": { - "js-yaml": "^3.13.1", - "lcov-parse": "^1.0.0", - "log-driver": "^1.2.7", - "minimist": "^1.2.5", - "request": "^2.88.2" + "https-proxy-agent": "^2.2.1" } }, - "create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "browserstack-local": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/browserstack-local/-/browserstack-local-1.4.8.tgz", + "integrity": "sha512-s+mc3gTOJwELdLWi4qFVKtGwMbb5JWsR+JxKlMaJkRJxoZ0gg3WREgPxAN0bm6iU5+S4Bi0sz0oxBRZT8BiNsQ==", "dev": true, "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" + "https-proxy-agent": "^4.0.0", + "is-running": "^2.1.0", + "ps-tree": "=1.2.0", + "temp-fs": "^0.9.9" }, "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "agent-base": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", + "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", "dev": true + }, + "https-proxy-agent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", + "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", + "dev": true, + "requires": { + "agent-base": "5", + "debug": "4" + } } } }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", "dev": true, "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" + "fast-json-stable-stringify": "2.x" } }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "node-int64": "^0.4.0" } }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", "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" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" }, "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true } } }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", "dev": true, "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" } }, - "custom-event": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", - "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", "dev": true }, - "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", "dev": true }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "requires": { - "assert-plus": "^1.0.0" - } + "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 }, - "date-format": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", - "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", "dev": true }, - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "dev": true, - "requires": { - "ms": "2.1.2" - } + "builtin-modules": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", + "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==", + "dev": true }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", "dev": true }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", "dev": true }, - "decompress-response": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", - "requires": { - "mimic-response": "^2.0.0" - } - }, - "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", - "dev": true, - "requires": { - "type-detect": "^4.0.0" - } - }, - "deep-equal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", - "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", "dev": true, "requires": { - "is-arguments": "^1.0.4", - "is-date-object": "^1.0.1", - "is-regex": "^1.0.4", - "object-is": "^1.0.1", - "object-keys": "^1.1.1", - "regexp.prototype.flags": "^1.2.0" + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "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==", + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, "requires": { - "strip-bom": "^4.0.0" + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" } }, - "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==", + "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": { - "object-keys": "^1.0.12" + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" } }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dev": true, "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" } }, - "delayed-stream": { + "callsite": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", "dev": true }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "di": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", - "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "caniuse-lite": { + "version": "1.0.30001230", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001230.tgz", + "integrity": "sha512-5yBd5nWCBS+jWKTcHOzXwo5xzcj4ePE/yjtkZyUV1BTUmrBaA9MRGC+e7mxnqXSA90CmCA8L3eKLaSUkt099IQ==", "dev": true }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "capture-exit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-1.2.0.tgz", + "integrity": "sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28=", "dev": true, "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } + "rsvp": "^3.3.3" } }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chai": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", + "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", "dev": true, "requires": { - "esutils": "^2.0.2" + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.0", + "type-detect": "^4.0.5" } }, - "dom-serialize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", - "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "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": { - "custom-event": "~1.0.0", - "ent": "~2.2.0", - "extend": "^3.0.0", - "void-elements": "^2.0.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, - "duplexer": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", - "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", "dev": true }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "chokidar": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz", + "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==", "dev": true, "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" } }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.739", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.739.tgz", - "integrity": "sha512-+LPJVRsN7hGZ9EIUUiWCpO7l4E3qBYHNadazlucBfsXBbccDFNKUBAgzE68FnkWGJPwD/AfKhSzL+G+Iqb8A4A==", + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true }, - "elliptic": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", - "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", "dev": true, "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } + "tslib": "^1.9.0" } }, - "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 - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", "dev": true }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dev": true, "requires": { - "once": "^1.4.0" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "engine.io": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz", - "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==", + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, "requires": { - "accepts": "~1.3.4", - "base64id": "1.0.0", - "cookie": "0.3.1", - "debug": "~3.1.0", - "engine.io-parser": "~2.1.0", - "ws": "~3.3.1" + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" }, "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "ms": "2.0.0" + "is-descriptor": "^0.1.0" } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true } } }, - "engine.io-client": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", - "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", - "dev": true, - "requires": { - "component-emitter": "1.2.1", - "component-inherit": "0.0.3", - "debug": "~3.1.0", - "engine.io-parser": "~2.1.1", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "ws": "~3.3.1", - "xmlhttprequest-ssl": "~1.5.4", - "yeast": "0.1.2" - }, - "dependencies": { - "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" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } + "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 }, - "engine.io-parser": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", - "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", + "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": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.5", - "blob": "0.0.5", - "has-binary2": "~1.0.2" + "restore-cursor": "^3.1.0" } }, - "enhanced-resolve": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", - "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", + "cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "memory-fs": "^0.5.0", - "tapable": "^1.0.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" }, "dependencies": { - "memory-fs": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", - "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "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": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" + "ansi-regex": "^5.0.0" } } } }, - "ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", - "dev": true - }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", + "clone-deep": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", + "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", "dev": true, "requires": { - "prr": "~1.0.1" + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" } }, - "es-abstract": { - "version": "1.18.0-next.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", - "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "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.2.2", - "is-negative-zero": "^2.0.0", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" } }, - "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==", + "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": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "color-name": "1.1.3" } }, - "es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "colorette": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz", + "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==", "dev": true }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "requires": { - "es6-promise": "^4.0.3" + "delayed-stream": "~1.0.0" } }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "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 }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "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=", + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", "dev": true }, - "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "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 + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", "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" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" }, "dependencies": { - "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==", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "eslint-visitor-keys": "^1.1.0" + "ms": "2.0.0" } }, - "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==", + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true } } }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", "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==", + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", "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.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", - "dev": true - } - } + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "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": { - "estraverse": "^5.2.0" + "safe-buffer": "~5.1.1" }, "dependencies": { - "estraverse": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", - "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "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 } } }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", "dev": true }, - "estree-walker": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", - "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", - "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 - }, - "event-stream": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", - "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", "dev": true, "requires": { - "duplexer": "~0.1.1", - "from": "~0", - "map-stream": "~0.1.0", - "pause-stream": "0.0.11", - "split": "0.3", - "stream-combiner": "~0.0.4", - "through": "~2.3.1" + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" } }, - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "dev": true }, - "events": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", - "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", + "core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", "dev": true }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "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 + }, + "coveralls": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.1.0.tgz", + "integrity": "sha512-sHxOu2ELzW8/NC1UP5XVLbZDzO4S3VxfFye3XYCznopHy02YjNkHcj5bKaVw2O7hVaBdBjEdQGpie4II1mWhuQ==", "dev": true, "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" + "js-yaml": "^3.13.1", + "lcov-parse": "^1.0.0", + "log-driver": "^1.2.7", + "minimist": "^1.2.5", + "request": "^2.88.2" } }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", "dev": true, "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" }, "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" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", "dev": true } } }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "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": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "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==", + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "dev": true, "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" } }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, + "cssstyle": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz", + "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==", "dev": true, "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "cssom": "0.3.x" + } + }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "dev": true + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "data-urls": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz", + "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "whatwg-mimetype": "^2.2.0", + "whatwg-url": "^7.0.0" }, "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" } - }, - "is-accessor-descriptor": { - "version": "1.0.0", + } + } + }, + "date-format": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", + "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", + "dev": true + }, + "debug": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", + "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "requires": { + "mimic-response": "^2.0.0" + } + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "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" + } + }, + "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" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, @@ -2825,737 +2816,1873 @@ } } }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "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=", + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, - "figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", "dev": true }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", "dev": true, "requires": { - "escape-string-regexp": "^1.0.5" + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, - "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==", + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", "dev": true, "requires": { - "flat-cache": "^2.0.1" + "repeating": "^2.0.0" } }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true + "detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", + "dev": true }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "dev": true }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^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=", + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", "dev": true } } }, - "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==", + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" + "esutils": "^2.0.2" } }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", "dev": true, "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^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==", + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", "dev": true, "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" + "webidl-conversions": "^4.0.2" } }, - "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", - "dev": true - }, - "flush-write-stream": { + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.739", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.739.tgz", + "integrity": "sha512-+LPJVRsN7hGZ9EIUUiWCpO7l4E3qBYHNadazlucBfsXBbccDFNKUBAgzE68FnkWGJPwD/AfKhSzL+G+Iqb8A4A==", + "dev": true + }, + "elliptic": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", + "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", "dev": true, "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } } }, - "follow-redirects": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", - "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==", + "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 }, - "for-in": { + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "encodeurl": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", "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==", + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "dev": true, "requires": { - "cross-spawn": "^7.0.0", - "signal-exit": "^3.0.2" + "once": "^1.4.0" + } + }, + "engine.io": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz", + "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "base64id": "1.0.0", + "cookie": "0.3.1", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.0", + "ws": "~3.3.1" }, "dependencies": { - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "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": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "ms": "2.0.0" } }, - "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": { + "ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "engine.io-client": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", + "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "~3.1.0", + "engine.io-parser": "~2.1.1", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "~3.3.1", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + }, + "dependencies": { + "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": { - "shebang-regex": "^3.0.0" + "ms": "2.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==", + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + } + } + }, + "engine.io-parser": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", + "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } + }, + "enhanced-resolve": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz", + "integrity": "sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", "dev": true, "requires": { - "isexe": "^2.0.0" + "errno": "^0.1.3", + "readable-stream": "^2.0.1" } } } }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", "dev": true }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "errno": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "dev": true, "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" + "prr": "~1.0.1" } }, - "formatio": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz", - "integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=", + "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": { - "samsam": "1.x" + "is-arrayish": "^0.2.1" } }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "es-abstract": { + "version": "1.18.0-next.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", + "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", "dev": true, "requires": { - "map-cache": "^0.2.2" + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.0", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" } }, - "from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", - "dev": true - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "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": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" } }, - "fromentries": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.2.1.tgz", - "integrity": "sha512-Xu2Qh8yqYuDhQGOhD5iJGninErSfI9A3FrriD3tjUgV5VbJFeH8vfgZ9HnC6jWN80QDVNQK5vmxRAmEAp7Mevw==", + "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 }, - "fs-access": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", - "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", - "dev": true, - "requires": { - "null-check": "^1.0.0" - } - }, - "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" - } + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" + "es6-promise": "^4.0.3" } }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", - "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", - "dev": true, - "optional": 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.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "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 - }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true }, - "get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", "dev": true }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "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 }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "escodegen": { + "version": "1.14.3", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.3.tgz", + "integrity": "sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==", "dev": true, "requires": { - "assert-plus": "^1.0.0" + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" } }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "eslint": { + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", + "@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", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "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": { + "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" + } + }, + "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 + } } }, - "glob-parent": { + "eslint-scope": { "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==", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "requires": { - "is-glob": "^4.0.1" + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" } }, - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, "requires": { - "type-fest": "^0.8.1" + "eslint-visitor-keys": "^1.1.0" } }, - "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 - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "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": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" } }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "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": { - "function-bind": "^1.1.1" + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } } }, - "has-binary2": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", - "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "requires": { - "isarray": "2.0.1" + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "dev": true + } } }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", "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==", + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "event-stream": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", "dev": true, "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" + "duplexer": "~0.1.1", + "from": "~0", + "map-stream": "~0.1.0", + "pause-stream": "0.0.11", + "split": "0.3", + "stream-combiner": "~0.0.4", + "through": "~2.3.1" } }, - "has-values": { + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "events": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", + "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "exec-sh": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz", + "integrity": "sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==", + "dev": true, + "requires": { + "merge": "^1.2.0" + } + }, + "execa": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" }, "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + } + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.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": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "ms": "2.0.0" } }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, - "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "dev": true, "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "fill-range": "^2.1.0" }, "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", "dev": true, "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^3.0.0", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" } } } }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "hasha": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.1.tgz", - "integrity": "sha512-x15jnRSHTi3VmH+oHtVb9kgU/HuKOK8mjK8iCL3dPQXh4YJlUb9YSI8ZLiiqLAIvY2wuDIlZYZppy8vB2XISkQ==", + "expect": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-23.6.0.tgz", + "integrity": "sha512-dgSoOHgmtn/aDGRVFWclQyPDKl2CQRq0hmIEoUAuQs/2rn2NcvCWcSCovm6BLeuB/7EZuLGu2QfnR+qRt5OM4w==", "dev": true, "requires": { - "is-stream": "^2.0.0", - "type-fest": "^0.8.0" + "ansi-styles": "^3.2.0", + "jest-diff": "^23.6.0", + "jest-get-type": "^22.1.0", + "jest-matcher-utils": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-regex-util": "^23.3.0" } }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "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 - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" }, "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } } } }, - "http-proxy": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", - "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, - "requires": { - "eventemitter3": "^4.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "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": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" } }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, - "https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "ms": "^2.1.1" + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" } } } }, - "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" - } + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true }, - "ieee754": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "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 }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", + "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 }, - "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==", + "fb-watchman": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.1.tgz", + "integrity": "sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==", "dev": true, "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" + "bser": "2.1.1" } }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", "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 + "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" + } }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true + "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" + } }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", "dev": true }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", "dev": true, "requires": { - "once": "^1.3.0", - "wrappy": "1" + "glob": "^7.0.3", + "minimatch": "^3.0.3" } }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } }, - "inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "dev": true, "requires": { - "ansi-escapes": "^4.2.1", + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.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 + } + } + }, + "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" + } + }, + "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" + } + }, + "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" + } + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "follow-redirects": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", + "integrity": "sha512-aq6gF1BEKje4a9i9+5jimNFIpq4Q1WiwBToeRK5NvZBd/TRsmW8BsJfOEGkr76TbOyPVD3OVDN910EcUNtRYEA==", + "dev": true + }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "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.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "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" + } + } + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "formatio": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz", + "integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=", + "dev": true, + "requires": { + "samsam": "1.x" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fromentries": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.2.1.tgz", + "integrity": "sha512-Xu2Qh8yqYuDhQGOhD5iJGninErSfI9A3FrriD3tjUgV5VbJFeH8vfgZ9HnC6jWN80QDVNQK5vmxRAmEAp7Mevw==", + "dev": true + }, + "fs-access": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", + "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", + "dev": true, + "requires": { + "null-check": "^1.0.0" + } + }, + "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-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": 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.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "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 + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "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-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "^2.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^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 + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true + }, + "handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dev": true, + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "dev": true, + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "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-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + } + } + }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "dev": true + }, + "has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "dev": true, + "requires": { + "isarray": "2.0.1" + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "dev": true + }, + "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 + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + }, + "dependencies": { + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + } + } + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hasha": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.1.tgz", + "integrity": "sha512-x15jnRSHTi3VmH+oHtVb9kgU/HuKOK8mjK8iCL3dPQXh4YJlUb9YSI8ZLiiqLAIvY2wuDIlZYZppy8vB2XISkQ==", + "dev": true, + "requires": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + } + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.1" + } + }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "html-encoding-sniffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.1" + } + }, + "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 + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "dev": true, + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "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" + } + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "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-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", + "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "dev": true, + "requires": { + "pkg-dir": "^2.0.0", + "resolve-cwd": "^2.0.0" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "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-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 + }, + "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 + }, + "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" + } + } + } + }, + "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 + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "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==", + "dev": true + }, + "inquirer": { + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", + "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", "chalk": "^4.1.0", "cli-cursor": "^3.1.0", "cli-width": "^3.0.0", @@ -3570,75 +4697,954 @@ "through": "^2.3.6" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", + "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "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.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arguments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", + "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", + "dev": true + }, + "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-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "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.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", + "dev": true + }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "requires": { + "ci-info": "^1.5.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "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-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "^2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "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-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "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-generator-fn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-1.0.0.tgz", + "integrity": "sha1-lp1J4bszKfa7fwkIm+JleLLd1Go=", + "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-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", + "dev": true + }, + "is-negative-zero": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", + "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "dev": true, + "requires": { + "@types/estree": "*" + } + }, + "is-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-running": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-running/-/is-running-2.1.0.tgz", + "integrity": "sha1-MKc/9cw4VOT8JUkICen1q/jeCeA=", + "dev": true + }, + "is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "dev": true + }, + "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 + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "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-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "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 + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + }, + "isbinaryfile": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", + "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", + "dev": true, + "requires": { + "buffer-alloc": "^1.2.0" + } + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul-api": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.7.tgz", + "integrity": "sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA==", + "dev": true, + "requires": { + "async": "^2.1.4", + "fileset": "^2.0.2", + "istanbul-lib-coverage": "^1.2.1", + "istanbul-lib-hook": "^1.2.2", + "istanbul-lib-instrument": "^1.10.2", + "istanbul-lib-report": "^1.1.5", + "istanbul-lib-source-maps": "^1.2.6", + "istanbul-reports": "^1.5.1", + "js-yaml": "^3.7.0", + "mkdirp": "^0.5.1", + "once": "^1.4.0" + }, + "dependencies": { + "append-transform": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", + "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", + "dev": true, + "requires": { + "default-require-extensions": "^1.0.0" + } + }, + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "default-require-extensions": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", + "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "dev": true, + "requires": { + "strip-bom": "^2.0.0" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "istanbul-lib-coverage": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", + "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz", + "integrity": "sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw==", + "dev": true, + "requires": { + "append-transform": "^0.4.0" + } + }, + "istanbul-lib-instrument": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz", + "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==", + "dev": true, + "requires": { + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.2.1", + "semver": "^5.3.0" + } + }, + "istanbul-lib-report": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz", + "integrity": "sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^1.2.1", + "mkdirp": "^0.5.1", + "path-parse": "^1.0.5", + "supports-color": "^3.1.2" + } + }, + "istanbul-lib-source-maps": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz", + "integrity": "sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "istanbul-lib-coverage": "^1.2.1", + "mkdirp": "^0.5.1", + "rimraf": "^2.6.1", + "source-map": "^0.5.3" + } + }, + "istanbul-reports": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.5.1.tgz", + "integrity": "sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw==", + "dev": true, + "requires": { + "handlebars": "^4.0.3" + } + }, + "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 + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + } + } + }, + "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.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@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.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "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.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "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" + } + }, + "jest": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-23.6.0.tgz", + "integrity": "sha512-lWzcd+HSiqeuxyhG+EnZds6iO3Y3ZEnMrfZq/OTGvF/C+Z4fPMCdhWTGSAiO2Oym9rbEXfwddHhh6jqrTF3+Lw==", + "dev": true, + "requires": { + "import-local": "^1.0.0", + "jest-cli": "^23.6.0" + }, + "dependencies": { + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "dev": true, "requires": { - "color-convert": "^2.0.1" + "is-posix-bracket": "^0.1.0" } }, - "chalk": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", - "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==", + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "dev": true, "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "is-extglob": "^1.0.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==", + "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": { - "color-name": "~1.1.4" + "locate-path": "^2.0.0" } }, - "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==", + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", "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==", + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", "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==", + "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 + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "ansi-regex": "^5.0.0" + "is-extglob": "^1.0.0" } }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "istanbul-lib-coverage": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", + "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz", + "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==", "dev": true, "requires": { - "has-flag": "^4.0.0" + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.2.1", + "semver": "^5.3.0" } - } - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { + }, + "istanbul-lib-source-maps": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz", + "integrity": "sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "istanbul-lib-coverage": "^1.2.1", + "mkdirp": "^0.5.1", + "rimraf": "^2.6.1", + "source-map": "^0.5.3" + } + }, + "jest-cli": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-23.6.0.tgz", + "integrity": "sha512-hgeD1zRUp1E1zsiyOXjEn4LzRLWdJBV//ukAHGlx6s5mfCNJTbhbHjgxnDUXA8fsKWN/HqFFF6X5XcCwC/IvYQ==", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "import-local": "^1.0.0", + "is-ci": "^1.0.10", + "istanbul-api": "^1.3.1", + "istanbul-lib-coverage": "^1.2.0", + "istanbul-lib-instrument": "^1.10.1", + "istanbul-lib-source-maps": "^1.2.4", + "jest-changed-files": "^23.4.2", + "jest-config": "^23.6.0", + "jest-environment-jsdom": "^23.4.0", + "jest-get-type": "^22.1.0", + "jest-haste-map": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-regex-util": "^23.3.0", + "jest-resolve-dependencies": "^23.6.0", + "jest-runner": "^23.6.0", + "jest-runtime": "^23.6.0", + "jest-snapshot": "^23.6.0", + "jest-util": "^23.4.0", + "jest-validate": "^23.6.0", + "jest-watcher": "^23.4.0", + "jest-worker": "^23.2.0", + "micromatch": "^2.3.11", + "node-notifier": "^5.2.1", + "prompts": "^0.1.9", + "realpath-native": "^1.0.0", + "rimraf": "^2.5.4", + "slash": "^1.0.0", + "string-length": "^2.0.0", + "strip-ansi": "^4.0.0", + "which": "^1.2.12", + "yargs": "^11.0.0" + } + }, + "jest-worker": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-23.2.0.tgz", + "integrity": "sha1-+vcGqNo2+uYOsmlXJX+ntdjqArk=", + "dev": true, + "requires": { + "merge-stream": "^1.0.1" + } + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -3647,45 +5653,297 @@ "requires": { "is-buffer": "^1.1.5" } + }, + "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" + } + }, + "merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "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-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 + }, + "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 + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "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 + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "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" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", + "dev": true + }, + "yargs": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.1.tgz", + "integrity": "sha512-PRU7gJrJaXv3q3yQZ/+/X6KBswZiaQ+zOmdprZcouPYtQgvNU35i+68M4b1ZHLZtYFT5QObFLV+ZkmJYcwKdiw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^9.0.2" + } + }, + "yargs-parser": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", + "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } } } }, - "is-arguments": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", - "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", - "dev": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "jest-changed-files": { + "version": "23.4.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-23.4.2.tgz", + "integrity": "sha512-EyNhTAUWEfwnK0Is/09LxoqNDOn7mU7S3EHskG52djOFS/z+IT0jT3h3Ql61+dklcG7bJJitIWEMB4Sp1piHmA==", "dev": true, "requires": { - "binary-extensions": "^2.0.0" + "throat": "^4.0.0" } }, - "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.2.2", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", - "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", - "dev": true - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "jest-config": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-23.6.0.tgz", + "integrity": "sha512-i8V7z9BeDXab1+VNo78WM0AtWpBRXJLnkT+lyT+Slx/cbP5sZJ0+NDuLcmBE5hXAoK0aUp7vI+MOxR+R4d8SRQ==", "dev": true, "requires": { - "kind-of": "^3.0.2" + "babel-core": "^6.0.0", + "babel-jest": "^23.6.0", + "chalk": "^2.0.1", + "glob": "^7.1.1", + "jest-environment-jsdom": "^23.4.0", + "jest-environment-node": "^23.4.0", + "jest-get-type": "^22.1.0", + "jest-jasmine2": "^23.6.0", + "jest-regex-util": "^23.3.0", + "jest-resolve": "^23.6.0", + "jest-util": "^23.4.0", + "jest-validate": "^23.6.0", + "micromatch": "^2.3.11", + "pretty-format": "^23.6.0" }, "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -3694,327 +5952,880 @@ "requires": { "is-buffer": "^1.1.5" } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } } } }, - "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-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "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==", + "jest-diff": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-23.6.0.tgz", + "integrity": "sha512-Gz9l5Ov+X3aL5L37IT+8hoCUsof1CVYBb2QEkOupK64XyRR3h+uRpYIm97K7sY8diFxowR8pIGEdyfMKTixo3g==", "dev": true, "requires": { - "is-extglob": "^2.1.1" + "chalk": "^2.0.1", + "diff": "^3.2.0", + "jest-get-type": "^22.1.0", + "pretty-format": "^23.6.0" } }, - "is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", - "dev": true - }, - "is-negative-zero": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz", - "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=", - "dev": true - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "jest-docblock": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-23.2.0.tgz", + "integrity": "sha1-8IXh8YVI2Z/dabICB+b9VdkTg6c=", "dev": true, "requires": { - "isobject": "^3.0.1" + "detect-newline": "^2.1.0" } }, - "is-reference": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", - "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "jest-each": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-23.6.0.tgz", + "integrity": "sha512-x7V6M/WGJo6/kLoissORuvLIeAoyo2YqLOoCDkohgJ4XOXSqOtyvr8FbInlAWS77ojBsZrafbozWoKVRdtxFCg==", "dev": true, "requires": { - "@types/estree": "*" + "chalk": "^2.0.1", + "pretty-format": "^23.6.0" } }, - "is-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", - "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "jest-environment-jsdom": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-23.4.0.tgz", + "integrity": "sha1-BWp5UrP+pROsYqFAosNox52eYCM=", "dev": true, "requires": { - "has-symbols": "^1.0.1" + "jest-mock": "^23.2.0", + "jest-util": "^23.4.0", + "jsdom": "^11.5.1" } }, - "is-running": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-running/-/is-running-2.1.0.tgz", - "integrity": "sha1-MKc/9cw4VOT8JUkICen1q/jeCeA=", - "dev": true - }, - "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 - }, - "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==", + "jest-environment-node": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-23.4.0.tgz", + "integrity": "sha1-V+gO0IQd6jAxZ8zozXlSHeuv3hA=", "dev": true, "requires": { - "has-symbols": "^1.0.1" + "jest-mock": "^23.2.0", + "jest-util": "^23.4.0" } }, - "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==", + "jest-get-type": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", + "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", "dev": true }, - "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true + "jest-haste-map": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-23.6.0.tgz", + "integrity": "sha512-uyNhMyl6dr6HaXGHp8VF7cK6KpC6G9z9LiMNsst+rJIZ8l7wY0tk8qwjPmEghczojZ2/ZhtEdIabZ0OQRJSGGg==", + "dev": true, + "requires": { + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.1.11", + "invariant": "^2.2.4", + "jest-docblock": "^23.2.0", + "jest-serializer": "^23.0.1", + "jest-worker": "^23.2.0", + "micromatch": "^2.3.11", + "sane": "^2.0.0" + }, + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "jest-worker": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-23.2.0.tgz", + "integrity": "sha1-+vcGqNo2+uYOsmlXJX+ntdjqArk=", + "dev": true, + "requires": { + "merge-stream": "^1.0.1" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true + "jest-jasmine2": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-23.6.0.tgz", + "integrity": "sha512-pe2Ytgs1nyCs8IvsEJRiRTPC0eVYd8L/dXJGU08GFuBwZ4sYH/lmFDdOL3ZmvJR8QKqV9MFuwlsAi/EWkFUbsQ==", + "dev": true, + "requires": { + "babel-traverse": "^6.0.0", + "chalk": "^2.0.1", + "co": "^4.6.0", + "expect": "^23.6.0", + "is-generator-fn": "^1.0.0", + "jest-diff": "^23.6.0", + "jest-each": "^23.6.0", + "jest-matcher-utils": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-snapshot": "^23.6.0", + "jest-util": "^23.4.0", + "pretty-format": "^23.6.0" + } }, - "isbinaryfile": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", - "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", + "jest-leak-detector": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-23.6.0.tgz", + "integrity": "sha512-f/8zA04rsl1Nzj10HIyEsXvYlMpMPcy0QkQilVZDFOaPbv2ur71X5u2+C4ZQJGyV/xvVXtCCZ3wQ99IgQxftCg==", "dev": true, "requires": { - "buffer-alloc": "^1.2.0" + "pretty-format": "^23.6.0" } }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "jest-matcher-utils": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-23.6.0.tgz", + "integrity": "sha512-rosyCHQfBcol4NsckTn01cdelzWLU9Cq7aaigDf8VwwpIRvWE/9zLgX2bON+FkEW69/0UuYslUe22SOdEf2nog==", + "dev": true, + "requires": { + "chalk": "^2.0.1", + "jest-get-type": "^22.1.0", + "pretty-format": "^23.6.0" + } }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "jest-message-util": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-23.4.0.tgz", + "integrity": "sha1-F2EMUJQjSVCNAaPR4L2iwHkIap8=", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0-beta.35", + "chalk": "^2.0.1", + "micromatch": "^2.3.11", + "slash": "^1.0.0", + "stack-utils": "^1.0.1" + }, + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.0.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "jest-mock": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-23.2.0.tgz", + "integrity": "sha1-rRxg8p6HGdR8JuETgJi20YsmETQ=", "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==", + "jest-regex-util": { + "version": "23.3.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-23.3.0.tgz", + "integrity": "sha1-X4ZylUfCeFxAAs6qj4Sf6MpHG8U=", "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==", + "jest-resolve": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-23.6.0.tgz", + "integrity": "sha512-XyoRxNtO7YGpQDmtQCmZjum1MljDqUCob7XlZ6jy9gsMugHdN2hY4+Acz9Qvjz2mSsOnPSH7skBmDYCHXVZqkA==", "dev": true, "requires": { - "append-transform": "^2.0.0" + "browser-resolve": "^1.11.3", + "chalk": "^2.0.1", + "realpath-native": "^1.0.0" } }, - "istanbul-lib-instrument": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", - "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "jest-resolve-dependencies": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-23.6.0.tgz", + "integrity": "sha512-EkQWkFWjGKwRtRyIwRwI6rtPAEyPWlUC2MpzHissYnzJeHcyCn1Hc8j7Nn1xUVrS5C6W5+ZL37XTem4D4pLZdA==", "dev": true, "requires": { - "@babel/core": "^7.7.5", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-coverage": "^3.0.0", - "semver": "^6.3.0" + "jest-regex-util": "^23.3.0", + "jest-snapshot": "^23.6.0" + } + }, + "jest-runner": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-23.6.0.tgz", + "integrity": "sha512-kw0+uj710dzSJKU6ygri851CObtCD9cN8aNkg8jWJf4ewFyEa6kwmiH/r/M1Ec5IL/6VFa0wnAk6w+gzUtjJzA==", + "dev": true, + "requires": { + "exit": "^0.1.2", + "graceful-fs": "^4.1.11", + "jest-config": "^23.6.0", + "jest-docblock": "^23.2.0", + "jest-haste-map": "^23.6.0", + "jest-jasmine2": "^23.6.0", + "jest-leak-detector": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-runtime": "^23.6.0", + "jest-util": "^23.4.0", + "jest-worker": "^23.2.0", + "source-map-support": "^0.5.6", + "throat": "^4.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 + "jest-worker": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-23.2.0.tgz", + "integrity": "sha1-+vcGqNo2+uYOsmlXJX+ntdjqArk=", + "dev": true, + "requires": { + "merge-stream": "^1.0.1" + } + }, + "merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "dev": true, + "requires": { + "readable-stream": "^2.0.1" + } } } }, - "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==", + "jest-runtime": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-23.6.0.tgz", + "integrity": "sha512-ycnLTNPT2Gv+TRhnAYAQ0B3SryEXhhRj1kA6hBPSeZaNQkJ7GbZsxOLUkwg6YmvWGdX3BB3PYKFLDQCAE1zNOw==", "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" + "babel-core": "^6.0.0", + "babel-plugin-istanbul": "^4.1.6", + "chalk": "^2.0.1", + "convert-source-map": "^1.4.0", + "exit": "^0.1.2", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.1.11", + "jest-config": "^23.6.0", + "jest-haste-map": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-regex-util": "^23.3.0", + "jest-resolve": "^23.6.0", + "jest-snapshot": "^23.6.0", + "jest-util": "^23.4.0", + "jest-validate": "^23.6.0", + "micromatch": "^2.3.11", + "realpath-native": "^1.0.0", + "slash": "^1.0.0", + "strip-bom": "3.0.0", + "write-file-atomic": "^2.1.0", + "yargs": "^11.0.0" }, "dependencies": { - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "dev": true, "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" + "arr-flatten": "^1.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==", + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", "dev": true }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "dev": true, "requires": { - "glob": "^7.1.3" + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" } }, - "shebang-command": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "^1.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" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-fullwidth-code-point": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "shebang-regex": "^3.0.0" + "is-extglob": "^1.0.0" } }, - "shebang-regex": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + }, + "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" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "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-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 + }, + "path-exists": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "isexe": "^2.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "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" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", + "dev": true + }, + "yargs": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.1.tgz", + "integrity": "sha512-PRU7gJrJaXv3q3yQZ/+/X6KBswZiaQ+zOmdprZcouPYtQgvNU35i+68M4b1ZHLZtYFT5QObFLV+ZkmJYcwKdiw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^9.0.2" + } + }, + "yargs-parser": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", + "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", + "dev": true, + "requires": { + "camelcase": "^4.1.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==", + "jest-serializer": { + "version": "23.0.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-23.0.1.tgz", + "integrity": "sha1-o3dq6zEekP6D+rnlM+hRAr0WQWU=", + "dev": true + }, + "jest-snapshot": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-23.6.0.tgz", + "integrity": "sha512-tM7/Bprftun6Cvj2Awh/ikS7zV3pVwjRYU2qNYS51VZHgaAMBs5l4o/69AiDHhQrj5+LA2Lq4VIvK7zYk/bswg==", "dev": true, "requires": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", - "supports-color": "^7.1.0" + "babel-types": "^6.0.0", + "chalk": "^2.0.1", + "jest-diff": "^23.6.0", + "jest-matcher-utils": "^23.6.0", + "jest-message-util": "^23.4.0", + "jest-resolve": "^23.6.0", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^23.6.0", + "semver": "^5.5.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==", + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "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==", + "jest-util": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-23.4.0.tgz", + "integrity": "sha1-TQY8uSe68KI4Mf9hvsLLv0l5NWE=", "dev": true, "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" + "callsites": "^2.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.11", + "is-ci": "^1.0.10", + "jest-message-util": "^23.4.0", + "mkdirp": "^0.5.1", + "slash": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + } } }, - "istanbul-reports": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz", - "integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==", + "jest-validate": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-23.6.0.tgz", + "integrity": "sha512-OFKapYxe72yz7agrDAWi8v2WL8GIfVqcbKRCLbRG9PAxtzF9b1SEDdTpytNDN12z2fJynoBwpMpvj2R39plI2A==", "dev": true, "requires": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" + "chalk": "^2.0.1", + "jest-get-type": "^22.1.0", + "leven": "^2.1.0", + "pretty-format": "^23.6.0" + } + }, + "jest-watcher": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-23.4.0.tgz", + "integrity": "sha1-0uKM50+NrWxq/JIrksq+9u0FyRw=", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "string-length": "^2.0.0" + }, + "dependencies": { + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + } } }, "jest-worker": { @@ -4054,12 +6865,63 @@ "esprima": "^4.0.0" } }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true - }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true + }, + "jsdom": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", + "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "acorn": "^5.5.3", + "acorn-globals": "^4.1.0", + "array-equal": "^1.0.0", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": "^1.0.0", + "data-urls": "^1.0.0", + "domexception": "^1.0.1", + "escodegen": "^1.9.1", + "html-encoding-sniffer": "^1.0.2", + "left-pad": "^1.3.0", + "nwsapi": "^2.0.7", + "parse5": "4.0.0", + "pn": "^1.1.0", + "request": "^2.87.0", + "request-promise-native": "^1.0.5", + "sax": "^1.2.4", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.3.4", + "w3c-hr-time": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.3", + "whatwg-mimetype": "^2.1.0", + "whatwg-url": "^6.4.1", + "ws": "^5.2.0", + "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "acorn": { + "version": "5.7.4", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", + "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", + "dev": true + }, + "ws": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.3.tgz", + "integrity": "sha512-jZArVERrMsKUatIdnLzqvcfydI85dvd/Fp1u/VOpfdDWQ4c9qWXe+VIeAbQ5FrDwciAkr+lzofXLz3Kuf26AOA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -4080,7 +6942,7 @@ }, "json-schema": { "version": "0.4.0", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "resolved": "https://nexus.es.ecg.tools/repository/npm-all/json-schema/-/json-schema-0.4.0.tgz", "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" }, "json-schema-traverse": { @@ -4245,12 +7107,39 @@ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, + "kleur": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-2.0.2.tgz", + "integrity": "sha512-77XF9iTllATmG9lSlIv0qdQ2BQ/h9t0bJllHlbvsQ0zUWfU7Yi0S8L5JXzPZgkefIiajLmBJJ4BsMJmqcf7oxQ==", + "dev": true + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, "lcov-parse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-1.0.0.tgz", "integrity": "sha1-6w1GtUER68VhrLTECO+TY73I9+A=", "dev": true }, + "left-pad": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", + "dev": true + }, + "leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "dev": true + }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", @@ -4261,6 +7150,36 @@ "type-check": "~0.3.2" } }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } + } + } + }, "loader-runner": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", @@ -4299,6 +7218,12 @@ "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", "dev": true }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, "log-driver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", @@ -4324,6 +7249,15 @@ "integrity": "sha1-OpoCg0UqR9dDnnJzG54H1zhuSfY=", "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" + } + }, "lru-cache": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", @@ -4366,6 +7300,24 @@ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, + "makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dev": true, + "requires": { + "tmpl": "1.0.5" + } + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "requires": { + "p-defer": "^1.0.0" + } + }, "map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -4387,6 +7339,12 @@ "object-visit": "^1.0.0" } }, + "math-random": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.4.tgz", + "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", + "dev": true + }, "md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -4404,6 +7362,17 @@ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, "memory-fs": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", @@ -4414,6 +7383,12 @@ "readable-stream": "^2.0.1" } }, + "merge": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", + "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==", + "dev": true + }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -4795,6 +7770,12 @@ } } }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, "node-libs-browser": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", @@ -4834,6 +7815,27 @@ } } }, + "node-notifier": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.5.tgz", + "integrity": "sha512-tVbHs7DyTLtzOiN78izLA85zRqB9NvEXkAf014Vx3jtSvn/xBl6bR8ZYifj+dFcFrKI21huSQgJZ6ZtL3B4HfQ==", + "dev": true, + "requires": { + "growly": "^1.3.0", + "is-wsl": "^1.1.0", + "semver": "^5.5.0", + "shellwords": "^0.1.1", + "which": "^1.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, "node-preload": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", @@ -4849,18 +7851,59 @@ "integrity": "sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==", "dev": true }, + "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": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "^2.0.0" + } + }, "null-check": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", "dev": true }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==", + "dev": true + }, "nyc": { "version": "15.1.0", "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", @@ -5005,6 +8048,123 @@ "object-keys": "^1.1.1" } }, + "object.getownpropertydescriptors": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz", + "integrity": "sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true + }, + "is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "object-inspect": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + } + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + } + }, "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", @@ -5079,12 +8239,47 @@ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", "dev": true }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, "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-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", + "dev": true + }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -5169,6 +8364,50 @@ "safe-buffer": "^5.1.1" } }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "^1.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" + } + }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, "parseqs": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", @@ -5253,6 +8492,25 @@ } } }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, "pathval": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", @@ -5299,6 +8557,21 @@ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" + } + }, "pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -5308,6 +8581,12 @@ "find-up": "^4.0.0" } }, + "pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", + "dev": true + }, "posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", @@ -5320,6 +8599,36 @@ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "pretty-format": { + "version": "23.6.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", + "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0", + "ansi-styles": "^3.2.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 + } + } + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, "process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -5359,6 +8668,16 @@ "integrity": "sha512-OzSf6gcCUQ01byV4BgwyUCswlaQQ6gzXc23aLQWhicvfX9kfsUiUhgt3CCQej8jDnl8/PhGF31JdHX2/MzF3WA==", "dev": true }, + "prompts": { + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-0.1.14.tgz", + "integrity": "sha512-rxkyiE9YH6zAz/rZpywySLKkpaj0NMVyNw1qhsubdbjjSgcayjTShDreZGlFMcGSu5sab3bAKPfFk78PB90+8w==", + "dev": true, + "requires": { + "kleur": "^2.0.1", + "sisteransi": "^0.1.1" + } + }, "propagate": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/propagate/-/propagate-0.3.1.tgz", @@ -5483,6 +8802,25 @@ "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", "dev": true }, + "randomatic": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", + "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", + "dev": true, + "requires": { + "is-number": "^4.0.0", + "kind-of": "^6.0.0", + "math-random": "^1.0.1" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + } + } + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -5520,6 +8858,48 @@ "unpipe": "1.0.0" } }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + } + } + }, "readable-stream": { "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", @@ -5558,6 +8938,30 @@ "picomatch": "^2.2.1" } }, + "realpath-native": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", + "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", + "dev": true, + "requires": { + "util.promisify": "^1.0.0" + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "^0.1.3" + } + }, "regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", @@ -5618,8 +9022,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true, - "optional": true + "dev": true }, "repeat-element": { "version": "1.1.3", @@ -5633,6 +9036,15 @@ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "^1.0.0" + } + }, "request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -5661,6 +9073,26 @@ "uuid": "^3.3.2" } }, + "request-promise-core": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", + "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", + "dev": true, + "requires": { + "lodash": "^4.17.19" + } + }, + "request-promise-native": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", + "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", + "dev": true, + "requires": { + "request-promise-core": "1.1.4", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -5688,6 +9120,23 @@ "path-parse": "^1.0.6" } }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + } + } + }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -5782,85 +9231,249 @@ "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "tslib": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", + "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==", + "dev": true + } + } + }, + "rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dev": true, + "requires": { + "estree-walker": "^0.6.1" + }, + "dependencies": { + "estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", + "dev": true + } + } + }, + "rsvp": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", + "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", + "dev": true + }, + "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 + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "rxjs": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", + "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "samsam": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz", + "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==", + "dev": true + }, + "sane": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/sane/-/sane-2.5.2.tgz", + "integrity": "sha1-tNwYYcIbQn6SlQej51HiosuKs/o=", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "capture-exit": "^1.2.0", + "exec-sh": "^0.2.0", + "fb-watchman": "^2.0.0", + "fsevents": "^1.2.3", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5", + "watch": "~0.18.0" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" } }, - "tslib": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz", - "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==", - "dev": true - } - } - }, - "rollup-pluginutils": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", - "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", - "dev": true, - "requires": { - "estree-walker": "^0.6.1" - }, - "dependencies": { - "estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", - "dev": true + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } } } }, - "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 - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "^1.1.1" - } - }, - "rxjs": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", - "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "samsam": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz", - "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==", + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true }, "schema-utils": { @@ -5964,6 +9577,31 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "dependencies": { + "object-inspect": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", + "dev": true + } + } + }, "signal-exit": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", @@ -5986,6 +9624,18 @@ "type-detect": "^4.0.0" } }, + "sisteransi": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-0.1.1.tgz", + "integrity": "sha512-PmGOd02bM9YO5ifxpw36nrNMBTptEtfRl4qUYl9SndkolplkrZZOW7PGHjrZL53QvMVj9nQ+TKqUnRsw4tJa4g==", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, "slice-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", @@ -6318,6 +9968,38 @@ } } }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "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.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", + "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", + "dev": true + }, "split": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", @@ -6368,6 +10050,23 @@ "figgy-pudding": "^3.5.1" } }, + "stack-utils": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.5.tgz", + "integrity": "sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + } + } + }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -6395,6 +10094,12 @@ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", "dev": true }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", + "dev": true + }, "stream-browserify": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", @@ -6467,6 +10172,33 @@ } } }, + "string-length": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", + "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", + "dev": true, + "requires": { + "astral-regex": "^1.0.0", + "strip-ansi": "^4.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 + }, + "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" + } + } + } + }, "string-width": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", @@ -6591,6 +10323,12 @@ "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -6606,6 +10344,12 @@ "has-flag": "^3.0.0" } }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, "table": { "version": "5.4.6", "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", @@ -6800,6 +10544,12 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, + "throat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", + "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", + "dev": true + }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -6834,6 +10584,12 @@ "os-tmpdir": "~1.0.2" } }, + "tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", + "dev": true + }, "to-array": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", @@ -6909,6 +10665,70 @@ "punycode": "^2.1.1" } }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "ts-jest": { + "version": "23.10.5", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-23.10.5.tgz", + "integrity": "sha512-MRCs9qnGoyKgFc8adDEntAOP64fWK1vZKnOYU1o2HxaqjdJvGqmkLCPCnVq1/If4zkUmEjKPnCiUisTrlX2p2A==", + "dev": true, + "requires": { + "bs-logger": "0.x", + "buffer-from": "1.x", + "fast-json-stable-stringify": "2.x", + "json5": "2.x", + "make-error": "1.x", + "mkdirp": "0.x", + "resolve": "1.x", + "semver": "^5.5", + "yargs-parser": "10.x" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "yargs-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, "ts-loader": { "version": "7.0.5", "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-7.0.5.tgz", @@ -7039,12 +10859,39 @@ "integrity": "sha512-tEu6DGxGgRJPb/mVPIZ48e69xCn2yRmCgYmDugAVwmJ6o+0u1RI18eO7E7WBTLYLaEVVOhwQmcdhQHweux/WPg==", "dev": true }, + "uglify-js": { + "version": "3.15.2", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.15.2.tgz", + "integrity": "sha512-peeoTk3hSwYdoc9nrdiEJk+gx1ALCtTjdYuKSXMTDqq7n1W7dHPqWDdSi+BPL0ni2YMeHD7hKUSdbj3TZauY2A==", + "dev": true, + "optional": true + }, "ultron": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", "dev": true }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + }, + "dependencies": { + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + } + } + }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -7212,6 +11059,19 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, + "util.promisify": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.1.1.tgz", + "integrity": "sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "for-each": "^0.3.3", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.1" + } + }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", @@ -7229,6 +11089,16 @@ "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==", "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" + } + }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", @@ -7252,6 +11122,34 @@ "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", "dev": true }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dev": true, + "requires": { + "makeerror": "1.0.12" + } + }, + "watch": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/watch/-/watch-0.18.0.tgz", + "integrity": "sha1-KAlUdsbffJDJYxOJkMClQj60uYY=", + "dev": true, + "requires": { + "exec-sh": "^0.2.0", + "minimist": "^1.2.0" + } + }, "watchpack": { "version": "1.7.4", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz", @@ -7494,6 +11392,12 @@ } } }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "dev": true + }, "webpack": { "version": "4.44.2", "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz", @@ -7679,6 +11583,32 @@ "source-map": "~0.6.1" } }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, + "whatwg-url": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -7688,6 +11618,19 @@ "isexe": "^2.0.0" } }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", @@ -7807,6 +11750,12 @@ } } }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, "xmlhttprequest-ssl": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", diff --git a/packages/optimizely-sdk/package.json b/packages/optimizely-sdk/package.json index 788783124..a4ffb7892 100644 --- a/packages/optimizely-sdk/package.json +++ b/packages/optimizely-sdk/package.json @@ -10,7 +10,7 @@ "scripts": { "clean": "rm -rf dist", "lint": "tsc --noEmit && eslint 'lib/**/*.js' 'lib/**/*.ts'", - "test": "TS_NODE_COMPILER_OPTIONS='{\"module\": \"commonjs\" }' mocha -r ts-node/register -r lib/tests/exit_on_unhandled_rejection.js 'lib/**/*.tests.ts' 'lib/**/*.tests.js'", + "test": "TS_NODE_COMPILER_OPTIONS='{\"module\": \"commonjs\" }' mocha -r ts-node/register -r lib/tests/exit_on_unhandled_rejection.js 'lib/**/*.tests.ts' 'lib/**/*.tests.js' && jest", "posttest": "npm run lint", "test-ci": "npm run test-xbrowser && npm run test-umdbrowser", "test-xbrowser": "karma start karma.bs.conf.js --single-run", @@ -47,7 +47,8 @@ "@optimizely/js-sdk-logging": "^0.3.1", "@optimizely/js-sdk-utils": "^0.4.0", "json-schema": "^0.4.0", - "murmurhash": "0.0.2" + "murmurhash": "0.0.2", + "uuid": "^3.3.2" }, "devDependencies": { "@rollup/plugin-commonjs": "^11.0.2", @@ -80,7 +81,11 @@ "ts-loader": "^7.0.5", "ts-node": "^8.10.2", "typescript": "^4.0.3", - "webpack": "^4.42.1" + "webpack": "^4.42.1", + "@types/jest": "^23.3.12", + "@types/uuid": "^3.4.4", + "jest": "^23.6.0", + "ts-jest": "^23.10.5" }, "publishConfig": { "access": "public" diff --git a/packages/optimizely-sdk/rollup.config.js b/packages/optimizely-sdk/rollup.config.js index 92f1af88b..dbde48acd 100644 --- a/packages/optimizely-sdk/rollup.config.js +++ b/packages/optimizely-sdk/rollup.config.js @@ -115,7 +115,7 @@ const jsonSchemaBundle = { commonjs(), typescript(typescriptPluginOptions), ], - external: ['json-schema', '@optimizely/js-sdk-utils'], + external: ['json-schema', '../../../modules/utils'], input: 'lib/utils/json_schema_validator/index.ts', output: { exports: 'named', From 37cab7bc964c1d5f3659e8c90cf2d523ed2a5aa9 Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Mon, 14 Mar 2022 20:59:19 +0500 Subject: [PATCH 02/59] logging integrated --- .../core/audience_evaluator/index.tests.js | 2 +- .../lib/core/audience_evaluator/index.ts | 2 +- .../optimizely-sdk/lib/core/bucketer/index.ts | 2 +- .../index.tests.js | 2 +- .../index.ts | 2 +- .../lib/core/decision_service/index.ts | 2 +- .../lib/core/event_builder/event_helpers.ts | 2 +- .../lib/core/event_builder/index.ts | 2 +- .../lib/core/notification_center/index.ts | 2 +- .../lib/core/project_config/index.tests.js | 2 +- .../lib/core/project_config/index.ts | 2 +- .../project_config_manager.tests.js | 2 +- .../project_config/project_config_manager.ts | 2 +- .../optimizely-sdk/lib/index.browser.tests.js | 2 +- packages/optimizely-sdk/lib/index.browser.ts | 2 +- packages/optimizely-sdk/lib/index.lite.ts | 2 +- packages/optimizely-sdk/lib/index.node.ts | 2 +- .../lib/index.react_native.tests.js | 2 +- .../optimizely-sdk/lib/index.react_native.ts | 2 +- .../lib/optimizely/index.tests.js | 2 +- .../optimizely-sdk/lib/optimizely/index.ts | 2 +- .../optimizely_user_context/index.tests.js | 2 +- .../http_polling_datafile_manager.ts | 2 +- .../lib/plugins/logger/index.react_native.ts | 2 +- .../lib/plugins/logger/index.ts | 2 +- .../lib/utils/event_tag_utils/index.ts | 2 +- .../lib/utils/semantic_version/index.ts | 2 +- .../modules/logging/__tests__/logger.spec.ts | 386 ++++++++++++++++++ .../modules/logging/errorHandler.ts | 67 +++ .../optimizely-sdk/modules/logging/index.ts | 18 + .../optimizely-sdk/modules/logging/logger.ts | 328 +++++++++++++++ .../optimizely-sdk/modules/logging/models.ts | 42 ++ packages/optimizely-sdk/rollup.config.js | 2 +- 33 files changed, 869 insertions(+), 28 deletions(-) create mode 100644 packages/optimizely-sdk/modules/logging/__tests__/logger.spec.ts create mode 100644 packages/optimizely-sdk/modules/logging/errorHandler.ts create mode 100644 packages/optimizely-sdk/modules/logging/index.ts create mode 100644 packages/optimizely-sdk/modules/logging/logger.ts create mode 100644 packages/optimizely-sdk/modules/logging/models.ts diff --git a/packages/optimizely-sdk/lib/core/audience_evaluator/index.tests.js b/packages/optimizely-sdk/lib/core/audience_evaluator/index.tests.js index 06d759d46..764819ed7 100644 --- a/packages/optimizely-sdk/lib/core/audience_evaluator/index.tests.js +++ b/packages/optimizely-sdk/lib/core/audience_evaluator/index.tests.js @@ -15,7 +15,7 @@ */ import sinon from 'sinon'; import { assert } from 'chai'; -import { getLogger } from '@optimizely/js-sdk-logging'; +import { getLogger } from '../../../modules/logging'; import { sprintf } from '../../../modules/utils'; import { createAudienceEvaluator } from './index'; diff --git a/packages/optimizely-sdk/lib/core/audience_evaluator/index.ts b/packages/optimizely-sdk/lib/core/audience_evaluator/index.ts index be6e8bfcd..82f1f9bc8 100644 --- a/packages/optimizely-sdk/lib/core/audience_evaluator/index.ts +++ b/packages/optimizely-sdk/lib/core/audience_evaluator/index.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { getLogger } from '@optimizely/js-sdk-logging'; +import { getLogger } from '../../../modules/logging'; import fns from '../../utils/fns'; import { diff --git a/packages/optimizely-sdk/lib/core/bucketer/index.ts b/packages/optimizely-sdk/lib/core/bucketer/index.ts index b26e30893..c8b40de51 100644 --- a/packages/optimizely-sdk/lib/core/bucketer/index.ts +++ b/packages/optimizely-sdk/lib/core/bucketer/index.ts @@ -19,7 +19,7 @@ */ import { sprintf } from '../../../modules/utils'; import murmurhash from 'murmurhash'; -import { LogHandler } from '@optimizely/js-sdk-logging'; +import { LogHandler } from '../../../modules/logging'; import { DecisionResponse, BucketerParams, diff --git a/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.tests.js b/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.tests.js index d4b165ab0..a9b3cee0a 100644 --- a/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.tests.js +++ b/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.tests.js @@ -21,7 +21,7 @@ import { LOG_LEVEL, LOG_MESSAGES, } from '../../utils/enums'; -import * as logging from '@optimizely/js-sdk-logging'; +import * as logging from '../../../modules/utils'; import * as customAttributeEvaluator from './'; var browserConditionSafari = { diff --git a/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.ts b/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.ts index f236533de..70298064c 100644 --- a/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.ts +++ b/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * * limitations under the License. * ***************************************************************************/ -import { getLogger } from '@optimizely/js-sdk-logging'; +import { getLogger } from '../../../modules/logging'; import { UserAttributes, Condition } from '../../shared_types'; import fns from '../../utils/fns'; diff --git a/packages/optimizely-sdk/lib/core/decision_service/index.ts b/packages/optimizely-sdk/lib/core/decision_service/index.ts index 02fe0f9e8..e6392a2cc 100644 --- a/packages/optimizely-sdk/lib/core/decision_service/index.ts +++ b/packages/optimizely-sdk/lib/core/decision_service/index.ts @@ -14,7 +14,7 @@ * limitations under the License. * ***************************************************************************/ import { sprintf } from '../../../modules/utils'; -import { LogHandler } from '@optimizely/js-sdk-logging'; +import { LogHandler } from '../../../modules/logging'; import fns from '../../utils/fns'; import { bucket } from '../bucketer'; diff --git a/packages/optimizely-sdk/lib/core/event_builder/event_helpers.ts b/packages/optimizely-sdk/lib/core/event_builder/event_helpers.ts index 9d2ae4609..d8e9ead57 100644 --- a/packages/optimizely-sdk/lib/core/event_builder/event_helpers.ts +++ b/packages/optimizely-sdk/lib/core/event_builder/event_helpers.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { getLogger } from '@optimizely/js-sdk-logging'; +import { getLogger } from '../../../modules/logging'; import fns from '../../utils/fns'; import * as eventTagUtils from '../../utils/event_tag_utils'; diff --git a/packages/optimizely-sdk/lib/core/event_builder/index.ts b/packages/optimizely-sdk/lib/core/event_builder/index.ts index 4c85c5fda..34ecfaa73 100644 --- a/packages/optimizely-sdk/lib/core/event_builder/index.ts +++ b/packages/optimizely-sdk/lib/core/event_builder/index.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { LoggerFacade } from '@optimizely/js-sdk-logging'; +import { LoggerFacade } from '../../../modules/logging'; import { EventV1 as CommonEventParams } from '@optimizely/js-sdk-event-processor'; import fns from '../../utils/fns'; diff --git a/packages/optimizely-sdk/lib/core/notification_center/index.ts b/packages/optimizely-sdk/lib/core/notification_center/index.ts index 2ad08b0ea..97bdf1a8b 100644 --- a/packages/optimizely-sdk/lib/core/notification_center/index.ts +++ b/packages/optimizely-sdk/lib/core/notification_center/index.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { objectValues } from '../../../modules/utils'; -import { LogHandler, ErrorHandler } from '@optimizely/js-sdk-logging'; +import { LogHandler, ErrorHandler } from '../../../modules/logging'; import { NOTIFICATION_TYPES as notificationTypesEnum } from '../../../modules/utils'; import { NotificationListener, ListenerPayload } from '../../shared_types'; diff --git a/packages/optimizely-sdk/lib/core/project_config/index.tests.js b/packages/optimizely-sdk/lib/core/project_config/index.tests.js index ff98cd630..1b837b70b 100644 --- a/packages/optimizely-sdk/lib/core/project_config/index.tests.js +++ b/packages/optimizely-sdk/lib/core/project_config/index.tests.js @@ -16,7 +16,7 @@ import sinon from 'sinon'; import { assert } from 'chai'; import { forEach, cloneDeep } from 'lodash'; -import { getLogger } from '@optimizely/js-sdk-logging'; +import { getLogger } from '../../../modules/logging'; import { sprintf } from '../../../modules/utils'; import fns from '../../utils/fns'; diff --git a/packages/optimizely-sdk/lib/core/project_config/index.ts b/packages/optimizely-sdk/lib/core/project_config/index.ts index a92089e01..4b52e9fc9 100644 --- a/packages/optimizely-sdk/lib/core/project_config/index.ts +++ b/packages/optimizely-sdk/lib/core/project_config/index.ts @@ -29,7 +29,7 @@ import { } from '../../utils/enums'; import configValidator from '../../utils/config_validator'; -import { LogHandler } from '@optimizely/js-sdk-logging'; +import { LogHandler } from '../../../modules/logging'; import { Audience, Experiment, diff --git a/packages/optimizely-sdk/lib/core/project_config/project_config_manager.tests.js b/packages/optimizely-sdk/lib/core/project_config/project_config_manager.tests.js index 20188f2d2..b90cfa9bb 100644 --- a/packages/optimizely-sdk/lib/core/project_config/project_config_manager.tests.js +++ b/packages/optimizely-sdk/lib/core/project_config/project_config_manager.tests.js @@ -18,7 +18,7 @@ import { assert } from 'chai'; import { cloneDeep } from 'lodash'; import { sprintf } from '../../../modules/utils'; -import * as logging from '@optimizely/js-sdk-logging'; +import * as logging from '../../../modules/logging'; import * as datafileManager from '@optimizely/js-sdk-datafile-manager'; import * as projectConfig from './index'; diff --git a/packages/optimizely-sdk/lib/core/project_config/project_config_manager.ts b/packages/optimizely-sdk/lib/core/project_config/project_config_manager.ts index 58ec462f0..54bf0e011 100644 --- a/packages/optimizely-sdk/lib/core/project_config/project_config_manager.ts +++ b/packages/optimizely-sdk/lib/core/project_config/project_config_manager.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { sprintf } from '../../../modules/utils'; -import { getLogger } from '@optimizely/js-sdk-logging'; +import { getLogger } from '../../../modules/logging'; import { ERROR_MESSAGES } from '../../utils/enums'; import { createOptimizelyConfig } from '../optimizely_config'; diff --git a/packages/optimizely-sdk/lib/index.browser.tests.js b/packages/optimizely-sdk/lib/index.browser.tests.js index 728224b4c..5a2885190 100644 --- a/packages/optimizely-sdk/lib/index.browser.tests.js +++ b/packages/optimizely-sdk/lib/index.browser.tests.js @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import * as logging from '@optimizely/js-sdk-logging'; +import * as logging from '../modules/logging'; import { assert } from 'chai'; import sinon from 'sinon'; diff --git a/packages/optimizely-sdk/lib/index.browser.ts b/packages/optimizely-sdk/lib/index.browser.ts index 59d23e694..05a3719dc 100644 --- a/packages/optimizely-sdk/lib/index.browser.ts +++ b/packages/optimizely-sdk/lib/index.browser.ts @@ -20,7 +20,7 @@ import { setErrorHandler, getErrorHandler, LogLevel -} from '@optimizely/js-sdk-logging'; +} from '../modules/logging'; import { LocalStoragePendingEventsDispatcher } from '@optimizely/js-sdk-event-processor'; import configValidator from './utils/config_validator'; import defaultErrorHandler from './plugins/error_handler'; diff --git a/packages/optimizely-sdk/lib/index.lite.ts b/packages/optimizely-sdk/lib/index.lite.ts index 86e30876d..dd2858d20 100644 --- a/packages/optimizely-sdk/lib/index.lite.ts +++ b/packages/optimizely-sdk/lib/index.lite.ts @@ -20,7 +20,7 @@ setErrorHandler, getErrorHandler, LogLevel - } from '@optimizely/js-sdk-logging'; + } from '../modules/logging'; import configValidator from './utils/config_validator'; import defaultErrorHandler from './plugins/error_handler'; import noOpEventDispatcher from './plugins/event_dispatcher/no_op'; diff --git a/packages/optimizely-sdk/lib/index.node.ts b/packages/optimizely-sdk/lib/index.node.ts index 99b5c7cd6..daa76c192 100644 --- a/packages/optimizely-sdk/lib/index.node.ts +++ b/packages/optimizely-sdk/lib/index.node.ts @@ -20,7 +20,7 @@ import { setErrorHandler, getErrorHandler, LogLevel -} from '@optimizely/js-sdk-logging'; +} from '../modules/logging'; import Optimizely from './optimizely'; import * as enums from './utils/enums'; import * as loggerPlugin from './plugins/logger'; diff --git a/packages/optimizely-sdk/lib/index.react_native.tests.js b/packages/optimizely-sdk/lib/index.react_native.tests.js index 0d3e92613..16af30222 100644 --- a/packages/optimizely-sdk/lib/index.react_native.tests.js +++ b/packages/optimizely-sdk/lib/index.react_native.tests.js @@ -15,7 +15,7 @@ */ import { assert } from 'chai'; import sinon from 'sinon'; -import * as logging from '@optimizely/js-sdk-logging'; +import * as logging from '../modules/logging'; import * as eventProcessor from './plugins/event_processor'; import Optimizely from './optimizely'; diff --git a/packages/optimizely-sdk/lib/index.react_native.ts b/packages/optimizely-sdk/lib/index.react_native.ts index 75c38cdcd..fb8bed02a 100644 --- a/packages/optimizely-sdk/lib/index.react_native.ts +++ b/packages/optimizely-sdk/lib/index.react_native.ts @@ -20,7 +20,7 @@ import { setErrorHandler, getErrorHandler, LogLevel -} from '@optimizely/js-sdk-logging'; +} from '../modules/logging'; import * as enums from './utils/enums'; import Optimizely from './optimizely'; import configValidator from './utils/config_validator'; diff --git a/packages/optimizely-sdk/lib/optimizely/index.tests.js b/packages/optimizely-sdk/lib/optimizely/index.tests.js index c4573967d..c6b5aa420 100644 --- a/packages/optimizely-sdk/lib/optimizely/index.tests.js +++ b/packages/optimizely-sdk/lib/optimizely/index.tests.js @@ -17,7 +17,7 @@ import { assert, expect } from 'chai'; import sinon from 'sinon'; import { sprintf, NOTIFICATION_TYPES } from '../../modules/utils'; import eventProcessor from '../plugins/event_processor'; -import * as logging from '@optimizely/js-sdk-logging'; +import * as logging from '../../modules/logging'; import Optimizely from './'; import OptimizelyUserContext from '../optimizely_user_context'; diff --git a/packages/optimizely-sdk/lib/optimizely/index.ts b/packages/optimizely-sdk/lib/optimizely/index.ts index 3fc3d8dd6..7983f0e04 100644 --- a/packages/optimizely-sdk/lib/optimizely/index.ts +++ b/packages/optimizely-sdk/lib/optimizely/index.ts @@ -14,7 +14,7 @@ * limitations under the License. * ***************************************************************************/ import { find, sprintf, objectValues, NotificationCenter } from '../../modules/utils'; -import { LoggerFacade, ErrorHandler } from '@optimizely/js-sdk-logging'; +import { LoggerFacade, ErrorHandler } from '../../modules/logging'; import { EventProcessor } from '@optimizely/js-sdk-event-processor'; import { diff --git a/packages/optimizely-sdk/lib/optimizely_user_context/index.tests.js b/packages/optimizely-sdk/lib/optimizely_user_context/index.tests.js index 39a9ef21b..3e75cde3a 100644 --- a/packages/optimizely-sdk/lib/optimizely_user_context/index.tests.js +++ b/packages/optimizely-sdk/lib/optimizely_user_context/index.tests.js @@ -16,7 +16,7 @@ import { assert } from 'chai'; import sinon from 'sinon'; -import * as logging from '@optimizely/js-sdk-logging'; +import * as logging from '../../modules/logging'; import { sprintf, NOTIFICATION_TYPES } from '../../modules/utils'; import OptimizelyUserContext from './'; diff --git a/packages/optimizely-sdk/lib/plugins/datafile_manager/http_polling_datafile_manager.ts b/packages/optimizely-sdk/lib/plugins/datafile_manager/http_polling_datafile_manager.ts index 5cca10bed..5cf9283a9 100644 --- a/packages/optimizely-sdk/lib/plugins/datafile_manager/http_polling_datafile_manager.ts +++ b/packages/optimizely-sdk/lib/plugins/datafile_manager/http_polling_datafile_manager.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { LoggerFacade } from '@optimizely/js-sdk-logging'; +import { LoggerFacade } from '../../../modules/logging'; import { HttpPollingDatafileManager } from '@optimizely/js-sdk-datafile-manager'; import { DatafileOptions, DatafileManagerConfig, DatafileManager } from '../../shared_types'; import { toDatafile, tryCreatingProjectConfig } from '../../core/project_config'; diff --git a/packages/optimizely-sdk/lib/plugins/logger/index.react_native.ts b/packages/optimizely-sdk/lib/plugins/logger/index.react_native.ts index aa0e2a24f..6ce370c9b 100644 --- a/packages/optimizely-sdk/lib/plugins/logger/index.react_native.ts +++ b/packages/optimizely-sdk/lib/plugins/logger/index.react_native.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { LogLevel } from '@optimizely/js-sdk-logging'; +import { LogLevel } from '../../../modules/logging'; import { sprintf } from '../../../modules/utils'; import { NoOpLogger } from './index'; diff --git a/packages/optimizely-sdk/lib/plugins/logger/index.ts b/packages/optimizely-sdk/lib/plugins/logger/index.ts index d0e09c0de..fc57f016a 100644 --- a/packages/optimizely-sdk/lib/plugins/logger/index.ts +++ b/packages/optimizely-sdk/lib/plugins/logger/index.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { ConsoleLogHandler, LogLevel } from '@optimizely/js-sdk-logging'; +import { ConsoleLogHandler, LogLevel } from '../../../modules/logging'; type ConsoleLogHandlerConfig = { logLevel?: LogLevel | string; diff --git a/packages/optimizely-sdk/lib/utils/event_tag_utils/index.ts b/packages/optimizely-sdk/lib/utils/event_tag_utils/index.ts index 86c37ad2a..9f0a62fdf 100644 --- a/packages/optimizely-sdk/lib/utils/event_tag_utils/index.ts +++ b/packages/optimizely-sdk/lib/utils/event_tag_utils/index.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { EventTags } from '@optimizely/js-sdk-event-processor'; -import { LoggerFacade } from '@optimizely/js-sdk-logging'; +import { LoggerFacade } from '../../../modules/logging'; import { LOG_LEVEL, diff --git a/packages/optimizely-sdk/lib/utils/semantic_version/index.ts b/packages/optimizely-sdk/lib/utils/semantic_version/index.ts index bb92013a0..099479a63 100644 --- a/packages/optimizely-sdk/lib/utils/semantic_version/index.ts +++ b/packages/optimizely-sdk/lib/utils/semantic_version/index.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { getLogger } from '@optimizely/js-sdk-logging'; +import { getLogger } from '../../../modules/logging'; import { VERSION_TYPE, LOG_MESSAGES } from '../enums'; const MODULE_NAME = 'SEMANTIC VERSION'; diff --git a/packages/optimizely-sdk/modules/logging/__tests__/logger.spec.ts b/packages/optimizely-sdk/modules/logging/__tests__/logger.spec.ts new file mode 100644 index 000000000..920ff0796 --- /dev/null +++ b/packages/optimizely-sdk/modules/logging/__tests__/logger.spec.ts @@ -0,0 +1,386 @@ +/// +import { + LogLevel, + LogHandler, + LoggerFacade, +} from '../models' + +import { + setLogHandler, + setLogLevel, + getLogger, + ConsoleLogHandler, + resetLogger, + getLogLevel, +} from '../logger' + +import { resetErrorHandler } from '../errorHandler' +import { ErrorHandler, setErrorHandler } from '../errorHandler' + +describe('logger', () => { + afterEach(() => { + resetLogger() + resetErrorHandler() + }) + + describe('OptimizelyLogger', () => { + let stubLogger: LogHandler + let logger: LoggerFacade + let stubErrorHandler: ErrorHandler + + beforeEach(() => { + stubLogger = { + log: jest.fn(), + } + stubErrorHandler = { + handleError: jest.fn(), + } + setLogLevel(LogLevel.DEBUG) + setLogHandler(stubLogger) + setErrorHandler(stubErrorHandler) + logger = getLogger() + }) + + describe('setLogLevel', () => { + it('should coerce "debug"', () => { + setLogLevel('debug') + expect(getLogLevel()).toBe(LogLevel.DEBUG) + }) + + it('should coerce "deBug"', () => { + setLogLevel('deBug') + expect(getLogLevel()).toBe(LogLevel.DEBUG) + }) + + it('should coerce "INFO"', () => { + setLogLevel('INFO') + expect(getLogLevel()).toBe(LogLevel.INFO) + }) + + it('should coerce "WARN"', () => { + setLogLevel('WARN') + expect(getLogLevel()).toBe(LogLevel.WARNING) + }) + + it('should coerce "warning"', () => { + setLogLevel('warning') + expect(getLogLevel()).toBe(LogLevel.WARNING) + }) + + it('should coerce "ERROR"', () => { + setLogLevel('WARN') + expect(getLogLevel()).toBe(LogLevel.WARNING) + }) + + it('should default to error if invalid', () => { + setLogLevel('invalid') + expect(getLogLevel()).toBe(LogLevel.ERROR) + }) + }) + + describe('getLogger(name)', () => { + it('should prepend the name in the log messages', () => { + const myLogger = getLogger('doit') + myLogger.info('test') + + expect(stubLogger.log).toHaveBeenCalledTimes(1) + expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.INFO, 'doit: test') + }) + }) + + describe('logger.log(level, msg)', () => { + it('should work with a string logLevel', () => { + setLogLevel(LogLevel.INFO) + logger.log('info', 'test') + + expect(stubLogger.log).toHaveBeenCalledTimes(1) + expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.INFO, 'test') + }) + + it('should call the loggerBackend when the message logLevel is equal to the configured logLevel threshold', () => { + setLogLevel(LogLevel.INFO) + logger.log(LogLevel.INFO, 'test') + + expect(stubLogger.log).toHaveBeenCalledTimes(1) + expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.INFO, 'test') + }) + + it('should call the loggerBackend when the message logLevel is above to the configured logLevel threshold', () => { + setLogLevel(LogLevel.INFO) + logger.log(LogLevel.WARNING, 'test') + + expect(stubLogger.log).toHaveBeenCalledTimes(1) + expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.WARNING, 'test') + }) + + it('should not call the loggerBackend when the message logLevel is above to the configured logLevel threshold', () => { + setLogLevel(LogLevel.INFO) + logger.log(LogLevel.DEBUG, 'test') + + expect(stubLogger.log).toHaveBeenCalledTimes(0) + }) + + it('should not throw if loggerBackend is not supplied', () => { + setLogLevel(LogLevel.INFO) + logger.log(LogLevel.ERROR, 'test') + }) + }) + + describe('logger.info', () => { + it('should handle info(message)', () => { + logger.info('test') + + expect(stubLogger.log).toHaveBeenCalledTimes(1) + expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.INFO, 'test') + }) + it('should handle info(message, ...splat)', () => { + logger.info('test: %s %s', 'hey', 'jude') + + expect(stubLogger.log).toHaveBeenCalledTimes(1) + expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.INFO, 'test: hey jude') + }) + + it('should handle info(message, ...splat, error)', () => { + const error = new Error('hey') + logger.info('test: %s', 'hey', error) + + expect(stubLogger.log).toHaveBeenCalledTimes(1) + expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.INFO, 'test: hey') + expect(stubErrorHandler.handleError).toHaveBeenCalledWith(error) + }) + + it('should handle info(error)', () => { + const error = new Error('hey') + logger.info(error) + + expect(stubLogger.log).toHaveBeenCalledTimes(1) + expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.INFO, 'hey') + expect(stubErrorHandler.handleError).toHaveBeenCalledWith(error) + }) + }) + + describe('logger.debug', () => { + it('should handle debug(message)', () => { + logger.debug('test') + + expect(stubLogger.log).toHaveBeenCalledTimes(1) + expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.DEBUG, 'test') + }) + + it('should handle debug(message, ...splat)', () => { + logger.debug('test: %s', 'hey') + + expect(stubLogger.log).toHaveBeenCalledTimes(1) + expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.DEBUG, 'test: hey') + }) + + it('should handle debug(message, ...splat, error)', () => { + const error = new Error('hey') + logger.debug('test: %s', 'hey', error) + + expect(stubLogger.log).toHaveBeenCalledTimes(1) + expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.DEBUG, 'test: hey') + expect(stubErrorHandler.handleError).toHaveBeenCalledWith(error) + }) + + it('should handle debug(error)', () => { + const error = new Error('hey') + logger.debug(error) + + expect(stubLogger.log).toHaveBeenCalledTimes(1) + expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.DEBUG, 'hey') + expect(stubErrorHandler.handleError).toHaveBeenCalledWith(error) + }) + }) + + describe('logger.warn', () => { + it('should handle warn(message)', () => { + logger.warn('test') + + expect(stubLogger.log).toHaveBeenCalledTimes(1) + expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.WARNING, 'test') + }) + + it('should handle warn(message, ...splat)', () => { + logger.warn('test: %s', 'hey') + + expect(stubLogger.log).toHaveBeenCalledTimes(1) + expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.WARNING, 'test: hey') + }) + + it('should handle warn(message, ...splat, error)', () => { + const error = new Error('hey') + logger.warn('test: %s', 'hey', error) + + expect(stubLogger.log).toHaveBeenCalledTimes(1) + expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.WARNING, 'test: hey') + expect(stubErrorHandler.handleError).toHaveBeenCalledWith(error) + }) + + it('should handle info(error)', () => { + const error = new Error('hey') + logger.warn(error) + + expect(stubLogger.log).toHaveBeenCalledTimes(1) + expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.WARNING, 'hey') + expect(stubErrorHandler.handleError).toHaveBeenCalledWith(error) + }) + }) + + describe('logger.error', () => { + it('should handle error(message)', () => { + logger.error('test') + + expect(stubLogger.log).toHaveBeenCalledTimes(1) + expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.ERROR, 'test') + }) + + it('should handle error(message, ...splat)', () => { + logger.error('test: %s', 'hey') + + expect(stubLogger.log).toHaveBeenCalledTimes(1) + expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.ERROR, 'test: hey') + }) + + it('should handle error(message, ...splat, error)', () => { + const error = new Error('hey') + logger.error('test: %s', 'hey', error) + + expect(stubLogger.log).toHaveBeenCalledTimes(1) + expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.ERROR, 'test: hey') + expect(stubErrorHandler.handleError).toHaveBeenCalledWith(error) + }) + + it('should handle error(error)', () => { + const error = new Error('hey') + logger.error(error) + + expect(stubLogger.log).toHaveBeenCalledTimes(1) + expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.ERROR, 'hey') + expect(stubErrorHandler.handleError).toHaveBeenCalledWith(error) + }) + + it('should work with an insufficient amount of splat args error(msg, ...splat, message)', () => { + const error = new Error('hey') + logger.error('hey %s', error) + + expect(stubLogger.log).toHaveBeenCalledTimes(1) + expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.ERROR, 'hey undefined') + expect(stubErrorHandler.handleError).toHaveBeenCalledWith(error) + }) + }) + + describe('using ConsoleLoggerHandler', () => { + beforeEach(() => { + jest.spyOn(console, 'info').mockImplementation(() => {}) + }) + + afterEach(() => { + jest.resetAllMocks() + }) + + it('should work with BasicLogger', () => { + const logger = new ConsoleLogHandler() + const TIME = '12:00' + setLogHandler(logger) + setLogLevel(LogLevel.INFO) + jest.spyOn(logger, 'getTime').mockImplementation(() => TIME) + + logger.log(LogLevel.INFO, 'hey') + + expect(console.info).toBeCalledTimes(1) + expect(console.info).toBeCalledWith('[OPTIMIZELY] - INFO 12:00 hey') + }) + + it('should set logLevel to ERROR when setLogLevel is called with invalid value', () => { + const logger = new ConsoleLogHandler() + logger.setLogLevel('invalid' as any) + + expect(logger.logLevel).toEqual(LogLevel.ERROR) + }) + + it('should set logLevel to ERROR when setLogLevel is called with no value', () => { + const logger = new ConsoleLogHandler() + // @ts-ignore + logger.setLogLevel() + + expect(logger.logLevel).toEqual(LogLevel.ERROR) + }) + }) + }) + + describe('ConsoleLogger', function() { + beforeEach(() => { + jest.spyOn(console, 'info') + jest.spyOn(console, 'log') + jest.spyOn(console, 'warn') + jest.spyOn(console, 'error') + }) + + afterEach(() => { + jest.resetAllMocks() + }) + + it('should log to console.info for LogLevel.INFO', () => { + const logger = new ConsoleLogHandler({ + logLevel: LogLevel.DEBUG, + }) + const TIME = '12:00' + jest.spyOn(logger, 'getTime').mockImplementation(() => TIME) + + logger.log(LogLevel.INFO, 'test') + + expect(console.info).toBeCalledTimes(1) + expect(console.info).toBeCalledWith('[OPTIMIZELY] - INFO 12:00 test') + }) + + it('should log to console.log for LogLevel.DEBUG', () => { + const logger = new ConsoleLogHandler({ + logLevel: LogLevel.DEBUG, + }) + const TIME = '12:00' + jest.spyOn(logger, 'getTime').mockImplementation(() => TIME) + + logger.log(LogLevel.DEBUG, 'debug') + + expect(console.log).toBeCalledTimes(1) + expect(console.log).toBeCalledWith('[OPTIMIZELY] - DEBUG 12:00 debug') + }) + + it('should log to console.warn for LogLevel.WARNING', () => { + const logger = new ConsoleLogHandler({ + logLevel: LogLevel.DEBUG, + }) + const TIME = '12:00' + jest.spyOn(logger, 'getTime').mockImplementation(() => TIME) + + logger.log(LogLevel.WARNING, 'warning') + + expect(console.warn).toBeCalledTimes(1) + expect(console.warn).toBeCalledWith('[OPTIMIZELY] - WARN 12:00 warning') + }) + + it('should log to console.error for LogLevel.ERROR', () => { + const logger = new ConsoleLogHandler({ + logLevel: LogLevel.DEBUG, + }) + const TIME = '12:00' + jest.spyOn(logger, 'getTime').mockImplementation(() => TIME) + + logger.log(LogLevel.ERROR, 'error') + + expect(console.error).toBeCalledTimes(1) + expect(console.error).toBeCalledWith('[OPTIMIZELY] - ERROR 12:00 error') + }) + + it('should not log if the configured logLevel is higher', () => { + const logger = new ConsoleLogHandler({ + logLevel: LogLevel.INFO, + }) + + logger.log(LogLevel.DEBUG, 'debug') + + expect(console.log).toBeCalledTimes(0) + }) + }) +}) diff --git a/packages/optimizely-sdk/modules/logging/errorHandler.ts b/packages/optimizely-sdk/modules/logging/errorHandler.ts new file mode 100644 index 000000000..bb659aeae --- /dev/null +++ b/packages/optimizely-sdk/modules/logging/errorHandler.ts @@ -0,0 +1,67 @@ +/** + * Copyright 2019, Optimizely + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @export + * @interface ErrorHandler + */ +export interface ErrorHandler { + /** + * @param {Error} exception + * @memberof ErrorHandler + */ + handleError(exception: Error): void +} + +/** + * @export + * @class NoopErrorHandler + * @implements {ErrorHandler} + */ +export class NoopErrorHandler implements ErrorHandler { + /** + * @param {Error} exception + * @memberof NoopErrorHandler + */ + handleError(exception: Error): void { + // no-op + return + } +} + +let globalErrorHandler: ErrorHandler = new NoopErrorHandler() + +/** + * @export + * @param {ErrorHandler} handler + */ +export function setErrorHandler(handler: ErrorHandler): void { + globalErrorHandler = handler +} + +/** + * @export + * @returns {ErrorHandler} + */ +export function getErrorHandler(): ErrorHandler { + return globalErrorHandler +} + +/** + * @export + */ +export function resetErrorHandler(): void { + globalErrorHandler = new NoopErrorHandler() +} diff --git a/packages/optimizely-sdk/modules/logging/index.ts b/packages/optimizely-sdk/modules/logging/index.ts new file mode 100644 index 000000000..47a1e99c8 --- /dev/null +++ b/packages/optimizely-sdk/modules/logging/index.ts @@ -0,0 +1,18 @@ +/** + * Copyright 2019, Optimizely + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export * from './errorHandler' +export * from './models' +export * from './logger' diff --git a/packages/optimizely-sdk/modules/logging/logger.ts b/packages/optimizely-sdk/modules/logging/logger.ts new file mode 100644 index 000000000..5647a798a --- /dev/null +++ b/packages/optimizely-sdk/modules/logging/logger.ts @@ -0,0 +1,328 @@ +/** + * Copyright 2019, Optimizely + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { getErrorHandler } from './errorHandler' +import { isValidEnum, sprintf } from '../utils' + +import { LogLevel, LoggerFacade, LogManager, LogHandler } from './models' + +type StringToLogLevel = { + NOTSET: number, + DEBUG: number, + INFO: number, + WARNING: number, + ERROR: number, +} + +const stringToLogLevel: StringToLogLevel = { + NOTSET: 0, + DEBUG: 1, + INFO: 2, + WARNING: 3, + ERROR: 4, +} + +function coerceLogLevel(level: any): LogLevel { + if (typeof level !== 'string') { + return level + } + + level = level.toUpperCase() + if (level === 'WARN') { + level = 'WARNING' + } + + if (!stringToLogLevel[level as keyof StringToLogLevel]) { + return level + } + + return stringToLogLevel[level as keyof StringToLogLevel] +} + +type LogData = { + message: string + splat: any[] + error?: Error +} + +class DefaultLogManager implements LogManager { + private loggers: { + [name: string]: LoggerFacade + } + private defaultLoggerFacade = new OptimizelyLogger() + + constructor() { + this.loggers = {} + } + + getLogger(name?: string): LoggerFacade { + if (!name) { + return this.defaultLoggerFacade + } + + if (!this.loggers[name]) { + this.loggers[name] = new OptimizelyLogger({ messagePrefix: name }) + } + + return this.loggers[name] + } +} + +type ConsoleLogHandlerConfig = { + logLevel?: LogLevel | string + logToConsole?: boolean + prefix?: string +} + +export class ConsoleLogHandler implements LogHandler { + public logLevel: LogLevel + private logToConsole: boolean + private prefix: string + + /** + * Creates an instance of ConsoleLogger. + * @param {ConsoleLogHandlerConfig} config + * @memberof ConsoleLogger + */ + constructor(config: ConsoleLogHandlerConfig = {}) { + this.logLevel = LogLevel.NOTSET + if (config.logLevel !== undefined && isValidEnum(LogLevel, config.logLevel)) { + this.setLogLevel(config.logLevel) + } + + this.logToConsole = config.logToConsole !== undefined ? !!config.logToConsole : true + this.prefix = config.prefix !== undefined ? config.prefix : '[OPTIMIZELY]' + } + + /** + * @param {LogLevel} level + * @param {string} message + * @memberof ConsoleLogger + */ + log(level: LogLevel, message: string) { + if (!this.shouldLog(level) || !this.logToConsole) { + return + } + + let logMessage: string = `${this.prefix} - ${this.getLogLevelName( + level, + )} ${this.getTime()} ${message}` + + this.consoleLog(level, [logMessage]) + } + + /** + * @param {LogLevel} level + * @memberof ConsoleLogger + */ + setLogLevel(level: LogLevel | string) { + level = coerceLogLevel(level) + if (!isValidEnum(LogLevel, level) || level === undefined) { + this.logLevel = LogLevel.ERROR + } else { + this.logLevel = level + } + } + + /** + * @returns {string} + * @memberof ConsoleLogger + */ + getTime(): string { + return new Date().toISOString() + } + + /** + * @private + * @param {LogLevel} targetLogLevel + * @returns {boolean} + * @memberof ConsoleLogger + */ + private shouldLog(targetLogLevel: LogLevel): boolean { + return targetLogLevel >= this.logLevel + } + + /** + * @private + * @param {LogLevel} logLevel + * @returns {string} + * @memberof ConsoleLogger + */ + private getLogLevelName(logLevel: LogLevel): string { + switch (logLevel) { + case LogLevel.DEBUG: + return 'DEBUG' + case LogLevel.INFO: + return 'INFO ' + case LogLevel.WARNING: + return 'WARN ' + case LogLevel.ERROR: + return 'ERROR' + default: + return 'NOTSET' + } + } + + /** + * @private + * @param {LogLevel} logLevel + * @param {string[]} logArguments + * @memberof ConsoleLogger + */ + private consoleLog(logLevel: LogLevel, logArguments: [string, ...string[]]) { + switch (logLevel) { + case LogLevel.DEBUG: + console.log.apply(console, logArguments) + break + case LogLevel.INFO: + console.info.apply(console, logArguments) + break + case LogLevel.WARNING: + console.warn.apply(console, logArguments) + break + case LogLevel.ERROR: + console.error.apply(console, logArguments) + break + default: + console.log.apply(console, logArguments) + } + } +} + +let globalLogLevel: LogLevel = LogLevel.NOTSET +let globalLogHandler: LogHandler | null = null + +class OptimizelyLogger implements LoggerFacade { + private messagePrefix: string = '' + + constructor(opts: { messagePrefix?: string } = {}) { + if (opts.messagePrefix) { + this.messagePrefix = opts.messagePrefix + } + } + + /** + * @param {(LogLevel | LogInputObject)} levelOrObj + * @param {string} [message] + * @memberof OptimizelyLogger + */ + log(level: LogLevel | string, message: string, ...splat: any[]): void { + this.internalLog(coerceLogLevel(level), { + message, + splat, + }) + } + + info(message: string | Error, ...splat: any[]): void { + this.namedLog(LogLevel.INFO, message, splat) + } + + debug(message: string | Error, ...splat: any[]): void { + this.namedLog(LogLevel.DEBUG, message, splat) + } + + warn(message: string | Error, ...splat: any[]): void { + this.namedLog(LogLevel.WARNING, message, splat) + } + + error(message: string | Error, ...splat: any[]): void { + this.namedLog(LogLevel.ERROR, message, splat) + } + + private format(data: LogData): string { + return `${this.messagePrefix ? this.messagePrefix + ': ' : ''}${sprintf( + data.message, + ...data.splat, + )}` + } + + private internalLog(level: LogLevel, data: LogData): void { + if (!globalLogHandler) { + return + } + + if (level < globalLogLevel) { + return + } + + globalLogHandler.log(level, this.format(data)) + + if (data.error && data.error instanceof Error) { + getErrorHandler().handleError(data.error) + } + } + + private namedLog(level: LogLevel, message: string | Error, splat: any[]): void { + let error: Error | undefined + + if (message instanceof Error) { + error = message + message = error.message + this.internalLog(level, { + error, + message, + splat, + }) + return + } + + if (splat.length === 0) { + this.internalLog(level, { + message, + splat, + }) + return + } + + const last = splat[splat.length - 1] + if (last instanceof Error) { + error = last + splat.splice(-1) + } + + this.internalLog(level, { message, error, splat }) + } +} + +let globalLogManager: LogManager = new DefaultLogManager() + +export function getLogger(name?: string): LoggerFacade { + return globalLogManager.getLogger(name) +} + +export function setLogHandler(logger: LogHandler | null) { + globalLogHandler = logger +} + +export function setLogLevel(level: LogLevel | string) { + level = coerceLogLevel(level) + if (!isValidEnum(LogLevel, level) || level === undefined) { + globalLogLevel = LogLevel.ERROR + } else { + globalLogLevel = level + } +} + +export function getLogLevel(): LogLevel { + return globalLogLevel +} + +/** + * Resets all global logger state to it's original + */ +export function resetLogger() { + globalLogManager = new DefaultLogManager() + globalLogLevel = LogLevel.NOTSET +} diff --git a/packages/optimizely-sdk/modules/logging/models.ts b/packages/optimizely-sdk/modules/logging/models.ts new file mode 100644 index 000000000..cd3223932 --- /dev/null +++ b/packages/optimizely-sdk/modules/logging/models.ts @@ -0,0 +1,42 @@ +/** + * Copyright 2019, Optimizely + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export enum LogLevel { + NOTSET = 0, + DEBUG = 1, + INFO = 2, + WARNING = 3, + ERROR = 4, +} + +export interface LoggerFacade { + log(level: LogLevel | string, message: string, ...splat: any[]): void + + info(message: string | Error, ...splat: any[]): void + + debug(message: string | Error, ...splat: any[]): void + + warn(message: string | Error, ...splat: any[]): void + + error(message: string | Error, ...splat: any[]): void +} + +export interface LogManager { + getLogger(name?: string): LoggerFacade +} + +export interface LogHandler { + log(level: LogLevel, message: string, ...splat: any[]): void +} diff --git a/packages/optimizely-sdk/rollup.config.js b/packages/optimizely-sdk/rollup.config.js index dbde48acd..e6f4bfe79 100644 --- a/packages/optimizely-sdk/rollup.config.js +++ b/packages/optimizely-sdk/rollup.config.js @@ -75,7 +75,7 @@ const umdBundle = { resolve({ browser: true }), commonjs({ namedExports: { - '@optimizely/js-sdk-logging': [ + '../../../modules/logging': [ 'ConsoleLogHandler', 'getLogger', 'setLogLevel', From 1d5368c178fde705aa4d079f55d6f1176d98dc75 Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Mon, 14 Mar 2022 23:09:26 +0500 Subject: [PATCH 03/59] testcases fix --- .../core/custom_attribute_condition_evaluator/index.tests.js | 2 +- packages/optimizely-sdk/lib/index.browser.tests.js | 2 +- packages/optimizely-sdk/lib/index.react_native.tests.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.tests.js b/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.tests.js index a9b3cee0a..c6068385d 100644 --- a/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.tests.js +++ b/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.tests.js @@ -21,7 +21,7 @@ import { LOG_LEVEL, LOG_MESSAGES, } from '../../utils/enums'; -import * as logging from '../../../modules/utils'; +import * as logging from '../../../modules/logging'; import * as customAttributeEvaluator from './'; var browserConditionSafari = { diff --git a/packages/optimizely-sdk/lib/index.browser.tests.js b/packages/optimizely-sdk/lib/index.browser.tests.js index 5a2885190..f469ff081 100644 --- a/packages/optimizely-sdk/lib/index.browser.tests.js +++ b/packages/optimizely-sdk/lib/index.browser.tests.js @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import * as logging from '../modules/logging'; +import * as logging from '../modules/logging/logger'; import { assert } from 'chai'; import sinon from 'sinon'; diff --git a/packages/optimizely-sdk/lib/index.react_native.tests.js b/packages/optimizely-sdk/lib/index.react_native.tests.js index 16af30222..52b8434ab 100644 --- a/packages/optimizely-sdk/lib/index.react_native.tests.js +++ b/packages/optimizely-sdk/lib/index.react_native.tests.js @@ -15,7 +15,7 @@ */ import { assert } from 'chai'; import sinon from 'sinon'; -import * as logging from '../modules/logging'; +import * as logging from '../modules/logging/logger'; import * as eventProcessor from './plugins/event_processor'; import Optimizely from './optimizely'; From 82b0fa1e71bd487fa67487c62ac2e61758bb67b6 Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Fri, 25 Mar 2022 20:47:32 +0500 Subject: [PATCH 04/59] revert logging --- .../core/audience_evaluator/index.tests.js | 2 +- .../lib/core/audience_evaluator/index.ts | 2 +- .../optimizely-sdk/lib/core/bucketer/index.ts | 2 +- .../index.tests.js | 2 +- .../index.ts | 2 +- .../lib/core/decision_service/index.ts | 2 +- .../lib/core/event_builder/event_helpers.ts | 2 +- .../lib/core/event_builder/index.ts | 2 +- .../lib/core/notification_center/index.ts | 2 +- .../lib/core/project_config/index.tests.js | 2 +- .../lib/core/project_config/index.ts | 2 +- .../project_config_manager.tests.js | 2 +- .../project_config/project_config_manager.ts | 2 +- .../optimizely-sdk/lib/index.browser.tests.js | 2 +- packages/optimizely-sdk/lib/index.browser.ts | 2 +- packages/optimizely-sdk/lib/index.lite.ts | 2 +- packages/optimizely-sdk/lib/index.node.ts | 2 +- .../lib/index.react_native.tests.js | 2 +- .../optimizely-sdk/lib/index.react_native.ts | 2 +- .../lib/optimizely/index.tests.js | 2 +- .../optimizely-sdk/lib/optimizely/index.ts | 2 +- .../optimizely_user_context/index.tests.js | 2 +- .../http_polling_datafile_manager.ts | 2 +- .../lib/plugins/logger/index.react_native.ts | 2 +- .../lib/plugins/logger/index.ts | 2 +- .../lib/utils/event_tag_utils/index.ts | 2 +- .../lib/utils/semantic_version/index.ts | 2 +- .../modules/logging/__tests__/logger.spec.ts | 386 ------------------ .../modules/logging/errorHandler.ts | 67 --- .../optimizely-sdk/modules/logging/index.ts | 18 - .../optimizely-sdk/modules/logging/logger.ts | 328 --------------- .../optimizely-sdk/modules/logging/models.ts | 42 -- packages/optimizely-sdk/rollup.config.js | 2 +- 33 files changed, 28 insertions(+), 869 deletions(-) delete mode 100644 packages/optimizely-sdk/modules/logging/__tests__/logger.spec.ts delete mode 100644 packages/optimizely-sdk/modules/logging/errorHandler.ts delete mode 100644 packages/optimizely-sdk/modules/logging/index.ts delete mode 100644 packages/optimizely-sdk/modules/logging/logger.ts delete mode 100644 packages/optimizely-sdk/modules/logging/models.ts diff --git a/packages/optimizely-sdk/lib/core/audience_evaluator/index.tests.js b/packages/optimizely-sdk/lib/core/audience_evaluator/index.tests.js index 764819ed7..06d759d46 100644 --- a/packages/optimizely-sdk/lib/core/audience_evaluator/index.tests.js +++ b/packages/optimizely-sdk/lib/core/audience_evaluator/index.tests.js @@ -15,7 +15,7 @@ */ import sinon from 'sinon'; import { assert } from 'chai'; -import { getLogger } from '../../../modules/logging'; +import { getLogger } from '@optimizely/js-sdk-logging'; import { sprintf } from '../../../modules/utils'; import { createAudienceEvaluator } from './index'; diff --git a/packages/optimizely-sdk/lib/core/audience_evaluator/index.ts b/packages/optimizely-sdk/lib/core/audience_evaluator/index.ts index 82f1f9bc8..be6e8bfcd 100644 --- a/packages/optimizely-sdk/lib/core/audience_evaluator/index.ts +++ b/packages/optimizely-sdk/lib/core/audience_evaluator/index.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { getLogger } from '../../../modules/logging'; +import { getLogger } from '@optimizely/js-sdk-logging'; import fns from '../../utils/fns'; import { diff --git a/packages/optimizely-sdk/lib/core/bucketer/index.ts b/packages/optimizely-sdk/lib/core/bucketer/index.ts index c8b40de51..b26e30893 100644 --- a/packages/optimizely-sdk/lib/core/bucketer/index.ts +++ b/packages/optimizely-sdk/lib/core/bucketer/index.ts @@ -19,7 +19,7 @@ */ import { sprintf } from '../../../modules/utils'; import murmurhash from 'murmurhash'; -import { LogHandler } from '../../../modules/logging'; +import { LogHandler } from '@optimizely/js-sdk-logging'; import { DecisionResponse, BucketerParams, diff --git a/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.tests.js b/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.tests.js index c6068385d..d4b165ab0 100644 --- a/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.tests.js +++ b/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.tests.js @@ -21,7 +21,7 @@ import { LOG_LEVEL, LOG_MESSAGES, } from '../../utils/enums'; -import * as logging from '../../../modules/logging'; +import * as logging from '@optimizely/js-sdk-logging'; import * as customAttributeEvaluator from './'; var browserConditionSafari = { diff --git a/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.ts b/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.ts index 70298064c..f236533de 100644 --- a/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.ts +++ b/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * * limitations under the License. * ***************************************************************************/ -import { getLogger } from '../../../modules/logging'; +import { getLogger } from '@optimizely/js-sdk-logging'; import { UserAttributes, Condition } from '../../shared_types'; import fns from '../../utils/fns'; diff --git a/packages/optimizely-sdk/lib/core/decision_service/index.ts b/packages/optimizely-sdk/lib/core/decision_service/index.ts index e6392a2cc..02fe0f9e8 100644 --- a/packages/optimizely-sdk/lib/core/decision_service/index.ts +++ b/packages/optimizely-sdk/lib/core/decision_service/index.ts @@ -14,7 +14,7 @@ * limitations under the License. * ***************************************************************************/ import { sprintf } from '../../../modules/utils'; -import { LogHandler } from '../../../modules/logging'; +import { LogHandler } from '@optimizely/js-sdk-logging'; import fns from '../../utils/fns'; import { bucket } from '../bucketer'; diff --git a/packages/optimizely-sdk/lib/core/event_builder/event_helpers.ts b/packages/optimizely-sdk/lib/core/event_builder/event_helpers.ts index d8e9ead57..9d2ae4609 100644 --- a/packages/optimizely-sdk/lib/core/event_builder/event_helpers.ts +++ b/packages/optimizely-sdk/lib/core/event_builder/event_helpers.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { getLogger } from '../../../modules/logging'; +import { getLogger } from '@optimizely/js-sdk-logging'; import fns from '../../utils/fns'; import * as eventTagUtils from '../../utils/event_tag_utils'; diff --git a/packages/optimizely-sdk/lib/core/event_builder/index.ts b/packages/optimizely-sdk/lib/core/event_builder/index.ts index 34ecfaa73..4c85c5fda 100644 --- a/packages/optimizely-sdk/lib/core/event_builder/index.ts +++ b/packages/optimizely-sdk/lib/core/event_builder/index.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { LoggerFacade } from '../../../modules/logging'; +import { LoggerFacade } from '@optimizely/js-sdk-logging'; import { EventV1 as CommonEventParams } from '@optimizely/js-sdk-event-processor'; import fns from '../../utils/fns'; diff --git a/packages/optimizely-sdk/lib/core/notification_center/index.ts b/packages/optimizely-sdk/lib/core/notification_center/index.ts index 97bdf1a8b..2ad08b0ea 100644 --- a/packages/optimizely-sdk/lib/core/notification_center/index.ts +++ b/packages/optimizely-sdk/lib/core/notification_center/index.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { objectValues } from '../../../modules/utils'; -import { LogHandler, ErrorHandler } from '../../../modules/logging'; +import { LogHandler, ErrorHandler } from '@optimizely/js-sdk-logging'; import { NOTIFICATION_TYPES as notificationTypesEnum } from '../../../modules/utils'; import { NotificationListener, ListenerPayload } from '../../shared_types'; diff --git a/packages/optimizely-sdk/lib/core/project_config/index.tests.js b/packages/optimizely-sdk/lib/core/project_config/index.tests.js index 1b837b70b..ff98cd630 100644 --- a/packages/optimizely-sdk/lib/core/project_config/index.tests.js +++ b/packages/optimizely-sdk/lib/core/project_config/index.tests.js @@ -16,7 +16,7 @@ import sinon from 'sinon'; import { assert } from 'chai'; import { forEach, cloneDeep } from 'lodash'; -import { getLogger } from '../../../modules/logging'; +import { getLogger } from '@optimizely/js-sdk-logging'; import { sprintf } from '../../../modules/utils'; import fns from '../../utils/fns'; diff --git a/packages/optimizely-sdk/lib/core/project_config/index.ts b/packages/optimizely-sdk/lib/core/project_config/index.ts index 4b52e9fc9..a92089e01 100644 --- a/packages/optimizely-sdk/lib/core/project_config/index.ts +++ b/packages/optimizely-sdk/lib/core/project_config/index.ts @@ -29,7 +29,7 @@ import { } from '../../utils/enums'; import configValidator from '../../utils/config_validator'; -import { LogHandler } from '../../../modules/logging'; +import { LogHandler } from '@optimizely/js-sdk-logging'; import { Audience, Experiment, diff --git a/packages/optimizely-sdk/lib/core/project_config/project_config_manager.tests.js b/packages/optimizely-sdk/lib/core/project_config/project_config_manager.tests.js index b90cfa9bb..20188f2d2 100644 --- a/packages/optimizely-sdk/lib/core/project_config/project_config_manager.tests.js +++ b/packages/optimizely-sdk/lib/core/project_config/project_config_manager.tests.js @@ -18,7 +18,7 @@ import { assert } from 'chai'; import { cloneDeep } from 'lodash'; import { sprintf } from '../../../modules/utils'; -import * as logging from '../../../modules/logging'; +import * as logging from '@optimizely/js-sdk-logging'; import * as datafileManager from '@optimizely/js-sdk-datafile-manager'; import * as projectConfig from './index'; diff --git a/packages/optimizely-sdk/lib/core/project_config/project_config_manager.ts b/packages/optimizely-sdk/lib/core/project_config/project_config_manager.ts index 54bf0e011..58ec462f0 100644 --- a/packages/optimizely-sdk/lib/core/project_config/project_config_manager.ts +++ b/packages/optimizely-sdk/lib/core/project_config/project_config_manager.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { sprintf } from '../../../modules/utils'; -import { getLogger } from '../../../modules/logging'; +import { getLogger } from '@optimizely/js-sdk-logging'; import { ERROR_MESSAGES } from '../../utils/enums'; import { createOptimizelyConfig } from '../optimizely_config'; diff --git a/packages/optimizely-sdk/lib/index.browser.tests.js b/packages/optimizely-sdk/lib/index.browser.tests.js index f469ff081..728224b4c 100644 --- a/packages/optimizely-sdk/lib/index.browser.tests.js +++ b/packages/optimizely-sdk/lib/index.browser.tests.js @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import * as logging from '../modules/logging/logger'; +import * as logging from '@optimizely/js-sdk-logging'; import { assert } from 'chai'; import sinon from 'sinon'; diff --git a/packages/optimizely-sdk/lib/index.browser.ts b/packages/optimizely-sdk/lib/index.browser.ts index 05a3719dc..59d23e694 100644 --- a/packages/optimizely-sdk/lib/index.browser.ts +++ b/packages/optimizely-sdk/lib/index.browser.ts @@ -20,7 +20,7 @@ import { setErrorHandler, getErrorHandler, LogLevel -} from '../modules/logging'; +} from '@optimizely/js-sdk-logging'; import { LocalStoragePendingEventsDispatcher } from '@optimizely/js-sdk-event-processor'; import configValidator from './utils/config_validator'; import defaultErrorHandler from './plugins/error_handler'; diff --git a/packages/optimizely-sdk/lib/index.lite.ts b/packages/optimizely-sdk/lib/index.lite.ts index dd2858d20..86e30876d 100644 --- a/packages/optimizely-sdk/lib/index.lite.ts +++ b/packages/optimizely-sdk/lib/index.lite.ts @@ -20,7 +20,7 @@ setErrorHandler, getErrorHandler, LogLevel - } from '../modules/logging'; + } from '@optimizely/js-sdk-logging'; import configValidator from './utils/config_validator'; import defaultErrorHandler from './plugins/error_handler'; import noOpEventDispatcher from './plugins/event_dispatcher/no_op'; diff --git a/packages/optimizely-sdk/lib/index.node.ts b/packages/optimizely-sdk/lib/index.node.ts index daa76c192..99b5c7cd6 100644 --- a/packages/optimizely-sdk/lib/index.node.ts +++ b/packages/optimizely-sdk/lib/index.node.ts @@ -20,7 +20,7 @@ import { setErrorHandler, getErrorHandler, LogLevel -} from '../modules/logging'; +} from '@optimizely/js-sdk-logging'; import Optimizely from './optimizely'; import * as enums from './utils/enums'; import * as loggerPlugin from './plugins/logger'; diff --git a/packages/optimizely-sdk/lib/index.react_native.tests.js b/packages/optimizely-sdk/lib/index.react_native.tests.js index 52b8434ab..0d3e92613 100644 --- a/packages/optimizely-sdk/lib/index.react_native.tests.js +++ b/packages/optimizely-sdk/lib/index.react_native.tests.js @@ -15,7 +15,7 @@ */ import { assert } from 'chai'; import sinon from 'sinon'; -import * as logging from '../modules/logging/logger'; +import * as logging from '@optimizely/js-sdk-logging'; import * as eventProcessor from './plugins/event_processor'; import Optimizely from './optimizely'; diff --git a/packages/optimizely-sdk/lib/index.react_native.ts b/packages/optimizely-sdk/lib/index.react_native.ts index fb8bed02a..75c38cdcd 100644 --- a/packages/optimizely-sdk/lib/index.react_native.ts +++ b/packages/optimizely-sdk/lib/index.react_native.ts @@ -20,7 +20,7 @@ import { setErrorHandler, getErrorHandler, LogLevel -} from '../modules/logging'; +} from '@optimizely/js-sdk-logging'; import * as enums from './utils/enums'; import Optimizely from './optimizely'; import configValidator from './utils/config_validator'; diff --git a/packages/optimizely-sdk/lib/optimizely/index.tests.js b/packages/optimizely-sdk/lib/optimizely/index.tests.js index c6b5aa420..c4573967d 100644 --- a/packages/optimizely-sdk/lib/optimizely/index.tests.js +++ b/packages/optimizely-sdk/lib/optimizely/index.tests.js @@ -17,7 +17,7 @@ import { assert, expect } from 'chai'; import sinon from 'sinon'; import { sprintf, NOTIFICATION_TYPES } from '../../modules/utils'; import eventProcessor from '../plugins/event_processor'; -import * as logging from '../../modules/logging'; +import * as logging from '@optimizely/js-sdk-logging'; import Optimizely from './'; import OptimizelyUserContext from '../optimizely_user_context'; diff --git a/packages/optimizely-sdk/lib/optimizely/index.ts b/packages/optimizely-sdk/lib/optimizely/index.ts index 7983f0e04..3fc3d8dd6 100644 --- a/packages/optimizely-sdk/lib/optimizely/index.ts +++ b/packages/optimizely-sdk/lib/optimizely/index.ts @@ -14,7 +14,7 @@ * limitations under the License. * ***************************************************************************/ import { find, sprintf, objectValues, NotificationCenter } from '../../modules/utils'; -import { LoggerFacade, ErrorHandler } from '../../modules/logging'; +import { LoggerFacade, ErrorHandler } from '@optimizely/js-sdk-logging'; import { EventProcessor } from '@optimizely/js-sdk-event-processor'; import { diff --git a/packages/optimizely-sdk/lib/optimizely_user_context/index.tests.js b/packages/optimizely-sdk/lib/optimizely_user_context/index.tests.js index 3e75cde3a..39a9ef21b 100644 --- a/packages/optimizely-sdk/lib/optimizely_user_context/index.tests.js +++ b/packages/optimizely-sdk/lib/optimizely_user_context/index.tests.js @@ -16,7 +16,7 @@ import { assert } from 'chai'; import sinon from 'sinon'; -import * as logging from '../../modules/logging'; +import * as logging from '@optimizely/js-sdk-logging'; import { sprintf, NOTIFICATION_TYPES } from '../../modules/utils'; import OptimizelyUserContext from './'; diff --git a/packages/optimizely-sdk/lib/plugins/datafile_manager/http_polling_datafile_manager.ts b/packages/optimizely-sdk/lib/plugins/datafile_manager/http_polling_datafile_manager.ts index 5cf9283a9..5cca10bed 100644 --- a/packages/optimizely-sdk/lib/plugins/datafile_manager/http_polling_datafile_manager.ts +++ b/packages/optimizely-sdk/lib/plugins/datafile_manager/http_polling_datafile_manager.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { LoggerFacade } from '../../../modules/logging'; +import { LoggerFacade } from '@optimizely/js-sdk-logging'; import { HttpPollingDatafileManager } from '@optimizely/js-sdk-datafile-manager'; import { DatafileOptions, DatafileManagerConfig, DatafileManager } from '../../shared_types'; import { toDatafile, tryCreatingProjectConfig } from '../../core/project_config'; diff --git a/packages/optimizely-sdk/lib/plugins/logger/index.react_native.ts b/packages/optimizely-sdk/lib/plugins/logger/index.react_native.ts index 6ce370c9b..aa0e2a24f 100644 --- a/packages/optimizely-sdk/lib/plugins/logger/index.react_native.ts +++ b/packages/optimizely-sdk/lib/plugins/logger/index.react_native.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { LogLevel } from '../../../modules/logging'; +import { LogLevel } from '@optimizely/js-sdk-logging'; import { sprintf } from '../../../modules/utils'; import { NoOpLogger } from './index'; diff --git a/packages/optimizely-sdk/lib/plugins/logger/index.ts b/packages/optimizely-sdk/lib/plugins/logger/index.ts index fc57f016a..d0e09c0de 100644 --- a/packages/optimizely-sdk/lib/plugins/logger/index.ts +++ b/packages/optimizely-sdk/lib/plugins/logger/index.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { ConsoleLogHandler, LogLevel } from '../../../modules/logging'; +import { ConsoleLogHandler, LogLevel } from '@optimizely/js-sdk-logging'; type ConsoleLogHandlerConfig = { logLevel?: LogLevel | string; diff --git a/packages/optimizely-sdk/lib/utils/event_tag_utils/index.ts b/packages/optimizely-sdk/lib/utils/event_tag_utils/index.ts index 9f0a62fdf..86c37ad2a 100644 --- a/packages/optimizely-sdk/lib/utils/event_tag_utils/index.ts +++ b/packages/optimizely-sdk/lib/utils/event_tag_utils/index.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { EventTags } from '@optimizely/js-sdk-event-processor'; -import { LoggerFacade } from '../../../modules/logging'; +import { LoggerFacade } from '@optimizely/js-sdk-logging'; import { LOG_LEVEL, diff --git a/packages/optimizely-sdk/lib/utils/semantic_version/index.ts b/packages/optimizely-sdk/lib/utils/semantic_version/index.ts index 099479a63..bb92013a0 100644 --- a/packages/optimizely-sdk/lib/utils/semantic_version/index.ts +++ b/packages/optimizely-sdk/lib/utils/semantic_version/index.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { getLogger } from '../../../modules/logging'; +import { getLogger } from '@optimizely/js-sdk-logging'; import { VERSION_TYPE, LOG_MESSAGES } from '../enums'; const MODULE_NAME = 'SEMANTIC VERSION'; diff --git a/packages/optimizely-sdk/modules/logging/__tests__/logger.spec.ts b/packages/optimizely-sdk/modules/logging/__tests__/logger.spec.ts deleted file mode 100644 index 920ff0796..000000000 --- a/packages/optimizely-sdk/modules/logging/__tests__/logger.spec.ts +++ /dev/null @@ -1,386 +0,0 @@ -/// -import { - LogLevel, - LogHandler, - LoggerFacade, -} from '../models' - -import { - setLogHandler, - setLogLevel, - getLogger, - ConsoleLogHandler, - resetLogger, - getLogLevel, -} from '../logger' - -import { resetErrorHandler } from '../errorHandler' -import { ErrorHandler, setErrorHandler } from '../errorHandler' - -describe('logger', () => { - afterEach(() => { - resetLogger() - resetErrorHandler() - }) - - describe('OptimizelyLogger', () => { - let stubLogger: LogHandler - let logger: LoggerFacade - let stubErrorHandler: ErrorHandler - - beforeEach(() => { - stubLogger = { - log: jest.fn(), - } - stubErrorHandler = { - handleError: jest.fn(), - } - setLogLevel(LogLevel.DEBUG) - setLogHandler(stubLogger) - setErrorHandler(stubErrorHandler) - logger = getLogger() - }) - - describe('setLogLevel', () => { - it('should coerce "debug"', () => { - setLogLevel('debug') - expect(getLogLevel()).toBe(LogLevel.DEBUG) - }) - - it('should coerce "deBug"', () => { - setLogLevel('deBug') - expect(getLogLevel()).toBe(LogLevel.DEBUG) - }) - - it('should coerce "INFO"', () => { - setLogLevel('INFO') - expect(getLogLevel()).toBe(LogLevel.INFO) - }) - - it('should coerce "WARN"', () => { - setLogLevel('WARN') - expect(getLogLevel()).toBe(LogLevel.WARNING) - }) - - it('should coerce "warning"', () => { - setLogLevel('warning') - expect(getLogLevel()).toBe(LogLevel.WARNING) - }) - - it('should coerce "ERROR"', () => { - setLogLevel('WARN') - expect(getLogLevel()).toBe(LogLevel.WARNING) - }) - - it('should default to error if invalid', () => { - setLogLevel('invalid') - expect(getLogLevel()).toBe(LogLevel.ERROR) - }) - }) - - describe('getLogger(name)', () => { - it('should prepend the name in the log messages', () => { - const myLogger = getLogger('doit') - myLogger.info('test') - - expect(stubLogger.log).toHaveBeenCalledTimes(1) - expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.INFO, 'doit: test') - }) - }) - - describe('logger.log(level, msg)', () => { - it('should work with a string logLevel', () => { - setLogLevel(LogLevel.INFO) - logger.log('info', 'test') - - expect(stubLogger.log).toHaveBeenCalledTimes(1) - expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.INFO, 'test') - }) - - it('should call the loggerBackend when the message logLevel is equal to the configured logLevel threshold', () => { - setLogLevel(LogLevel.INFO) - logger.log(LogLevel.INFO, 'test') - - expect(stubLogger.log).toHaveBeenCalledTimes(1) - expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.INFO, 'test') - }) - - it('should call the loggerBackend when the message logLevel is above to the configured logLevel threshold', () => { - setLogLevel(LogLevel.INFO) - logger.log(LogLevel.WARNING, 'test') - - expect(stubLogger.log).toHaveBeenCalledTimes(1) - expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.WARNING, 'test') - }) - - it('should not call the loggerBackend when the message logLevel is above to the configured logLevel threshold', () => { - setLogLevel(LogLevel.INFO) - logger.log(LogLevel.DEBUG, 'test') - - expect(stubLogger.log).toHaveBeenCalledTimes(0) - }) - - it('should not throw if loggerBackend is not supplied', () => { - setLogLevel(LogLevel.INFO) - logger.log(LogLevel.ERROR, 'test') - }) - }) - - describe('logger.info', () => { - it('should handle info(message)', () => { - logger.info('test') - - expect(stubLogger.log).toHaveBeenCalledTimes(1) - expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.INFO, 'test') - }) - it('should handle info(message, ...splat)', () => { - logger.info('test: %s %s', 'hey', 'jude') - - expect(stubLogger.log).toHaveBeenCalledTimes(1) - expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.INFO, 'test: hey jude') - }) - - it('should handle info(message, ...splat, error)', () => { - const error = new Error('hey') - logger.info('test: %s', 'hey', error) - - expect(stubLogger.log).toHaveBeenCalledTimes(1) - expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.INFO, 'test: hey') - expect(stubErrorHandler.handleError).toHaveBeenCalledWith(error) - }) - - it('should handle info(error)', () => { - const error = new Error('hey') - logger.info(error) - - expect(stubLogger.log).toHaveBeenCalledTimes(1) - expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.INFO, 'hey') - expect(stubErrorHandler.handleError).toHaveBeenCalledWith(error) - }) - }) - - describe('logger.debug', () => { - it('should handle debug(message)', () => { - logger.debug('test') - - expect(stubLogger.log).toHaveBeenCalledTimes(1) - expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.DEBUG, 'test') - }) - - it('should handle debug(message, ...splat)', () => { - logger.debug('test: %s', 'hey') - - expect(stubLogger.log).toHaveBeenCalledTimes(1) - expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.DEBUG, 'test: hey') - }) - - it('should handle debug(message, ...splat, error)', () => { - const error = new Error('hey') - logger.debug('test: %s', 'hey', error) - - expect(stubLogger.log).toHaveBeenCalledTimes(1) - expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.DEBUG, 'test: hey') - expect(stubErrorHandler.handleError).toHaveBeenCalledWith(error) - }) - - it('should handle debug(error)', () => { - const error = new Error('hey') - logger.debug(error) - - expect(stubLogger.log).toHaveBeenCalledTimes(1) - expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.DEBUG, 'hey') - expect(stubErrorHandler.handleError).toHaveBeenCalledWith(error) - }) - }) - - describe('logger.warn', () => { - it('should handle warn(message)', () => { - logger.warn('test') - - expect(stubLogger.log).toHaveBeenCalledTimes(1) - expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.WARNING, 'test') - }) - - it('should handle warn(message, ...splat)', () => { - logger.warn('test: %s', 'hey') - - expect(stubLogger.log).toHaveBeenCalledTimes(1) - expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.WARNING, 'test: hey') - }) - - it('should handle warn(message, ...splat, error)', () => { - const error = new Error('hey') - logger.warn('test: %s', 'hey', error) - - expect(stubLogger.log).toHaveBeenCalledTimes(1) - expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.WARNING, 'test: hey') - expect(stubErrorHandler.handleError).toHaveBeenCalledWith(error) - }) - - it('should handle info(error)', () => { - const error = new Error('hey') - logger.warn(error) - - expect(stubLogger.log).toHaveBeenCalledTimes(1) - expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.WARNING, 'hey') - expect(stubErrorHandler.handleError).toHaveBeenCalledWith(error) - }) - }) - - describe('logger.error', () => { - it('should handle error(message)', () => { - logger.error('test') - - expect(stubLogger.log).toHaveBeenCalledTimes(1) - expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.ERROR, 'test') - }) - - it('should handle error(message, ...splat)', () => { - logger.error('test: %s', 'hey') - - expect(stubLogger.log).toHaveBeenCalledTimes(1) - expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.ERROR, 'test: hey') - }) - - it('should handle error(message, ...splat, error)', () => { - const error = new Error('hey') - logger.error('test: %s', 'hey', error) - - expect(stubLogger.log).toHaveBeenCalledTimes(1) - expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.ERROR, 'test: hey') - expect(stubErrorHandler.handleError).toHaveBeenCalledWith(error) - }) - - it('should handle error(error)', () => { - const error = new Error('hey') - logger.error(error) - - expect(stubLogger.log).toHaveBeenCalledTimes(1) - expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.ERROR, 'hey') - expect(stubErrorHandler.handleError).toHaveBeenCalledWith(error) - }) - - it('should work with an insufficient amount of splat args error(msg, ...splat, message)', () => { - const error = new Error('hey') - logger.error('hey %s', error) - - expect(stubLogger.log).toHaveBeenCalledTimes(1) - expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.ERROR, 'hey undefined') - expect(stubErrorHandler.handleError).toHaveBeenCalledWith(error) - }) - }) - - describe('using ConsoleLoggerHandler', () => { - beforeEach(() => { - jest.spyOn(console, 'info').mockImplementation(() => {}) - }) - - afterEach(() => { - jest.resetAllMocks() - }) - - it('should work with BasicLogger', () => { - const logger = new ConsoleLogHandler() - const TIME = '12:00' - setLogHandler(logger) - setLogLevel(LogLevel.INFO) - jest.spyOn(logger, 'getTime').mockImplementation(() => TIME) - - logger.log(LogLevel.INFO, 'hey') - - expect(console.info).toBeCalledTimes(1) - expect(console.info).toBeCalledWith('[OPTIMIZELY] - INFO 12:00 hey') - }) - - it('should set logLevel to ERROR when setLogLevel is called with invalid value', () => { - const logger = new ConsoleLogHandler() - logger.setLogLevel('invalid' as any) - - expect(logger.logLevel).toEqual(LogLevel.ERROR) - }) - - it('should set logLevel to ERROR when setLogLevel is called with no value', () => { - const logger = new ConsoleLogHandler() - // @ts-ignore - logger.setLogLevel() - - expect(logger.logLevel).toEqual(LogLevel.ERROR) - }) - }) - }) - - describe('ConsoleLogger', function() { - beforeEach(() => { - jest.spyOn(console, 'info') - jest.spyOn(console, 'log') - jest.spyOn(console, 'warn') - jest.spyOn(console, 'error') - }) - - afterEach(() => { - jest.resetAllMocks() - }) - - it('should log to console.info for LogLevel.INFO', () => { - const logger = new ConsoleLogHandler({ - logLevel: LogLevel.DEBUG, - }) - const TIME = '12:00' - jest.spyOn(logger, 'getTime').mockImplementation(() => TIME) - - logger.log(LogLevel.INFO, 'test') - - expect(console.info).toBeCalledTimes(1) - expect(console.info).toBeCalledWith('[OPTIMIZELY] - INFO 12:00 test') - }) - - it('should log to console.log for LogLevel.DEBUG', () => { - const logger = new ConsoleLogHandler({ - logLevel: LogLevel.DEBUG, - }) - const TIME = '12:00' - jest.spyOn(logger, 'getTime').mockImplementation(() => TIME) - - logger.log(LogLevel.DEBUG, 'debug') - - expect(console.log).toBeCalledTimes(1) - expect(console.log).toBeCalledWith('[OPTIMIZELY] - DEBUG 12:00 debug') - }) - - it('should log to console.warn for LogLevel.WARNING', () => { - const logger = new ConsoleLogHandler({ - logLevel: LogLevel.DEBUG, - }) - const TIME = '12:00' - jest.spyOn(logger, 'getTime').mockImplementation(() => TIME) - - logger.log(LogLevel.WARNING, 'warning') - - expect(console.warn).toBeCalledTimes(1) - expect(console.warn).toBeCalledWith('[OPTIMIZELY] - WARN 12:00 warning') - }) - - it('should log to console.error for LogLevel.ERROR', () => { - const logger = new ConsoleLogHandler({ - logLevel: LogLevel.DEBUG, - }) - const TIME = '12:00' - jest.spyOn(logger, 'getTime').mockImplementation(() => TIME) - - logger.log(LogLevel.ERROR, 'error') - - expect(console.error).toBeCalledTimes(1) - expect(console.error).toBeCalledWith('[OPTIMIZELY] - ERROR 12:00 error') - }) - - it('should not log if the configured logLevel is higher', () => { - const logger = new ConsoleLogHandler({ - logLevel: LogLevel.INFO, - }) - - logger.log(LogLevel.DEBUG, 'debug') - - expect(console.log).toBeCalledTimes(0) - }) - }) -}) diff --git a/packages/optimizely-sdk/modules/logging/errorHandler.ts b/packages/optimizely-sdk/modules/logging/errorHandler.ts deleted file mode 100644 index bb659aeae..000000000 --- a/packages/optimizely-sdk/modules/logging/errorHandler.ts +++ /dev/null @@ -1,67 +0,0 @@ -/** - * Copyright 2019, Optimizely - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * @export - * @interface ErrorHandler - */ -export interface ErrorHandler { - /** - * @param {Error} exception - * @memberof ErrorHandler - */ - handleError(exception: Error): void -} - -/** - * @export - * @class NoopErrorHandler - * @implements {ErrorHandler} - */ -export class NoopErrorHandler implements ErrorHandler { - /** - * @param {Error} exception - * @memberof NoopErrorHandler - */ - handleError(exception: Error): void { - // no-op - return - } -} - -let globalErrorHandler: ErrorHandler = new NoopErrorHandler() - -/** - * @export - * @param {ErrorHandler} handler - */ -export function setErrorHandler(handler: ErrorHandler): void { - globalErrorHandler = handler -} - -/** - * @export - * @returns {ErrorHandler} - */ -export function getErrorHandler(): ErrorHandler { - return globalErrorHandler -} - -/** - * @export - */ -export function resetErrorHandler(): void { - globalErrorHandler = new NoopErrorHandler() -} diff --git a/packages/optimizely-sdk/modules/logging/index.ts b/packages/optimizely-sdk/modules/logging/index.ts deleted file mode 100644 index 47a1e99c8..000000000 --- a/packages/optimizely-sdk/modules/logging/index.ts +++ /dev/null @@ -1,18 +0,0 @@ -/** - * Copyright 2019, Optimizely - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -export * from './errorHandler' -export * from './models' -export * from './logger' diff --git a/packages/optimizely-sdk/modules/logging/logger.ts b/packages/optimizely-sdk/modules/logging/logger.ts deleted file mode 100644 index 5647a798a..000000000 --- a/packages/optimizely-sdk/modules/logging/logger.ts +++ /dev/null @@ -1,328 +0,0 @@ -/** - * Copyright 2019, Optimizely - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { getErrorHandler } from './errorHandler' -import { isValidEnum, sprintf } from '../utils' - -import { LogLevel, LoggerFacade, LogManager, LogHandler } from './models' - -type StringToLogLevel = { - NOTSET: number, - DEBUG: number, - INFO: number, - WARNING: number, - ERROR: number, -} - -const stringToLogLevel: StringToLogLevel = { - NOTSET: 0, - DEBUG: 1, - INFO: 2, - WARNING: 3, - ERROR: 4, -} - -function coerceLogLevel(level: any): LogLevel { - if (typeof level !== 'string') { - return level - } - - level = level.toUpperCase() - if (level === 'WARN') { - level = 'WARNING' - } - - if (!stringToLogLevel[level as keyof StringToLogLevel]) { - return level - } - - return stringToLogLevel[level as keyof StringToLogLevel] -} - -type LogData = { - message: string - splat: any[] - error?: Error -} - -class DefaultLogManager implements LogManager { - private loggers: { - [name: string]: LoggerFacade - } - private defaultLoggerFacade = new OptimizelyLogger() - - constructor() { - this.loggers = {} - } - - getLogger(name?: string): LoggerFacade { - if (!name) { - return this.defaultLoggerFacade - } - - if (!this.loggers[name]) { - this.loggers[name] = new OptimizelyLogger({ messagePrefix: name }) - } - - return this.loggers[name] - } -} - -type ConsoleLogHandlerConfig = { - logLevel?: LogLevel | string - logToConsole?: boolean - prefix?: string -} - -export class ConsoleLogHandler implements LogHandler { - public logLevel: LogLevel - private logToConsole: boolean - private prefix: string - - /** - * Creates an instance of ConsoleLogger. - * @param {ConsoleLogHandlerConfig} config - * @memberof ConsoleLogger - */ - constructor(config: ConsoleLogHandlerConfig = {}) { - this.logLevel = LogLevel.NOTSET - if (config.logLevel !== undefined && isValidEnum(LogLevel, config.logLevel)) { - this.setLogLevel(config.logLevel) - } - - this.logToConsole = config.logToConsole !== undefined ? !!config.logToConsole : true - this.prefix = config.prefix !== undefined ? config.prefix : '[OPTIMIZELY]' - } - - /** - * @param {LogLevel} level - * @param {string} message - * @memberof ConsoleLogger - */ - log(level: LogLevel, message: string) { - if (!this.shouldLog(level) || !this.logToConsole) { - return - } - - let logMessage: string = `${this.prefix} - ${this.getLogLevelName( - level, - )} ${this.getTime()} ${message}` - - this.consoleLog(level, [logMessage]) - } - - /** - * @param {LogLevel} level - * @memberof ConsoleLogger - */ - setLogLevel(level: LogLevel | string) { - level = coerceLogLevel(level) - if (!isValidEnum(LogLevel, level) || level === undefined) { - this.logLevel = LogLevel.ERROR - } else { - this.logLevel = level - } - } - - /** - * @returns {string} - * @memberof ConsoleLogger - */ - getTime(): string { - return new Date().toISOString() - } - - /** - * @private - * @param {LogLevel} targetLogLevel - * @returns {boolean} - * @memberof ConsoleLogger - */ - private shouldLog(targetLogLevel: LogLevel): boolean { - return targetLogLevel >= this.logLevel - } - - /** - * @private - * @param {LogLevel} logLevel - * @returns {string} - * @memberof ConsoleLogger - */ - private getLogLevelName(logLevel: LogLevel): string { - switch (logLevel) { - case LogLevel.DEBUG: - return 'DEBUG' - case LogLevel.INFO: - return 'INFO ' - case LogLevel.WARNING: - return 'WARN ' - case LogLevel.ERROR: - return 'ERROR' - default: - return 'NOTSET' - } - } - - /** - * @private - * @param {LogLevel} logLevel - * @param {string[]} logArguments - * @memberof ConsoleLogger - */ - private consoleLog(logLevel: LogLevel, logArguments: [string, ...string[]]) { - switch (logLevel) { - case LogLevel.DEBUG: - console.log.apply(console, logArguments) - break - case LogLevel.INFO: - console.info.apply(console, logArguments) - break - case LogLevel.WARNING: - console.warn.apply(console, logArguments) - break - case LogLevel.ERROR: - console.error.apply(console, logArguments) - break - default: - console.log.apply(console, logArguments) - } - } -} - -let globalLogLevel: LogLevel = LogLevel.NOTSET -let globalLogHandler: LogHandler | null = null - -class OptimizelyLogger implements LoggerFacade { - private messagePrefix: string = '' - - constructor(opts: { messagePrefix?: string } = {}) { - if (opts.messagePrefix) { - this.messagePrefix = opts.messagePrefix - } - } - - /** - * @param {(LogLevel | LogInputObject)} levelOrObj - * @param {string} [message] - * @memberof OptimizelyLogger - */ - log(level: LogLevel | string, message: string, ...splat: any[]): void { - this.internalLog(coerceLogLevel(level), { - message, - splat, - }) - } - - info(message: string | Error, ...splat: any[]): void { - this.namedLog(LogLevel.INFO, message, splat) - } - - debug(message: string | Error, ...splat: any[]): void { - this.namedLog(LogLevel.DEBUG, message, splat) - } - - warn(message: string | Error, ...splat: any[]): void { - this.namedLog(LogLevel.WARNING, message, splat) - } - - error(message: string | Error, ...splat: any[]): void { - this.namedLog(LogLevel.ERROR, message, splat) - } - - private format(data: LogData): string { - return `${this.messagePrefix ? this.messagePrefix + ': ' : ''}${sprintf( - data.message, - ...data.splat, - )}` - } - - private internalLog(level: LogLevel, data: LogData): void { - if (!globalLogHandler) { - return - } - - if (level < globalLogLevel) { - return - } - - globalLogHandler.log(level, this.format(data)) - - if (data.error && data.error instanceof Error) { - getErrorHandler().handleError(data.error) - } - } - - private namedLog(level: LogLevel, message: string | Error, splat: any[]): void { - let error: Error | undefined - - if (message instanceof Error) { - error = message - message = error.message - this.internalLog(level, { - error, - message, - splat, - }) - return - } - - if (splat.length === 0) { - this.internalLog(level, { - message, - splat, - }) - return - } - - const last = splat[splat.length - 1] - if (last instanceof Error) { - error = last - splat.splice(-1) - } - - this.internalLog(level, { message, error, splat }) - } -} - -let globalLogManager: LogManager = new DefaultLogManager() - -export function getLogger(name?: string): LoggerFacade { - return globalLogManager.getLogger(name) -} - -export function setLogHandler(logger: LogHandler | null) { - globalLogHandler = logger -} - -export function setLogLevel(level: LogLevel | string) { - level = coerceLogLevel(level) - if (!isValidEnum(LogLevel, level) || level === undefined) { - globalLogLevel = LogLevel.ERROR - } else { - globalLogLevel = level - } -} - -export function getLogLevel(): LogLevel { - return globalLogLevel -} - -/** - * Resets all global logger state to it's original - */ -export function resetLogger() { - globalLogManager = new DefaultLogManager() - globalLogLevel = LogLevel.NOTSET -} diff --git a/packages/optimizely-sdk/modules/logging/models.ts b/packages/optimizely-sdk/modules/logging/models.ts deleted file mode 100644 index cd3223932..000000000 --- a/packages/optimizely-sdk/modules/logging/models.ts +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Copyright 2019, Optimizely - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -export enum LogLevel { - NOTSET = 0, - DEBUG = 1, - INFO = 2, - WARNING = 3, - ERROR = 4, -} - -export interface LoggerFacade { - log(level: LogLevel | string, message: string, ...splat: any[]): void - - info(message: string | Error, ...splat: any[]): void - - debug(message: string | Error, ...splat: any[]): void - - warn(message: string | Error, ...splat: any[]): void - - error(message: string | Error, ...splat: any[]): void -} - -export interface LogManager { - getLogger(name?: string): LoggerFacade -} - -export interface LogHandler { - log(level: LogLevel, message: string, ...splat: any[]): void -} diff --git a/packages/optimizely-sdk/rollup.config.js b/packages/optimizely-sdk/rollup.config.js index e6f4bfe79..dbde48acd 100644 --- a/packages/optimizely-sdk/rollup.config.js +++ b/packages/optimizely-sdk/rollup.config.js @@ -75,7 +75,7 @@ const umdBundle = { resolve({ browser: true }), commonjs({ namedExports: { - '../../../modules/logging': [ + '@optimizely/js-sdk-logging': [ 'ConsoleLogHandler', 'getLogger', 'setLogLevel', From 2843dccb8a5a19f7707f706ac5e8b2abe1471bd6 Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Fri, 25 Mar 2022 21:03:06 +0500 Subject: [PATCH 05/59] utils merged in optimizely sdk --- packages/optimizely-sdk/jest.config.js | 2 +- .../core/audience_evaluator/index.tests.js | 2 +- .../lib/core/bucketer/index.tests.js | 2 +- .../optimizely-sdk/lib/core/bucketer/index.ts | 2 +- .../index.tests.js | 2 +- .../lib/core/decision_service/index.tests.js | 2 +- .../lib/core/decision_service/index.ts | 2 +- .../lib/core/notification_center/index.ts | 3 +- .../lib/core/project_config/index.tests.js | 2 +- .../lib/core/project_config/index.ts | 2 +- .../project_config_manager.tests.js | 2 +- .../project_config/project_config_manager.ts | 2 +- .../lib/optimizely/index.tests.js | 2 +- .../optimizely-sdk/lib/optimizely/index.ts | 2 +- .../optimizely_user_context/index.tests.js | 2 +- .../forwarding_event_processor.ts | 2 +- .../lib/plugins/logger/index.react_native.ts | 2 +- packages/optimizely-sdk/lib/shared_types.ts | 2 +- .../utils/attributes_validator/index.tests.js | 2 +- .../lib/utils/attributes_validator/index.ts | 2 +- .../lib/utils/config_validator/index.tests.js | 2 +- .../lib/utils/config_validator/index.ts | 2 +- .../optimizely-sdk/lib/utils/enums/index.ts | 2 +- .../lib/utils/event_tag_utils/index.tests.js | 2 +- .../utils/event_tags_validator/index.tests.js | 2 +- .../lib/utils/event_tags_validator/index.ts | 2 +- .../optimizely-sdk/lib/utils/fns/index.ts | 145 +++++++++++++++- .../json_schema_validator/index.tests.js | 2 +- .../lib/utils/json_schema_validator/index.ts | 2 +- .../index.tests.js | 2 +- .../user_profile_service_validator/index.ts | 2 +- .../optimizely-sdk/modules/utils/index.d.ts | 36 ---- .../optimizely-sdk/modules/utils/index.js | 156 ------------------ packages/optimizely-sdk/rollup.config.js | 5 +- .../utils/__tests__ => tests}/utils.spec.ts | 4 +- packages/utils/src/index.ts | 4 +- 36 files changed, 180 insertions(+), 231 deletions(-) delete mode 100644 packages/optimizely-sdk/modules/utils/index.d.ts delete mode 100644 packages/optimizely-sdk/modules/utils/index.js rename packages/optimizely-sdk/{modules/utils/__tests__ => tests}/utils.spec.ts (97%) diff --git a/packages/optimizely-sdk/jest.config.js b/packages/optimizely-sdk/jest.config.js index 322f646e0..612a829eb 100644 --- a/packages/optimizely-sdk/jest.config.js +++ b/packages/optimizely-sdk/jest.config.js @@ -5,7 +5,7 @@ module.exports = { "transform": { "^.+\\.tsx?$": "ts-jest" }, - "testRegex": "(/modules/*/__tests__/.*|(\\.|/)(test|spec))\\.tsx?$", + "testRegex": "(/tests/.*|(\\.|/)(test|spec))\\.tsx?$", "moduleFileExtensions": [ "ts", "tsx", diff --git a/packages/optimizely-sdk/lib/core/audience_evaluator/index.tests.js b/packages/optimizely-sdk/lib/core/audience_evaluator/index.tests.js index 06d759d46..3332dbef4 100644 --- a/packages/optimizely-sdk/lib/core/audience_evaluator/index.tests.js +++ b/packages/optimizely-sdk/lib/core/audience_evaluator/index.tests.js @@ -16,7 +16,7 @@ import sinon from 'sinon'; import { assert } from 'chai'; import { getLogger } from '@optimizely/js-sdk-logging'; -import { sprintf } from '../../../modules/utils'; +import { sprintf } from '../../utils/fns'; import { createAudienceEvaluator } from './index'; import * as conditionTreeEvaluator from '../condition_tree_evaluator'; diff --git a/packages/optimizely-sdk/lib/core/bucketer/index.tests.js b/packages/optimizely-sdk/lib/core/bucketer/index.tests.js index c24bc4e9c..955a602f3 100644 --- a/packages/optimizely-sdk/lib/core/bucketer/index.tests.js +++ b/packages/optimizely-sdk/lib/core/bucketer/index.tests.js @@ -16,7 +16,7 @@ import sinon from 'sinon'; import { assert, expect } from 'chai'; import { cloneDeep } from 'lodash'; -import { sprintf } from '../../../modules/utils'; +import { sprintf } from '../../utils/fns'; import * as bucketer from './'; import { diff --git a/packages/optimizely-sdk/lib/core/bucketer/index.ts b/packages/optimizely-sdk/lib/core/bucketer/index.ts index b26e30893..7d24feda5 100644 --- a/packages/optimizely-sdk/lib/core/bucketer/index.ts +++ b/packages/optimizely-sdk/lib/core/bucketer/index.ts @@ -17,7 +17,7 @@ /** * Bucketer API for determining the variation id from the specified parameters */ -import { sprintf } from '../../../modules/utils'; +import { sprintf } from '../../utils/fns'; import murmurhash from 'murmurhash'; import { LogHandler } from '@optimizely/js-sdk-logging'; import { diff --git a/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.tests.js b/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.tests.js index d4b165ab0..641d9556c 100644 --- a/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.tests.js +++ b/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.tests.js @@ -15,7 +15,7 @@ ***************************************************************************/ import sinon from 'sinon'; import { assert } from 'chai'; -import { sprintf } from '../../../modules/utils'; +import { sprintf } from '../../utils/fns'; import { LOG_LEVEL, diff --git a/packages/optimizely-sdk/lib/core/decision_service/index.tests.js b/packages/optimizely-sdk/lib/core/decision_service/index.tests.js index 4cdea9988..419da672a 100644 --- a/packages/optimizely-sdk/lib/core/decision_service/index.tests.js +++ b/packages/optimizely-sdk/lib/core/decision_service/index.tests.js @@ -16,7 +16,7 @@ import sinon from 'sinon'; import { assert } from 'chai'; import cloneDeep from 'lodash/cloneDeep'; -import { sprintf } from '../../../modules/utils'; +import { sprintf } from '../../utils/fns'; import { createDecisionService } from './'; import * as bucketer from '../bucketer'; diff --git a/packages/optimizely-sdk/lib/core/decision_service/index.ts b/packages/optimizely-sdk/lib/core/decision_service/index.ts index 02fe0f9e8..546aa5c23 100644 --- a/packages/optimizely-sdk/lib/core/decision_service/index.ts +++ b/packages/optimizely-sdk/lib/core/decision_service/index.ts @@ -13,8 +13,8 @@ * See the License for the specific language governing permissions and * * limitations under the License. * ***************************************************************************/ -import { sprintf } from '../../../modules/utils'; import { LogHandler } from '@optimizely/js-sdk-logging'; +import { sprintf } from '../../utils/fns'; import fns from '../../utils/fns'; import { bucket } from '../bucketer'; diff --git a/packages/optimizely-sdk/lib/core/notification_center/index.ts b/packages/optimizely-sdk/lib/core/notification_center/index.ts index 2ad08b0ea..0f841de6c 100644 --- a/packages/optimizely-sdk/lib/core/notification_center/index.ts +++ b/packages/optimizely-sdk/lib/core/notification_center/index.ts @@ -13,9 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { objectValues } from '../../../modules/utils'; import { LogHandler, ErrorHandler } from '@optimizely/js-sdk-logging'; -import { NOTIFICATION_TYPES as notificationTypesEnum } from '../../../modules/utils'; +import { objectValues, NOTIFICATION_TYPES as notificationTypesEnum } from '../../utils/fns'; import { NotificationListener, ListenerPayload } from '../../shared_types'; import { diff --git a/packages/optimizely-sdk/lib/core/project_config/index.tests.js b/packages/optimizely-sdk/lib/core/project_config/index.tests.js index ff98cd630..690ca6aa9 100644 --- a/packages/optimizely-sdk/lib/core/project_config/index.tests.js +++ b/packages/optimizely-sdk/lib/core/project_config/index.tests.js @@ -17,7 +17,7 @@ import sinon from 'sinon'; import { assert } from 'chai'; import { forEach, cloneDeep } from 'lodash'; import { getLogger } from '@optimizely/js-sdk-logging'; -import { sprintf } from '../../../modules/utils'; +import { sprintf } from '../../utils/fns'; import fns from '../../utils/fns'; import projectConfig from './'; diff --git a/packages/optimizely-sdk/lib/core/project_config/index.ts b/packages/optimizely-sdk/lib/core/project_config/index.ts index a92089e01..c625f8060 100644 --- a/packages/optimizely-sdk/lib/core/project_config/index.ts +++ b/packages/optimizely-sdk/lib/core/project_config/index.ts @@ -18,7 +18,7 @@ import { objectEntries, objectValues, sprintf -} from '../../../modules/utils'; +} from '../../utils/fns'; import fns from '../../utils/fns'; import { diff --git a/packages/optimizely-sdk/lib/core/project_config/project_config_manager.tests.js b/packages/optimizely-sdk/lib/core/project_config/project_config_manager.tests.js index 20188f2d2..3dc884747 100644 --- a/packages/optimizely-sdk/lib/core/project_config/project_config_manager.tests.js +++ b/packages/optimizely-sdk/lib/core/project_config/project_config_manager.tests.js @@ -17,8 +17,8 @@ import sinon from 'sinon'; import { assert } from 'chai'; import { cloneDeep } from 'lodash'; -import { sprintf } from '../../../modules/utils'; import * as logging from '@optimizely/js-sdk-logging'; +import { sprintf } from '../../utils/fns'; import * as datafileManager from '@optimizely/js-sdk-datafile-manager'; import * as projectConfig from './index'; diff --git a/packages/optimizely-sdk/lib/core/project_config/project_config_manager.ts b/packages/optimizely-sdk/lib/core/project_config/project_config_manager.ts index 58ec462f0..7074e1d14 100644 --- a/packages/optimizely-sdk/lib/core/project_config/project_config_manager.ts +++ b/packages/optimizely-sdk/lib/core/project_config/project_config_manager.ts @@ -13,8 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { sprintf } from '../../../modules/utils'; import { getLogger } from '@optimizely/js-sdk-logging'; +import { sprintf } from '../../utils/fns'; import { ERROR_MESSAGES } from '../../utils/enums'; import { createOptimizelyConfig } from '../optimizely_config'; diff --git a/packages/optimizely-sdk/lib/optimizely/index.tests.js b/packages/optimizely-sdk/lib/optimizely/index.tests.js index c4573967d..736506246 100644 --- a/packages/optimizely-sdk/lib/optimizely/index.tests.js +++ b/packages/optimizely-sdk/lib/optimizely/index.tests.js @@ -15,7 +15,7 @@ ***************************************************************************/ import { assert, expect } from 'chai'; import sinon from 'sinon'; -import { sprintf, NOTIFICATION_TYPES } from '../../modules/utils'; +import { sprintf, NOTIFICATION_TYPES } from '../utils/fns'; import eventProcessor from '../plugins/event_processor'; import * as logging from '@optimizely/js-sdk-logging'; diff --git a/packages/optimizely-sdk/lib/optimizely/index.ts b/packages/optimizely-sdk/lib/optimizely/index.ts index 3fc3d8dd6..430b652bb 100644 --- a/packages/optimizely-sdk/lib/optimizely/index.ts +++ b/packages/optimizely-sdk/lib/optimizely/index.ts @@ -13,8 +13,8 @@ * See the License for the specific language governing permissions and * * limitations under the License. * ***************************************************************************/ -import { find, sprintf, objectValues, NotificationCenter } from '../../modules/utils'; import { LoggerFacade, ErrorHandler } from '@optimizely/js-sdk-logging'; +import { find, sprintf, objectValues, NotificationCenter } from '../utils/fns'; import { EventProcessor } from '@optimizely/js-sdk-event-processor'; import { diff --git a/packages/optimizely-sdk/lib/optimizely_user_context/index.tests.js b/packages/optimizely-sdk/lib/optimizely_user_context/index.tests.js index 39a9ef21b..837a577f0 100644 --- a/packages/optimizely-sdk/lib/optimizely_user_context/index.tests.js +++ b/packages/optimizely-sdk/lib/optimizely_user_context/index.tests.js @@ -17,7 +17,7 @@ import { assert } from 'chai'; import sinon from 'sinon'; import * as logging from '@optimizely/js-sdk-logging'; -import { sprintf, NOTIFICATION_TYPES } from '../../modules/utils'; +import { sprintf, NOTIFICATION_TYPES } from '../utils/fns'; import OptimizelyUserContext from './'; import { createLogger } from '../plugins/logger'; diff --git a/packages/optimizely-sdk/lib/plugins/event_processor/forwarding_event_processor.ts b/packages/optimizely-sdk/lib/plugins/event_processor/forwarding_event_processor.ts index 12abe13d5..98fbc536e 100644 --- a/packages/optimizely-sdk/lib/plugins/event_processor/forwarding_event_processor.ts +++ b/packages/optimizely-sdk/lib/plugins/event_processor/forwarding_event_processor.ts @@ -18,7 +18,7 @@ import { EventProcessor, ProcessableEvent, } from '@optimizely/js-sdk-event-processor'; -import { NotificationCenter } from '../../../modules/utils'; +import { NotificationCenter } from '../../utils/fns'; import { EventDispatcher } from '../../shared_types'; import { NOTIFICATION_TYPES } from '../../utils/enums'; diff --git a/packages/optimizely-sdk/lib/plugins/logger/index.react_native.ts b/packages/optimizely-sdk/lib/plugins/logger/index.react_native.ts index aa0e2a24f..d0ecc4656 100644 --- a/packages/optimizely-sdk/lib/plugins/logger/index.react_native.ts +++ b/packages/optimizely-sdk/lib/plugins/logger/index.react_native.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { LogLevel } from '@optimizely/js-sdk-logging'; -import { sprintf } from '../../../modules/utils'; +import { sprintf } from '../../utils/fns'; import { NoOpLogger } from './index'; function getLogLevelName(level: number): string { diff --git a/packages/optimizely-sdk/lib/shared_types.ts b/packages/optimizely-sdk/lib/shared_types.ts index e4fd2f8d3..ce2366227 100644 --- a/packages/optimizely-sdk/lib/shared_types.ts +++ b/packages/optimizely-sdk/lib/shared_types.ts @@ -16,7 +16,7 @@ import { ErrorHandler, LogHandler, LogLevel, LoggerFacade } from '@optimizely/js-sdk-logging'; import { EventProcessor } from '@optimizely/js-sdk-event-processor'; -import { NotificationCenter } from '../modules/utils'; +import { NotificationCenter } from '../lib/utils/fns'; export interface BucketerParams { experimentId: string; diff --git a/packages/optimizely-sdk/lib/utils/attributes_validator/index.tests.js b/packages/optimizely-sdk/lib/utils/attributes_validator/index.tests.js index 2d121a849..99b95620b 100644 --- a/packages/optimizely-sdk/lib/utils/attributes_validator/index.tests.js +++ b/packages/optimizely-sdk/lib/utils/attributes_validator/index.tests.js @@ -14,7 +14,7 @@ * limitations under the License. */ import { assert } from 'chai'; -import { sprintf } from '../../../modules/utils'; +import { sprintf } from '../../utils/fns'; import * as attributesValidator from './'; import { ERROR_MESSAGES } from '../enums'; diff --git a/packages/optimizely-sdk/lib/utils/attributes_validator/index.ts b/packages/optimizely-sdk/lib/utils/attributes_validator/index.ts index aa0dd97af..9cda1dd0e 100644 --- a/packages/optimizely-sdk/lib/utils/attributes_validator/index.ts +++ b/packages/optimizely-sdk/lib/utils/attributes_validator/index.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { sprintf } from '../../../modules/utils'; +import { sprintf } from '../../utils/fns'; import { ObjectWithUnknownProperties } from '../../shared_types'; import fns from '../../utils/fns'; diff --git a/packages/optimizely-sdk/lib/utils/config_validator/index.tests.js b/packages/optimizely-sdk/lib/utils/config_validator/index.tests.js index afce34b71..fcdfcd2fb 100644 --- a/packages/optimizely-sdk/lib/utils/config_validator/index.tests.js +++ b/packages/optimizely-sdk/lib/utils/config_validator/index.tests.js @@ -14,7 +14,7 @@ * limitations under the License. */ import { assert } from 'chai'; -import { sprintf } from '../../../modules/utils'; +import { sprintf } from '../../utils/fns'; import configValidator from './'; import { ERROR_MESSAGES } from '../enums'; diff --git a/packages/optimizely-sdk/lib/utils/config_validator/index.ts b/packages/optimizely-sdk/lib/utils/config_validator/index.ts index 14b0c509f..2bb2f0e66 100644 --- a/packages/optimizely-sdk/lib/utils/config_validator/index.ts +++ b/packages/optimizely-sdk/lib/utils/config_validator/index.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { sprintf } from '../../../modules/utils'; +import { sprintf } from '../../utils/fns'; import { ObjectWithUnknownProperties } from '../../shared_types'; import { diff --git a/packages/optimizely-sdk/lib/utils/enums/index.ts b/packages/optimizely-sdk/lib/utils/enums/index.ts index 3d4882f40..051e62e35 100644 --- a/packages/optimizely-sdk/lib/utils/enums/index.ts +++ b/packages/optimizely-sdk/lib/utils/enums/index.ts @@ -14,7 +14,7 @@ * limitations under the License. * ***************************************************************************/ -import { NOTIFICATION_TYPES as notificationTypesEnum } from '../../../modules/utils'; +import { NOTIFICATION_TYPES as notificationTypesEnum } from '../../utils/fns'; /** * Contains global enums used throughout the library diff --git a/packages/optimizely-sdk/lib/utils/event_tag_utils/index.tests.js b/packages/optimizely-sdk/lib/utils/event_tag_utils/index.tests.js index 86fe53923..32ddcd11e 100644 --- a/packages/optimizely-sdk/lib/utils/event_tag_utils/index.tests.js +++ b/packages/optimizely-sdk/lib/utils/event_tag_utils/index.tests.js @@ -15,7 +15,7 @@ */ import sinon from 'sinon'; import { assert } from 'chai'; -import { sprintf } from '../../../modules/utils'; +import { sprintf } from '../../utils/fns'; import * as eventTagUtils from './'; diff --git a/packages/optimizely-sdk/lib/utils/event_tags_validator/index.tests.js b/packages/optimizely-sdk/lib/utils/event_tags_validator/index.tests.js index 5363f8d30..d79b14c3d 100644 --- a/packages/optimizely-sdk/lib/utils/event_tags_validator/index.tests.js +++ b/packages/optimizely-sdk/lib/utils/event_tags_validator/index.tests.js @@ -14,7 +14,7 @@ * limitations under the License. */ import { assert } from 'chai'; -import { sprintf } from '../../../modules/utils'; +import { sprintf } from '../../utils/fns'; import { validate } from './'; import { ERROR_MESSAGES } from'../enums'; diff --git a/packages/optimizely-sdk/lib/utils/event_tags_validator/index.ts b/packages/optimizely-sdk/lib/utils/event_tags_validator/index.ts index 306e31e1e..db36bc47a 100644 --- a/packages/optimizely-sdk/lib/utils/event_tags_validator/index.ts +++ b/packages/optimizely-sdk/lib/utils/event_tags_validator/index.ts @@ -17,7 +17,7 @@ /** * Provides utility method for validating that event tags user has provided are valid */ -import { sprintf } from '../../../modules/utils'; +import { sprintf } from '../../utils/fns'; import { ERROR_MESSAGES } from '../enums'; diff --git a/packages/optimizely-sdk/lib/utils/fns/index.ts b/packages/optimizely-sdk/lib/utils/fns/index.ts index 7eb5bd6dc..a05a6843a 100644 --- a/packages/optimizely-sdk/lib/utils/fns/index.ts +++ b/packages/optimizely-sdk/lib/utils/fns/index.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { generateUUID as uuid, keyBy as keyByUtil } from '../../../modules/utils'; +import v4 from 'uuid'; const MAX_SAFE_INTEGER_LIMIT = Math.pow(2, 53); @@ -61,11 +61,152 @@ function isNumber(value: unknown): boolean { return typeof value === 'number'; } + export function uuid(): string { + return v4() + } + + export type Omit = Pick> + + export function getTimestamp(): number { + return new Date().getTime() + } + + /** + * Validates a value is a valid TypeScript enum + * + * @export + * @param {object} enumToCheck + * @param {*} value + * @returns {boolean} + */ + export function isValidEnum(enumToCheck: { [key: string]: any }, value: any): boolean { + let found = false + + const keys = Object.keys(enumToCheck) + for (let index = 0; index < keys.length; index++) { + if (value === enumToCheck[keys[index]]) { + found = true + break + } + } + return found + } + + export function groupBy(arr: K[], grouperFn: (item: K) => string): Array { + const grouper: { [key: string]: K[] } = {} + + arr.forEach(item => { + const key = grouperFn(item) + grouper[key] = grouper[key] || [] + grouper[key].push(item) + }) + + return objectValues(grouper) + } + + export function objectValues(obj: { [key: string]: K }): K[] { + return Object.keys(obj).map(key => obj[key]) + } + + export function objectEntries(obj: { [key: string]: K }): [string, K][] { + return Object.keys(obj).map(key => [key, obj[key]]) + } + + export function find(arr: K[], cond: (arg: K) => boolean): K | undefined { + let found + + for (let item of arr) { + if (cond(item)) { + found = item + break + } + } + + return found + } + + export function keyByUtil(arr: K[], keyByFn: (item: K) => string): { [key: string]: K } { + let map: { [key: string]: K } = {} + arr.forEach(item => { + const key = keyByFn(item) + map[key] = item + }) + return map + } + + export function sprintf(format: string, ...args: any[]): string { + var i = 0 + return format.replace(/%s/g, function() { + const arg = args[i++] + const type = typeof arg + if (type === 'function') { + return arg() + } else if (type === 'string') { + return arg + } else { + return String(arg) + } + }) + } + /* + * Notification types for use with NotificationCenter + * Format is EVENT: + * + * SDK consumers can use these to register callbacks with the notification center. + * + * @deprecated since 3.1.0 + * ACTIVATE: An impression event will be sent to Optimizely + * Callbacks will receive an object argument with the following properties: + * - experiment {Object} + * - userId {string} + * - attributes {Object|undefined} + * - variation {Object} + * - logEvent {Object} + * + * DECISION: A decision is made in the system. i.e. user activation, + * feature access or feature-variable value retrieval + * Callbacks will receive an object argument with the following properties: + * - type {string} + * - userId {string} + * - attributes {Object|undefined} + * - decisionInfo {Object|undefined} + * + * LOG_EVENT: A batch of events, which could contain impressions and/or conversions, + * will be sent to Optimizely + * Callbacks will receive an object argument with the following properties: + * - url {string} + * - httpVerb {string} + * - params {Object} + * + * OPTIMIZELY_CONFIG_UPDATE: This Optimizely instance has been updated with a new + * config + * + * TRACK: A conversion event will be sent to Optimizely + * Callbacks will receive the an object argument with the following properties: + * - eventKey {string} + * - userId {string} + * - attributes {Object|undefined} + * - eventTags {Object|undefined} + * - logEvent {Object} + * + */ + export enum NOTIFICATION_TYPES { + ACTIVATE = 'ACTIVATE:experiment, user_id,attributes, variation, event', + DECISION = 'DECISION:type, userId, attributes, decisionInfo', + LOG_EVENT = 'LOG_EVENT:logEvent', + OPTIMIZELY_CONFIG_UPDATE = 'OPTIMIZELY_CONFIG_UPDATE', + TRACK = 'TRACK:event_key, user_id, attributes, event_tags, event', + } + + export interface NotificationCenter { + sendNotifications(notificationType: NOTIFICATION_TYPES, notificationData?: any): void + } + export default { assign, currentTimestamp, isSafeInteger, keyBy, uuid, - isNumber, + isNumber } diff --git a/packages/optimizely-sdk/lib/utils/json_schema_validator/index.tests.js b/packages/optimizely-sdk/lib/utils/json_schema_validator/index.tests.js index 322624a3d..ad5afc0ea 100644 --- a/packages/optimizely-sdk/lib/utils/json_schema_validator/index.tests.js +++ b/packages/optimizely-sdk/lib/utils/json_schema_validator/index.tests.js @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { sprintf } from '../../../modules/utils'; +import { sprintf } from '../../utils/fns'; import { assert } from 'chai'; import { validate } from './'; diff --git a/packages/optimizely-sdk/lib/utils/json_schema_validator/index.ts b/packages/optimizely-sdk/lib/utils/json_schema_validator/index.ts index 48d0a92af..ac6833687 100644 --- a/packages/optimizely-sdk/lib/utils/json_schema_validator/index.ts +++ b/packages/optimizely-sdk/lib/utils/json_schema_validator/index.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { sprintf } from '../../../modules/utils'; +import { sprintf } from '../fns'; import { validate as jsonSchemaValidator } from 'json-schema'; import { ERROR_MESSAGES } from '../enums'; diff --git a/packages/optimizely-sdk/lib/utils/user_profile_service_validator/index.tests.js b/packages/optimizely-sdk/lib/utils/user_profile_service_validator/index.tests.js index 155ce7c06..e095f4c6c 100644 --- a/packages/optimizely-sdk/lib/utils/user_profile_service_validator/index.tests.js +++ b/packages/optimizely-sdk/lib/utils/user_profile_service_validator/index.tests.js @@ -15,7 +15,7 @@ ***************************************************************************/ import { assert } from 'chai'; -import { sprintf } from '../../../modules/utils'; +import { sprintf } from '../../utils/fns'; import { validate } from './'; import { ERROR_MESSAGES } from '../enums'; diff --git a/packages/optimizely-sdk/lib/utils/user_profile_service_validator/index.ts b/packages/optimizely-sdk/lib/utils/user_profile_service_validator/index.ts index 4c2de4f46..5a3a4b38d 100644 --- a/packages/optimizely-sdk/lib/utils/user_profile_service_validator/index.ts +++ b/packages/optimizely-sdk/lib/utils/user_profile_service_validator/index.ts @@ -18,7 +18,7 @@ * Provides utility method for validating that the given user profile service implementation is valid. */ -import { sprintf } from '../../../modules/utils'; +import { sprintf } from '../../utils/fns'; import { ObjectWithUnknownProperties } from '../../shared_types'; import { ERROR_MESSAGES } from '../enums'; diff --git a/packages/optimizely-sdk/modules/utils/index.d.ts b/packages/optimizely-sdk/modules/utils/index.d.ts deleted file mode 100644 index a6e6630b2..000000000 --- a/packages/optimizely-sdk/modules/utils/index.d.ts +++ /dev/null @@ -1,36 +0,0 @@ -export declare function generateUUID(): string; -export declare type Omit = Pick>; -export declare function getTimestamp(): number; -/** - * Validates a value is a valid TypeScript enum - * - * @export - * @param {object} enumToCheck - * @param {*} value - * @returns {boolean} - */ -export declare function isValidEnum(enumToCheck: { - [key: string]: any; -}, value: any): boolean; -export declare function groupBy(arr: K[], grouperFn: (item: K) => string): Array; -export declare function objectValues(obj: { - [key: string]: K; -}): K[]; -export declare function objectEntries(obj: { - [key: string]: K; -}): [string, K][]; -export declare function find(arr: K[], cond: (arg: K) => boolean): K | undefined; -export declare function keyBy(arr: K[], keyByFn: (item: K) => string): { - [key: string]: K; -}; -export declare function sprintf(format: string, ...args: any[]): string; -export declare enum NOTIFICATION_TYPES { - ACTIVATE = "ACTIVATE:experiment, user_id,attributes, variation, event", - DECISION = "DECISION:type, userId, attributes, decisionInfo", - LOG_EVENT = "LOG_EVENT:logEvent", - OPTIMIZELY_CONFIG_UPDATE = "OPTIMIZELY_CONFIG_UPDATE", - TRACK = "TRACK:event_key, user_id, attributes, event_tags, event" -} -export interface NotificationCenter { - sendNotifications(notificationType: NOTIFICATION_TYPES, notificationData?: any): void; -} diff --git a/packages/optimizely-sdk/modules/utils/index.js b/packages/optimizely-sdk/modules/utils/index.js deleted file mode 100644 index f90d987cf..000000000 --- a/packages/optimizely-sdk/modules/utils/index.js +++ /dev/null @@ -1,156 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -/** - * Copyright 2019, Optimizely - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -var uuid_1 = require("uuid"); -function generateUUID() { - return uuid_1.v4(); -} -exports.generateUUID = generateUUID; -function getTimestamp() { - return new Date().getTime(); -} -exports.getTimestamp = getTimestamp; -/** - * Validates a value is a valid TypeScript enum - * - * @export - * @param {object} enumToCheck - * @param {*} value - * @returns {boolean} - */ -function isValidEnum(enumToCheck, value) { - var found = false; - var keys = Object.keys(enumToCheck); - for (var index = 0; index < keys.length; index++) { - if (value === enumToCheck[keys[index]]) { - found = true; - break; - } - } - return found; -} -exports.isValidEnum = isValidEnum; -function groupBy(arr, grouperFn) { - var grouper = {}; - arr.forEach(function (item) { - var key = grouperFn(item); - grouper[key] = grouper[key] || []; - grouper[key].push(item); - }); - return objectValues(grouper); -} -exports.groupBy = groupBy; -function objectValues(obj) { - return Object.keys(obj).map(function (key) { return obj[key]; }); -} -exports.objectValues = objectValues; -function objectEntries(obj) { - return Object.keys(obj).map(function (key) { return [key, obj[key]]; }); -} -exports.objectEntries = objectEntries; -function find(arr, cond) { - var found; - for (var _i = 0, arr_1 = arr; _i < arr_1.length; _i++) { - var item = arr_1[_i]; - if (cond(item)) { - found = item; - break; - } - } - return found; -} -exports.find = find; -function keyBy(arr, keyByFn) { - var map = {}; - arr.forEach(function (item) { - var key = keyByFn(item); - map[key] = item; - }); - return map; -} -exports.keyBy = keyBy; -function sprintf(format) { - var args = []; - for (var _i = 1; _i < arguments.length; _i++) { - args[_i - 1] = arguments[_i]; - } - var i = 0; - return format.replace(/%s/g, function () { - var arg = args[i++]; - var type = typeof arg; - if (type === 'function') { - return arg(); - } - else if (type === 'string') { - return arg; - } - else { - return String(arg); - } - }); -} -exports.sprintf = sprintf; -/* - * Notification types for use with NotificationCenter - * Format is EVENT: - * - * SDK consumers can use these to register callbacks with the notification center. - * - * @deprecated since 3.1.0 - * ACTIVATE: An impression event will be sent to Optimizely - * Callbacks will receive an object argument with the following properties: - * - experiment {Object} - * - userId {string} - * - attributes {Object|undefined} - * - variation {Object} - * - logEvent {Object} - * - * DECISION: A decision is made in the system. i.e. user activation, - * feature access or feature-variable value retrieval - * Callbacks will receive an object argument with the following properties: - * - type {string} - * - userId {string} - * - attributes {Object|undefined} - * - decisionInfo {Object|undefined} - * - * LOG_EVENT: A batch of events, which could contain impressions and/or conversions, - * will be sent to Optimizely - * Callbacks will receive an object argument with the following properties: - * - url {string} - * - httpVerb {string} - * - params {Object} - * - * OPTIMIZELY_CONFIG_UPDATE: This Optimizely instance has been updated with a new - * config - * - * TRACK: A conversion event will be sent to Optimizely - * Callbacks will receive the an object argument with the following properties: - * - eventKey {string} - * - userId {string} - * - attributes {Object|undefined} - * - eventTags {Object|undefined} - * - logEvent {Object} - * - */ -var NOTIFICATION_TYPES; -(function (NOTIFICATION_TYPES) { - NOTIFICATION_TYPES["ACTIVATE"] = "ACTIVATE:experiment, user_id,attributes, variation, event"; - NOTIFICATION_TYPES["DECISION"] = "DECISION:type, userId, attributes, decisionInfo"; - NOTIFICATION_TYPES["LOG_EVENT"] = "LOG_EVENT:logEvent"; - NOTIFICATION_TYPES["OPTIMIZELY_CONFIG_UPDATE"] = "OPTIMIZELY_CONFIG_UPDATE"; - NOTIFICATION_TYPES["TRACK"] = "TRACK:event_key, user_id, attributes, event_tags, event"; -})(NOTIFICATION_TYPES = exports.NOTIFICATION_TYPES || (exports.NOTIFICATION_TYPES = {})); diff --git a/packages/optimizely-sdk/rollup.config.js b/packages/optimizely-sdk/rollup.config.js index dbde48acd..de2f94042 100644 --- a/packages/optimizely-sdk/rollup.config.js +++ b/packages/optimizely-sdk/rollup.config.js @@ -32,7 +32,8 @@ const typescriptPluginOptions = { ], include: [ './lib/**/*.ts', - './lib/**/*.js' + './lib/**/*.js', + './modules/**/*.ts' ], }; @@ -115,7 +116,7 @@ const jsonSchemaBundle = { commonjs(), typescript(typescriptPluginOptions), ], - external: ['json-schema', '../../../modules/utils'], + external: ['json-schema', './lib/utils/fns', 'uuid'], input: 'lib/utils/json_schema_validator/index.ts', output: { exports: 'named', diff --git a/packages/optimizely-sdk/modules/utils/__tests__/utils.spec.ts b/packages/optimizely-sdk/tests/utils.spec.ts similarity index 97% rename from packages/optimizely-sdk/modules/utils/__tests__/utils.spec.ts rename to packages/optimizely-sdk/tests/utils.spec.ts index 8867d50e5..a54188673 100644 --- a/packages/optimizely-sdk/modules/utils/__tests__/utils.spec.ts +++ b/packages/optimizely-sdk/tests/utils.spec.ts @@ -1,5 +1,5 @@ /// -import { isValidEnum, groupBy, objectEntries, objectValues, find, keyBy, sprintf } from '../' +import { isValidEnum, groupBy, objectEntries, objectValues, find, keyByUtil, sprintf } from '../lib/utils/fns' describe('utils', () => { describe('isValidEnum', () => { @@ -83,7 +83,7 @@ describe('utils', () => { { key: 'baz', firstName: 'james', lastName: 'foxy' }, ] - expect(keyBy(input, item => item.key)).toEqual({ + expect(keyByUtil(input, item => item.key)).toEqual({ foo: { key: 'foo', firstName: 'jordan', lastName: 'foo' }, bar: { key: 'bar', firstName: 'jordan', lastName: 'bar' }, baz: { key: 'baz', firstName: 'james', lastName: 'foxy' }, diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts index cd7dec342..bc797a43d 100644 --- a/packages/utils/src/index.ts +++ b/packages/utils/src/index.ts @@ -13,10 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { v4 } from 'uuid'; +import * as uuid from 'uuid'; export function generateUUID(): string { - return v4() + return uuid.v4() } export type Omit = Pick> From 8574c7e5f93b7dc929d86aa7c03616d8783225ed Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Fri, 25 Mar 2022 21:09:00 +0500 Subject: [PATCH 06/59] small changes removed --- packages/optimizely-sdk/jest.config.js | 2 +- packages/optimizely-sdk/lib/utils/fns/index.ts | 2 +- packages/utils/src/index.ts | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/optimizely-sdk/jest.config.js b/packages/optimizely-sdk/jest.config.js index 612a829eb..1f7958d49 100644 --- a/packages/optimizely-sdk/jest.config.js +++ b/packages/optimizely-sdk/jest.config.js @@ -14,4 +14,4 @@ module.exports = { "json", "node" ], -} \ No newline at end of file +} diff --git a/packages/optimizely-sdk/lib/utils/fns/index.ts b/packages/optimizely-sdk/lib/utils/fns/index.ts index a05a6843a..09438c173 100644 --- a/packages/optimizely-sdk/lib/utils/fns/index.ts +++ b/packages/optimizely-sdk/lib/utils/fns/index.ts @@ -208,5 +208,5 @@ export default { isSafeInteger, keyBy, uuid, - isNumber + isNumber, } diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts index bc797a43d..cd7dec342 100644 --- a/packages/utils/src/index.ts +++ b/packages/utils/src/index.ts @@ -13,10 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import * as uuid from 'uuid'; +import { v4 } from 'uuid'; export function generateUUID(): string { - return uuid.v4() + return v4() } export type Omit = Pick> From 28905d016f08fbdd652c57d45d2d935ffb3cc3eb Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Mon, 28 Mar 2022 11:15:27 +0500 Subject: [PATCH 07/59] ts config added because jest and mocha use similar declarations --- packages/optimizely-sdk/tsconfig.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/optimizely-sdk/tsconfig.json b/packages/optimizely-sdk/tsconfig.json index d7ec24942..3c8b45cd4 100644 --- a/packages/optimizely-sdk/tsconfig.json +++ b/packages/optimizely-sdk/tsconfig.json @@ -11,7 +11,8 @@ "declaration": false, "module": "esnext", "outDir": "./dist", - "sourceMap": true + "sourceMap": true, + "skipLibCheck": true, }, "exclude": [ "./dist", From 11518e1a1735596e2d9069bc7b9a9da3e398a5a7 Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Mon, 28 Mar 2022 11:26:56 +0500 Subject: [PATCH 08/59] type warning fixed --- packages/optimizely-sdk/lib/optimizely/index.ts | 3 +-- .../lib/optimizely_user_context/index.ts | 10 ++-------- packages/optimizely-sdk/lib/utils/fns/index.ts | 8 ++++++-- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/packages/optimizely-sdk/lib/optimizely/index.ts b/packages/optimizely-sdk/lib/optimizely/index.ts index 430b652bb..b74d93ccd 100644 --- a/packages/optimizely-sdk/lib/optimizely/index.ts +++ b/packages/optimizely-sdk/lib/optimizely/index.ts @@ -14,7 +14,7 @@ * limitations under the License. * ***************************************************************************/ import { LoggerFacade, ErrorHandler } from '@optimizely/js-sdk-logging'; -import { find, sprintf, objectValues, NotificationCenter } from '../utils/fns'; +import { sprintf, objectValues, NotificationCenter } from '../utils/fns'; import { EventProcessor } from '@optimizely/js-sdk-event-processor'; import { @@ -26,7 +26,6 @@ import { Variation, FeatureFlag, FeatureVariable, - OptimizelyVariation, OptimizelyOptions, OptimizelyDecideOption, OptimizelyDecision diff --git a/packages/optimizely-sdk/lib/optimizely_user_context/index.ts b/packages/optimizely-sdk/lib/optimizely_user_context/index.ts index 2fcf78238..afc1116d3 100644 --- a/packages/optimizely-sdk/lib/optimizely_user_context/index.ts +++ b/packages/optimizely-sdk/lib/optimizely_user_context/index.ts @@ -15,20 +15,14 @@ ***************************************************************************/ import Optimizely from '../../lib/optimizely'; import { - DecisionResponse, EventTags, OptimizelyDecideOption, OptimizelyDecision, OptimizelyDecisionContext, OptimizelyForcedDecision, - UserAttributes, - Variation + UserAttributes } from '../../lib/shared_types'; -import { - getFlagVariationByKey, - ProjectConfig, -} from '../core/project_config'; -import { LOG_MESSAGES, CONTROL_ATTRIBUTES } from '../utils/enums'; +import { CONTROL_ATTRIBUTES } from '../utils/enums'; export default class OptimizelyUserContext { private optimizely: Optimizely; diff --git a/packages/optimizely-sdk/lib/utils/fns/index.ts b/packages/optimizely-sdk/lib/utils/fns/index.ts index 09438c173..edd84664e 100644 --- a/packages/optimizely-sdk/lib/utils/fns/index.ts +++ b/packages/optimizely-sdk/lib/utils/fns/index.ts @@ -79,6 +79,8 @@ function isNumber(value: unknown): boolean { * @param {*} value * @returns {boolean} */ + // TODO[OASIS-6649]: Don't use any type + // eslint-disable-next-line @typescript-eslint/no-explicit-any export function isValidEnum(enumToCheck: { [key: string]: any }, value: any): boolean { let found = false @@ -115,7 +117,7 @@ function isNumber(value: unknown): boolean { export function find(arr: K[], cond: (arg: K) => boolean): K | undefined { let found - for (let item of arr) { + for (const item of arr) { if (cond(item)) { found = item break @@ -126,7 +128,7 @@ function isNumber(value: unknown): boolean { } export function keyByUtil(arr: K[], keyByFn: (item: K) => string): { [key: string]: K } { - let map: { [key: string]: K } = {} + const map: { [key: string]: K } = {} arr.forEach(item => { const key = keyByFn(item) map[key] = item @@ -134,6 +136,8 @@ function isNumber(value: unknown): boolean { return map } + // TODO[OASIS-6649]: Don't use any type + // eslint-disable-next-line @typescript-eslint/no-explicit-any export function sprintf(format: string, ...args: any[]): string { var i = 0 return format.replace(/%s/g, function() { From d3371ce775de3706afc440a1ef50fc16a4aace39 Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Mon, 28 Mar 2022 11:34:36 +0500 Subject: [PATCH 09/59] more types fixed --- packages/optimizely-sdk/lib/utils/fns/index.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/optimizely-sdk/lib/utils/fns/index.ts b/packages/optimizely-sdk/lib/utils/fns/index.ts index edd84664e..9b835d2cc 100644 --- a/packages/optimizely-sdk/lib/utils/fns/index.ts +++ b/packages/optimizely-sdk/lib/utils/fns/index.ts @@ -139,7 +139,7 @@ function isNumber(value: unknown): boolean { // TODO[OASIS-6649]: Don't use any type // eslint-disable-next-line @typescript-eslint/no-explicit-any export function sprintf(format: string, ...args: any[]): string { - var i = 0 + let i = 0 return format.replace(/%s/g, function() { const arg = args[i++] const type = typeof arg @@ -203,6 +203,8 @@ function isNumber(value: unknown): boolean { } export interface NotificationCenter { + // TODO[OASIS-6649]: Don't use any type + // eslint-disable-next-line @typescript-eslint/no-explicit-any sendNotifications(notificationType: NOTIFICATION_TYPES, notificationData?: any): void } From da73e11c98d608c6446147c61c8a20a825349f60 Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Mon, 28 Mar 2022 11:44:43 +0500 Subject: [PATCH 10/59] fix --- packages/optimizely-sdk/lib/utils/fns/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/optimizely-sdk/lib/utils/fns/index.ts b/packages/optimizely-sdk/lib/utils/fns/index.ts index 9b835d2cc..15fe502b2 100644 --- a/packages/optimizely-sdk/lib/utils/fns/index.ts +++ b/packages/optimizely-sdk/lib/utils/fns/index.ts @@ -79,6 +79,7 @@ function isNumber(value: unknown): boolean { * @param {*} value * @returns {boolean} */ + // TODO[OASIS-6649]: Don't use any type // eslint-disable-next-line @typescript-eslint/no-explicit-any export function isValidEnum(enumToCheck: { [key: string]: any }, value: any): boolean { From 069e5016c2de8e317e3da9b96faf158dd9b0a73b Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Mon, 28 Mar 2022 12:15:40 +0500 Subject: [PATCH 11/59] fix --- packages/optimizely-sdk/lib/utils/fns/index.ts | 9 --------- 1 file changed, 9 deletions(-) diff --git a/packages/optimizely-sdk/lib/utils/fns/index.ts b/packages/optimizely-sdk/lib/utils/fns/index.ts index 15fe502b2..681a827e7 100644 --- a/packages/optimizely-sdk/lib/utils/fns/index.ts +++ b/packages/optimizely-sdk/lib/utils/fns/index.ts @@ -70,15 +70,6 @@ function isNumber(value: unknown): boolean { export function getTimestamp(): number { return new Date().getTime() } - - /** - * Validates a value is a valid TypeScript enum - * - * @export - * @param {object} enumToCheck - * @param {*} value - * @returns {boolean} - */ // TODO[OASIS-6649]: Don't use any type // eslint-disable-next-line @typescript-eslint/no-explicit-any From bc6d5fbbd7fb95932787aa018e79b04fd5293c0d Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Mon, 28 Mar 2022 12:27:04 +0500 Subject: [PATCH 12/59] fix --- packages/optimizely-sdk/lib/utils/fns/index.ts | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/packages/optimizely-sdk/lib/utils/fns/index.ts b/packages/optimizely-sdk/lib/utils/fns/index.ts index 681a827e7..10d65e056 100644 --- a/packages/optimizely-sdk/lib/utils/fns/index.ts +++ b/packages/optimizely-sdk/lib/utils/fns/index.ts @@ -70,10 +70,21 @@ function isNumber(value: unknown): boolean { export function getTimestamp(): number { return new Date().getTime() } - + + /** + * Validates a value is a valid TypeScript enum + * + * @export + * @param {object} enumToCheck + * @param {*} value + * @returns {boolean} + */ // TODO[OASIS-6649]: Don't use any type // eslint-disable-next-line @typescript-eslint/no-explicit-any - export function isValidEnum(enumToCheck: { [key: string]: any }, value: any): boolean { + export function isValidEnum(enumToCheck: { [key: string]: any }, + // TODO[OASIS-6649]: Don't use any type + // eslint-disable-next-line @typescript-eslint/no-explicit-any + value: any): boolean { let found = false const keys = Object.keys(enumToCheck) From 3b758bd948f00996355b4c956f702ba58b8c0b6b Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Mon, 28 Mar 2022 12:49:24 +0500 Subject: [PATCH 13/59] type defined --- packages/optimizely-sdk/lib/utils/fns/index.ts | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/packages/optimizely-sdk/lib/utils/fns/index.ts b/packages/optimizely-sdk/lib/utils/fns/index.ts index 10d65e056..c854df958 100644 --- a/packages/optimizely-sdk/lib/utils/fns/index.ts +++ b/packages/optimizely-sdk/lib/utils/fns/index.ts @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import { LogLevel } from '@optimizely/js-sdk-logging'; import v4 from 'uuid'; const MAX_SAFE_INTEGER_LIMIT = Math.pow(2, 53); @@ -79,12 +80,7 @@ function isNumber(value: unknown): boolean { * @param {*} value * @returns {boolean} */ - // TODO[OASIS-6649]: Don't use any type - // eslint-disable-next-line @typescript-eslint/no-explicit-any - export function isValidEnum(enumToCheck: { [key: string]: any }, - // TODO[OASIS-6649]: Don't use any type - // eslint-disable-next-line @typescript-eslint/no-explicit-any - value: any): boolean { + export function isValidEnum(enumToCheck: { [key: string]: any }, value: LogLevel | string): boolean { let found = false const keys = Object.keys(enumToCheck) From 73e1db862cd276a701572eea6d319070a58034ca Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Mon, 28 Mar 2022 13:43:42 +0500 Subject: [PATCH 14/59] type fix --- packages/optimizely-sdk/lib/utils/fns/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/optimizely-sdk/lib/utils/fns/index.ts b/packages/optimizely-sdk/lib/utils/fns/index.ts index c854df958..2ef95913a 100644 --- a/packages/optimizely-sdk/lib/utils/fns/index.ts +++ b/packages/optimizely-sdk/lib/utils/fns/index.ts @@ -80,7 +80,7 @@ function isNumber(value: unknown): boolean { * @param {*} value * @returns {boolean} */ - export function isValidEnum(enumToCheck: { [key: string]: any }, value: LogLevel | string): boolean { + export function isValidEnum(enumToCheck: { [key: string]: any }, value: number | string): boolean { let found = false const keys = Object.keys(enumToCheck) From 550c3baae1bf6416c867d1778573eb2c76935fcf Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Tue, 12 Apr 2022 20:55:58 +0500 Subject: [PATCH 15/59] headers updated --- .../core/audience_evaluator/index.tests.js | 2 +- .../lib/core/bucketer/index.tests.js | 2 +- .../optimizely-sdk/lib/core/bucketer/index.ts | 2 +- .../index.tests.js | 2 +- .../lib/core/decision_service/index.tests.js | 2 +- .../lib/core/notification_center/index.ts | 2 +- .../lib/core/project_config/index.tests.js | 2 +- .../project_config_manager.tests.js | 2 +- .../lib/optimizely/index.tests.js | 2 +- .../optimizely-sdk/lib/optimizely/index.ts | 1 - .../forwarding_event_processor.ts | 2 +- .../lib/plugins/logger/index.react_native.ts | 2 +- .../utils/attributes_validator/index.tests.js | 2 +- .../lib/utils/attributes_validator/index.ts | 2 +- .../lib/utils/config_validator/index.tests.js | 2 +- .../lib/utils/config_validator/index.ts | 2 +- .../lib/utils/event_tag_utils/index.tests.js | 2 +- .../utils/event_tags_validator/index.tests.js | 2 +- .../lib/utils/event_tags_validator/index.ts | 2 +- .../optimizely-sdk/lib/utils/fns/index.ts | 300 +++++++++--------- .../json_schema_validator/index.tests.js | 2 +- .../lib/utils/json_schema_validator/index.ts | 2 +- .../index.tests.js | 2 +- .../user_profile_service_validator/index.ts | 2 +- packages/optimizely-sdk/rollup.config.js | 2 +- 25 files changed, 177 insertions(+), 170 deletions(-) diff --git a/packages/optimizely-sdk/lib/core/audience_evaluator/index.tests.js b/packages/optimizely-sdk/lib/core/audience_evaluator/index.tests.js index 3332dbef4..f8869f330 100644 --- a/packages/optimizely-sdk/lib/core/audience_evaluator/index.tests.js +++ b/packages/optimizely-sdk/lib/core/audience_evaluator/index.tests.js @@ -1,5 +1,5 @@ /** - * Copyright 2016, 2018-2020, Optimizely + * Copyright 2016, 2018-2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/core/bucketer/index.tests.js b/packages/optimizely-sdk/lib/core/bucketer/index.tests.js index 955a602f3..926f6f7c2 100644 --- a/packages/optimizely-sdk/lib/core/bucketer/index.tests.js +++ b/packages/optimizely-sdk/lib/core/bucketer/index.tests.js @@ -1,5 +1,5 @@ /** - * Copyright 2016-2017, 2019-2021, Optimizely + * Copyright 2016-2017, 2019-2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/core/bucketer/index.ts b/packages/optimizely-sdk/lib/core/bucketer/index.ts index 7d24feda5..82d7f5bca 100644 --- a/packages/optimizely-sdk/lib/core/bucketer/index.ts +++ b/packages/optimizely-sdk/lib/core/bucketer/index.ts @@ -1,5 +1,5 @@ /** - * Copyright 2016, 2019-2021, Optimizely + * Copyright 2016, 2019-2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.tests.js b/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.tests.js index 641d9556c..af85b5da3 100644 --- a/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.tests.js +++ b/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.tests.js @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright 2018-2020, Optimizely, Inc. and contributors * + * Copyright 2018-2021, Optimizely, Inc. and contributors * * * * Licensed under the Apache License, Version 2.0 (the "License"); * * you may not use this file except in compliance with the License. * diff --git a/packages/optimizely-sdk/lib/core/decision_service/index.tests.js b/packages/optimizely-sdk/lib/core/decision_service/index.tests.js index 419da672a..747ef9720 100644 --- a/packages/optimizely-sdk/lib/core/decision_service/index.tests.js +++ b/packages/optimizely-sdk/lib/core/decision_service/index.tests.js @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright 2017-2021 Optimizely, Inc. and contributors * + * Copyright 2017-2022 Optimizely, Inc. and contributors * * * * Licensed under the Apache License, Version 2.0 (the "License"); * * you may not use this file except in compliance with the License. * diff --git a/packages/optimizely-sdk/lib/core/notification_center/index.ts b/packages/optimizely-sdk/lib/core/notification_center/index.ts index 0f841de6c..f2a6086a4 100644 --- a/packages/optimizely-sdk/lib/core/notification_center/index.ts +++ b/packages/optimizely-sdk/lib/core/notification_center/index.ts @@ -1,5 +1,5 @@ /** - * Copyright 2020, Optimizely + * Copyright 2020-2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/core/project_config/index.tests.js b/packages/optimizely-sdk/lib/core/project_config/index.tests.js index 690ca6aa9..401eefb4d 100644 --- a/packages/optimizely-sdk/lib/core/project_config/index.tests.js +++ b/packages/optimizely-sdk/lib/core/project_config/index.tests.js @@ -1,5 +1,5 @@ /** - * Copyright 2016-2021, Optimizely + * Copyright 2016-2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/core/project_config/project_config_manager.tests.js b/packages/optimizely-sdk/lib/core/project_config/project_config_manager.tests.js index 3dc884747..9212fd17c 100644 --- a/packages/optimizely-sdk/lib/core/project_config/project_config_manager.tests.js +++ b/packages/optimizely-sdk/lib/core/project_config/project_config_manager.tests.js @@ -1,5 +1,5 @@ /** - * Copyright 2019-2020 Optimizely + * Copyright 2019-2022 Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/optimizely/index.tests.js b/packages/optimizely-sdk/lib/optimizely/index.tests.js index 736506246..1b776958b 100644 --- a/packages/optimizely-sdk/lib/optimizely/index.tests.js +++ b/packages/optimizely-sdk/lib/optimizely/index.tests.js @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright 2016-2021, Optimizely, Inc. and contributors * + * Copyright 2016-2022, Optimizely, Inc. and contributors * * * * Licensed under the Apache License, Version 2.0 (the "License"); * * you may not use this file except in compliance with the License. * diff --git a/packages/optimizely-sdk/lib/optimizely/index.ts b/packages/optimizely-sdk/lib/optimizely/index.ts index 3343c86a6..52fdf7026 100644 --- a/packages/optimizely-sdk/lib/optimizely/index.ts +++ b/packages/optimizely-sdk/lib/optimizely/index.ts @@ -16,7 +16,6 @@ import { LoggerFacade, ErrorHandler } from '@optimizely/js-sdk-logging'; import { sprintf, objectValues, NotificationCenter } from '../utils/fns'; import { EventProcessor } from '@optimizely/js-sdk-event-processor'; -import {NotificationCenter} from '../core/notification_center' import { UserAttributes, diff --git a/packages/optimizely-sdk/lib/plugins/event_processor/forwarding_event_processor.ts b/packages/optimizely-sdk/lib/plugins/event_processor/forwarding_event_processor.ts index 98fbc536e..609f2729d 100644 --- a/packages/optimizely-sdk/lib/plugins/event_processor/forwarding_event_processor.ts +++ b/packages/optimizely-sdk/lib/plugins/event_processor/forwarding_event_processor.ts @@ -1,5 +1,5 @@ /** - * Copyright 2021, Optimizely + * Copyright 2021-2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/plugins/logger/index.react_native.ts b/packages/optimizely-sdk/lib/plugins/logger/index.react_native.ts index d0ecc4656..ce8340e4c 100644 --- a/packages/optimizely-sdk/lib/plugins/logger/index.react_native.ts +++ b/packages/optimizely-sdk/lib/plugins/logger/index.react_native.ts @@ -1,5 +1,5 @@ /** - * Copyright 2019-2021, Optimizely + * Copyright 2019-2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/utils/attributes_validator/index.tests.js b/packages/optimizely-sdk/lib/utils/attributes_validator/index.tests.js index 99b95620b..d29686105 100644 --- a/packages/optimizely-sdk/lib/utils/attributes_validator/index.tests.js +++ b/packages/optimizely-sdk/lib/utils/attributes_validator/index.tests.js @@ -1,5 +1,5 @@ /** - * Copyright 2016, 2018-2020, Optimizely + * Copyright 2016, 2018-2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/utils/attributes_validator/index.ts b/packages/optimizely-sdk/lib/utils/attributes_validator/index.ts index 9cda1dd0e..24e4be28f 100644 --- a/packages/optimizely-sdk/lib/utils/attributes_validator/index.ts +++ b/packages/optimizely-sdk/lib/utils/attributes_validator/index.ts @@ -1,5 +1,5 @@ /** - * Copyright 2016, 2018-2020, Optimizely + * Copyright 2016, 2018-2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/utils/config_validator/index.tests.js b/packages/optimizely-sdk/lib/utils/config_validator/index.tests.js index fcdfcd2fb..690799503 100644 --- a/packages/optimizely-sdk/lib/utils/config_validator/index.tests.js +++ b/packages/optimizely-sdk/lib/utils/config_validator/index.tests.js @@ -1,5 +1,5 @@ /** - * Copyright 2016, 2018-2020, Optimizely + * Copyright 2016, 2018-2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/utils/config_validator/index.ts b/packages/optimizely-sdk/lib/utils/config_validator/index.ts index 2bb2f0e66..d18c82184 100644 --- a/packages/optimizely-sdk/lib/utils/config_validator/index.ts +++ b/packages/optimizely-sdk/lib/utils/config_validator/index.ts @@ -1,5 +1,5 @@ /** - * Copyright 2016, 2018-2020, Optimizely + * Copyright 2016, 2018-2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/utils/event_tag_utils/index.tests.js b/packages/optimizely-sdk/lib/utils/event_tag_utils/index.tests.js index 32ddcd11e..552bfe120 100644 --- a/packages/optimizely-sdk/lib/utils/event_tag_utils/index.tests.js +++ b/packages/optimizely-sdk/lib/utils/event_tag_utils/index.tests.js @@ -1,5 +1,5 @@ /** - * Copyright 2017, 2020, Optimizely + * Copyright 2017, 2020-2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/utils/event_tags_validator/index.tests.js b/packages/optimizely-sdk/lib/utils/event_tags_validator/index.tests.js index d79b14c3d..d4e279abe 100644 --- a/packages/optimizely-sdk/lib/utils/event_tags_validator/index.tests.js +++ b/packages/optimizely-sdk/lib/utils/event_tags_validator/index.tests.js @@ -1,5 +1,5 @@ /** - * Copyright 2017, 2020 Optimizely + * Copyright 2017, 2020-2022 Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/utils/event_tags_validator/index.ts b/packages/optimizely-sdk/lib/utils/event_tags_validator/index.ts index db36bc47a..cf4883324 100644 --- a/packages/optimizely-sdk/lib/utils/event_tags_validator/index.ts +++ b/packages/optimizely-sdk/lib/utils/event_tags_validator/index.ts @@ -1,5 +1,5 @@ /** - * Copyright 2017, 2020 Optimizely + * Copyright 2017, 2020-2022 Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/utils/fns/index.ts b/packages/optimizely-sdk/lib/utils/fns/index.ts index 2ef95913a..95c124b3b 100644 --- a/packages/optimizely-sdk/lib/utils/fns/index.ts +++ b/packages/optimizely-sdk/lib/utils/fns/index.ts @@ -1,5 +1,5 @@ /** - * Copyright 2017, 2019-2020, Optimizely + * Copyright 2017, 2019-2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { LogLevel } from '@optimizely/js-sdk-logging'; import v4 from 'uuid'; const MAX_SAFE_INTEGER_LIMIT = Math.pow(2, 53); @@ -62,150 +61,150 @@ function isNumber(value: unknown): boolean { return typeof value === 'number'; } - export function uuid(): string { - return v4() - } - - export type Omit = Pick> - - export function getTimestamp(): number { - return new Date().getTime() - } - - /** - * Validates a value is a valid TypeScript enum - * - * @export - * @param {object} enumToCheck - * @param {*} value - * @returns {boolean} - */ - export function isValidEnum(enumToCheck: { [key: string]: any }, value: number | string): boolean { - let found = false - - const keys = Object.keys(enumToCheck) - for (let index = 0; index < keys.length; index++) { - if (value === enumToCheck[keys[index]]) { - found = true - break - } - } - return found - } - - export function groupBy(arr: K[], grouperFn: (item: K) => string): Array { - const grouper: { [key: string]: K[] } = {} - - arr.forEach(item => { - const key = grouperFn(item) - grouper[key] = grouper[key] || [] - grouper[key].push(item) - }) - - return objectValues(grouper) - } - - export function objectValues(obj: { [key: string]: K }): K[] { - return Object.keys(obj).map(key => obj[key]) - } - - export function objectEntries(obj: { [key: string]: K }): [string, K][] { - return Object.keys(obj).map(key => [key, obj[key]]) - } - - export function find(arr: K[], cond: (arg: K) => boolean): K | undefined { - let found - - for (const item of arr) { - if (cond(item)) { - found = item - break - } - } - - return found - } - - export function keyByUtil(arr: K[], keyByFn: (item: K) => string): { [key: string]: K } { - const map: { [key: string]: K } = {} - arr.forEach(item => { - const key = keyByFn(item) - map[key] = item - }) - return map - } - - // TODO[OASIS-6649]: Don't use any type - // eslint-disable-next-line @typescript-eslint/no-explicit-any - export function sprintf(format: string, ...args: any[]): string { - let i = 0 - return format.replace(/%s/g, function() { - const arg = args[i++] - const type = typeof arg - if (type === 'function') { - return arg() - } else if (type === 'string') { - return arg - } else { - return String(arg) - } - }) - } - /* - * Notification types for use with NotificationCenter - * Format is EVENT: - * - * SDK consumers can use these to register callbacks with the notification center. - * - * @deprecated since 3.1.0 - * ACTIVATE: An impression event will be sent to Optimizely - * Callbacks will receive an object argument with the following properties: - * - experiment {Object} - * - userId {string} - * - attributes {Object|undefined} - * - variation {Object} - * - logEvent {Object} - * - * DECISION: A decision is made in the system. i.e. user activation, - * feature access or feature-variable value retrieval - * Callbacks will receive an object argument with the following properties: - * - type {string} - * - userId {string} - * - attributes {Object|undefined} - * - decisionInfo {Object|undefined} - * - * LOG_EVENT: A batch of events, which could contain impressions and/or conversions, - * will be sent to Optimizely - * Callbacks will receive an object argument with the following properties: - * - url {string} - * - httpVerb {string} - * - params {Object} - * - * OPTIMIZELY_CONFIG_UPDATE: This Optimizely instance has been updated with a new - * config - * - * TRACK: A conversion event will be sent to Optimizely - * Callbacks will receive the an object argument with the following properties: - * - eventKey {string} - * - userId {string} - * - attributes {Object|undefined} - * - eventTags {Object|undefined} - * - logEvent {Object} - * - */ - export enum NOTIFICATION_TYPES { - ACTIVATE = 'ACTIVATE:experiment, user_id,attributes, variation, event', - DECISION = 'DECISION:type, userId, attributes, decisionInfo', - LOG_EVENT = 'LOG_EVENT:logEvent', - OPTIMIZELY_CONFIG_UPDATE = 'OPTIMIZELY_CONFIG_UPDATE', - TRACK = 'TRACK:event_key, user_id, attributes, event_tags, event', - } - - export interface NotificationCenter { - // TODO[OASIS-6649]: Don't use any type - // eslint-disable-next-line @typescript-eslint/no-explicit-any - sendNotifications(notificationType: NOTIFICATION_TYPES, notificationData?: any): void - } +export function uuid(): string { + return v4() +} + +export type Omit = Pick> + +export function getTimestamp(): number { + return new Date().getTime() +} + +/** +* Validates a value is a valid TypeScript enum +* +* @export +* @param {object} enumToCheck +* @param {*} value +* @returns {boolean} +*/ +export function isValidEnum(enumToCheck: { [key: string]: any }, value: number | string): boolean { + let found = false + + const keys = Object.keys(enumToCheck) + for (let index = 0; index < keys.length; index++) { + if (value === enumToCheck[keys[index]]) { + found = true + break + } + } + return found +} + +export function groupBy(arr: K[], grouperFn: (item: K) => string): Array { + const grouper: { [key: string]: K[] } = {} + + arr.forEach(item => { + const key = grouperFn(item) + grouper[key] = grouper[key] || [] + grouper[key].push(item) + }) + + return objectValues(grouper) +} + +export function objectValues(obj: { [key: string]: K }): K[] { + return Object.keys(obj).map(key => obj[key]) +} + +export function objectEntries(obj: { [key: string]: K }): [string, K][] { + return Object.keys(obj).map(key => [key, obj[key]]) +} + +export function find(arr: K[], cond: (arg: K) => boolean): K | undefined { + let found + + for (const item of arr) { + if (cond(item)) { + found = item + break + } + } + + return found +} + +export function keyByUtil(arr: K[], keyByFn: (item: K) => string): { [key: string]: K } { + const map: { [key: string]: K } = {} + arr.forEach(item => { + const key = keyByFn(item) + map[key] = item + }) + return map +} + +// TODO[OASIS-6649]: Don't use any type +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export function sprintf(format: string, ...args: any[]): string { + let i = 0 + return format.replace(/%s/g, function() { + const arg = args[i++] + const type = typeof arg + if (type === 'function') { + return arg() + } else if (type === 'string') { + return arg + } else { + return String(arg) + } + }) +} +/* +* Notification types for use with NotificationCenter +* Format is EVENT: +* +* SDK consumers can use these to register callbacks with the notification center. +* +* @deprecated since 3.1.0 +* ACTIVATE: An impression event will be sent to Optimizely +* Callbacks will receive an object argument with the following properties: +* - experiment {Object} +* - userId {string} +* - attributes {Object|undefined} +* - variation {Object} +* - logEvent {Object} +* +* DECISION: A decision is made in the system. i.e. user activation, +* feature access or feature-variable value retrieval +* Callbacks will receive an object argument with the following properties: +* - type {string} +* - userId {string} +* - attributes {Object|undefined} +* - decisionInfo {Object|undefined} +* +* LOG_EVENT: A batch of events, which could contain impressions and/or conversions, +* will be sent to Optimizely +* Callbacks will receive an object argument with the following properties: +* - url {string} +* - httpVerb {string} +* - params {Object} +* +* OPTIMIZELY_CONFIG_UPDATE: This Optimizely instance has been updated with a new +* config +* +* TRACK: A conversion event will be sent to Optimizely +* Callbacks will receive the an object argument with the following properties: +* - eventKey {string} +* - userId {string} +* - attributes {Object|undefined} +* - eventTags {Object|undefined} +* - logEvent {Object} +* +*/ +export enum NOTIFICATION_TYPES { + ACTIVATE = 'ACTIVATE:experiment, user_id,attributes, variation, event', + DECISION = 'DECISION:type, userId, attributes, decisionInfo', + LOG_EVENT = 'LOG_EVENT:logEvent', + OPTIMIZELY_CONFIG_UPDATE = 'OPTIMIZELY_CONFIG_UPDATE', + TRACK = 'TRACK:event_key, user_id, attributes, event_tags, event', +} + +export interface NotificationCenter { + // TODO[OASIS-6649]: Don't use any type + // eslint-disable-next-line @typescript-eslint/no-explicit-any + sendNotifications(notificationType: NOTIFICATION_TYPES, notificationData?: any): void +} export default { assign, @@ -214,4 +213,13 @@ export default { keyBy, uuid, isNumber, + getTimestamp, + isValidEnum, + groupBy, + objectValues, + objectEntries, + find, + keyByUtil, + sprintf, + NOTIFICATION_TYPES } diff --git a/packages/optimizely-sdk/lib/utils/json_schema_validator/index.tests.js b/packages/optimizely-sdk/lib/utils/json_schema_validator/index.tests.js index ad5afc0ea..5c31841dd 100644 --- a/packages/optimizely-sdk/lib/utils/json_schema_validator/index.tests.js +++ b/packages/optimizely-sdk/lib/utils/json_schema_validator/index.tests.js @@ -1,5 +1,5 @@ /** - * Copyright 2016-2020, Optimizely + * Copyright 2016-2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/utils/json_schema_validator/index.ts b/packages/optimizely-sdk/lib/utils/json_schema_validator/index.ts index ac6833687..0e93cee60 100644 --- a/packages/optimizely-sdk/lib/utils/json_schema_validator/index.ts +++ b/packages/optimizely-sdk/lib/utils/json_schema_validator/index.ts @@ -1,5 +1,5 @@ /** - * Copyright 2016-2017, 2020 Optimizely + * Copyright 2016-2017, 2020-2022 Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/utils/user_profile_service_validator/index.tests.js b/packages/optimizely-sdk/lib/utils/user_profile_service_validator/index.tests.js index e095f4c6c..8d93bc16b 100644 --- a/packages/optimizely-sdk/lib/utils/user_profile_service_validator/index.tests.js +++ b/packages/optimizely-sdk/lib/utils/user_profile_service_validator/index.tests.js @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright 2017, 2020, Optimizely, Inc. and contributors * + * Copyright 2017, 2020-2022, Optimizely, Inc. and contributors * * * * Licensed under the Apache License, Version 2.0 (the "License"); * * you may not use this file except in compliance with the License. * diff --git a/packages/optimizely-sdk/lib/utils/user_profile_service_validator/index.ts b/packages/optimizely-sdk/lib/utils/user_profile_service_validator/index.ts index 5a3a4b38d..c9f5d557f 100644 --- a/packages/optimizely-sdk/lib/utils/user_profile_service_validator/index.ts +++ b/packages/optimizely-sdk/lib/utils/user_profile_service_validator/index.ts @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright 2017, 2020, Optimizely, Inc. and contributors * + * Copyright 2017, 2020-2022, Optimizely, Inc. and contributors * * * * Licensed under the Apache License, Version 2.0 (the "License"); * * you may not use this file except in compliance with the License. * diff --git a/packages/optimizely-sdk/rollup.config.js b/packages/optimizely-sdk/rollup.config.js index de2f94042..1df635d4b 100644 --- a/packages/optimizely-sdk/rollup.config.js +++ b/packages/optimizely-sdk/rollup.config.js @@ -1,5 +1,5 @@ /** - * Copyright 2020-2021 Optimizely + * Copyright 2020-2022 Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. From 39b5d696d0fb5d439d8060456bca5abe4d9f0b39 Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Tue, 12 Apr 2022 21:01:30 +0500 Subject: [PATCH 16/59] fix --- packages/optimizely-sdk/lib/shared_types.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/optimizely-sdk/lib/shared_types.ts b/packages/optimizely-sdk/lib/shared_types.ts index bfc764d63..1c60b7301 100644 --- a/packages/optimizely-sdk/lib/shared_types.ts +++ b/packages/optimizely-sdk/lib/shared_types.ts @@ -278,7 +278,7 @@ export interface OptimizelyVariable { } export interface Client { - notificationCenter: NotificationCenter; + notificationCenter: NotificationCenterImpl; createUserContext( userId: string, attributes?: UserAttributes From d00a828e5c18ca2c859269b3d2a94fa3631bf49f Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Tue, 12 Apr 2022 21:56:23 +0500 Subject: [PATCH 17/59] correct notification type imported --- packages/optimizely-sdk/lib/optimizely/index.ts | 3 ++- packages/optimizely-sdk/lib/shared_types.ts | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/optimizely-sdk/lib/optimizely/index.ts b/packages/optimizely-sdk/lib/optimizely/index.ts index 52fdf7026..23fbeec6c 100644 --- a/packages/optimizely-sdk/lib/optimizely/index.ts +++ b/packages/optimizely-sdk/lib/optimizely/index.ts @@ -14,7 +14,8 @@ * limitations under the License. * ***************************************************************************/ import { LoggerFacade, ErrorHandler } from '@optimizely/js-sdk-logging'; -import { sprintf, objectValues, NotificationCenter } from '../utils/fns'; +import { sprintf, objectValues } from '../utils/fns'; +import { NotificationCenter } from '../core/notification_center'; import { EventProcessor } from '@optimizely/js-sdk-event-processor'; import { diff --git a/packages/optimizely-sdk/lib/shared_types.ts b/packages/optimizely-sdk/lib/shared_types.ts index 1c60b7301..bfc764d63 100644 --- a/packages/optimizely-sdk/lib/shared_types.ts +++ b/packages/optimizely-sdk/lib/shared_types.ts @@ -278,7 +278,7 @@ export interface OptimizelyVariable { } export interface Client { - notificationCenter: NotificationCenterImpl; + notificationCenter: NotificationCenter; createUserContext( userId: string, attributes?: UserAttributes From c958cdac5c103d70ac8e002b011b90d70e2cd98c Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Tue, 12 Apr 2022 22:47:46 +0500 Subject: [PATCH 18/59] comment addressed --- packages/optimizely-sdk/rollup.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/optimizely-sdk/rollup.config.js b/packages/optimizely-sdk/rollup.config.js index 1df635d4b..45aa3f75e 100644 --- a/packages/optimizely-sdk/rollup.config.js +++ b/packages/optimizely-sdk/rollup.config.js @@ -116,7 +116,7 @@ const jsonSchemaBundle = { commonjs(), typescript(typescriptPluginOptions), ], - external: ['json-schema', './lib/utils/fns', 'uuid'], + external: ['json-schema', 'uuid'], input: 'lib/utils/json_schema_validator/index.ts', output: { exports: 'named', From c36dee97f814e410c2881181f6403575167215e8 Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Wed, 13 Apr 2022 15:43:07 +0500 Subject: [PATCH 19/59] headers updated and notification center moved --- .../lib/core/notification_center/index.ts | 23 +++++++++++++++---- .../lib/optimizely/index.tests.js | 3 ++- .../optimizely_user_context/index.tests.js | 3 ++- .../forwarding_event_processor.ts | 4 ++-- packages/optimizely-sdk/lib/shared_types.ts | 2 +- .../optimizely-sdk/lib/utils/enums/index.ts | 2 +- .../lib/utils/event_tag_utils/index.tests.js | 2 +- .../utils/event_tags_validator/index.tests.js | 2 +- .../lib/utils/event_tags_validator/index.ts | 2 +- .../optimizely-sdk/lib/utils/fns/index.ts | 16 +------------ .../lib/utils/json_schema_validator/index.ts | 2 +- .../index.tests.js | 2 +- .../user_profile_service_validator/index.ts | 2 +- 13 files changed, 33 insertions(+), 32 deletions(-) diff --git a/packages/optimizely-sdk/lib/core/notification_center/index.ts b/packages/optimizely-sdk/lib/core/notification_center/index.ts index f2a6086a4..8ffd29f5a 100644 --- a/packages/optimizely-sdk/lib/core/notification_center/index.ts +++ b/packages/optimizely-sdk/lib/core/notification_center/index.ts @@ -1,5 +1,5 @@ /** - * Copyright 2020-2022, Optimizely + * Copyright 2020, 2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -14,17 +14,24 @@ * limitations under the License. */ import { LogHandler, ErrorHandler } from '@optimizely/js-sdk-logging'; -import { objectValues, NOTIFICATION_TYPES as notificationTypesEnum } from '../../utils/fns'; +import { objectValues } from '../../utils/fns'; import { NotificationListener, ListenerPayload } from '../../shared_types'; import { LOG_LEVEL, LOG_MESSAGES, - NOTIFICATION_TYPES, } from '../../utils/enums'; const MODULE_NAME = 'NOTIFICATION_CENTER'; +export enum NOTIFICATION_TYPES { + ACTIVATE = 'ACTIVATE:experiment, user_id,attributes, variation, event', + DECISION = 'DECISION:type, userId, attributes, decisionInfo', + LOG_EVENT = 'LOG_EVENT:logEvent', + OPTIMIZELY_CONFIG_UPDATE = 'OPTIMIZELY_CONFIG_UPDATE', + TRACK = 'TRACK:event_key, user_id, attributes, event_tags, event', +} + interface NotificationCenterOptions { logger: LogHandler; errorHandler: ErrorHandler; @@ -185,9 +192,9 @@ export class NotificationCenter { /** * Remove all previously added notification listeners for the argument type - * @param {notificationTypesEnum} notificationType One of NOTIFICATION_TYPES + * @param {NOTIFICATION_TYPES} notificationType One of NOTIFICATION_TYPES */ - clearNotificationListeners(notificationType: notificationTypesEnum): void { + clearNotificationListeners(notificationType: NOTIFICATION_TYPES): void { try { this.notificationListeners[notificationType] = []; } catch (e) { @@ -238,3 +245,9 @@ export class NotificationCenter { export function createNotificationCenter(options: NotificationCenterOptions): NotificationCenter { return new NotificationCenter(options); } + +export interface NotificationCenter { + // TODO[OASIS-6649]: Don't use any type + // eslint-disable-next-line @typescript-eslint/no-explicit-any + sendNotifications(notificationType: NOTIFICATION_TYPES, notificationData?: any): void +} diff --git a/packages/optimizely-sdk/lib/optimizely/index.tests.js b/packages/optimizely-sdk/lib/optimizely/index.tests.js index 1b776958b..996663695 100644 --- a/packages/optimizely-sdk/lib/optimizely/index.tests.js +++ b/packages/optimizely-sdk/lib/optimizely/index.tests.js @@ -15,7 +15,8 @@ ***************************************************************************/ import { assert, expect } from 'chai'; import sinon from 'sinon'; -import { sprintf, NOTIFICATION_TYPES } from '../utils/fns'; +import { sprintf } from '../utils/fns'; +import { NOTIFICATION_TYPES } from '../core/notification_center'; import eventProcessor from '../plugins/event_processor'; import * as logging from '@optimizely/js-sdk-logging'; diff --git a/packages/optimizely-sdk/lib/optimizely_user_context/index.tests.js b/packages/optimizely-sdk/lib/optimizely_user_context/index.tests.js index 837a577f0..eb113fd96 100644 --- a/packages/optimizely-sdk/lib/optimizely_user_context/index.tests.js +++ b/packages/optimizely-sdk/lib/optimizely_user_context/index.tests.js @@ -17,7 +17,8 @@ import { assert } from 'chai'; import sinon from 'sinon'; import * as logging from '@optimizely/js-sdk-logging'; -import { sprintf, NOTIFICATION_TYPES } from '../utils/fns'; +import { sprintf } from '../utils/fns'; +import { NOTIFICATION_TYPES } from '../core/notification_center'; import OptimizelyUserContext from './'; import { createLogger } from '../plugins/logger'; diff --git a/packages/optimizely-sdk/lib/plugins/event_processor/forwarding_event_processor.ts b/packages/optimizely-sdk/lib/plugins/event_processor/forwarding_event_processor.ts index 609f2729d..2875d9200 100644 --- a/packages/optimizely-sdk/lib/plugins/event_processor/forwarding_event_processor.ts +++ b/packages/optimizely-sdk/lib/plugins/event_processor/forwarding_event_processor.ts @@ -1,5 +1,5 @@ /** - * Copyright 2021-2022, Optimizely + * Copyright 2021, 2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,7 +18,7 @@ import { EventProcessor, ProcessableEvent, } from '@optimizely/js-sdk-event-processor'; -import { NotificationCenter } from '../../utils/fns'; +import { NotificationCenter } from '../../core/notification_center'; import { EventDispatcher } from '../../shared_types'; import { NOTIFICATION_TYPES } from '../../utils/enums'; diff --git a/packages/optimizely-sdk/lib/shared_types.ts b/packages/optimizely-sdk/lib/shared_types.ts index bfc764d63..89023509d 100644 --- a/packages/optimizely-sdk/lib/shared_types.ts +++ b/packages/optimizely-sdk/lib/shared_types.ts @@ -17,7 +17,7 @@ import { ErrorHandler, LogHandler, LogLevel, LoggerFacade } from '@optimizely/js import { EventProcessor } from '@optimizely/js-sdk-event-processor'; import {NotificationCenter as NotificationCenterImpl} from './core/notification_center' -import { NOTIFICATION_TYPES } from './utils/fns'; +import { NOTIFICATION_TYPES } from './core/notification_center'; export interface BucketerParams { experimentId: string; diff --git a/packages/optimizely-sdk/lib/utils/enums/index.ts b/packages/optimizely-sdk/lib/utils/enums/index.ts index 051e62e35..c327e5369 100644 --- a/packages/optimizely-sdk/lib/utils/enums/index.ts +++ b/packages/optimizely-sdk/lib/utils/enums/index.ts @@ -14,7 +14,7 @@ * limitations under the License. * ***************************************************************************/ -import { NOTIFICATION_TYPES as notificationTypesEnum } from '../../utils/fns'; +import { NOTIFICATION_TYPES as notificationTypesEnum } from '../../core/notification_center'; /** * Contains global enums used throughout the library diff --git a/packages/optimizely-sdk/lib/utils/event_tag_utils/index.tests.js b/packages/optimizely-sdk/lib/utils/event_tag_utils/index.tests.js index 552bfe120..5f7fc2bcc 100644 --- a/packages/optimizely-sdk/lib/utils/event_tag_utils/index.tests.js +++ b/packages/optimizely-sdk/lib/utils/event_tag_utils/index.tests.js @@ -1,5 +1,5 @@ /** - * Copyright 2017, 2020-2022, Optimizely + * Copyright 2017, 2020, 2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/utils/event_tags_validator/index.tests.js b/packages/optimizely-sdk/lib/utils/event_tags_validator/index.tests.js index d4e279abe..45dc75123 100644 --- a/packages/optimizely-sdk/lib/utils/event_tags_validator/index.tests.js +++ b/packages/optimizely-sdk/lib/utils/event_tags_validator/index.tests.js @@ -1,5 +1,5 @@ /** - * Copyright 2017, 2020-2022 Optimizely + * Copyright 2017, 2020, 2022 Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/utils/event_tags_validator/index.ts b/packages/optimizely-sdk/lib/utils/event_tags_validator/index.ts index cf4883324..f2294dda0 100644 --- a/packages/optimizely-sdk/lib/utils/event_tags_validator/index.ts +++ b/packages/optimizely-sdk/lib/utils/event_tags_validator/index.ts @@ -1,5 +1,5 @@ /** - * Copyright 2017, 2020-2022 Optimizely + * Copyright 2017, 2020, 2022 Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/utils/fns/index.ts b/packages/optimizely-sdk/lib/utils/fns/index.ts index 95c124b3b..748eee4db 100644 --- a/packages/optimizely-sdk/lib/utils/fns/index.ts +++ b/packages/optimizely-sdk/lib/utils/fns/index.ts @@ -192,19 +192,6 @@ export function sprintf(format: string, ...args: any[]): string { * - logEvent {Object} * */ -export enum NOTIFICATION_TYPES { - ACTIVATE = 'ACTIVATE:experiment, user_id,attributes, variation, event', - DECISION = 'DECISION:type, userId, attributes, decisionInfo', - LOG_EVENT = 'LOG_EVENT:logEvent', - OPTIMIZELY_CONFIG_UPDATE = 'OPTIMIZELY_CONFIG_UPDATE', - TRACK = 'TRACK:event_key, user_id, attributes, event_tags, event', -} - -export interface NotificationCenter { - // TODO[OASIS-6649]: Don't use any type - // eslint-disable-next-line @typescript-eslint/no-explicit-any - sendNotifications(notificationType: NOTIFICATION_TYPES, notificationData?: any): void -} export default { assign, @@ -220,6 +207,5 @@ export default { objectEntries, find, keyByUtil, - sprintf, - NOTIFICATION_TYPES + sprintf } diff --git a/packages/optimizely-sdk/lib/utils/json_schema_validator/index.ts b/packages/optimizely-sdk/lib/utils/json_schema_validator/index.ts index 0e93cee60..95e4c504f 100644 --- a/packages/optimizely-sdk/lib/utils/json_schema_validator/index.ts +++ b/packages/optimizely-sdk/lib/utils/json_schema_validator/index.ts @@ -1,5 +1,5 @@ /** - * Copyright 2016-2017, 2020-2022 Optimizely + * Copyright 2016-2017, 2020, 2022 Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/utils/user_profile_service_validator/index.tests.js b/packages/optimizely-sdk/lib/utils/user_profile_service_validator/index.tests.js index 8d93bc16b..1237a0894 100644 --- a/packages/optimizely-sdk/lib/utils/user_profile_service_validator/index.tests.js +++ b/packages/optimizely-sdk/lib/utils/user_profile_service_validator/index.tests.js @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright 2017, 2020-2022, Optimizely, Inc. and contributors * + * Copyright 2017, 2020, 2022, Optimizely, Inc. and contributors * * * * Licensed under the Apache License, Version 2.0 (the "License"); * * you may not use this file except in compliance with the License. * diff --git a/packages/optimizely-sdk/lib/utils/user_profile_service_validator/index.ts b/packages/optimizely-sdk/lib/utils/user_profile_service_validator/index.ts index c9f5d557f..57df0c891 100644 --- a/packages/optimizely-sdk/lib/utils/user_profile_service_validator/index.ts +++ b/packages/optimizely-sdk/lib/utils/user_profile_service_validator/index.ts @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright 2017, 2020-2022, Optimizely, Inc. and contributors * + * Copyright 2017, 2020, 2022, Optimizely, Inc. and contributors * * * * Licensed under the Apache License, Version 2.0 (the "License"); * * you may not use this file except in compliance with the License. * From 19d1ca0ad00ec5fd27741fd2933594e2233f0235 Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Thu, 14 Apr 2022 22:16:53 +0500 Subject: [PATCH 20/59] comments addressed --- .../lib/core/notification_center/index.ts | 9 +-------- .../optimizely-sdk/lib/optimizely/index.tests.js | 2 +- .../lib/optimizely_user_context/index.tests.js | 2 +- packages/optimizely-sdk/lib/shared_types.ts | 2 +- packages/optimizely-sdk/lib/utils/enums/index.ts | 12 ++++++++---- 5 files changed, 12 insertions(+), 15 deletions(-) diff --git a/packages/optimizely-sdk/lib/core/notification_center/index.ts b/packages/optimizely-sdk/lib/core/notification_center/index.ts index 8ffd29f5a..d1774b8b0 100644 --- a/packages/optimizely-sdk/lib/core/notification_center/index.ts +++ b/packages/optimizely-sdk/lib/core/notification_center/index.ts @@ -20,18 +20,11 @@ import { NotificationListener, ListenerPayload } from '../../shared_types'; import { LOG_LEVEL, LOG_MESSAGES, + NOTIFICATION_TYPES } from '../../utils/enums'; const MODULE_NAME = 'NOTIFICATION_CENTER'; -export enum NOTIFICATION_TYPES { - ACTIVATE = 'ACTIVATE:experiment, user_id,attributes, variation, event', - DECISION = 'DECISION:type, userId, attributes, decisionInfo', - LOG_EVENT = 'LOG_EVENT:logEvent', - OPTIMIZELY_CONFIG_UPDATE = 'OPTIMIZELY_CONFIG_UPDATE', - TRACK = 'TRACK:event_key, user_id, attributes, event_tags, event', -} - interface NotificationCenterOptions { logger: LogHandler; errorHandler: ErrorHandler; diff --git a/packages/optimizely-sdk/lib/optimizely/index.tests.js b/packages/optimizely-sdk/lib/optimizely/index.tests.js index 996663695..2c0a7be28 100644 --- a/packages/optimizely-sdk/lib/optimizely/index.tests.js +++ b/packages/optimizely-sdk/lib/optimizely/index.tests.js @@ -16,7 +16,7 @@ import { assert, expect } from 'chai'; import sinon from 'sinon'; import { sprintf } from '../utils/fns'; -import { NOTIFICATION_TYPES } from '../core/notification_center'; +import { NOTIFICATION_TYPES } from '../utils/enums'; import eventProcessor from '../plugins/event_processor'; import * as logging from '@optimizely/js-sdk-logging'; diff --git a/packages/optimizely-sdk/lib/optimizely_user_context/index.tests.js b/packages/optimizely-sdk/lib/optimizely_user_context/index.tests.js index eb113fd96..6b9e1ccf0 100644 --- a/packages/optimizely-sdk/lib/optimizely_user_context/index.tests.js +++ b/packages/optimizely-sdk/lib/optimizely_user_context/index.tests.js @@ -18,7 +18,7 @@ import sinon from 'sinon'; import * as logging from '@optimizely/js-sdk-logging'; import { sprintf } from '../utils/fns'; -import { NOTIFICATION_TYPES } from '../core/notification_center'; +import { NOTIFICATION_TYPES } from '../utils/enums'; import OptimizelyUserContext from './'; import { createLogger } from '../plugins/logger'; diff --git a/packages/optimizely-sdk/lib/shared_types.ts b/packages/optimizely-sdk/lib/shared_types.ts index 89023509d..b6b1527ca 100644 --- a/packages/optimizely-sdk/lib/shared_types.ts +++ b/packages/optimizely-sdk/lib/shared_types.ts @@ -17,7 +17,7 @@ import { ErrorHandler, LogHandler, LogLevel, LoggerFacade } from '@optimizely/js import { EventProcessor } from '@optimizely/js-sdk-event-processor'; import {NotificationCenter as NotificationCenterImpl} from './core/notification_center' -import { NOTIFICATION_TYPES } from './core/notification_center'; +import { NOTIFICATION_TYPES } from './utils/enums'; export interface BucketerParams { experimentId: string; diff --git a/packages/optimizely-sdk/lib/utils/enums/index.ts b/packages/optimizely-sdk/lib/utils/enums/index.ts index c327e5369..1f011c02b 100644 --- a/packages/optimizely-sdk/lib/utils/enums/index.ts +++ b/packages/optimizely-sdk/lib/utils/enums/index.ts @@ -14,8 +14,6 @@ * limitations under the License. * ***************************************************************************/ -import { NOTIFICATION_TYPES as notificationTypesEnum } from '../../core/notification_center'; - /** * Contains global enums used throughout the library */ @@ -184,8 +182,6 @@ export const REACT_NATIVE_CLIENT_ENGINE = 'react-native-sdk'; export const REACT_NATIVE_JS_CLIENT_ENGINE = 'react-native-js-sdk'; export const NODE_CLIENT_VERSION = '4.9.1'; -export const NOTIFICATION_TYPES = notificationTypesEnum; - export const DECISION_NOTIFICATION_TYPES = { AB_TEST: 'ab-test', FEATURE: 'feature', @@ -245,3 +241,11 @@ export const DECISION_MESSAGES = { FLAG_KEY_INVALID: 'No flag was found for key "%s".', VARIABLE_VALUE_INVALID: 'Variable value for key "%s" is invalid or wrong type.', } + +export enum NOTIFICATION_TYPES { + ACTIVATE = 'ACTIVATE:experiment, user_id,attributes, variation, event', + DECISION = 'DECISION:type, userId, attributes, decisionInfo', + LOG_EVENT = 'LOG_EVENT:logEvent', + OPTIMIZELY_CONFIG_UPDATE = 'OPTIMIZELY_CONFIG_UPDATE', + TRACK = 'TRACK:event_key, user_id, attributes, event_tags, event', +} From 6622d21467e205b603a15d126832c01dbf4661be Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Mon, 18 Apr 2022 17:59:14 +0500 Subject: [PATCH 21/59] removed Notification center interface --- .../optimizely-sdk/lib/core/notification_center/index.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/packages/optimizely-sdk/lib/core/notification_center/index.ts b/packages/optimizely-sdk/lib/core/notification_center/index.ts index d1774b8b0..a7862eb32 100644 --- a/packages/optimizely-sdk/lib/core/notification_center/index.ts +++ b/packages/optimizely-sdk/lib/core/notification_center/index.ts @@ -238,9 +238,3 @@ export class NotificationCenter { export function createNotificationCenter(options: NotificationCenterOptions): NotificationCenter { return new NotificationCenter(options); } - -export interface NotificationCenter { - // TODO[OASIS-6649]: Don't use any type - // eslint-disable-next-line @typescript-eslint/no-explicit-any - sendNotifications(notificationType: NOTIFICATION_TYPES, notificationData?: any): void -} From 71f7e1443548880d3e2ca3cb1439954a3f1e4d8f Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Mon, 18 Apr 2022 19:42:56 +0500 Subject: [PATCH 22/59] notification center renamed --- .../optimizely-sdk/lib/core/notification_center/index.ts | 6 ++++++ packages/optimizely-sdk/lib/optimizely/index.ts | 2 +- .../plugins/event_processor/forwarding_event_processor.ts | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/optimizely-sdk/lib/core/notification_center/index.ts b/packages/optimizely-sdk/lib/core/notification_center/index.ts index a7862eb32..083e24355 100644 --- a/packages/optimizely-sdk/lib/core/notification_center/index.ts +++ b/packages/optimizely-sdk/lib/core/notification_center/index.ts @@ -238,3 +238,9 @@ export class NotificationCenter { export function createNotificationCenter(options: NotificationCenterOptions): NotificationCenter { return new NotificationCenter(options); } + +export interface NotificationCenterInterface { + // TODO[OASIS-6649]: Don't use any type + // eslint-disable-next-line @typescript-eslint/no-explicit-any + sendNotifications(notificationType: NOTIFICATION_TYPES, notificationData?: any): void +} diff --git a/packages/optimizely-sdk/lib/optimizely/index.ts b/packages/optimizely-sdk/lib/optimizely/index.ts index 23fbeec6c..c8e22419a 100644 --- a/packages/optimizely-sdk/lib/optimizely/index.ts +++ b/packages/optimizely-sdk/lib/optimizely/index.ts @@ -15,7 +15,7 @@ ***************************************************************************/ import { LoggerFacade, ErrorHandler } from '@optimizely/js-sdk-logging'; import { sprintf, objectValues } from '../utils/fns'; -import { NotificationCenter } from '../core/notification_center'; +import { NotificationCenterInterface as NotificationCenter } from '../core/notification_center'; import { EventProcessor } from '@optimizely/js-sdk-event-processor'; import { diff --git a/packages/optimizely-sdk/lib/plugins/event_processor/forwarding_event_processor.ts b/packages/optimizely-sdk/lib/plugins/event_processor/forwarding_event_processor.ts index 2875d9200..1111e62d3 100644 --- a/packages/optimizely-sdk/lib/plugins/event_processor/forwarding_event_processor.ts +++ b/packages/optimizely-sdk/lib/plugins/event_processor/forwarding_event_processor.ts @@ -18,7 +18,7 @@ import { EventProcessor, ProcessableEvent, } from '@optimizely/js-sdk-event-processor'; -import { NotificationCenter } from '../../core/notification_center'; +import { NotificationCenterInterface as NotificationCenter } from '../../core/notification_center'; import { EventDispatcher } from '../../shared_types'; import { NOTIFICATION_TYPES } from '../../utils/enums'; From 4b9c12430d12fac4fc5451d18e750e78113af285 Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Mon, 18 Apr 2022 19:56:50 +0500 Subject: [PATCH 23/59] notification type corrected --- packages/optimizely-sdk/lib/optimizely/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/optimizely-sdk/lib/optimizely/index.ts b/packages/optimizely-sdk/lib/optimizely/index.ts index c8e22419a..23fbeec6c 100644 --- a/packages/optimizely-sdk/lib/optimizely/index.ts +++ b/packages/optimizely-sdk/lib/optimizely/index.ts @@ -15,7 +15,7 @@ ***************************************************************************/ import { LoggerFacade, ErrorHandler } from '@optimizely/js-sdk-logging'; import { sprintf, objectValues } from '../utils/fns'; -import { NotificationCenterInterface as NotificationCenter } from '../core/notification_center'; +import { NotificationCenter } from '../core/notification_center'; import { EventProcessor } from '@optimizely/js-sdk-event-processor'; import { From 9e3d8d493c76b0aa54e9f7a020019961f4b7b92c Mon Sep 17 00:00:00 2001 From: zashraf1985 Date: Mon, 18 Apr 2022 17:55:46 -0700 Subject: [PATCH 24/59] renamed a conflicting interface --- .../optimizely-sdk/lib/core/notification_center/index.ts | 2 +- .../plugins/event_processor/forwarding_event_processor.ts | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/optimizely-sdk/lib/core/notification_center/index.ts b/packages/optimizely-sdk/lib/core/notification_center/index.ts index 083e24355..efd473d09 100644 --- a/packages/optimizely-sdk/lib/core/notification_center/index.ts +++ b/packages/optimizely-sdk/lib/core/notification_center/index.ts @@ -239,7 +239,7 @@ export function createNotificationCenter(options: NotificationCenterOptions): No return new NotificationCenter(options); } -export interface NotificationCenterInterface { +export interface NotificationSender { // TODO[OASIS-6649]: Don't use any type // eslint-disable-next-line @typescript-eslint/no-explicit-any sendNotifications(notificationType: NOTIFICATION_TYPES, notificationData?: any): void diff --git a/packages/optimizely-sdk/lib/plugins/event_processor/forwarding_event_processor.ts b/packages/optimizely-sdk/lib/plugins/event_processor/forwarding_event_processor.ts index 1111e62d3..cfb9d9880 100644 --- a/packages/optimizely-sdk/lib/plugins/event_processor/forwarding_event_processor.ts +++ b/packages/optimizely-sdk/lib/plugins/event_processor/forwarding_event_processor.ts @@ -18,7 +18,7 @@ import { EventProcessor, ProcessableEvent, } from '@optimizely/js-sdk-event-processor'; -import { NotificationCenterInterface as NotificationCenter } from '../../core/notification_center'; +import { NotificationSender } from '../../core/notification_center'; import { EventDispatcher } from '../../shared_types'; import { NOTIFICATION_TYPES } from '../../utils/enums'; @@ -26,9 +26,9 @@ import { formatEvents } from '../../core/event_builder/build_event_v1'; class ForwardingEventProcessor implements EventProcessor { private dispatcher: EventDispatcher; - private notificationCenter?: NotificationCenter; + private notificationCenter?: NotificationSender; - constructor(dispatcher: EventDispatcher, notificationCenter?: NotificationCenter) { + constructor(dispatcher: EventDispatcher, notificationCenter?: NotificationSender) { this.dispatcher = dispatcher; this.notificationCenter = notificationCenter; } @@ -51,6 +51,6 @@ class ForwardingEventProcessor implements EventProcessor { } } -export function createForwardingEventProcessor(dispatcher: EventDispatcher, notificationCenter?: NotificationCenter): EventProcessor { +export function createForwardingEventProcessor(dispatcher: EventDispatcher, notificationCenter?: NotificationSender): EventProcessor { return new ForwardingEventProcessor(dispatcher, notificationCenter); } From bef10a0f67122f5e6a1b96301c07fc48ee146283 Mon Sep 17 00:00:00 2001 From: zashraf1985 Date: Mon, 18 Apr 2022 18:02:47 -0700 Subject: [PATCH 25/59] removed unused line --- packages/optimizely-sdk/rollup.config.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/optimizely-sdk/rollup.config.js b/packages/optimizely-sdk/rollup.config.js index 45aa3f75e..92c0aa20b 100644 --- a/packages/optimizely-sdk/rollup.config.js +++ b/packages/optimizely-sdk/rollup.config.js @@ -33,7 +33,6 @@ const typescriptPluginOptions = { include: [ './lib/**/*.ts', './lib/**/*.js', - './modules/**/*.ts' ], }; From dcdd371e1faf0cfc7a553e424befa298d9b511c7 Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Thu, 21 Apr 2022 21:58:08 +0500 Subject: [PATCH 26/59] comments addressed --- .../optimizely-sdk/lib/core/audience_evaluator/index.tests.js | 2 +- .../core/custom_attribute_condition_evaluator/index.tests.js | 2 +- packages/optimizely-sdk/lib/core/notification_center/index.ts | 2 +- .../lib/core/project_config/project_config_manager.tests.js | 2 +- .../lib/plugins/event_processor/forwarding_event_processor.ts | 2 +- .../lib/utils/attributes_validator/index.tests.js | 2 +- packages/optimizely-sdk/lib/utils/attributes_validator/index.ts | 2 +- .../optimizely-sdk/lib/utils/config_validator/index.tests.js | 2 +- packages/optimizely-sdk/lib/utils/config_validator/index.ts | 2 +- packages/optimizely-sdk/lib/utils/fns/index.ts | 2 +- .../lib/utils/json_schema_validator/index.tests.js | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/optimizely-sdk/lib/core/audience_evaluator/index.tests.js b/packages/optimizely-sdk/lib/core/audience_evaluator/index.tests.js index f8869f330..126e23ce3 100644 --- a/packages/optimizely-sdk/lib/core/audience_evaluator/index.tests.js +++ b/packages/optimizely-sdk/lib/core/audience_evaluator/index.tests.js @@ -1,5 +1,5 @@ /** - * Copyright 2016, 2018-2022, Optimizely + * Copyright 2016, 2018-2020, 2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.tests.js b/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.tests.js index af85b5da3..55a8e0dbe 100644 --- a/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.tests.js +++ b/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.tests.js @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright 2018-2021, Optimizely, Inc. and contributors * + * Copyright 2018-2020, 2022, Optimizely, Inc. and contributors * * * * Licensed under the Apache License, Version 2.0 (the "License"); * * you may not use this file except in compliance with the License. * diff --git a/packages/optimizely-sdk/lib/core/notification_center/index.ts b/packages/optimizely-sdk/lib/core/notification_center/index.ts index efd473d09..d54e30f84 100644 --- a/packages/optimizely-sdk/lib/core/notification_center/index.ts +++ b/packages/optimizely-sdk/lib/core/notification_center/index.ts @@ -20,7 +20,7 @@ import { NotificationListener, ListenerPayload } from '../../shared_types'; import { LOG_LEVEL, LOG_MESSAGES, - NOTIFICATION_TYPES + NOTIFICATION_TYPES, } from '../../utils/enums'; const MODULE_NAME = 'NOTIFICATION_CENTER'; diff --git a/packages/optimizely-sdk/lib/core/project_config/project_config_manager.tests.js b/packages/optimizely-sdk/lib/core/project_config/project_config_manager.tests.js index 9212fd17c..387c9aee8 100644 --- a/packages/optimizely-sdk/lib/core/project_config/project_config_manager.tests.js +++ b/packages/optimizely-sdk/lib/core/project_config/project_config_manager.tests.js @@ -1,5 +1,5 @@ /** - * Copyright 2019-2022 Optimizely + * Copyright 2019-2020, 2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/plugins/event_processor/forwarding_event_processor.ts b/packages/optimizely-sdk/lib/plugins/event_processor/forwarding_event_processor.ts index cfb9d9880..1896199de 100644 --- a/packages/optimizely-sdk/lib/plugins/event_processor/forwarding_event_processor.ts +++ b/packages/optimizely-sdk/lib/plugins/event_processor/forwarding_event_processor.ts @@ -1,5 +1,5 @@ /** - * Copyright 2021, 2022, Optimizely + * Copyright 2021-2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/utils/attributes_validator/index.tests.js b/packages/optimizely-sdk/lib/utils/attributes_validator/index.tests.js index d29686105..d98e8fdb0 100644 --- a/packages/optimizely-sdk/lib/utils/attributes_validator/index.tests.js +++ b/packages/optimizely-sdk/lib/utils/attributes_validator/index.tests.js @@ -1,5 +1,5 @@ /** - * Copyright 2016, 2018-2022, Optimizely + * Copyright 2016, 2018-2020, 2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/utils/attributes_validator/index.ts b/packages/optimizely-sdk/lib/utils/attributes_validator/index.ts index 24e4be28f..5f33e85d4 100644 --- a/packages/optimizely-sdk/lib/utils/attributes_validator/index.ts +++ b/packages/optimizely-sdk/lib/utils/attributes_validator/index.ts @@ -1,5 +1,5 @@ /** - * Copyright 2016, 2018-2022, Optimizely + * Copyright 2016, 2018-2020, 2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/utils/config_validator/index.tests.js b/packages/optimizely-sdk/lib/utils/config_validator/index.tests.js index 690799503..9ff0a32c5 100644 --- a/packages/optimizely-sdk/lib/utils/config_validator/index.tests.js +++ b/packages/optimizely-sdk/lib/utils/config_validator/index.tests.js @@ -1,5 +1,5 @@ /** - * Copyright 2016, 2018-2022, Optimizely + * Copyright 2016, 2018-2020, 2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/utils/config_validator/index.ts b/packages/optimizely-sdk/lib/utils/config_validator/index.ts index d18c82184..a273121cc 100644 --- a/packages/optimizely-sdk/lib/utils/config_validator/index.ts +++ b/packages/optimizely-sdk/lib/utils/config_validator/index.ts @@ -1,5 +1,5 @@ /** - * Copyright 2016, 2018-2022, Optimizely + * Copyright 2016, 2018-2020, 2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/utils/fns/index.ts b/packages/optimizely-sdk/lib/utils/fns/index.ts index 748eee4db..499273610 100644 --- a/packages/optimizely-sdk/lib/utils/fns/index.ts +++ b/packages/optimizely-sdk/lib/utils/fns/index.ts @@ -1,5 +1,5 @@ /** - * Copyright 2017, 2019-2022, Optimizely + * Copyright 2017, 2019-2020, 2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/utils/json_schema_validator/index.tests.js b/packages/optimizely-sdk/lib/utils/json_schema_validator/index.tests.js index 5c31841dd..00d9e712b 100644 --- a/packages/optimizely-sdk/lib/utils/json_schema_validator/index.tests.js +++ b/packages/optimizely-sdk/lib/utils/json_schema_validator/index.tests.js @@ -1,5 +1,5 @@ /** - * Copyright 2016-2022, Optimizely + * Copyright 2016-2020, 2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. From 4fc4b516a569abba8b923dd9f821ba847981454f Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Fri, 22 Apr 2022 00:24:57 +0500 Subject: [PATCH 27/59] fns exported in same import --- .../lib/core/project_config/index.ts | 51 ++++++++++--------- .../optimizely-sdk/lib/utils/fns/index.ts | 4 +- 2 files changed, 28 insertions(+), 27 deletions(-) diff --git a/packages/optimizely-sdk/lib/core/project_config/index.ts b/packages/optimizely-sdk/lib/core/project_config/index.ts index 1e807aefc..9f04289be 100644 --- a/packages/optimizely-sdk/lib/core/project_config/index.ts +++ b/packages/optimizely-sdk/lib/core/project_config/index.ts @@ -17,10 +17,11 @@ import { find, objectEntries, objectValues, - sprintf + sprintf, + assign, + keyBy } from '../../utils/fns'; -import fns from '../../utils/fns'; import { ERROR_MESSAGES, LOG_LEVEL, @@ -105,27 +106,27 @@ const MODULE_NAME = 'PROJECT_CONFIG'; // eslint-disable-next-line @typescript-eslint/no-explicit-any function createMutationSafeDatafileCopy(datafile: any): ProjectConfig { - const datafileCopy = fns.assign({}, datafile); + const datafileCopy = assign({}, datafile); datafileCopy.audiences = (datafile.audiences || []).map((audience: Audience) => { - return fns.assign({}, audience); + return assign({}, audience); }); datafileCopy.experiments = (datafile.experiments || []).map((experiment: Experiment) => { - return fns.assign({}, experiment); + return assign({}, experiment); }); datafileCopy.featureFlags = (datafile.featureFlags || []).map((featureFlag: FeatureFlag) => { - return fns.assign({}, featureFlag); + return assign({}, featureFlag); }); datafileCopy.groups = (datafile.groups || []).map((group: Group) => { - const groupCopy = fns.assign({}, group); + const groupCopy = assign({}, group); groupCopy.experiments = (group.experiments || []).map((experiment) => { - return fns.assign({}, experiment); + return assign({}, experiment); }); return groupCopy; }); datafileCopy.rollouts = (datafile.rollouts || []).map((rollout: Rollout) => { - const rolloutCopy = fns.assign({}, rollout); + const rolloutCopy = assign({}, rollout); rolloutCopy.experiments = (rollout.experiments || []).map((experiment) => { - return fns.assign({}, experiment); + return assign({}, experiment); }); return rolloutCopy; }); @@ -157,46 +158,46 @@ export const createProjectConfig = function( (projectConfig.audiences || []).forEach((audience) => { audience.conditions = JSON.parse(audience.conditions as string); }); - projectConfig.audiencesById = fns.keyBy(projectConfig.audiences, 'id'); - fns.assign(projectConfig.audiencesById, fns.keyBy(projectConfig.typedAudiences, 'id')); + projectConfig.audiencesById = keyBy(projectConfig.audiences, 'id'); + assign(projectConfig.audiencesById, keyBy(projectConfig.typedAudiences, 'id')); - projectConfig.attributeKeyMap = fns.keyBy(projectConfig.attributes, 'key'); - projectConfig.eventKeyMap = fns.keyBy(projectConfig.events, 'key'); - projectConfig.groupIdMap = fns.keyBy(projectConfig.groups, 'id'); + projectConfig.attributeKeyMap = keyBy(projectConfig.attributes, 'key'); + projectConfig.eventKeyMap = keyBy(projectConfig.events, 'key'); + projectConfig.groupIdMap = keyBy(projectConfig.groups, 'id'); let experiments; Object.keys(projectConfig.groupIdMap || {}).forEach((Id) => { experiments = projectConfig.groupIdMap[Id].experiments; (experiments || []).forEach((experiment) => { - projectConfig.experiments.push(fns.assign(experiment, { groupId: Id })); + projectConfig.experiments.push(assign(experiment, { groupId: Id })); }); }); - projectConfig.rolloutIdMap = fns.keyBy(projectConfig.rollouts || [], 'id'); + projectConfig.rolloutIdMap = keyBy(projectConfig.rollouts || [], 'id'); objectValues(projectConfig.rolloutIdMap || {}).forEach( (rollout) => { (rollout.experiments || []).forEach((experiment) => { projectConfig.experiments.push(experiment); // Creates { : } map inside of the experiment - experiment.variationKeyMap = fns.keyBy(experiment.variations, 'key'); + experiment.variationKeyMap = keyBy(experiment.variations, 'key'); }); } ); - projectConfig.experimentKeyMap = fns.keyBy(projectConfig.experiments, 'key'); - projectConfig.experimentIdMap = fns.keyBy(projectConfig.experiments, 'id'); + projectConfig.experimentKeyMap = keyBy(projectConfig.experiments, 'key'); + projectConfig.experimentIdMap = keyBy(projectConfig.experiments, 'id'); projectConfig.variationIdMap = {}; projectConfig.variationVariableUsageMap = {}; (projectConfig.experiments || []).forEach((experiment) => { // Creates { : } map inside of the experiment - experiment.variationKeyMap = fns.keyBy(experiment.variations, 'key'); + experiment.variationKeyMap = keyBy(experiment.variations, 'key'); // Creates { : { key: , id: } } mapping for quick lookup - fns.assign(projectConfig.variationIdMap, fns.keyBy(experiment.variations, 'id')); + assign(projectConfig.variationIdMap, keyBy(experiment.variations, 'id')); objectValues(experiment.variationKeyMap || {}).forEach((variation) => { if (variation.variables) { - projectConfig.variationVariableUsageMap[variation.id] = fns.keyBy(variation.variables, 'id'); + projectConfig.variationVariableUsageMap[variation.id] = keyBy(variation.variables, 'id'); } }); }); @@ -205,7 +206,7 @@ export const createProjectConfig = function( // for checking that experiment is a feature experiment or not. projectConfig.experimentFeatureMap = {}; - projectConfig.featureKeyMap = fns.keyBy(projectConfig.featureFlags || [], 'key'); + projectConfig.featureKeyMap = keyBy(projectConfig.featureFlags || [], 'key'); objectValues(projectConfig.featureKeyMap || {}).forEach( (feature) => { // Json type is represented in datafile as a subtype of string for the sake of backwards compatibility. @@ -217,7 +218,7 @@ export const createProjectConfig = function( } }); - feature.variableKeyMap = fns.keyBy(feature.variables, 'key'); + feature.variableKeyMap = keyBy(feature.variables, 'key'); (feature.experimentIds || []).forEach((experimentId) => { // Add this experiment in experiment-feature map. if (projectConfig.experimentFeatureMap[experimentId]) { diff --git a/packages/optimizely-sdk/lib/utils/fns/index.ts b/packages/optimizely-sdk/lib/utils/fns/index.ts index 499273610..6cdec3a76 100644 --- a/packages/optimizely-sdk/lib/utils/fns/index.ts +++ b/packages/optimizely-sdk/lib/utils/fns/index.ts @@ -18,7 +18,7 @@ import v4 from 'uuid'; const MAX_SAFE_INTEGER_LIMIT = Math.pow(2, 53); // eslint-disable-next-line -function assign(target: any, ...sources: any[]): any { +export function assign(target: any, ...sources: any[]): any { if (!target) { return {}; } @@ -49,7 +49,7 @@ function isSafeInteger(number: unknown): boolean { return typeof number == 'number' && Math.abs(number) <= MAX_SAFE_INTEGER_LIMIT; } -function keyBy(arr: K[], key: string): { [key: string]: K } { +export function keyBy(arr: K[], key: string): { [key: string]: K } { if (!arr) return {}; return keyByUtil(arr, function (item) { // eslint-disable-next-line @typescript-eslint/no-explicit-any From 201800e12bb68b1f4fbfe2c3656558adc8828704 Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Mon, 14 Mar 2022 20:59:19 +0500 Subject: [PATCH 28/59] intergrate logging --- .../core/audience_evaluator/index.tests.js | 2 +- .../lib/core/audience_evaluator/index.ts | 2 +- .../optimizely-sdk/lib/core/bucketer/index.ts | 2 +- .../index.tests.js | 2 +- .../index.ts | 2 +- .../lib/core/decision_service/index.ts | 2 +- .../lib/core/event_builder/event_helpers.ts | 2 +- .../lib/core/event_builder/index.ts | 2 +- .../lib/core/notification_center/index.ts | 2 +- .../lib/core/project_config/index.tests.js | 2 +- .../lib/core/project_config/index.ts | 2 +- .../project_config_manager.tests.js | 2 +- .../project_config/project_config_manager.ts | 2 +- .../optimizely-sdk/lib/index.browser.tests.js | 2 +- packages/optimizely-sdk/lib/index.browser.ts | 2 +- packages/optimizely-sdk/lib/index.lite.ts | 2 +- packages/optimizely-sdk/lib/index.node.ts | 2 +- .../lib/index.react_native.tests.js | 2 +- .../optimizely-sdk/lib/index.react_native.ts | 2 +- .../lib/optimizely/index.tests.js | 2 +- .../optimizely-sdk/lib/optimizely/index.ts | 2 +- .../optimizely_user_context/index.tests.js | 2 +- .../http_polling_datafile_manager.ts | 2 +- .../lib/plugins/logger/index.react_native.ts | 2 +- .../lib/plugins/logger/index.ts | 2 +- .../lib/utils/event_tag_utils/index.ts | 2 +- .../lib/utils/semantic_version/index.ts | 2 +- .../modules/logging/__tests__/logger.spec.ts | 386 ++++++++++++++++++ .../modules/logging/errorHandler.ts | 67 +++ .../optimizely-sdk/modules/logging/index.ts | 18 + .../optimizely-sdk/modules/logging/logger.ts | 328 +++++++++++++++ .../optimizely-sdk/modules/logging/models.ts | 42 ++ packages/optimizely-sdk/rollup.config.js | 2 +- 33 files changed, 869 insertions(+), 28 deletions(-) create mode 100644 packages/optimizely-sdk/modules/logging/__tests__/logger.spec.ts create mode 100644 packages/optimizely-sdk/modules/logging/errorHandler.ts create mode 100644 packages/optimizely-sdk/modules/logging/index.ts create mode 100644 packages/optimizely-sdk/modules/logging/logger.ts create mode 100644 packages/optimizely-sdk/modules/logging/models.ts diff --git a/packages/optimizely-sdk/lib/core/audience_evaluator/index.tests.js b/packages/optimizely-sdk/lib/core/audience_evaluator/index.tests.js index 126e23ce3..fe58a9907 100644 --- a/packages/optimizely-sdk/lib/core/audience_evaluator/index.tests.js +++ b/packages/optimizely-sdk/lib/core/audience_evaluator/index.tests.js @@ -15,8 +15,8 @@ */ import sinon from 'sinon'; import { assert } from 'chai'; -import { getLogger } from '@optimizely/js-sdk-logging'; import { sprintf } from '../../utils/fns'; +import { getLogger } from '../../../modules/logging'; import { createAudienceEvaluator } from './index'; import * as conditionTreeEvaluator from '../condition_tree_evaluator'; diff --git a/packages/optimizely-sdk/lib/core/audience_evaluator/index.ts b/packages/optimizely-sdk/lib/core/audience_evaluator/index.ts index be6e8bfcd..82f1f9bc8 100644 --- a/packages/optimizely-sdk/lib/core/audience_evaluator/index.ts +++ b/packages/optimizely-sdk/lib/core/audience_evaluator/index.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { getLogger } from '@optimizely/js-sdk-logging'; +import { getLogger } from '../../../modules/logging'; import fns from '../../utils/fns'; import { diff --git a/packages/optimizely-sdk/lib/core/bucketer/index.ts b/packages/optimizely-sdk/lib/core/bucketer/index.ts index 82d7f5bca..f1d244b8a 100644 --- a/packages/optimizely-sdk/lib/core/bucketer/index.ts +++ b/packages/optimizely-sdk/lib/core/bucketer/index.ts @@ -19,7 +19,7 @@ */ import { sprintf } from '../../utils/fns'; import murmurhash from 'murmurhash'; -import { LogHandler } from '@optimizely/js-sdk-logging'; +import { LogHandler } from '../../../modules/logging'; import { DecisionResponse, BucketerParams, diff --git a/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.tests.js b/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.tests.js index 55a8e0dbe..a28e735ba 100644 --- a/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.tests.js +++ b/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.tests.js @@ -21,7 +21,7 @@ import { LOG_LEVEL, LOG_MESSAGES, } from '../../utils/enums'; -import * as logging from '@optimizely/js-sdk-logging'; +import * as logging from '../../../modules/utils'; import * as customAttributeEvaluator from './'; var browserConditionSafari = { diff --git a/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.ts b/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.ts index f236533de..70298064c 100644 --- a/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.ts +++ b/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * * limitations under the License. * ***************************************************************************/ -import { getLogger } from '@optimizely/js-sdk-logging'; +import { getLogger } from '../../../modules/logging'; import { UserAttributes, Condition } from '../../shared_types'; import fns from '../../utils/fns'; diff --git a/packages/optimizely-sdk/lib/core/decision_service/index.ts b/packages/optimizely-sdk/lib/core/decision_service/index.ts index 546aa5c23..09fbed7b6 100644 --- a/packages/optimizely-sdk/lib/core/decision_service/index.ts +++ b/packages/optimizely-sdk/lib/core/decision_service/index.ts @@ -13,8 +13,8 @@ * See the License for the specific language governing permissions and * * limitations under the License. * ***************************************************************************/ -import { LogHandler } from '@optimizely/js-sdk-logging'; import { sprintf } from '../../utils/fns'; +import { LogHandler } from '../../../modules/logging'; import fns from '../../utils/fns'; import { bucket } from '../bucketer'; diff --git a/packages/optimizely-sdk/lib/core/event_builder/event_helpers.ts b/packages/optimizely-sdk/lib/core/event_builder/event_helpers.ts index 9d2ae4609..d8e9ead57 100644 --- a/packages/optimizely-sdk/lib/core/event_builder/event_helpers.ts +++ b/packages/optimizely-sdk/lib/core/event_builder/event_helpers.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { getLogger } from '@optimizely/js-sdk-logging'; +import { getLogger } from '../../../modules/logging'; import fns from '../../utils/fns'; import * as eventTagUtils from '../../utils/event_tag_utils'; diff --git a/packages/optimizely-sdk/lib/core/event_builder/index.ts b/packages/optimizely-sdk/lib/core/event_builder/index.ts index 4c85c5fda..34ecfaa73 100644 --- a/packages/optimizely-sdk/lib/core/event_builder/index.ts +++ b/packages/optimizely-sdk/lib/core/event_builder/index.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { LoggerFacade } from '@optimizely/js-sdk-logging'; +import { LoggerFacade } from '../../../modules/logging'; import { EventV1 as CommonEventParams } from '@optimizely/js-sdk-event-processor'; import fns from '../../utils/fns'; diff --git a/packages/optimizely-sdk/lib/core/notification_center/index.ts b/packages/optimizely-sdk/lib/core/notification_center/index.ts index d54e30f84..c5847c449 100644 --- a/packages/optimizely-sdk/lib/core/notification_center/index.ts +++ b/packages/optimizely-sdk/lib/core/notification_center/index.ts @@ -13,8 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { LogHandler, ErrorHandler } from '@optimizely/js-sdk-logging'; import { objectValues } from '../../utils/fns'; +import { LogHandler, ErrorHandler } from '../../../modules/logging'; import { NotificationListener, ListenerPayload } from '../../shared_types'; import { diff --git a/packages/optimizely-sdk/lib/core/project_config/index.tests.js b/packages/optimizely-sdk/lib/core/project_config/index.tests.js index 401eefb4d..071e96e41 100644 --- a/packages/optimizely-sdk/lib/core/project_config/index.tests.js +++ b/packages/optimizely-sdk/lib/core/project_config/index.tests.js @@ -16,8 +16,8 @@ import sinon from 'sinon'; import { assert } from 'chai'; import { forEach, cloneDeep } from 'lodash'; -import { getLogger } from '@optimizely/js-sdk-logging'; import { sprintf } from '../../utils/fns'; +import { getLogger } from '../../../modules/logging'; import fns from '../../utils/fns'; import projectConfig from './'; diff --git a/packages/optimizely-sdk/lib/core/project_config/index.ts b/packages/optimizely-sdk/lib/core/project_config/index.ts index 9f04289be..13d72c103 100644 --- a/packages/optimizely-sdk/lib/core/project_config/index.ts +++ b/packages/optimizely-sdk/lib/core/project_config/index.ts @@ -30,7 +30,7 @@ import { } from '../../utils/enums'; import configValidator from '../../utils/config_validator'; -import { LogHandler } from '@optimizely/js-sdk-logging'; +import { LogHandler } from '../../../modules/logging'; import { Audience, Experiment, diff --git a/packages/optimizely-sdk/lib/core/project_config/project_config_manager.tests.js b/packages/optimizely-sdk/lib/core/project_config/project_config_manager.tests.js index 387c9aee8..e4f86d3a4 100644 --- a/packages/optimizely-sdk/lib/core/project_config/project_config_manager.tests.js +++ b/packages/optimizely-sdk/lib/core/project_config/project_config_manager.tests.js @@ -17,8 +17,8 @@ import sinon from 'sinon'; import { assert } from 'chai'; import { cloneDeep } from 'lodash'; -import * as logging from '@optimizely/js-sdk-logging'; import { sprintf } from '../../utils/fns'; +import * as logging from '../../../modules/logging'; import * as datafileManager from '@optimizely/js-sdk-datafile-manager'; import * as projectConfig from './index'; diff --git a/packages/optimizely-sdk/lib/core/project_config/project_config_manager.ts b/packages/optimizely-sdk/lib/core/project_config/project_config_manager.ts index 961a79b89..de43bbf4a 100644 --- a/packages/optimizely-sdk/lib/core/project_config/project_config_manager.ts +++ b/packages/optimizely-sdk/lib/core/project_config/project_config_manager.ts @@ -13,8 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { getLogger } from '@optimizely/js-sdk-logging'; import { sprintf } from '../../utils/fns'; +import { getLogger } from '../../../modules/logging'; import { ERROR_MESSAGES } from '../../utils/enums'; import { createOptimizelyConfig } from '../optimizely_config'; diff --git a/packages/optimizely-sdk/lib/index.browser.tests.js b/packages/optimizely-sdk/lib/index.browser.tests.js index 728224b4c..5a2885190 100644 --- a/packages/optimizely-sdk/lib/index.browser.tests.js +++ b/packages/optimizely-sdk/lib/index.browser.tests.js @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import * as logging from '@optimizely/js-sdk-logging'; +import * as logging from '../modules/logging'; import { assert } from 'chai'; import sinon from 'sinon'; diff --git a/packages/optimizely-sdk/lib/index.browser.ts b/packages/optimizely-sdk/lib/index.browser.ts index 7411fc22a..a2b7101d7 100644 --- a/packages/optimizely-sdk/lib/index.browser.ts +++ b/packages/optimizely-sdk/lib/index.browser.ts @@ -20,7 +20,7 @@ import { setErrorHandler, getErrorHandler, LogLevel -} from '@optimizely/js-sdk-logging'; +} from '../modules/logging'; import { LocalStoragePendingEventsDispatcher } from '@optimizely/js-sdk-event-processor'; import configValidator from './utils/config_validator'; import defaultErrorHandler from './plugins/error_handler'; diff --git a/packages/optimizely-sdk/lib/index.lite.ts b/packages/optimizely-sdk/lib/index.lite.ts index 3e46b8878..0cd866cc2 100644 --- a/packages/optimizely-sdk/lib/index.lite.ts +++ b/packages/optimizely-sdk/lib/index.lite.ts @@ -20,7 +20,7 @@ setErrorHandler, getErrorHandler, LogLevel - } from '@optimizely/js-sdk-logging'; + } from '../modules/logging'; import configValidator from './utils/config_validator'; import defaultErrorHandler from './plugins/error_handler'; import noOpEventDispatcher from './plugins/event_dispatcher/no_op'; diff --git a/packages/optimizely-sdk/lib/index.node.ts b/packages/optimizely-sdk/lib/index.node.ts index 6c1a71f20..b8dd2d974 100644 --- a/packages/optimizely-sdk/lib/index.node.ts +++ b/packages/optimizely-sdk/lib/index.node.ts @@ -20,7 +20,7 @@ import { setErrorHandler, getErrorHandler, LogLevel -} from '@optimizely/js-sdk-logging'; +} from '../modules/logging'; import Optimizely from './optimizely'; import * as enums from './utils/enums'; import * as loggerPlugin from './plugins/logger'; diff --git a/packages/optimizely-sdk/lib/index.react_native.tests.js b/packages/optimizely-sdk/lib/index.react_native.tests.js index 0d3e92613..16af30222 100644 --- a/packages/optimizely-sdk/lib/index.react_native.tests.js +++ b/packages/optimizely-sdk/lib/index.react_native.tests.js @@ -15,7 +15,7 @@ */ import { assert } from 'chai'; import sinon from 'sinon'; -import * as logging from '@optimizely/js-sdk-logging'; +import * as logging from '../modules/logging'; import * as eventProcessor from './plugins/event_processor'; import Optimizely from './optimizely'; diff --git a/packages/optimizely-sdk/lib/index.react_native.ts b/packages/optimizely-sdk/lib/index.react_native.ts index 67f7f46be..8e6241804 100644 --- a/packages/optimizely-sdk/lib/index.react_native.ts +++ b/packages/optimizely-sdk/lib/index.react_native.ts @@ -20,7 +20,7 @@ import { setErrorHandler, getErrorHandler, LogLevel -} from '@optimizely/js-sdk-logging'; +} from '../modules/logging'; import * as enums from './utils/enums'; import Optimizely from './optimizely'; import configValidator from './utils/config_validator'; diff --git a/packages/optimizely-sdk/lib/optimizely/index.tests.js b/packages/optimizely-sdk/lib/optimizely/index.tests.js index 2c0a7be28..5ad61e3f2 100644 --- a/packages/optimizely-sdk/lib/optimizely/index.tests.js +++ b/packages/optimizely-sdk/lib/optimizely/index.tests.js @@ -18,7 +18,7 @@ import sinon from 'sinon'; import { sprintf } from '../utils/fns'; import { NOTIFICATION_TYPES } from '../utils/enums'; import eventProcessor from '../plugins/event_processor'; -import * as logging from '@optimizely/js-sdk-logging'; +import * as logging from '../../modules/logging'; import Optimizely from './'; import OptimizelyUserContext from '../optimizely_user_context'; diff --git a/packages/optimizely-sdk/lib/optimizely/index.ts b/packages/optimizely-sdk/lib/optimizely/index.ts index 23fbeec6c..f48e8ba70 100644 --- a/packages/optimizely-sdk/lib/optimizely/index.ts +++ b/packages/optimizely-sdk/lib/optimizely/index.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * * limitations under the License. * ***************************************************************************/ -import { LoggerFacade, ErrorHandler } from '@optimizely/js-sdk-logging'; +import { LoggerFacade, ErrorHandler } from '../../modules/logging'; import { sprintf, objectValues } from '../utils/fns'; import { NotificationCenter } from '../core/notification_center'; import { EventProcessor } from '@optimizely/js-sdk-event-processor'; diff --git a/packages/optimizely-sdk/lib/optimizely_user_context/index.tests.js b/packages/optimizely-sdk/lib/optimizely_user_context/index.tests.js index 6b9e1ccf0..14372bd11 100644 --- a/packages/optimizely-sdk/lib/optimizely_user_context/index.tests.js +++ b/packages/optimizely-sdk/lib/optimizely_user_context/index.tests.js @@ -16,7 +16,7 @@ import { assert } from 'chai'; import sinon from 'sinon'; -import * as logging from '@optimizely/js-sdk-logging'; +import * as logging from '../../modules/logging'; import { sprintf } from '../utils/fns'; import { NOTIFICATION_TYPES } from '../utils/enums'; diff --git a/packages/optimizely-sdk/lib/plugins/datafile_manager/http_polling_datafile_manager.ts b/packages/optimizely-sdk/lib/plugins/datafile_manager/http_polling_datafile_manager.ts index 42f993145..5f8a21ed9 100644 --- a/packages/optimizely-sdk/lib/plugins/datafile_manager/http_polling_datafile_manager.ts +++ b/packages/optimizely-sdk/lib/plugins/datafile_manager/http_polling_datafile_manager.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { LoggerFacade } from '@optimizely/js-sdk-logging'; +import { LoggerFacade } from '../../../modules/logging'; import { HttpPollingDatafileManager } from '@optimizely/js-sdk-datafile-manager'; import { DatafileOptions, DatafileManagerConfig, DatafileManager } from '../../shared_types'; import { toDatafile, tryCreatingProjectConfig } from '../../core/project_config'; diff --git a/packages/optimizely-sdk/lib/plugins/logger/index.react_native.ts b/packages/optimizely-sdk/lib/plugins/logger/index.react_native.ts index ce8340e4c..c41e2d93d 100644 --- a/packages/optimizely-sdk/lib/plugins/logger/index.react_native.ts +++ b/packages/optimizely-sdk/lib/plugins/logger/index.react_native.ts @@ -13,8 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { LogLevel } from '@optimizely/js-sdk-logging'; import { sprintf } from '../../utils/fns'; +import { LogLevel } from '../../../modules/logging'; import { NoOpLogger } from './index'; function getLogLevelName(level: number): string { diff --git a/packages/optimizely-sdk/lib/plugins/logger/index.ts b/packages/optimizely-sdk/lib/plugins/logger/index.ts index d0e09c0de..fc57f016a 100644 --- a/packages/optimizely-sdk/lib/plugins/logger/index.ts +++ b/packages/optimizely-sdk/lib/plugins/logger/index.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { ConsoleLogHandler, LogLevel } from '@optimizely/js-sdk-logging'; +import { ConsoleLogHandler, LogLevel } from '../../../modules/logging'; type ConsoleLogHandlerConfig = { logLevel?: LogLevel | string; diff --git a/packages/optimizely-sdk/lib/utils/event_tag_utils/index.ts b/packages/optimizely-sdk/lib/utils/event_tag_utils/index.ts index 86c37ad2a..9f0a62fdf 100644 --- a/packages/optimizely-sdk/lib/utils/event_tag_utils/index.ts +++ b/packages/optimizely-sdk/lib/utils/event_tag_utils/index.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { EventTags } from '@optimizely/js-sdk-event-processor'; -import { LoggerFacade } from '@optimizely/js-sdk-logging'; +import { LoggerFacade } from '../../../modules/logging'; import { LOG_LEVEL, diff --git a/packages/optimizely-sdk/lib/utils/semantic_version/index.ts b/packages/optimizely-sdk/lib/utils/semantic_version/index.ts index bb92013a0..099479a63 100644 --- a/packages/optimizely-sdk/lib/utils/semantic_version/index.ts +++ b/packages/optimizely-sdk/lib/utils/semantic_version/index.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { getLogger } from '@optimizely/js-sdk-logging'; +import { getLogger } from '../../../modules/logging'; import { VERSION_TYPE, LOG_MESSAGES } from '../enums'; const MODULE_NAME = 'SEMANTIC VERSION'; diff --git a/packages/optimizely-sdk/modules/logging/__tests__/logger.spec.ts b/packages/optimizely-sdk/modules/logging/__tests__/logger.spec.ts new file mode 100644 index 000000000..920ff0796 --- /dev/null +++ b/packages/optimizely-sdk/modules/logging/__tests__/logger.spec.ts @@ -0,0 +1,386 @@ +/// +import { + LogLevel, + LogHandler, + LoggerFacade, +} from '../models' + +import { + setLogHandler, + setLogLevel, + getLogger, + ConsoleLogHandler, + resetLogger, + getLogLevel, +} from '../logger' + +import { resetErrorHandler } from '../errorHandler' +import { ErrorHandler, setErrorHandler } from '../errorHandler' + +describe('logger', () => { + afterEach(() => { + resetLogger() + resetErrorHandler() + }) + + describe('OptimizelyLogger', () => { + let stubLogger: LogHandler + let logger: LoggerFacade + let stubErrorHandler: ErrorHandler + + beforeEach(() => { + stubLogger = { + log: jest.fn(), + } + stubErrorHandler = { + handleError: jest.fn(), + } + setLogLevel(LogLevel.DEBUG) + setLogHandler(stubLogger) + setErrorHandler(stubErrorHandler) + logger = getLogger() + }) + + describe('setLogLevel', () => { + it('should coerce "debug"', () => { + setLogLevel('debug') + expect(getLogLevel()).toBe(LogLevel.DEBUG) + }) + + it('should coerce "deBug"', () => { + setLogLevel('deBug') + expect(getLogLevel()).toBe(LogLevel.DEBUG) + }) + + it('should coerce "INFO"', () => { + setLogLevel('INFO') + expect(getLogLevel()).toBe(LogLevel.INFO) + }) + + it('should coerce "WARN"', () => { + setLogLevel('WARN') + expect(getLogLevel()).toBe(LogLevel.WARNING) + }) + + it('should coerce "warning"', () => { + setLogLevel('warning') + expect(getLogLevel()).toBe(LogLevel.WARNING) + }) + + it('should coerce "ERROR"', () => { + setLogLevel('WARN') + expect(getLogLevel()).toBe(LogLevel.WARNING) + }) + + it('should default to error if invalid', () => { + setLogLevel('invalid') + expect(getLogLevel()).toBe(LogLevel.ERROR) + }) + }) + + describe('getLogger(name)', () => { + it('should prepend the name in the log messages', () => { + const myLogger = getLogger('doit') + myLogger.info('test') + + expect(stubLogger.log).toHaveBeenCalledTimes(1) + expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.INFO, 'doit: test') + }) + }) + + describe('logger.log(level, msg)', () => { + it('should work with a string logLevel', () => { + setLogLevel(LogLevel.INFO) + logger.log('info', 'test') + + expect(stubLogger.log).toHaveBeenCalledTimes(1) + expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.INFO, 'test') + }) + + it('should call the loggerBackend when the message logLevel is equal to the configured logLevel threshold', () => { + setLogLevel(LogLevel.INFO) + logger.log(LogLevel.INFO, 'test') + + expect(stubLogger.log).toHaveBeenCalledTimes(1) + expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.INFO, 'test') + }) + + it('should call the loggerBackend when the message logLevel is above to the configured logLevel threshold', () => { + setLogLevel(LogLevel.INFO) + logger.log(LogLevel.WARNING, 'test') + + expect(stubLogger.log).toHaveBeenCalledTimes(1) + expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.WARNING, 'test') + }) + + it('should not call the loggerBackend when the message logLevel is above to the configured logLevel threshold', () => { + setLogLevel(LogLevel.INFO) + logger.log(LogLevel.DEBUG, 'test') + + expect(stubLogger.log).toHaveBeenCalledTimes(0) + }) + + it('should not throw if loggerBackend is not supplied', () => { + setLogLevel(LogLevel.INFO) + logger.log(LogLevel.ERROR, 'test') + }) + }) + + describe('logger.info', () => { + it('should handle info(message)', () => { + logger.info('test') + + expect(stubLogger.log).toHaveBeenCalledTimes(1) + expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.INFO, 'test') + }) + it('should handle info(message, ...splat)', () => { + logger.info('test: %s %s', 'hey', 'jude') + + expect(stubLogger.log).toHaveBeenCalledTimes(1) + expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.INFO, 'test: hey jude') + }) + + it('should handle info(message, ...splat, error)', () => { + const error = new Error('hey') + logger.info('test: %s', 'hey', error) + + expect(stubLogger.log).toHaveBeenCalledTimes(1) + expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.INFO, 'test: hey') + expect(stubErrorHandler.handleError).toHaveBeenCalledWith(error) + }) + + it('should handle info(error)', () => { + const error = new Error('hey') + logger.info(error) + + expect(stubLogger.log).toHaveBeenCalledTimes(1) + expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.INFO, 'hey') + expect(stubErrorHandler.handleError).toHaveBeenCalledWith(error) + }) + }) + + describe('logger.debug', () => { + it('should handle debug(message)', () => { + logger.debug('test') + + expect(stubLogger.log).toHaveBeenCalledTimes(1) + expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.DEBUG, 'test') + }) + + it('should handle debug(message, ...splat)', () => { + logger.debug('test: %s', 'hey') + + expect(stubLogger.log).toHaveBeenCalledTimes(1) + expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.DEBUG, 'test: hey') + }) + + it('should handle debug(message, ...splat, error)', () => { + const error = new Error('hey') + logger.debug('test: %s', 'hey', error) + + expect(stubLogger.log).toHaveBeenCalledTimes(1) + expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.DEBUG, 'test: hey') + expect(stubErrorHandler.handleError).toHaveBeenCalledWith(error) + }) + + it('should handle debug(error)', () => { + const error = new Error('hey') + logger.debug(error) + + expect(stubLogger.log).toHaveBeenCalledTimes(1) + expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.DEBUG, 'hey') + expect(stubErrorHandler.handleError).toHaveBeenCalledWith(error) + }) + }) + + describe('logger.warn', () => { + it('should handle warn(message)', () => { + logger.warn('test') + + expect(stubLogger.log).toHaveBeenCalledTimes(1) + expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.WARNING, 'test') + }) + + it('should handle warn(message, ...splat)', () => { + logger.warn('test: %s', 'hey') + + expect(stubLogger.log).toHaveBeenCalledTimes(1) + expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.WARNING, 'test: hey') + }) + + it('should handle warn(message, ...splat, error)', () => { + const error = new Error('hey') + logger.warn('test: %s', 'hey', error) + + expect(stubLogger.log).toHaveBeenCalledTimes(1) + expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.WARNING, 'test: hey') + expect(stubErrorHandler.handleError).toHaveBeenCalledWith(error) + }) + + it('should handle info(error)', () => { + const error = new Error('hey') + logger.warn(error) + + expect(stubLogger.log).toHaveBeenCalledTimes(1) + expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.WARNING, 'hey') + expect(stubErrorHandler.handleError).toHaveBeenCalledWith(error) + }) + }) + + describe('logger.error', () => { + it('should handle error(message)', () => { + logger.error('test') + + expect(stubLogger.log).toHaveBeenCalledTimes(1) + expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.ERROR, 'test') + }) + + it('should handle error(message, ...splat)', () => { + logger.error('test: %s', 'hey') + + expect(stubLogger.log).toHaveBeenCalledTimes(1) + expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.ERROR, 'test: hey') + }) + + it('should handle error(message, ...splat, error)', () => { + const error = new Error('hey') + logger.error('test: %s', 'hey', error) + + expect(stubLogger.log).toHaveBeenCalledTimes(1) + expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.ERROR, 'test: hey') + expect(stubErrorHandler.handleError).toHaveBeenCalledWith(error) + }) + + it('should handle error(error)', () => { + const error = new Error('hey') + logger.error(error) + + expect(stubLogger.log).toHaveBeenCalledTimes(1) + expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.ERROR, 'hey') + expect(stubErrorHandler.handleError).toHaveBeenCalledWith(error) + }) + + it('should work with an insufficient amount of splat args error(msg, ...splat, message)', () => { + const error = new Error('hey') + logger.error('hey %s', error) + + expect(stubLogger.log).toHaveBeenCalledTimes(1) + expect(stubLogger.log).toHaveBeenCalledWith(LogLevel.ERROR, 'hey undefined') + expect(stubErrorHandler.handleError).toHaveBeenCalledWith(error) + }) + }) + + describe('using ConsoleLoggerHandler', () => { + beforeEach(() => { + jest.spyOn(console, 'info').mockImplementation(() => {}) + }) + + afterEach(() => { + jest.resetAllMocks() + }) + + it('should work with BasicLogger', () => { + const logger = new ConsoleLogHandler() + const TIME = '12:00' + setLogHandler(logger) + setLogLevel(LogLevel.INFO) + jest.spyOn(logger, 'getTime').mockImplementation(() => TIME) + + logger.log(LogLevel.INFO, 'hey') + + expect(console.info).toBeCalledTimes(1) + expect(console.info).toBeCalledWith('[OPTIMIZELY] - INFO 12:00 hey') + }) + + it('should set logLevel to ERROR when setLogLevel is called with invalid value', () => { + const logger = new ConsoleLogHandler() + logger.setLogLevel('invalid' as any) + + expect(logger.logLevel).toEqual(LogLevel.ERROR) + }) + + it('should set logLevel to ERROR when setLogLevel is called with no value', () => { + const logger = new ConsoleLogHandler() + // @ts-ignore + logger.setLogLevel() + + expect(logger.logLevel).toEqual(LogLevel.ERROR) + }) + }) + }) + + describe('ConsoleLogger', function() { + beforeEach(() => { + jest.spyOn(console, 'info') + jest.spyOn(console, 'log') + jest.spyOn(console, 'warn') + jest.spyOn(console, 'error') + }) + + afterEach(() => { + jest.resetAllMocks() + }) + + it('should log to console.info for LogLevel.INFO', () => { + const logger = new ConsoleLogHandler({ + logLevel: LogLevel.DEBUG, + }) + const TIME = '12:00' + jest.spyOn(logger, 'getTime').mockImplementation(() => TIME) + + logger.log(LogLevel.INFO, 'test') + + expect(console.info).toBeCalledTimes(1) + expect(console.info).toBeCalledWith('[OPTIMIZELY] - INFO 12:00 test') + }) + + it('should log to console.log for LogLevel.DEBUG', () => { + const logger = new ConsoleLogHandler({ + logLevel: LogLevel.DEBUG, + }) + const TIME = '12:00' + jest.spyOn(logger, 'getTime').mockImplementation(() => TIME) + + logger.log(LogLevel.DEBUG, 'debug') + + expect(console.log).toBeCalledTimes(1) + expect(console.log).toBeCalledWith('[OPTIMIZELY] - DEBUG 12:00 debug') + }) + + it('should log to console.warn for LogLevel.WARNING', () => { + const logger = new ConsoleLogHandler({ + logLevel: LogLevel.DEBUG, + }) + const TIME = '12:00' + jest.spyOn(logger, 'getTime').mockImplementation(() => TIME) + + logger.log(LogLevel.WARNING, 'warning') + + expect(console.warn).toBeCalledTimes(1) + expect(console.warn).toBeCalledWith('[OPTIMIZELY] - WARN 12:00 warning') + }) + + it('should log to console.error for LogLevel.ERROR', () => { + const logger = new ConsoleLogHandler({ + logLevel: LogLevel.DEBUG, + }) + const TIME = '12:00' + jest.spyOn(logger, 'getTime').mockImplementation(() => TIME) + + logger.log(LogLevel.ERROR, 'error') + + expect(console.error).toBeCalledTimes(1) + expect(console.error).toBeCalledWith('[OPTIMIZELY] - ERROR 12:00 error') + }) + + it('should not log if the configured logLevel is higher', () => { + const logger = new ConsoleLogHandler({ + logLevel: LogLevel.INFO, + }) + + logger.log(LogLevel.DEBUG, 'debug') + + expect(console.log).toBeCalledTimes(0) + }) + }) +}) diff --git a/packages/optimizely-sdk/modules/logging/errorHandler.ts b/packages/optimizely-sdk/modules/logging/errorHandler.ts new file mode 100644 index 000000000..bb659aeae --- /dev/null +++ b/packages/optimizely-sdk/modules/logging/errorHandler.ts @@ -0,0 +1,67 @@ +/** + * Copyright 2019, Optimizely + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/** + * @export + * @interface ErrorHandler + */ +export interface ErrorHandler { + /** + * @param {Error} exception + * @memberof ErrorHandler + */ + handleError(exception: Error): void +} + +/** + * @export + * @class NoopErrorHandler + * @implements {ErrorHandler} + */ +export class NoopErrorHandler implements ErrorHandler { + /** + * @param {Error} exception + * @memberof NoopErrorHandler + */ + handleError(exception: Error): void { + // no-op + return + } +} + +let globalErrorHandler: ErrorHandler = new NoopErrorHandler() + +/** + * @export + * @param {ErrorHandler} handler + */ +export function setErrorHandler(handler: ErrorHandler): void { + globalErrorHandler = handler +} + +/** + * @export + * @returns {ErrorHandler} + */ +export function getErrorHandler(): ErrorHandler { + return globalErrorHandler +} + +/** + * @export + */ +export function resetErrorHandler(): void { + globalErrorHandler = new NoopErrorHandler() +} diff --git a/packages/optimizely-sdk/modules/logging/index.ts b/packages/optimizely-sdk/modules/logging/index.ts new file mode 100644 index 000000000..47a1e99c8 --- /dev/null +++ b/packages/optimizely-sdk/modules/logging/index.ts @@ -0,0 +1,18 @@ +/** + * Copyright 2019, Optimizely + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export * from './errorHandler' +export * from './models' +export * from './logger' diff --git a/packages/optimizely-sdk/modules/logging/logger.ts b/packages/optimizely-sdk/modules/logging/logger.ts new file mode 100644 index 000000000..5647a798a --- /dev/null +++ b/packages/optimizely-sdk/modules/logging/logger.ts @@ -0,0 +1,328 @@ +/** + * Copyright 2019, Optimizely + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { getErrorHandler } from './errorHandler' +import { isValidEnum, sprintf } from '../utils' + +import { LogLevel, LoggerFacade, LogManager, LogHandler } from './models' + +type StringToLogLevel = { + NOTSET: number, + DEBUG: number, + INFO: number, + WARNING: number, + ERROR: number, +} + +const stringToLogLevel: StringToLogLevel = { + NOTSET: 0, + DEBUG: 1, + INFO: 2, + WARNING: 3, + ERROR: 4, +} + +function coerceLogLevel(level: any): LogLevel { + if (typeof level !== 'string') { + return level + } + + level = level.toUpperCase() + if (level === 'WARN') { + level = 'WARNING' + } + + if (!stringToLogLevel[level as keyof StringToLogLevel]) { + return level + } + + return stringToLogLevel[level as keyof StringToLogLevel] +} + +type LogData = { + message: string + splat: any[] + error?: Error +} + +class DefaultLogManager implements LogManager { + private loggers: { + [name: string]: LoggerFacade + } + private defaultLoggerFacade = new OptimizelyLogger() + + constructor() { + this.loggers = {} + } + + getLogger(name?: string): LoggerFacade { + if (!name) { + return this.defaultLoggerFacade + } + + if (!this.loggers[name]) { + this.loggers[name] = new OptimizelyLogger({ messagePrefix: name }) + } + + return this.loggers[name] + } +} + +type ConsoleLogHandlerConfig = { + logLevel?: LogLevel | string + logToConsole?: boolean + prefix?: string +} + +export class ConsoleLogHandler implements LogHandler { + public logLevel: LogLevel + private logToConsole: boolean + private prefix: string + + /** + * Creates an instance of ConsoleLogger. + * @param {ConsoleLogHandlerConfig} config + * @memberof ConsoleLogger + */ + constructor(config: ConsoleLogHandlerConfig = {}) { + this.logLevel = LogLevel.NOTSET + if (config.logLevel !== undefined && isValidEnum(LogLevel, config.logLevel)) { + this.setLogLevel(config.logLevel) + } + + this.logToConsole = config.logToConsole !== undefined ? !!config.logToConsole : true + this.prefix = config.prefix !== undefined ? config.prefix : '[OPTIMIZELY]' + } + + /** + * @param {LogLevel} level + * @param {string} message + * @memberof ConsoleLogger + */ + log(level: LogLevel, message: string) { + if (!this.shouldLog(level) || !this.logToConsole) { + return + } + + let logMessage: string = `${this.prefix} - ${this.getLogLevelName( + level, + )} ${this.getTime()} ${message}` + + this.consoleLog(level, [logMessage]) + } + + /** + * @param {LogLevel} level + * @memberof ConsoleLogger + */ + setLogLevel(level: LogLevel | string) { + level = coerceLogLevel(level) + if (!isValidEnum(LogLevel, level) || level === undefined) { + this.logLevel = LogLevel.ERROR + } else { + this.logLevel = level + } + } + + /** + * @returns {string} + * @memberof ConsoleLogger + */ + getTime(): string { + return new Date().toISOString() + } + + /** + * @private + * @param {LogLevel} targetLogLevel + * @returns {boolean} + * @memberof ConsoleLogger + */ + private shouldLog(targetLogLevel: LogLevel): boolean { + return targetLogLevel >= this.logLevel + } + + /** + * @private + * @param {LogLevel} logLevel + * @returns {string} + * @memberof ConsoleLogger + */ + private getLogLevelName(logLevel: LogLevel): string { + switch (logLevel) { + case LogLevel.DEBUG: + return 'DEBUG' + case LogLevel.INFO: + return 'INFO ' + case LogLevel.WARNING: + return 'WARN ' + case LogLevel.ERROR: + return 'ERROR' + default: + return 'NOTSET' + } + } + + /** + * @private + * @param {LogLevel} logLevel + * @param {string[]} logArguments + * @memberof ConsoleLogger + */ + private consoleLog(logLevel: LogLevel, logArguments: [string, ...string[]]) { + switch (logLevel) { + case LogLevel.DEBUG: + console.log.apply(console, logArguments) + break + case LogLevel.INFO: + console.info.apply(console, logArguments) + break + case LogLevel.WARNING: + console.warn.apply(console, logArguments) + break + case LogLevel.ERROR: + console.error.apply(console, logArguments) + break + default: + console.log.apply(console, logArguments) + } + } +} + +let globalLogLevel: LogLevel = LogLevel.NOTSET +let globalLogHandler: LogHandler | null = null + +class OptimizelyLogger implements LoggerFacade { + private messagePrefix: string = '' + + constructor(opts: { messagePrefix?: string } = {}) { + if (opts.messagePrefix) { + this.messagePrefix = opts.messagePrefix + } + } + + /** + * @param {(LogLevel | LogInputObject)} levelOrObj + * @param {string} [message] + * @memberof OptimizelyLogger + */ + log(level: LogLevel | string, message: string, ...splat: any[]): void { + this.internalLog(coerceLogLevel(level), { + message, + splat, + }) + } + + info(message: string | Error, ...splat: any[]): void { + this.namedLog(LogLevel.INFO, message, splat) + } + + debug(message: string | Error, ...splat: any[]): void { + this.namedLog(LogLevel.DEBUG, message, splat) + } + + warn(message: string | Error, ...splat: any[]): void { + this.namedLog(LogLevel.WARNING, message, splat) + } + + error(message: string | Error, ...splat: any[]): void { + this.namedLog(LogLevel.ERROR, message, splat) + } + + private format(data: LogData): string { + return `${this.messagePrefix ? this.messagePrefix + ': ' : ''}${sprintf( + data.message, + ...data.splat, + )}` + } + + private internalLog(level: LogLevel, data: LogData): void { + if (!globalLogHandler) { + return + } + + if (level < globalLogLevel) { + return + } + + globalLogHandler.log(level, this.format(data)) + + if (data.error && data.error instanceof Error) { + getErrorHandler().handleError(data.error) + } + } + + private namedLog(level: LogLevel, message: string | Error, splat: any[]): void { + let error: Error | undefined + + if (message instanceof Error) { + error = message + message = error.message + this.internalLog(level, { + error, + message, + splat, + }) + return + } + + if (splat.length === 0) { + this.internalLog(level, { + message, + splat, + }) + return + } + + const last = splat[splat.length - 1] + if (last instanceof Error) { + error = last + splat.splice(-1) + } + + this.internalLog(level, { message, error, splat }) + } +} + +let globalLogManager: LogManager = new DefaultLogManager() + +export function getLogger(name?: string): LoggerFacade { + return globalLogManager.getLogger(name) +} + +export function setLogHandler(logger: LogHandler | null) { + globalLogHandler = logger +} + +export function setLogLevel(level: LogLevel | string) { + level = coerceLogLevel(level) + if (!isValidEnum(LogLevel, level) || level === undefined) { + globalLogLevel = LogLevel.ERROR + } else { + globalLogLevel = level + } +} + +export function getLogLevel(): LogLevel { + return globalLogLevel +} + +/** + * Resets all global logger state to it's original + */ +export function resetLogger() { + globalLogManager = new DefaultLogManager() + globalLogLevel = LogLevel.NOTSET +} diff --git a/packages/optimizely-sdk/modules/logging/models.ts b/packages/optimizely-sdk/modules/logging/models.ts new file mode 100644 index 000000000..cd3223932 --- /dev/null +++ b/packages/optimizely-sdk/modules/logging/models.ts @@ -0,0 +1,42 @@ +/** + * Copyright 2019, Optimizely + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export enum LogLevel { + NOTSET = 0, + DEBUG = 1, + INFO = 2, + WARNING = 3, + ERROR = 4, +} + +export interface LoggerFacade { + log(level: LogLevel | string, message: string, ...splat: any[]): void + + info(message: string | Error, ...splat: any[]): void + + debug(message: string | Error, ...splat: any[]): void + + warn(message: string | Error, ...splat: any[]): void + + error(message: string | Error, ...splat: any[]): void +} + +export interface LogManager { + getLogger(name?: string): LoggerFacade +} + +export interface LogHandler { + log(level: LogLevel, message: string, ...splat: any[]): void +} diff --git a/packages/optimizely-sdk/rollup.config.js b/packages/optimizely-sdk/rollup.config.js index 92c0aa20b..c899f43d0 100644 --- a/packages/optimizely-sdk/rollup.config.js +++ b/packages/optimizely-sdk/rollup.config.js @@ -75,7 +75,7 @@ const umdBundle = { resolve({ browser: true }), commonjs({ namedExports: { - '@optimizely/js-sdk-logging': [ + '../../../modules/logging': [ 'ConsoleLogHandler', 'getLogger', 'setLogLevel', From e55fdc0f93ee8f60247eb0097a1b0756c37d9694 Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Mon, 14 Mar 2022 23:09:26 +0500 Subject: [PATCH 29/59] testcases fix --- .../core/custom_attribute_condition_evaluator/index.tests.js | 2 +- packages/optimizely-sdk/lib/index.browser.tests.js | 2 +- packages/optimizely-sdk/lib/index.react_native.tests.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.tests.js b/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.tests.js index a28e735ba..52bd5f6f0 100644 --- a/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.tests.js +++ b/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.tests.js @@ -21,7 +21,7 @@ import { LOG_LEVEL, LOG_MESSAGES, } from '../../utils/enums'; -import * as logging from '../../../modules/utils'; +import * as logging from '../../../modules/logging'; import * as customAttributeEvaluator from './'; var browserConditionSafari = { diff --git a/packages/optimizely-sdk/lib/index.browser.tests.js b/packages/optimizely-sdk/lib/index.browser.tests.js index 5a2885190..f469ff081 100644 --- a/packages/optimizely-sdk/lib/index.browser.tests.js +++ b/packages/optimizely-sdk/lib/index.browser.tests.js @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import * as logging from '../modules/logging'; +import * as logging from '../modules/logging/logger'; import { assert } from 'chai'; import sinon from 'sinon'; diff --git a/packages/optimizely-sdk/lib/index.react_native.tests.js b/packages/optimizely-sdk/lib/index.react_native.tests.js index 16af30222..52b8434ab 100644 --- a/packages/optimizely-sdk/lib/index.react_native.tests.js +++ b/packages/optimizely-sdk/lib/index.react_native.tests.js @@ -15,7 +15,7 @@ */ import { assert } from 'chai'; import sinon from 'sinon'; -import * as logging from '../modules/logging'; +import * as logging from '../modules/logging/logger'; import * as eventProcessor from './plugins/event_processor'; import Optimizely from './optimizely'; From 0146bf1eb93852a210187e97f2f16a4f7ef90c81 Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Fri, 25 Mar 2022 21:26:09 +0500 Subject: [PATCH 30/59] logging rollup corrected --- packages/optimizely-sdk/modules/logging/logger.ts | 2 +- packages/optimizely-sdk/rollup.config.js | 2 +- .../{modules/logging/__tests__ => tests}/logger.spec.ts | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) rename packages/optimizely-sdk/{modules/logging/__tests__ => tests}/logger.spec.ts (98%) diff --git a/packages/optimizely-sdk/modules/logging/logger.ts b/packages/optimizely-sdk/modules/logging/logger.ts index 5647a798a..371b6fa25 100644 --- a/packages/optimizely-sdk/modules/logging/logger.ts +++ b/packages/optimizely-sdk/modules/logging/logger.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { getErrorHandler } from './errorHandler' -import { isValidEnum, sprintf } from '../utils' +import { isValidEnum, sprintf } from '../../lib/utils/fns' import { LogLevel, LoggerFacade, LogManager, LogHandler } from './models' diff --git a/packages/optimizely-sdk/rollup.config.js b/packages/optimizely-sdk/rollup.config.js index c899f43d0..a532cb545 100644 --- a/packages/optimizely-sdk/rollup.config.js +++ b/packages/optimizely-sdk/rollup.config.js @@ -75,7 +75,7 @@ const umdBundle = { resolve({ browser: true }), commonjs({ namedExports: { - '../../../modules/logging': [ + './modules/logging': [ 'ConsoleLogHandler', 'getLogger', 'setLogLevel', diff --git a/packages/optimizely-sdk/modules/logging/__tests__/logger.spec.ts b/packages/optimizely-sdk/tests/logger.spec.ts similarity index 98% rename from packages/optimizely-sdk/modules/logging/__tests__/logger.spec.ts rename to packages/optimizely-sdk/tests/logger.spec.ts index 920ff0796..e64c33c8f 100644 --- a/packages/optimizely-sdk/modules/logging/__tests__/logger.spec.ts +++ b/packages/optimizely-sdk/tests/logger.spec.ts @@ -3,7 +3,7 @@ import { LogLevel, LogHandler, LoggerFacade, -} from '../models' +} from '../modules/logging/models' import { setLogHandler, @@ -12,10 +12,10 @@ import { ConsoleLogHandler, resetLogger, getLogLevel, -} from '../logger' +} from '../modules/logging/logger' -import { resetErrorHandler } from '../errorHandler' -import { ErrorHandler, setErrorHandler } from '../errorHandler' +import { resetErrorHandler } from '../modules/logging/errorHandler' +import { ErrorHandler, setErrorHandler } from '../modules/logging/errorHandler' describe('logger', () => { afterEach(() => { From 65a3f0ae485729094a6d2f47ad85b35838db85c0 Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Tue, 26 Apr 2022 20:41:51 +0500 Subject: [PATCH 31/59] rollup fixed --- packages/optimizely-sdk/rollup.config.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/optimizely-sdk/rollup.config.js b/packages/optimizely-sdk/rollup.config.js index a532cb545..f67fd83dd 100644 --- a/packages/optimizely-sdk/rollup.config.js +++ b/packages/optimizely-sdk/rollup.config.js @@ -33,6 +33,7 @@ const typescriptPluginOptions = { include: [ './lib/**/*.ts', './lib/**/*.js', + './modules/**/*.ts' ], }; From d594c09f4ba4d4d78618fcced7dba759b6c89f16 Mon Sep 17 00:00:00 2001 From: zashraf1985 Date: Tue, 26 Apr 2022 12:59:42 -0700 Subject: [PATCH 32/59] fixed some build issues --- .../lib/core/audience_evaluator/index.tests.js | 2 +- .../lib/core/audience_evaluator/index.ts | 2 +- packages/optimizely-sdk/lib/core/bucketer/index.ts | 2 +- .../index.tests.js | 2 +- .../core/custom_attribute_condition_evaluator/index.ts | 2 +- .../optimizely-sdk/lib/core/decision_service/index.ts | 2 +- .../lib/core/event_builder/event_helpers.ts | 2 +- .../optimizely-sdk/lib/core/event_builder/index.ts | 2 +- .../lib/core/notification_center/index.ts | 2 +- .../lib/core/project_config/index.tests.js | 2 +- .../optimizely-sdk/lib/core/project_config/index.ts | 2 +- .../project_config/project_config_manager.tests.js | 2 +- .../lib/core/project_config/project_config_manager.ts | 2 +- packages/optimizely-sdk/lib/index.browser.tests.js | 2 +- packages/optimizely-sdk/lib/index.browser.ts | 2 +- packages/optimizely-sdk/lib/index.lite.ts | 2 +- packages/optimizely-sdk/lib/index.node.ts | 2 +- .../optimizely-sdk/lib/index.react_native.tests.js | 2 +- packages/optimizely-sdk/lib/index.react_native.ts | 2 +- .../{ => lib}/modules/logging/errorHandler.ts | 0 .../optimizely-sdk/{ => lib}/modules/logging/index.ts | 0 .../optimizely-sdk/{ => lib}/modules/logging/logger.ts | 2 +- .../optimizely-sdk/{ => lib}/modules/logging/models.ts | 0 packages/optimizely-sdk/lib/optimizely/index.tests.js | 2 +- packages/optimizely-sdk/lib/optimizely/index.ts | 2 +- .../lib/optimizely_user_context/index.tests.js | 2 +- .../datafile_manager/http_polling_datafile_manager.ts | 2 +- .../lib/plugins/logger/index.react_native.ts | 2 +- packages/optimizely-sdk/lib/plugins/logger/index.ts | 2 +- .../optimizely-sdk/lib/utils/event_tag_utils/index.ts | 2 +- .../optimizely-sdk/lib/utils/semantic_version/index.ts | 2 +- packages/optimizely-sdk/rollup.config.js | 10 ---------- 32 files changed, 28 insertions(+), 38 deletions(-) rename packages/optimizely-sdk/{ => lib}/modules/logging/errorHandler.ts (100%) rename packages/optimizely-sdk/{ => lib}/modules/logging/index.ts (100%) rename packages/optimizely-sdk/{ => lib}/modules/logging/logger.ts (99%) rename packages/optimizely-sdk/{ => lib}/modules/logging/models.ts (100%) diff --git a/packages/optimizely-sdk/lib/core/audience_evaluator/index.tests.js b/packages/optimizely-sdk/lib/core/audience_evaluator/index.tests.js index fe58a9907..72571282e 100644 --- a/packages/optimizely-sdk/lib/core/audience_evaluator/index.tests.js +++ b/packages/optimizely-sdk/lib/core/audience_evaluator/index.tests.js @@ -16,7 +16,7 @@ import sinon from 'sinon'; import { assert } from 'chai'; import { sprintf } from '../../utils/fns'; -import { getLogger } from '../../../modules/logging'; +import { getLogger } from '../../modules/logging'; import { createAudienceEvaluator } from './index'; import * as conditionTreeEvaluator from '../condition_tree_evaluator'; diff --git a/packages/optimizely-sdk/lib/core/audience_evaluator/index.ts b/packages/optimizely-sdk/lib/core/audience_evaluator/index.ts index 82f1f9bc8..5dc92e825 100644 --- a/packages/optimizely-sdk/lib/core/audience_evaluator/index.ts +++ b/packages/optimizely-sdk/lib/core/audience_evaluator/index.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { getLogger } from '../../../modules/logging'; +import { getLogger } from '../../modules/logging'; import fns from '../../utils/fns'; import { diff --git a/packages/optimizely-sdk/lib/core/bucketer/index.ts b/packages/optimizely-sdk/lib/core/bucketer/index.ts index f1d244b8a..3931d1b02 100644 --- a/packages/optimizely-sdk/lib/core/bucketer/index.ts +++ b/packages/optimizely-sdk/lib/core/bucketer/index.ts @@ -19,7 +19,7 @@ */ import { sprintf } from '../../utils/fns'; import murmurhash from 'murmurhash'; -import { LogHandler } from '../../../modules/logging'; +import { LogHandler } from '../../modules/logging'; import { DecisionResponse, BucketerParams, diff --git a/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.tests.js b/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.tests.js index 52bd5f6f0..8981741c7 100644 --- a/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.tests.js +++ b/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.tests.js @@ -21,7 +21,7 @@ import { LOG_LEVEL, LOG_MESSAGES, } from '../../utils/enums'; -import * as logging from '../../../modules/logging'; +import * as logging from '../../modules/logging'; import * as customAttributeEvaluator from './'; var browserConditionSafari = { diff --git a/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.ts b/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.ts index 70298064c..c66384b66 100644 --- a/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.ts +++ b/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * * limitations under the License. * ***************************************************************************/ -import { getLogger } from '../../../modules/logging'; +import { getLogger } from '../../modules/logging'; import { UserAttributes, Condition } from '../../shared_types'; import fns from '../../utils/fns'; diff --git a/packages/optimizely-sdk/lib/core/decision_service/index.ts b/packages/optimizely-sdk/lib/core/decision_service/index.ts index 09fbed7b6..f1e64e632 100644 --- a/packages/optimizely-sdk/lib/core/decision_service/index.ts +++ b/packages/optimizely-sdk/lib/core/decision_service/index.ts @@ -14,7 +14,7 @@ * limitations under the License. * ***************************************************************************/ import { sprintf } from '../../utils/fns'; -import { LogHandler } from '../../../modules/logging'; +import { LogHandler } from '../../modules/logging'; import fns from '../../utils/fns'; import { bucket } from '../bucketer'; diff --git a/packages/optimizely-sdk/lib/core/event_builder/event_helpers.ts b/packages/optimizely-sdk/lib/core/event_builder/event_helpers.ts index d8e9ead57..9a181d543 100644 --- a/packages/optimizely-sdk/lib/core/event_builder/event_helpers.ts +++ b/packages/optimizely-sdk/lib/core/event_builder/event_helpers.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { getLogger } from '../../../modules/logging'; +import { getLogger } from '../../modules/logging'; import fns from '../../utils/fns'; import * as eventTagUtils from '../../utils/event_tag_utils'; diff --git a/packages/optimizely-sdk/lib/core/event_builder/index.ts b/packages/optimizely-sdk/lib/core/event_builder/index.ts index 34ecfaa73..096cf70a2 100644 --- a/packages/optimizely-sdk/lib/core/event_builder/index.ts +++ b/packages/optimizely-sdk/lib/core/event_builder/index.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { LoggerFacade } from '../../../modules/logging'; +import { LoggerFacade } from '../../modules/logging'; import { EventV1 as CommonEventParams } from '@optimizely/js-sdk-event-processor'; import fns from '../../utils/fns'; diff --git a/packages/optimizely-sdk/lib/core/notification_center/index.ts b/packages/optimizely-sdk/lib/core/notification_center/index.ts index c5847c449..903813766 100644 --- a/packages/optimizely-sdk/lib/core/notification_center/index.ts +++ b/packages/optimizely-sdk/lib/core/notification_center/index.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { objectValues } from '../../utils/fns'; -import { LogHandler, ErrorHandler } from '../../../modules/logging'; +import { LogHandler, ErrorHandler } from '../../modules/logging'; import { NotificationListener, ListenerPayload } from '../../shared_types'; import { diff --git a/packages/optimizely-sdk/lib/core/project_config/index.tests.js b/packages/optimizely-sdk/lib/core/project_config/index.tests.js index 071e96e41..6f22e3595 100644 --- a/packages/optimizely-sdk/lib/core/project_config/index.tests.js +++ b/packages/optimizely-sdk/lib/core/project_config/index.tests.js @@ -17,7 +17,7 @@ import sinon from 'sinon'; import { assert } from 'chai'; import { forEach, cloneDeep } from 'lodash'; import { sprintf } from '../../utils/fns'; -import { getLogger } from '../../../modules/logging'; +import { getLogger } from '../../modules/logging'; import fns from '../../utils/fns'; import projectConfig from './'; diff --git a/packages/optimizely-sdk/lib/core/project_config/index.ts b/packages/optimizely-sdk/lib/core/project_config/index.ts index 13d72c103..c8b9ec4bd 100644 --- a/packages/optimizely-sdk/lib/core/project_config/index.ts +++ b/packages/optimizely-sdk/lib/core/project_config/index.ts @@ -30,7 +30,7 @@ import { } from '../../utils/enums'; import configValidator from '../../utils/config_validator'; -import { LogHandler } from '../../../modules/logging'; +import { LogHandler } from '../../modules/logging'; import { Audience, Experiment, diff --git a/packages/optimizely-sdk/lib/core/project_config/project_config_manager.tests.js b/packages/optimizely-sdk/lib/core/project_config/project_config_manager.tests.js index e4f86d3a4..25969facc 100644 --- a/packages/optimizely-sdk/lib/core/project_config/project_config_manager.tests.js +++ b/packages/optimizely-sdk/lib/core/project_config/project_config_manager.tests.js @@ -18,7 +18,7 @@ import { assert } from 'chai'; import { cloneDeep } from 'lodash'; import { sprintf } from '../../utils/fns'; -import * as logging from '../../../modules/logging'; +import * as logging from '../../modules/logging'; import * as datafileManager from '@optimizely/js-sdk-datafile-manager'; import * as projectConfig from './index'; diff --git a/packages/optimizely-sdk/lib/core/project_config/project_config_manager.ts b/packages/optimizely-sdk/lib/core/project_config/project_config_manager.ts index de43bbf4a..cf657d07f 100644 --- a/packages/optimizely-sdk/lib/core/project_config/project_config_manager.ts +++ b/packages/optimizely-sdk/lib/core/project_config/project_config_manager.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { sprintf } from '../../utils/fns'; -import { getLogger } from '../../../modules/logging'; +import { getLogger } from '../../modules/logging'; import { ERROR_MESSAGES } from '../../utils/enums'; import { createOptimizelyConfig } from '../optimizely_config'; diff --git a/packages/optimizely-sdk/lib/index.browser.tests.js b/packages/optimizely-sdk/lib/index.browser.tests.js index f469ff081..61c976510 100644 --- a/packages/optimizely-sdk/lib/index.browser.tests.js +++ b/packages/optimizely-sdk/lib/index.browser.tests.js @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import * as logging from '../modules/logging/logger'; +import * as logging from './modules/logging/logger'; import { assert } from 'chai'; import sinon from 'sinon'; diff --git a/packages/optimizely-sdk/lib/index.browser.ts b/packages/optimizely-sdk/lib/index.browser.ts index a2b7101d7..a4e951107 100644 --- a/packages/optimizely-sdk/lib/index.browser.ts +++ b/packages/optimizely-sdk/lib/index.browser.ts @@ -20,7 +20,7 @@ import { setErrorHandler, getErrorHandler, LogLevel -} from '../modules/logging'; +} from './modules/logging'; import { LocalStoragePendingEventsDispatcher } from '@optimizely/js-sdk-event-processor'; import configValidator from './utils/config_validator'; import defaultErrorHandler from './plugins/error_handler'; diff --git a/packages/optimizely-sdk/lib/index.lite.ts b/packages/optimizely-sdk/lib/index.lite.ts index 0cd866cc2..86a8bc872 100644 --- a/packages/optimizely-sdk/lib/index.lite.ts +++ b/packages/optimizely-sdk/lib/index.lite.ts @@ -20,7 +20,7 @@ setErrorHandler, getErrorHandler, LogLevel - } from '../modules/logging'; + } from './modules/logging'; import configValidator from './utils/config_validator'; import defaultErrorHandler from './plugins/error_handler'; import noOpEventDispatcher from './plugins/event_dispatcher/no_op'; diff --git a/packages/optimizely-sdk/lib/index.node.ts b/packages/optimizely-sdk/lib/index.node.ts index b8dd2d974..f5b9632aa 100644 --- a/packages/optimizely-sdk/lib/index.node.ts +++ b/packages/optimizely-sdk/lib/index.node.ts @@ -20,7 +20,7 @@ import { setErrorHandler, getErrorHandler, LogLevel -} from '../modules/logging'; +} from './modules/logging'; import Optimizely from './optimizely'; import * as enums from './utils/enums'; import * as loggerPlugin from './plugins/logger'; diff --git a/packages/optimizely-sdk/lib/index.react_native.tests.js b/packages/optimizely-sdk/lib/index.react_native.tests.js index 52b8434ab..0722a524a 100644 --- a/packages/optimizely-sdk/lib/index.react_native.tests.js +++ b/packages/optimizely-sdk/lib/index.react_native.tests.js @@ -15,7 +15,7 @@ */ import { assert } from 'chai'; import sinon from 'sinon'; -import * as logging from '../modules/logging/logger'; +import * as logging from './modules/logging/logger'; import * as eventProcessor from './plugins/event_processor'; import Optimizely from './optimizely'; diff --git a/packages/optimizely-sdk/lib/index.react_native.ts b/packages/optimizely-sdk/lib/index.react_native.ts index 8e6241804..49bd8feea 100644 --- a/packages/optimizely-sdk/lib/index.react_native.ts +++ b/packages/optimizely-sdk/lib/index.react_native.ts @@ -20,7 +20,7 @@ import { setErrorHandler, getErrorHandler, LogLevel -} from '../modules/logging'; +} from './modules/logging'; import * as enums from './utils/enums'; import Optimizely from './optimizely'; import configValidator from './utils/config_validator'; diff --git a/packages/optimizely-sdk/modules/logging/errorHandler.ts b/packages/optimizely-sdk/lib/modules/logging/errorHandler.ts similarity index 100% rename from packages/optimizely-sdk/modules/logging/errorHandler.ts rename to packages/optimizely-sdk/lib/modules/logging/errorHandler.ts diff --git a/packages/optimizely-sdk/modules/logging/index.ts b/packages/optimizely-sdk/lib/modules/logging/index.ts similarity index 100% rename from packages/optimizely-sdk/modules/logging/index.ts rename to packages/optimizely-sdk/lib/modules/logging/index.ts diff --git a/packages/optimizely-sdk/modules/logging/logger.ts b/packages/optimizely-sdk/lib/modules/logging/logger.ts similarity index 99% rename from packages/optimizely-sdk/modules/logging/logger.ts rename to packages/optimizely-sdk/lib/modules/logging/logger.ts index 371b6fa25..2f4b12097 100644 --- a/packages/optimizely-sdk/modules/logging/logger.ts +++ b/packages/optimizely-sdk/lib/modules/logging/logger.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { getErrorHandler } from './errorHandler' -import { isValidEnum, sprintf } from '../../lib/utils/fns' +import { isValidEnum, sprintf } from '../../utils/fns' import { LogLevel, LoggerFacade, LogManager, LogHandler } from './models' diff --git a/packages/optimizely-sdk/modules/logging/models.ts b/packages/optimizely-sdk/lib/modules/logging/models.ts similarity index 100% rename from packages/optimizely-sdk/modules/logging/models.ts rename to packages/optimizely-sdk/lib/modules/logging/models.ts diff --git a/packages/optimizely-sdk/lib/optimizely/index.tests.js b/packages/optimizely-sdk/lib/optimizely/index.tests.js index 5ad61e3f2..2a4c45f1c 100644 --- a/packages/optimizely-sdk/lib/optimizely/index.tests.js +++ b/packages/optimizely-sdk/lib/optimizely/index.tests.js @@ -18,7 +18,7 @@ import sinon from 'sinon'; import { sprintf } from '../utils/fns'; import { NOTIFICATION_TYPES } from '../utils/enums'; import eventProcessor from '../plugins/event_processor'; -import * as logging from '../../modules/logging'; +import * as logging from '../modules/logging'; import Optimizely from './'; import OptimizelyUserContext from '../optimizely_user_context'; diff --git a/packages/optimizely-sdk/lib/optimizely/index.ts b/packages/optimizely-sdk/lib/optimizely/index.ts index f48e8ba70..d65fa3fa0 100644 --- a/packages/optimizely-sdk/lib/optimizely/index.ts +++ b/packages/optimizely-sdk/lib/optimizely/index.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * * limitations under the License. * ***************************************************************************/ -import { LoggerFacade, ErrorHandler } from '../../modules/logging'; +import { LoggerFacade, ErrorHandler } from '../modules/logging'; import { sprintf, objectValues } from '../utils/fns'; import { NotificationCenter } from '../core/notification_center'; import { EventProcessor } from '@optimizely/js-sdk-event-processor'; diff --git a/packages/optimizely-sdk/lib/optimizely_user_context/index.tests.js b/packages/optimizely-sdk/lib/optimizely_user_context/index.tests.js index 14372bd11..3e7f9a746 100644 --- a/packages/optimizely-sdk/lib/optimizely_user_context/index.tests.js +++ b/packages/optimizely-sdk/lib/optimizely_user_context/index.tests.js @@ -16,7 +16,7 @@ import { assert } from 'chai'; import sinon from 'sinon'; -import * as logging from '../../modules/logging'; +import * as logging from '../modules/logging'; import { sprintf } from '../utils/fns'; import { NOTIFICATION_TYPES } from '../utils/enums'; diff --git a/packages/optimizely-sdk/lib/plugins/datafile_manager/http_polling_datafile_manager.ts b/packages/optimizely-sdk/lib/plugins/datafile_manager/http_polling_datafile_manager.ts index 5f8a21ed9..32b3e9905 100644 --- a/packages/optimizely-sdk/lib/plugins/datafile_manager/http_polling_datafile_manager.ts +++ b/packages/optimizely-sdk/lib/plugins/datafile_manager/http_polling_datafile_manager.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { LoggerFacade } from '../../../modules/logging'; +import { LoggerFacade } from '../../modules/logging'; import { HttpPollingDatafileManager } from '@optimizely/js-sdk-datafile-manager'; import { DatafileOptions, DatafileManagerConfig, DatafileManager } from '../../shared_types'; import { toDatafile, tryCreatingProjectConfig } from '../../core/project_config'; diff --git a/packages/optimizely-sdk/lib/plugins/logger/index.react_native.ts b/packages/optimizely-sdk/lib/plugins/logger/index.react_native.ts index c41e2d93d..04fe6d9b8 100644 --- a/packages/optimizely-sdk/lib/plugins/logger/index.react_native.ts +++ b/packages/optimizely-sdk/lib/plugins/logger/index.react_native.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { sprintf } from '../../utils/fns'; -import { LogLevel } from '../../../modules/logging'; +import { LogLevel } from '../../modules/logging'; import { NoOpLogger } from './index'; function getLogLevelName(level: number): string { diff --git a/packages/optimizely-sdk/lib/plugins/logger/index.ts b/packages/optimizely-sdk/lib/plugins/logger/index.ts index fc57f016a..d907cc5f0 100644 --- a/packages/optimizely-sdk/lib/plugins/logger/index.ts +++ b/packages/optimizely-sdk/lib/plugins/logger/index.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { ConsoleLogHandler, LogLevel } from '../../../modules/logging'; +import { ConsoleLogHandler, LogLevel } from '../../modules/logging'; type ConsoleLogHandlerConfig = { logLevel?: LogLevel | string; diff --git a/packages/optimizely-sdk/lib/utils/event_tag_utils/index.ts b/packages/optimizely-sdk/lib/utils/event_tag_utils/index.ts index 9f0a62fdf..b7a034deb 100644 --- a/packages/optimizely-sdk/lib/utils/event_tag_utils/index.ts +++ b/packages/optimizely-sdk/lib/utils/event_tag_utils/index.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { EventTags } from '@optimizely/js-sdk-event-processor'; -import { LoggerFacade } from '../../../modules/logging'; +import { LoggerFacade } from '../../modules/logging'; import { LOG_LEVEL, diff --git a/packages/optimizely-sdk/lib/utils/semantic_version/index.ts b/packages/optimizely-sdk/lib/utils/semantic_version/index.ts index 099479a63..6d292bd77 100644 --- a/packages/optimizely-sdk/lib/utils/semantic_version/index.ts +++ b/packages/optimizely-sdk/lib/utils/semantic_version/index.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { getLogger } from '../../../modules/logging'; +import { getLogger } from '../../modules/logging'; import { VERSION_TYPE, LOG_MESSAGES } from '../enums'; const MODULE_NAME = 'SEMANTIC VERSION'; diff --git a/packages/optimizely-sdk/rollup.config.js b/packages/optimizely-sdk/rollup.config.js index f67fd83dd..7afe33aea 100644 --- a/packages/optimizely-sdk/rollup.config.js +++ b/packages/optimizely-sdk/rollup.config.js @@ -33,7 +33,6 @@ const typescriptPluginOptions = { include: [ './lib/**/*.ts', './lib/**/*.js', - './modules/**/*.ts' ], }; @@ -76,15 +75,6 @@ const umdBundle = { resolve({ browser: true }), commonjs({ namedExports: { - './modules/logging': [ - 'ConsoleLogHandler', - 'getLogger', - 'setLogLevel', - 'LogLevel', - 'setLogHandler', - 'setErrorHandler', - 'getErrorHandler', - ], '@optimizely/js-sdk-event-processor': ['LogTierV1EventProcessor', 'LocalStoragePendingEventsDispatcher'], }, }), From a8e7858ec5e9fbe3d8ddaf58f0f635ce0c32ff96 Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Thu, 28 Apr 2022 19:33:05 +0500 Subject: [PATCH 33/59] comment addressed --- .../plugins/event_processor/forwarding_event_processor.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/optimizely-sdk/lib/plugins/event_processor/forwarding_event_processor.ts b/packages/optimizely-sdk/lib/plugins/event_processor/forwarding_event_processor.ts index 1896199de..86390cbcf 100644 --- a/packages/optimizely-sdk/lib/plugins/event_processor/forwarding_event_processor.ts +++ b/packages/optimizely-sdk/lib/plugins/event_processor/forwarding_event_processor.ts @@ -26,18 +26,18 @@ import { formatEvents } from '../../core/event_builder/build_event_v1'; class ForwardingEventProcessor implements EventProcessor { private dispatcher: EventDispatcher; - private notificationCenter?: NotificationSender; + private NotificationSender?: NotificationSender; constructor(dispatcher: EventDispatcher, notificationCenter?: NotificationSender) { this.dispatcher = dispatcher; - this.notificationCenter = notificationCenter; + this.NotificationSender = notificationCenter; } process(event: ProcessableEvent): void { const formattedEvent = formatEvents([event]); this.dispatcher.dispatchEvent(formattedEvent, () => {}); - if (this.notificationCenter) { - this.notificationCenter.sendNotifications( + if (this.NotificationSender) { + this.NotificationSender.sendNotifications( NOTIFICATION_TYPES.LOG_EVENT, formattedEvent, ) From def50b4b192fde5c121324f65303f91c65909210 Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Thu, 28 Apr 2022 19:47:22 +0500 Subject: [PATCH 34/59] headers updated --- packages/optimizely-sdk/lib/core/audience_evaluator/index.ts | 2 +- .../lib/core/custom_attribute_condition_evaluator/index.ts | 2 +- packages/optimizely-sdk/lib/core/event_builder/event_helpers.ts | 2 +- packages/optimizely-sdk/lib/core/event_builder/index.ts | 2 +- packages/optimizely-sdk/lib/plugins/logger/index.ts | 2 +- packages/optimizely-sdk/lib/utils/event_tag_utils/index.ts | 2 +- packages/optimizely-sdk/lib/utils/semantic_version/index.ts | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/optimizely-sdk/lib/core/audience_evaluator/index.ts b/packages/optimizely-sdk/lib/core/audience_evaluator/index.ts index 5dc92e825..820e90927 100644 --- a/packages/optimizely-sdk/lib/core/audience_evaluator/index.ts +++ b/packages/optimizely-sdk/lib/core/audience_evaluator/index.ts @@ -1,5 +1,5 @@ /** - * Copyright 2016, 2018-2021, Optimizely + * Copyright 2016, 2018-2021, 2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.ts b/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.ts index c66384b66..24f412652 100644 --- a/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.ts +++ b/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.ts @@ -1,5 +1,5 @@ /**************************************************************************** - * Copyright 2018-2019, 2020 Optimizely, Inc. and contributors * + * Copyright 2018-2019, 2020, 2022, Optimizely, Inc. and contributors * * * * Licensed under the Apache License, Version 2.0 (the "License"); * * you may not use this file except in compliance with the License. * diff --git a/packages/optimizely-sdk/lib/core/event_builder/event_helpers.ts b/packages/optimizely-sdk/lib/core/event_builder/event_helpers.ts index 9a181d543..4b6b767b2 100644 --- a/packages/optimizely-sdk/lib/core/event_builder/event_helpers.ts +++ b/packages/optimizely-sdk/lib/core/event_builder/event_helpers.ts @@ -1,5 +1,5 @@ /** - * Copyright 2019-2021, Optimizely + * Copyright 2019-2021, 2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/core/event_builder/index.ts b/packages/optimizely-sdk/lib/core/event_builder/index.ts index 096cf70a2..9e518c58a 100644 --- a/packages/optimizely-sdk/lib/core/event_builder/index.ts +++ b/packages/optimizely-sdk/lib/core/event_builder/index.ts @@ -1,5 +1,5 @@ /** - * Copyright 2016-2021, Optimizely + * Copyright 2016-2021, 2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/plugins/logger/index.ts b/packages/optimizely-sdk/lib/plugins/logger/index.ts index d907cc5f0..cd04727fc 100644 --- a/packages/optimizely-sdk/lib/plugins/logger/index.ts +++ b/packages/optimizely-sdk/lib/plugins/logger/index.ts @@ -1,5 +1,5 @@ /** - * Copyright 2016-2017, 2020-2021, Optimizely + * Copyright 2016-2017, 2020-2021, 2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/utils/event_tag_utils/index.ts b/packages/optimizely-sdk/lib/utils/event_tag_utils/index.ts index b7a034deb..d47ab1944 100644 --- a/packages/optimizely-sdk/lib/utils/event_tag_utils/index.ts +++ b/packages/optimizely-sdk/lib/utils/event_tag_utils/index.ts @@ -1,5 +1,5 @@ /** - * Copyright 2017, 2019-2020 Optimizely + * Copyright 2017, 2019-2020, 2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/utils/semantic_version/index.ts b/packages/optimizely-sdk/lib/utils/semantic_version/index.ts index 6d292bd77..e8ef11c7f 100644 --- a/packages/optimizely-sdk/lib/utils/semantic_version/index.ts +++ b/packages/optimizely-sdk/lib/utils/semantic_version/index.ts @@ -1,5 +1,5 @@ /** - * Copyright 2020, Optimizely + * Copyright 2020, 2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. From 0d088e7b64619eb277c92dffc87920597f5bff9f Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Thu, 28 Apr 2022 19:53:00 +0500 Subject: [PATCH 35/59] logging path corrected --- packages/optimizely-sdk/tests/logger.spec.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/optimizely-sdk/tests/logger.spec.ts b/packages/optimizely-sdk/tests/logger.spec.ts index e64c33c8f..f34afbb0e 100644 --- a/packages/optimizely-sdk/tests/logger.spec.ts +++ b/packages/optimizely-sdk/tests/logger.spec.ts @@ -3,7 +3,7 @@ import { LogLevel, LogHandler, LoggerFacade, -} from '../modules/logging/models' +} from '../lib/modules/logging/models' import { setLogHandler, @@ -12,10 +12,10 @@ import { ConsoleLogHandler, resetLogger, getLogLevel, -} from '../modules/logging/logger' +} from '../lib/modules/logging/logger' -import { resetErrorHandler } from '../modules/logging/errorHandler' -import { ErrorHandler, setErrorHandler } from '../modules/logging/errorHandler' +import { resetErrorHandler } from '../lib/modules/logging/errorHandler' +import { ErrorHandler, setErrorHandler } from '../lib/modules/logging/errorHandler' describe('logger', () => { afterEach(() => { From f36baf4a8ae007dfe3e1451e3452a157c84f1388 Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Thu, 5 May 2022 15:55:51 +0500 Subject: [PATCH 36/59] comments addressed --- .../lib/core/audience_evaluator/index.ts | 4 +-- .../optimizely-sdk/lib/core/bucketer/index.ts | 4 +-- .../index.ts | 6 ++-- .../lib/core/decision_service/index.ts | 8 ++--- .../lib/core/event_builder/event_helpers.ts | 6 ++-- .../lib/core/event_builder/index.ts | 8 ++--- .../lib/core/notification_center/index.ts | 4 +-- .../lib/core/project_config/index.ts | 6 ++-- .../project_config/project_config_manager.ts | 4 +-- .../optimizely-sdk/lib/optimizely/index.ts | 16 +++++----- .../lib/optimizely_user_context/index.ts | 2 +- .../http_polling_datafile_manager.ts | 2 +- .../forwarding_event_processor.ts | 10 +++--- .../lib/plugins/logger/index.react_native.ts | 2 +- .../lib/utils/attributes_validator/index.ts | 4 +-- .../lib/utils/config_validator/index.ts | 2 +- .../lib/utils/event_tags_validator/index.ts | 2 +- .../optimizely-sdk/lib/utils/fns/index.ts | 2 ++ .../user_profile_service_validator/index.ts | 2 +- packages/optimizely-sdk/package-lock.json | 31 +++++++++++++++++++ packages/optimizely-sdk/package.json | 13 ++++---- packages/optimizely-sdk/tsconfig.json | 3 ++ 22 files changed, 89 insertions(+), 52 deletions(-) diff --git a/packages/optimizely-sdk/lib/core/audience_evaluator/index.ts b/packages/optimizely-sdk/lib/core/audience_evaluator/index.ts index be6e8bfcd..50832bfd8 100644 --- a/packages/optimizely-sdk/lib/core/audience_evaluator/index.ts +++ b/packages/optimizely-sdk/lib/core/audience_evaluator/index.ts @@ -15,12 +15,12 @@ */ import { getLogger } from '@optimizely/js-sdk-logging'; -import fns from '../../utils/fns'; +import fns from '@utils/fns'; import { LOG_LEVEL, LOG_MESSAGES, ERROR_MESSAGES, -} from '../../utils/enums'; +} from '@utils/enums'; import * as conditionTreeEvaluator from '../condition_tree_evaluator'; import * as customAttributeConditionEvaluator from '../custom_attribute_condition_evaluator'; import { UserAttributes, Audience, Condition } from '../../shared_types'; diff --git a/packages/optimizely-sdk/lib/core/bucketer/index.ts b/packages/optimizely-sdk/lib/core/bucketer/index.ts index 82d7f5bca..5f51a6562 100644 --- a/packages/optimizely-sdk/lib/core/bucketer/index.ts +++ b/packages/optimizely-sdk/lib/core/bucketer/index.ts @@ -17,7 +17,7 @@ /** * Bucketer API for determining the variation id from the specified parameters */ -import { sprintf } from '../../utils/fns'; +import { sprintf } from '@utils/fns'; import murmurhash from 'murmurhash'; import { LogHandler } from '@optimizely/js-sdk-logging'; import { @@ -31,7 +31,7 @@ import { ERROR_MESSAGES, LOG_LEVEL, LOG_MESSAGES, -} from '../../utils/enums'; +} from '@utils/enums'; const HASH_SEED = 1; const MAX_HASH_VALUE = Math.pow(2, 32); diff --git a/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.ts b/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.ts index f236533de..8686455c7 100644 --- a/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.ts +++ b/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.ts @@ -16,9 +16,9 @@ import { getLogger } from '@optimizely/js-sdk-logging'; import { UserAttributes, Condition } from '../../shared_types'; -import fns from '../../utils/fns'; -import { LOG_MESSAGES } from '../../utils/enums'; -import { compareVersion } from '../../utils/semantic_version'; +import fns from '@utils/fns'; +import { LOG_MESSAGES } from '@utils/enums'; +import { compareVersion } from '@utils/semantic_version'; const MODULE_NAME = 'CUSTOM_ATTRIBUTE_CONDITION_EVALUATOR'; diff --git a/packages/optimizely-sdk/lib/core/decision_service/index.ts b/packages/optimizely-sdk/lib/core/decision_service/index.ts index 546aa5c23..9f5e2ba8b 100644 --- a/packages/optimizely-sdk/lib/core/decision_service/index.ts +++ b/packages/optimizely-sdk/lib/core/decision_service/index.ts @@ -14,9 +14,9 @@ * limitations under the License. * ***************************************************************************/ import { LogHandler } from '@optimizely/js-sdk-logging'; -import { sprintf } from '../../utils/fns'; +import { sprintf } from '@utils/fns'; -import fns from '../../utils/fns'; +import fns from '@utils/fns'; import { bucket } from '../bucketer'; import { AUDIENCE_EVALUATION_TYPES, @@ -25,7 +25,7 @@ import { ERROR_MESSAGES, LOG_LEVEL, LOG_MESSAGES, -} from '../../utils/enums'; +} from '@utils/enums'; import { getAudiencesById, getExperimentAudienceConditions, @@ -40,7 +40,7 @@ import { ProjectConfig, } from '../project_config'; import { AudienceEvaluator, createAudienceEvaluator } from '../audience_evaluator'; -import * as stringValidator from '../../utils/string_value_validator'; +import * as stringValidator from '@utils/string_value_validator'; import { BucketerParams, DecisionResponse, diff --git a/packages/optimizely-sdk/lib/core/event_builder/event_helpers.ts b/packages/optimizely-sdk/lib/core/event_builder/event_helpers.ts index 9d2ae4609..afe380bf8 100644 --- a/packages/optimizely-sdk/lib/core/event_builder/event_helpers.ts +++ b/packages/optimizely-sdk/lib/core/event_builder/event_helpers.ts @@ -15,9 +15,9 @@ */ import { getLogger } from '@optimizely/js-sdk-logging'; -import fns from '../../utils/fns'; -import * as eventTagUtils from '../../utils/event_tag_utils'; -import * as attributesValidator from '../../utils/attributes_validator'; +import fns from '@utils/fns'; +import * as eventTagUtils from '@utils/event_tag_utils'; +import * as attributesValidator from '@utils/attributes_validator'; import * as decision from '../decision'; import { EventTags, UserAttributes } from '../../shared_types'; diff --git a/packages/optimizely-sdk/lib/core/event_builder/index.ts b/packages/optimizely-sdk/lib/core/event_builder/index.ts index 4c85c5fda..13c4167c7 100644 --- a/packages/optimizely-sdk/lib/core/event_builder/index.ts +++ b/packages/optimizely-sdk/lib/core/event_builder/index.ts @@ -16,8 +16,8 @@ import { LoggerFacade } from '@optimizely/js-sdk-logging'; import { EventV1 as CommonEventParams } from '@optimizely/js-sdk-event-processor'; -import fns from '../../utils/fns'; -import { CONTROL_ATTRIBUTES, RESERVED_EVENT_KEYWORDS } from '../../utils/enums'; +import fns from '@utils/fns'; +import { CONTROL_ATTRIBUTES, RESERVED_EVENT_KEYWORDS } from '@utils/enums'; import { getAttributeId, getEventId, @@ -25,8 +25,8 @@ import { getVariationKeyFromId, ProjectConfig, } from '../project_config'; -import * as eventTagUtils from '../../utils/event_tag_utils'; -import { isAttributeValid } from '../../utils/attributes_validator'; +import * as eventTagUtils from '@utils/event_tag_utils'; +import { isAttributeValid } from '@utils/attributes_validator'; import { EventTags, UserAttributes, Event as EventLoggingEndpoint } from '../../shared_types'; const ACTIVATE_EVENT_KEY = 'campaign_activated'; diff --git a/packages/optimizely-sdk/lib/core/notification_center/index.ts b/packages/optimizely-sdk/lib/core/notification_center/index.ts index d54e30f84..ba69f7750 100644 --- a/packages/optimizely-sdk/lib/core/notification_center/index.ts +++ b/packages/optimizely-sdk/lib/core/notification_center/index.ts @@ -14,14 +14,14 @@ * limitations under the License. */ import { LogHandler, ErrorHandler } from '@optimizely/js-sdk-logging'; -import { objectValues } from '../../utils/fns'; +import { objectValues } from '@utils/fns'; import { NotificationListener, ListenerPayload } from '../../shared_types'; import { LOG_LEVEL, LOG_MESSAGES, NOTIFICATION_TYPES, -} from '../../utils/enums'; +} from '@utils/enums'; const MODULE_NAME = 'NOTIFICATION_CENTER'; diff --git a/packages/optimizely-sdk/lib/core/project_config/index.ts b/packages/optimizely-sdk/lib/core/project_config/index.ts index 9f04289be..30dd60369 100644 --- a/packages/optimizely-sdk/lib/core/project_config/index.ts +++ b/packages/optimizely-sdk/lib/core/project_config/index.ts @@ -20,15 +20,15 @@ import { sprintf, assign, keyBy -} from '../../utils/fns'; +} from '@utils/fns'; import { ERROR_MESSAGES, LOG_LEVEL, LOG_MESSAGES, FEATURE_VARIABLE_TYPES, -} from '../../utils/enums'; -import configValidator from '../../utils/config_validator'; +} from '@utils/enums'; +import configValidator from '@utils/config_validator'; import { LogHandler } from '@optimizely/js-sdk-logging'; import { diff --git a/packages/optimizely-sdk/lib/core/project_config/project_config_manager.ts b/packages/optimizely-sdk/lib/core/project_config/project_config_manager.ts index 961a79b89..69b204cc5 100644 --- a/packages/optimizely-sdk/lib/core/project_config/project_config_manager.ts +++ b/packages/optimizely-sdk/lib/core/project_config/project_config_manager.ts @@ -14,9 +14,9 @@ * limitations under the License. */ import { getLogger } from '@optimizely/js-sdk-logging'; -import { sprintf } from '../../utils/fns'; +import { sprintf } from '@utils/fns'; -import { ERROR_MESSAGES } from '../../utils/enums'; +import { ERROR_MESSAGES } from '@utils/enums'; import { createOptimizelyConfig } from '../optimizely_config'; import { OnReadyResult, diff --git a/packages/optimizely-sdk/lib/optimizely/index.ts b/packages/optimizely-sdk/lib/optimizely/index.ts index 23fbeec6c..e8241c2c8 100644 --- a/packages/optimizely-sdk/lib/optimizely/index.ts +++ b/packages/optimizely-sdk/lib/optimizely/index.ts @@ -14,7 +14,7 @@ * limitations under the License. * ***************************************************************************/ import { LoggerFacade, ErrorHandler } from '@optimizely/js-sdk-logging'; -import { sprintf, objectValues } from '../utils/fns'; +import { sprintf, objectValues } from '@utils/fns'; import { NotificationCenter } from '../core/notification_center'; import { EventProcessor } from '@optimizely/js-sdk-event-processor'; @@ -37,13 +37,13 @@ import { createProjectConfigManager, ProjectConfigManager } from '../core/projec import { createDecisionService, DecisionService, DecisionObj } from '../core/decision_service'; import { getImpressionEvent, getConversionEvent } from '../core/event_builder'; import { buildImpressionEvent, buildConversionEvent } from '../core/event_builder/event_helpers'; -import fns from '../utils/fns' -import { validate } from '../utils/attributes_validator'; -import * as enums from '../utils/enums'; -import * as eventTagsValidator from '../utils/event_tags_validator'; +import fns from '@utils/fns' +import { validate } from '@utils/attributes_validator'; +import * as enums from '@utils/enums'; +import * as eventTagsValidator from '@utils/event_tags_validator'; import * as projectConfig from '../core/project_config'; -import * as userProfileServiceValidator from '../utils/user_profile_service_validator'; -import * as stringValidator from '../utils/string_value_validator'; +import * as userProfileServiceValidator from '@utils/user_profile_service_validator'; +import * as stringValidator from '@utils/string_value_validator'; import * as decision from '../core/decision'; import { ERROR_MESSAGES, @@ -54,7 +54,7 @@ import { FEATURE_VARIABLE_TYPES, DECISION_NOTIFICATION_TYPES, NOTIFICATION_TYPES -} from '../utils/enums'; +} from '@utils/enums'; const MODULE_NAME = 'OPTIMIZELY'; diff --git a/packages/optimizely-sdk/lib/optimizely_user_context/index.ts b/packages/optimizely-sdk/lib/optimizely_user_context/index.ts index 7ab5f0a22..73356073a 100644 --- a/packages/optimizely-sdk/lib/optimizely_user_context/index.ts +++ b/packages/optimizely-sdk/lib/optimizely_user_context/index.ts @@ -22,7 +22,7 @@ import { OptimizelyForcedDecision, UserAttributes, } from '../../lib/shared_types'; -import { CONTROL_ATTRIBUTES } from '../utils/enums'; +import { CONTROL_ATTRIBUTES } from '@utils/enums'; export default class OptimizelyUserContext { private optimizely: Optimizely; diff --git a/packages/optimizely-sdk/lib/plugins/datafile_manager/http_polling_datafile_manager.ts b/packages/optimizely-sdk/lib/plugins/datafile_manager/http_polling_datafile_manager.ts index 42f993145..0f110a026 100644 --- a/packages/optimizely-sdk/lib/plugins/datafile_manager/http_polling_datafile_manager.ts +++ b/packages/optimizely-sdk/lib/plugins/datafile_manager/http_polling_datafile_manager.ts @@ -17,7 +17,7 @@ import { LoggerFacade } from '@optimizely/js-sdk-logging'; import { HttpPollingDatafileManager } from '@optimizely/js-sdk-datafile-manager'; import { DatafileOptions, DatafileManagerConfig, DatafileManager } from '../../shared_types'; import { toDatafile, tryCreatingProjectConfig } from '../../core/project_config'; -import fns from '../../utils/fns'; +import fns from '@utils/fns'; export function createHttpPollingDatafileManager( sdkKey: string, diff --git a/packages/optimizely-sdk/lib/plugins/event_processor/forwarding_event_processor.ts b/packages/optimizely-sdk/lib/plugins/event_processor/forwarding_event_processor.ts index 86390cbcf..1efd1368f 100644 --- a/packages/optimizely-sdk/lib/plugins/event_processor/forwarding_event_processor.ts +++ b/packages/optimizely-sdk/lib/plugins/event_processor/forwarding_event_processor.ts @@ -21,16 +21,16 @@ import { import { NotificationSender } from '../../core/notification_center'; import { EventDispatcher } from '../../shared_types'; -import { NOTIFICATION_TYPES } from '../../utils/enums'; +import { NOTIFICATION_TYPES } from '@utils/enums'; import { formatEvents } from '../../core/event_builder/build_event_v1'; class ForwardingEventProcessor implements EventProcessor { private dispatcher: EventDispatcher; private NotificationSender?: NotificationSender; - constructor(dispatcher: EventDispatcher, notificationCenter?: NotificationSender) { + constructor(dispatcher: EventDispatcher, notificationSender?: NotificationSender) { this.dispatcher = dispatcher; - this.NotificationSender = notificationCenter; + this.NotificationSender = notificationSender; } process(event: ProcessableEvent): void { @@ -51,6 +51,6 @@ class ForwardingEventProcessor implements EventProcessor { } } -export function createForwardingEventProcessor(dispatcher: EventDispatcher, notificationCenter?: NotificationSender): EventProcessor { - return new ForwardingEventProcessor(dispatcher, notificationCenter); +export function createForwardingEventProcessor(dispatcher: EventDispatcher, notificationSender?: NotificationSender): EventProcessor { + return new ForwardingEventProcessor(dispatcher, notificationSender); } diff --git a/packages/optimizely-sdk/lib/plugins/logger/index.react_native.ts b/packages/optimizely-sdk/lib/plugins/logger/index.react_native.ts index ce8340e4c..b4bdbdbd4 100644 --- a/packages/optimizely-sdk/lib/plugins/logger/index.react_native.ts +++ b/packages/optimizely-sdk/lib/plugins/logger/index.react_native.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { LogLevel } from '@optimizely/js-sdk-logging'; -import { sprintf } from '../../utils/fns'; +import { sprintf } from '@utils/fns'; import { NoOpLogger } from './index'; function getLogLevelName(level: number): string { diff --git a/packages/optimizely-sdk/lib/utils/attributes_validator/index.ts b/packages/optimizely-sdk/lib/utils/attributes_validator/index.ts index 5f33e85d4..5ab79ea74 100644 --- a/packages/optimizely-sdk/lib/utils/attributes_validator/index.ts +++ b/packages/optimizely-sdk/lib/utils/attributes_validator/index.ts @@ -13,10 +13,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { sprintf } from '../../utils/fns'; +import { sprintf } from '@utils/fns'; import { ObjectWithUnknownProperties } from '../../shared_types'; -import fns from '../../utils/fns'; +import fns from '@utils/fns'; import { ERROR_MESSAGES } from '../enums'; const MODULE_NAME = 'ATTRIBUTES_VALIDATOR'; diff --git a/packages/optimizely-sdk/lib/utils/config_validator/index.ts b/packages/optimizely-sdk/lib/utils/config_validator/index.ts index a273121cc..e006968a4 100644 --- a/packages/optimizely-sdk/lib/utils/config_validator/index.ts +++ b/packages/optimizely-sdk/lib/utils/config_validator/index.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { sprintf } from '../../utils/fns'; +import { sprintf } from '@utils/fns'; import { ObjectWithUnknownProperties } from '../../shared_types'; import { diff --git a/packages/optimizely-sdk/lib/utils/event_tags_validator/index.ts b/packages/optimizely-sdk/lib/utils/event_tags_validator/index.ts index f2294dda0..0338b149e 100644 --- a/packages/optimizely-sdk/lib/utils/event_tags_validator/index.ts +++ b/packages/optimizely-sdk/lib/utils/event_tags_validator/index.ts @@ -17,7 +17,7 @@ /** * Provides utility method for validating that event tags user has provided are valid */ -import { sprintf } from '../../utils/fns'; +import { sprintf } from '@utils/fns'; import { ERROR_MESSAGES } from '../enums'; diff --git a/packages/optimizely-sdk/lib/utils/fns/index.ts b/packages/optimizely-sdk/lib/utils/fns/index.ts index 6cdec3a76..5821c3edd 100644 --- a/packages/optimizely-sdk/lib/utils/fns/index.ts +++ b/packages/optimizely-sdk/lib/utils/fns/index.ts @@ -79,6 +79,8 @@ export function getTimestamp(): number { * @param {*} value * @returns {boolean} */ +// TODO[OASIS-6649]: Don't use any type +// eslint-disable-next-line @typescript-eslint/no-explicit-any export function isValidEnum(enumToCheck: { [key: string]: any }, value: number | string): boolean { let found = false diff --git a/packages/optimizely-sdk/lib/utils/user_profile_service_validator/index.ts b/packages/optimizely-sdk/lib/utils/user_profile_service_validator/index.ts index 57df0c891..1409a1d48 100644 --- a/packages/optimizely-sdk/lib/utils/user_profile_service_validator/index.ts +++ b/packages/optimizely-sdk/lib/utils/user_profile_service_validator/index.ts @@ -18,7 +18,7 @@ * Provides utility method for validating that the given user profile service implementation is valid. */ -import { sprintf } from '../../utils/fns'; +import { sprintf } from '@utils/fns'; import { ObjectWithUnknownProperties } from '../../shared_types'; import { ERROR_MESSAGES } from '../enums'; diff --git a/packages/optimizely-sdk/package-lock.json b/packages/optimizely-sdk/package-lock.json index bf2c46f53..777034ba9 100644 --- a/packages/optimizely-sdk/package-lock.json +++ b/packages/optimizely-sdk/package-lock.json @@ -10771,6 +10771,37 @@ } } }, + "tsconfig-paths": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.0.0.tgz", + "integrity": "sha512-SLBg2GBKlR6bVtMgJJlud/o3waplKtL7skmLkExomIiaAtLGtVsoXIqP3SYdjbcH9lq/KVv7pMZeCBpLYOit6Q==", + "dev": true, + "requires": { + "json5": "^2.2.1", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true + }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "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 + } + } + }, "tslib": { "version": "1.14.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.0.tgz", diff --git a/packages/optimizely-sdk/package.json b/packages/optimizely-sdk/package.json index 7ca0863a9..586e685b2 100644 --- a/packages/optimizely-sdk/package.json +++ b/packages/optimizely-sdk/package.json @@ -10,7 +10,7 @@ "scripts": { "clean": "rm -rf dist", "lint": "tsc --noEmit && eslint 'lib/**/*.js' 'lib/**/*.ts'", - "test": "TS_NODE_COMPILER_OPTIONS='{\"module\": \"commonjs\" }' mocha -r ts-node/register -r lib/tests/exit_on_unhandled_rejection.js 'lib/**/*.tests.ts' 'lib/**/*.tests.js' && jest", + "test": "TS_NODE_COMPILER_OPTIONS='{\"module\": \"commonjs\" }' mocha -r ts-node/register -r tsconfig-paths/register -r lib/tests/exit_on_unhandled_rejection.js 'lib/**/*.tests.ts' 'lib/**/*.tests.js' && jest", "posttest": "npm run lint", "test-ci": "npm run test-xbrowser && npm run test-umdbrowser", "test-xbrowser": "karma start karma.bs.conf.js --single-run", @@ -52,13 +52,16 @@ "@rollup/plugin-commonjs": "^11.0.2", "@rollup/plugin-node-resolve": "^7.1.1", "@types/chai": "^4.2.11", + "@types/jest": "^23.3.12", "@types/mocha": "^5.2.7", + "@types/uuid": "^3.4.4", "@typescript-eslint/eslint-plugin": "^3.2.0", "@typescript-eslint/parser": "^3.2.0", "bluebird": "^3.4.6", "chai": "^4.2.0", "coveralls": "^3.0.2", "eslint": "^6.7.2", + "jest": "^23.6.0", "json-loader": "^0.5.4", "karma": "^4.4.1", "karma-browserstack-launcher": "^1.5.1", @@ -76,14 +79,12 @@ "rollup-plugin-terser": "^5.3.0", "rollup-plugin-typescript2": "^0.27.1", "sinon": "^2.3.1", + "ts-jest": "^23.10.5", "ts-loader": "^7.0.5", "ts-node": "^8.10.2", + "tsconfig-paths": "^4.0.0", "typescript": "^4.0.3", - "webpack": "^4.42.1", - "@types/jest": "^23.3.12", - "@types/uuid": "^3.4.4", - "jest": "^23.6.0", - "ts-jest": "^23.10.5" + "webpack": "^4.42.1" }, "publishConfig": { "access": "public" diff --git a/packages/optimizely-sdk/tsconfig.json b/packages/optimizely-sdk/tsconfig.json index a4abc0042..4df20d46a 100644 --- a/packages/optimizely-sdk/tsconfig.json +++ b/packages/optimizely-sdk/tsconfig.json @@ -5,6 +5,9 @@ "paths": { "*": [ "./typings/*" + ], + "@utils/*": [ + "./lib/utils/*" ] }, "allowJs": true, From 26f2b0a725ff215b23202d8b4bafbfe590255d5d Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Mon, 16 May 2022 19:22:20 +0500 Subject: [PATCH 37/59] event processor consolidated --- package-lock.json | 5073 +++++++++++++++++ .../async-storage.ts | 51 + .../@react-native-community/netinfo.ts | 24 + packages/optimizely-sdk/jest.config.js | 4 + .../lib/core/event_builder/build_event_v1.ts | 2 +- .../lib/core/event_builder/index.ts | 2 +- packages/optimizely-sdk/lib/index.browser.ts | 2 +- .../event_processor/eventDispatcher.ts | 32 + .../modules/event_processor/eventProcessor.ts | 82 + .../lib/modules/event_processor/eventQueue.ts | 159 + .../lib/modules/event_processor/events.ts | 101 + .../event_processor/index.react_native.ts | 23 + .../lib/modules/event_processor/index.ts | 23 + .../lib/modules/event_processor/managed.ts | 20 + .../pendingEventsDispatcher.ts | 88 + .../event_processor/pendingEventsStore.ts | 117 + .../persistentKeyValueCache.ts | 60 + .../reactNativeAsyncStorageCache.ts | 49 + .../event_processor/reactNativeEventsStore.ts | 81 + .../modules/event_processor/requestTracker.ts | 60 + .../modules/event_processor/synchronizer.ts | 42 + .../event_processor/v1/buildEventV1.ts | 255 + .../v1/v1EventProcessor.react_native.ts | 235 + .../event_processor/v1/v1EventProcessor.ts | 102 + .../lib/modules/logging/logger.ts | 24 +- .../optimizely-sdk/lib/optimizely/index.ts | 2 +- .../forwarding_event_processor.ts | 2 +- .../lib/plugins/event_processor/index.ts | 2 +- packages/optimizely-sdk/lib/shared_types.ts | 4 +- .../lib/utils/event_tag_utils/index.ts | 2 +- packages/optimizely-sdk/package-lock.json | 36 + packages/optimizely-sdk/package.json | 17 +- .../optimizely-sdk/tests/buildEventV1.spec.ts | 812 +++ .../optimizely-sdk/tests/eventQueue.spec.ts | 290 + .../tests/pendingEventsDispatcher.spec.ts | 261 + .../tests/pendingEventsStore.spec.ts | 143 + .../tests/reactNativeEventsStore.spec.ts | 219 + .../tests/requestTracker.spec.ts | 64 + .../v1EventProcessor.react_native.spec.ts | 887 +++ .../tests/v1EventProcessor.spec.ts | 530 ++ packages/optimizely-sdk/tsconfig.json | 4 +- 41 files changed, 9963 insertions(+), 23 deletions(-) create mode 100644 package-lock.json create mode 100644 packages/optimizely-sdk/__mocks__/@react-native-async-storage/async-storage.ts create mode 100644 packages/optimizely-sdk/__mocks__/@react-native-community/netinfo.ts create mode 100644 packages/optimizely-sdk/lib/modules/event_processor/eventDispatcher.ts create mode 100644 packages/optimizely-sdk/lib/modules/event_processor/eventProcessor.ts create mode 100644 packages/optimizely-sdk/lib/modules/event_processor/eventQueue.ts create mode 100644 packages/optimizely-sdk/lib/modules/event_processor/events.ts create mode 100644 packages/optimizely-sdk/lib/modules/event_processor/index.react_native.ts create mode 100644 packages/optimizely-sdk/lib/modules/event_processor/index.ts create mode 100644 packages/optimizely-sdk/lib/modules/event_processor/managed.ts create mode 100644 packages/optimizely-sdk/lib/modules/event_processor/pendingEventsDispatcher.ts create mode 100644 packages/optimizely-sdk/lib/modules/event_processor/pendingEventsStore.ts create mode 100644 packages/optimizely-sdk/lib/modules/event_processor/persistentKeyValueCache.ts create mode 100644 packages/optimizely-sdk/lib/modules/event_processor/reactNativeAsyncStorageCache.ts create mode 100644 packages/optimizely-sdk/lib/modules/event_processor/reactNativeEventsStore.ts create mode 100644 packages/optimizely-sdk/lib/modules/event_processor/requestTracker.ts create mode 100644 packages/optimizely-sdk/lib/modules/event_processor/synchronizer.ts create mode 100644 packages/optimizely-sdk/lib/modules/event_processor/v1/buildEventV1.ts create mode 100644 packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.react_native.ts create mode 100644 packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.ts create mode 100644 packages/optimizely-sdk/tests/buildEventV1.spec.ts create mode 100644 packages/optimizely-sdk/tests/eventQueue.spec.ts create mode 100644 packages/optimizely-sdk/tests/pendingEventsDispatcher.spec.ts create mode 100644 packages/optimizely-sdk/tests/pendingEventsStore.spec.ts create mode 100644 packages/optimizely-sdk/tests/reactNativeEventsStore.spec.ts create mode 100644 packages/optimizely-sdk/tests/requestTracker.spec.ts create mode 100644 packages/optimizely-sdk/tests/v1EventProcessor.react_native.spec.ts create mode 100644 packages/optimizely-sdk/tests/v1EventProcessor.spec.ts diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 000000000..5bc8a6877 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5073 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "@lerna/add": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@lerna/add/-/add-3.2.0.tgz", + "integrity": "sha512-qGA7agAWcKlrXZR3FwFJXTr26Q2rqjOVMNhtm8uyawImqfdKp4WJXuGdioiWOSW20jMvzLIFhWZh5lCh0UyMBw==", + "requires": { + "@lerna/bootstrap": "^3.2.0", + "@lerna/command": "^3.1.3", + "@lerna/filter-options": "^3.1.2", + "@lerna/npm-conf": "^3.0.0", + "@lerna/validation-error": "^3.0.0", + "dedent": "^0.7.0", + "npm-package-arg": "^6.0.0", + "p-map": "^1.2.0", + "pacote": "^9.1.0", + "semver": "^5.5.0" + } + }, + "@lerna/batch-packages": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@lerna/batch-packages/-/batch-packages-3.1.2.tgz", + "integrity": "sha512-HAkpptrYeUVlBYbLScXgeCgk6BsNVXxDd53HVWgzzTWpXV4MHpbpeKrByyt7viXlNhW0w73jJbipb/QlFsHIhQ==", + "requires": { + "@lerna/package-graph": "^3.1.2", + "@lerna/validation-error": "^3.0.0", + "npmlog": "^4.1.2" + } + }, + "@lerna/bootstrap": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@lerna/bootstrap/-/bootstrap-3.2.0.tgz", + "integrity": "sha512-xh6dPpdzsAEWF7lqASaym5AThkmP3ArR7Q+P/tiPWCT+OT7QT5QI2IQAz1aAYEBQL3ACzpE6kq+VOGi0m+9bxw==", + "requires": { + "@lerna/batch-packages": "^3.1.2", + "@lerna/command": "^3.1.3", + "@lerna/filter-options": "^3.1.2", + "@lerna/has-npm-version": "^3.0.4", + "@lerna/npm-conf": "^3.0.0", + "@lerna/npm-install": "^3.0.0", + "@lerna/rimraf-dir": "^3.0.0", + "@lerna/run-lifecycle": "^3.2.0", + "@lerna/run-parallel-batches": "^3.0.0", + "@lerna/symlink-binary": "^3.1.4", + "@lerna/symlink-dependencies": "^3.1.4", + "@lerna/validation-error": "^3.0.0", + "dedent": "^0.7.0", + "get-port": "^3.2.0", + "multimatch": "^2.1.0", + "npm-package-arg": "^6.0.0", + "npmlog": "^4.1.2", + "p-finally": "^1.0.0", + "p-map": "^1.2.0", + "p-map-series": "^1.0.0", + "p-waterfall": "^1.0.0", + "read-package-tree": "^5.1.6", + "semver": "^5.5.0" + } + }, + "@lerna/changed": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@lerna/changed/-/changed-3.2.0.tgz", + "integrity": "sha512-R+vGzzXPN5s5lJT0v1zSTLw43O2ek2yekqCqvw7p9UFqgqYSbxUsyWXMdhku/mOIFWTc6DzrsOi+U7CX3TXmHg==", + "requires": { + "@lerna/collect-updates": "^3.1.0", + "@lerna/command": "^3.1.3", + "@lerna/listable": "^3.0.0", + "@lerna/output": "^3.0.0", + "@lerna/version": "^3.2.0" + } + }, + "@lerna/check-working-tree": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@lerna/check-working-tree/-/check-working-tree-3.1.0.tgz", + "integrity": "sha512-ruy6s44IUcaPEa4JlDDDk6nbacMESUPRSb+dohzLJxfhXx1wFnEVF6L91TGxFP+C0lt5V6zd8rnJxkW/uZzNAA==", + "requires": { + "@lerna/describe-ref": "^3.1.0", + "@lerna/validation-error": "^3.0.0" + } + }, + "@lerna/child-process": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@lerna/child-process/-/child-process-3.0.0.tgz", + "integrity": "sha512-8vHRDkpGhzSaMsXgyXVgY80mUSC5WSkDmhWWA3bnB/n5FBK1gK8EKQUpHTk14SckwvUgEJzBd35gR5/XKGOgmQ==", + "requires": { + "chalk": "^2.3.1", + "execa": "^0.10.0", + "strong-log-transformer": "^1.0.6" + } + }, + "@lerna/clean": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@lerna/clean/-/clean-3.1.3.tgz", + "integrity": "sha512-XVdcIOjhudXlk5pTXjrpsnNLqeVi2rBu2oWzPH2GHrxWGBZBW8thGIFhQf09da/RbRT3uzBWXpUv+sbL2vbX3g==", + "requires": { + "@lerna/command": "^3.1.3", + "@lerna/filter-options": "^3.1.2", + "@lerna/prompt": "^3.0.0", + "@lerna/rimraf-dir": "^3.0.0", + "p-map": "^1.2.0", + "p-map-series": "^1.0.0", + "p-waterfall": "^1.0.0" + } + }, + "@lerna/cli": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@lerna/cli/-/cli-3.2.0.tgz", + "integrity": "sha512-JdbLyTxHqxUlrkI+Ke+ltXbtyA+MPu9zR6kg/n8Fl6uaez/2fZWtReXzYi8MgLxfUFa7+1OHWJv4eAMZlByJ+Q==", + "requires": { + "@lerna/global-options": "^3.1.3", + "dedent": "^0.7.0", + "npmlog": "^4.1.2", + "yargs": "^12.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "decamelize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz", + "integrity": "sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==", + "requires": { + "xregexp": "4.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "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=" + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", + "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", + "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==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", + "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "yargs": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.1.tgz", + "integrity": "sha512-B0vRAp1hRX4jgIOWFtjfNjd9OA9RWYZ6tqGA9/I/IrTMsxmKvtWy+ersM+jzpQqbC3YfLzeABPdeTgcJ9eu1qQ==", + "requires": { + "cliui": "^4.0.0", + "decamelize": "^2.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^10.1.0" + } + } + } + }, + "@lerna/collect-updates": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@lerna/collect-updates/-/collect-updates-3.1.0.tgz", + "integrity": "sha512-zHxHRZOteTqcW9mAyLrmoWEKpfxgA3c6LJj4nauB2pM3MKyKNhg0gqiy2RHFu7EGivPki4Q1624I301iAXtUVA==", + "requires": { + "@lerna/child-process": "^3.0.0", + "@lerna/describe-ref": "^3.1.0", + "minimatch": "^3.0.4", + "npmlog": "^4.1.2", + "slash": "^1.0.0" + } + }, + "@lerna/command": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@lerna/command/-/command-3.1.3.tgz", + "integrity": "sha512-ptaFNsfcTpxnSkaNrGgW3fRbWWVSVDUx4BpkjUUnRTgy9mwoykQWgQB3inhgTYHwW6e4PzO79F2hovfUMzHuzg==", + "requires": { + "@lerna/child-process": "^3.0.0", + "@lerna/package-graph": "^3.1.2", + "@lerna/project": "^3.0.0", + "@lerna/validation-error": "^3.0.0", + "@lerna/write-log-file": "^3.0.0", + "dedent": "^0.7.0", + "execa": "^0.10.0", + "is-ci": "^1.0.10", + "lodash": "^4.17.5", + "npmlog": "^4.1.2" + } + }, + "@lerna/conventional-commits": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@lerna/conventional-commits/-/conventional-commits-3.0.2.tgz", + "integrity": "sha512-Cxd1eWXn3usADKXIUvYmTERx2+1N7oJD4Whz+FVu8kTfufsfTO7fYOan1RVkg86ukZbNDyS+iOxZ8DJ2JspS9g==", + "requires": { + "@lerna/validation-error": "^3.0.0", + "conventional-changelog-angular": "^1.6.6", + "conventional-changelog-core": "^2.0.5", + "conventional-recommended-bump": "^2.0.6", + "dedent": "^0.7.0", + "fs-extra": "^6.0.1", + "get-stream": "^3.0.0", + "npm-package-arg": "^6.0.0", + "npmlog": "^4.1.2", + "semver": "^5.5.0" + } + }, + "@lerna/create": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@lerna/create/-/create-3.1.3.tgz", + "integrity": "sha512-CmXKCBc6AE3F9O6mMg4Y76cQ8eTCy3ksqDFKxVQMdYDtHKnTrH1s0l8sn3J1AiylqVDnvxhb3Rjyj+OWyzmFPQ==", + "requires": { + "@lerna/child-process": "^3.0.0", + "@lerna/command": "^3.1.3", + "@lerna/npm-conf": "^3.0.0", + "@lerna/validation-error": "^3.0.0", + "camelcase": "^4.1.0", + "dedent": "^0.7.0", + "fs-extra": "^6.0.1", + "globby": "^8.0.1", + "init-package-json": "^1.10.3", + "npm-package-arg": "^6.0.0", + "pify": "^3.0.0", + "semver": "^5.5.0", + "slash": "^1.0.0", + "validate-npm-package-license": "^3.0.3", + "validate-npm-package-name": "^3.0.0", + "whatwg-url": "^6.5.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + } + } + }, + "@lerna/create-symlink": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@lerna/create-symlink/-/create-symlink-3.0.0.tgz", + "integrity": "sha512-Q9qAzGGqQtVzHWrCz+Md4SH0tW99DrgFJ68cnFqilOO6H3Y/y/H0gwHICqM9YxRwLs6GJdkzoqJATFShM7PKJA==", + "requires": { + "cmd-shim": "^2.0.2", + "fs-extra": "^6.0.1", + "npmlog": "^4.1.2" + } + }, + "@lerna/describe-ref": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@lerna/describe-ref/-/describe-ref-3.1.0.tgz", + "integrity": "sha512-0a7WFKDSmdEwwmEj+ZfhI7SkkG1CDcVhfW8VhPqr6gnCMY+ryt6iV/rR7ygb0eCDg8wEe9eQsiwbnrbXDLjIDw==", + "requires": { + "@lerna/child-process": "^3.0.0", + "npmlog": "^4.1.2" + } + }, + "@lerna/diff": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@lerna/diff/-/diff-3.1.3.tgz", + "integrity": "sha512-30G74DxdQC4dR3U0yqh5mjcioLDUmSy1ntntdF3khvKV9oiMVzCSOO0oOlSwIdmohke+bQ//oF+oyl0Dy1TUTQ==", + "requires": { + "@lerna/child-process": "^3.0.0", + "@lerna/command": "^3.1.3", + "@lerna/validation-error": "^3.0.0", + "npmlog": "^4.1.2" + } + }, + "@lerna/exec": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@lerna/exec/-/exec-3.1.3.tgz", + "integrity": "sha512-r0yQj9Rza5a42Shts8rXYGU1/Va8hO2atk/TEZgrA1EcTwgZyAuXsuML5UWbC/eLgwEjVDmc3MUSj8O1JijBMQ==", + "requires": { + "@lerna/batch-packages": "^3.1.2", + "@lerna/child-process": "^3.0.0", + "@lerna/command": "^3.1.3", + "@lerna/filter-options": "^3.1.2", + "@lerna/run-parallel-batches": "^3.0.0", + "@lerna/validation-error": "^3.0.0" + } + }, + "@lerna/filter-options": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@lerna/filter-options/-/filter-options-3.1.2.tgz", + "integrity": "sha512-smbvSGK/eU+7PDKO4jbJ7XYO2XTfhnwPeOTuwSm1mlWS5dUGasYkhAuFzouFh60aZBvmW0e6APe0XYeofQNcCg==", + "requires": { + "@lerna/collect-updates": "^3.1.0", + "@lerna/filter-packages": "^3.0.0", + "dedent": "^0.7.0" + } + }, + "@lerna/filter-packages": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@lerna/filter-packages/-/filter-packages-3.0.0.tgz", + "integrity": "sha512-zwbY1J4uRjWRZ/FgYbtVkq7I3Nduwsg2V2HwLKSzwV2vPglfGqgovYOVkND6/xqe2BHwDX4IyA2+e7OJmLaLSA==", + "requires": { + "@lerna/validation-error": "^3.0.0", + "multimatch": "^2.1.0", + "npmlog": "^4.1.2" + } + }, + "@lerna/get-npm-exec-opts": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@lerna/get-npm-exec-opts/-/get-npm-exec-opts-3.0.0.tgz", + "integrity": "sha512-arcYUm+4xS8J3Palhl+5rRJXnZnFHsLFKHBxznkPIxjwGQeAEw7df38uHdVjEQ+HNeFmHnBgSqfbxl1VIw5DHg==", + "requires": { + "npmlog": "^4.1.2" + } + }, + "@lerna/global-options": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@lerna/global-options/-/global-options-3.1.3.tgz", + "integrity": "sha512-LVeZU/Zgc0XkHdGMRYn+EmHfDmmYNwYRv3ta59iCVFXLVp7FRFWF7oB1ss/WRa9x/pYU0o6L8as/5DomLUGASA==" + }, + "@lerna/has-npm-version": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@lerna/has-npm-version/-/has-npm-version-3.0.4.tgz", + "integrity": "sha512-RisEWZBROi8corPb/PUIQqT+xGPLeriJ/n6VCeO6GROCO1fyYBX7kgFmVpFOytufWFkI04qBgLaUs+CEc8Yspg==", + "requires": { + "@lerna/child-process": "^3.0.0", + "semver": "^5.5.0" + } + }, + "@lerna/import": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@lerna/import/-/import-3.1.3.tgz", + "integrity": "sha512-+XV/EHXEHbyMmprz8zQa0VF0TZ+txRIrcF3Q/PsuZ4isVxawIbP1CmgE0yn0/1XSNJwGKsuPfGauRtnjUi2LJw==", + "requires": { + "@lerna/child-process": "^3.0.0", + "@lerna/command": "^3.1.3", + "@lerna/prompt": "^3.0.0", + "@lerna/validation-error": "^3.0.0", + "dedent": "^0.7.0", + "fs-extra": "^6.0.1", + "p-map-series": "^1.0.0" + } + }, + "@lerna/init": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@lerna/init/-/init-3.1.3.tgz", + "integrity": "sha512-c418p6fAfJ+b/tidB8/O/ABGLX7a5y5uJSWxH2/Mp7i5da/RD27XJ6E6818hGAbUbVQw04+XuXHtrWYlWLEJCw==", + "requires": { + "@lerna/child-process": "^3.0.0", + "@lerna/command": "^3.1.3", + "fs-extra": "^6.0.1", + "p-map": "^1.2.0", + "write-json-file": "^2.3.0" + } + }, + "@lerna/link": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@lerna/link/-/link-3.1.4.tgz", + "integrity": "sha512-AAl4ctKtE6975zxdrsr16CAh/K4y0ZjjY9XDdD+zMxsSPELvRVG6M36O1A72AmKz5Nhh1l82bPrw7w54TbQ8hA==", + "requires": { + "@lerna/command": "^3.1.3", + "@lerna/package-graph": "^3.1.2", + "@lerna/symlink-dependencies": "^3.1.4", + "p-map": "^1.2.0", + "slash": "^1.0.0" + } + }, + "@lerna/list": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@lerna/list/-/list-3.1.3.tgz", + "integrity": "sha512-/ncX5Kj1ddLgZuBkjaoluJgcmAAm/L4/AymVNBgVrw6dOad0C0RB6oIcRAbxDennEQ25wSOFmuXRZHYHY9VYyg==", + "requires": { + "@lerna/command": "^3.1.3", + "@lerna/filter-options": "^3.1.2", + "@lerna/listable": "^3.0.0", + "@lerna/output": "^3.0.0" + } + }, + "@lerna/listable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@lerna/listable/-/listable-3.0.0.tgz", + "integrity": "sha512-HX/9hyx1HLg2kpiKXIUc1EimlkK1T58aKQ7ovO7rQdTx9ForpefoMzyLnHE1n4XrUtEszcSWJIICJ/F898M6Ag==", + "requires": { + "chalk": "^2.3.1", + "columnify": "^1.5.4" + } + }, + "@lerna/log-packed": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@lerna/log-packed/-/log-packed-3.0.4.tgz", + "integrity": "sha512-vVQHgMagE2wnbxhNY9nFkdu+Cx2TsyWalkJfkxbNzmo6gOCrDsxCBDj9vTEV8Q+4aWx0C0Bsc0sB2Eb8y/+ofA==", + "requires": { + "byte-size": "^4.0.3", + "columnify": "^1.5.4", + "has-unicode": "^2.0.1", + "npmlog": "^4.1.2" + } + }, + "@lerna/npm-conf": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@lerna/npm-conf/-/npm-conf-3.0.0.tgz", + "integrity": "sha512-xXG7qt349t+xzaHTQELmIDjbq8Q49HOMR8Nx/gTDBkMl02Fno91LXFnA4A7ErPiyUSGqNSfLw+zgij0hgpeN7w==", + "requires": { + "config-chain": "^1.1.11", + "pify": "^3.0.0" + } + }, + "@lerna/npm-dist-tag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@lerna/npm-dist-tag/-/npm-dist-tag-3.0.0.tgz", + "integrity": "sha512-ZOcfcsNJlCoVHvLOROdCTvqD3keG3TJ78Cu8sALsz8n0kEz2ga7tNy5wbQ67SGyY7+jq4YiBv5BwXjV+56Sv+A==", + "requires": { + "@lerna/child-process": "^3.0.0", + "@lerna/get-npm-exec-opts": "^3.0.0", + "npmlog": "^4.1.2" + } + }, + "@lerna/npm-install": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@lerna/npm-install/-/npm-install-3.0.0.tgz", + "integrity": "sha512-e0sspVUfzEKhqsRIxzWqZ/uMBHzZSzOa4HCeORErEZu+dmDoI145XYhqvCVn7EvbAb407FV2H9GVeoP0JeG8GQ==", + "requires": { + "@lerna/child-process": "^3.0.0", + "@lerna/get-npm-exec-opts": "^3.0.0", + "fs-extra": "^6.0.1", + "npm-package-arg": "^6.0.0", + "npmlog": "^4.1.2", + "signal-exit": "^3.0.2", + "write-pkg": "^3.1.0" + } + }, + "@lerna/npm-publish": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@lerna/npm-publish/-/npm-publish-3.2.0.tgz", + "integrity": "sha512-x13EGrjZk9w8gCQAE44aKbeO1xhLizLJ4tKjzZmQqKEaUCugF4UU8ZRGshPMRFBdsHTEWh05dkKx2oPMoaf0dw==", + "requires": { + "@lerna/child-process": "^3.0.0", + "@lerna/get-npm-exec-opts": "^3.0.0", + "@lerna/has-npm-version": "^3.0.4", + "@lerna/log-packed": "^3.0.4", + "fs-extra": "^6.0.1", + "npmlog": "^4.1.2", + "p-map": "^1.2.0" + } + }, + "@lerna/npm-run-script": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@lerna/npm-run-script/-/npm-run-script-3.0.0.tgz", + "integrity": "sha512-Y1H4Myer1S7an33FDK0eqyR+95PujUePC/xJZKq/H50SaQNwBw7KMlxXxy6kXVEcQhmvQsER4Bw3msgqwwGYIw==", + "requires": { + "@lerna/child-process": "^3.0.0", + "@lerna/get-npm-exec-opts": "^3.0.0", + "npmlog": "^4.1.2" + } + }, + "@lerna/output": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@lerna/output/-/output-3.0.0.tgz", + "integrity": "sha512-EFxnSbO0zDEVKkTKpoCUAFcZjc3gn3DwPlyTDxbeqPU7neCfxP4rA4+0a6pcOfTlRS5kLBRMx79F2TRCaMM3DA==", + "requires": { + "npmlog": "^4.1.2" + } + }, + "@lerna/package": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@lerna/package/-/package-3.0.0.tgz", + "integrity": "sha512-djzEJxzn212wS8d9znBnlXkeRlPL7GqeAYBykAmsuq51YGvaQK67Umh5ejdO0uxexF/4r7yRwgrlRHpQs8Rfqg==", + "requires": { + "npm-package-arg": "^6.0.0", + "write-pkg": "^3.1.0" + } + }, + "@lerna/package-graph": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@lerna/package-graph/-/package-graph-3.1.2.tgz", + "integrity": "sha512-9wIWb49I1IJmyjPdEVZQ13IAi9biGfH/OZHOC04U2zXGA0GLiY+B3CAx6FQvqkZ8xEGfqzmXnv3LvZ0bQfc1aQ==", + "requires": { + "@lerna/validation-error": "^3.0.0", + "npm-package-arg": "^6.0.0", + "semver": "^5.5.0" + } + }, + "@lerna/project": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@lerna/project/-/project-3.0.0.tgz", + "integrity": "sha512-XhDFVfqj79jG2Speggd15RpYaE8uiR25UKcQBDmumbmqvTS7xf2cvl2pq2UTvDafaJ0YwFF3xkxQZeZnFMwdkw==", + "requires": { + "@lerna/package": "^3.0.0", + "@lerna/validation-error": "^3.0.0", + "cosmiconfig": "^5.0.2", + "dedent": "^0.7.0", + "dot-prop": "^4.2.0", + "glob-parent": "^3.1.0", + "globby": "^8.0.1", + "load-json-file": "^4.0.0", + "npmlog": "^4.1.2", + "p-map": "^1.2.0", + "resolve-from": "^4.0.0", + "write-json-file": "^2.3.0" + } + }, + "@lerna/prompt": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@lerna/prompt/-/prompt-3.0.0.tgz", + "integrity": "sha512-EzvNexDTh//GlpOz68zRo16NdOIqWqiiXMs9tIxpELQubH+kUGKvBSiBrZ2Zyrfd8pQhIf+8qARtkCG+G7wzQQ==", + "requires": { + "inquirer": "^5.1.0", + "npmlog": "^4.1.2" + } + }, + "@lerna/publish": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/@lerna/publish/-/publish-3.2.1.tgz", + "integrity": "sha512-SnSBstK/G9qLt5rS56pihNacgsu3UgxXiCexWb57GGEp2eDguQ7rFzxVs4JMQQWmVG97EMJQxfFV54tW2sqtIw==", + "requires": { + "@lerna/batch-packages": "^3.1.2", + "@lerna/check-working-tree": "^3.1.0", + "@lerna/child-process": "^3.0.0", + "@lerna/collect-updates": "^3.1.0", + "@lerna/command": "^3.1.3", + "@lerna/describe-ref": "^3.1.0", + "@lerna/get-npm-exec-opts": "^3.0.0", + "@lerna/npm-dist-tag": "^3.0.0", + "@lerna/npm-publish": "^3.2.0", + "@lerna/output": "^3.0.0", + "@lerna/prompt": "^3.0.0", + "@lerna/run-lifecycle": "^3.2.0", + "@lerna/run-parallel-batches": "^3.0.0", + "@lerna/validation-error": "^3.0.0", + "@lerna/version": "^3.2.0", + "fs-extra": "^6.0.1", + "npm-package-arg": "^6.0.0", + "npmlog": "^4.1.2", + "p-finally": "^1.0.0", + "p-map": "^1.2.0", + "p-pipe": "^1.2.0", + "p-reduce": "^1.0.0", + "semver": "^5.5.0" + } + }, + "@lerna/resolve-symlink": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@lerna/resolve-symlink/-/resolve-symlink-3.0.0.tgz", + "integrity": "sha512-MqjW9e+QVXts5IK5dk1XnYx7JKb+g+tQkOnnpAxYWHjahf3rGJ7Ru8maWh8KoPE+nIHAekk4WcjpiA9nLKvkFQ==", + "requires": { + "fs-extra": "^6.0.1", + "npmlog": "^4.1.2", + "read-cmd-shim": "^1.0.1" + } + }, + "@lerna/rimraf-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@lerna/rimraf-dir/-/rimraf-dir-3.0.0.tgz", + "integrity": "sha512-epvh/RGWSOYdrNgrizMcRq9VyCHkeY0LpIE4074r4ouKdYNhBT0LlpT0yMLvQgQKJkKRlqcfhJHvZeGHhXQyGg==", + "requires": { + "@lerna/child-process": "^3.0.0", + "npmlog": "^4.1.2", + "path-exists": "^3.0.0", + "rimraf": "^2.6.2" + } + }, + "@lerna/run": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@lerna/run/-/run-3.1.3.tgz", + "integrity": "sha512-O26WdR+sQFSG2Fpc67nw+m8oVq3R+H6jsscKuB6VJafU+V4/hPURSbuFZIcmnD9MLmzAIhlQiCf0Fy6s/1MPPA==", + "requires": { + "@lerna/batch-packages": "^3.1.2", + "@lerna/command": "^3.1.3", + "@lerna/filter-options": "^3.1.2", + "@lerna/npm-run-script": "^3.0.0", + "@lerna/output": "^3.0.0", + "@lerna/run-parallel-batches": "^3.0.0", + "@lerna/validation-error": "^3.0.0", + "p-map": "^1.2.0" + } + }, + "@lerna/run-lifecycle": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@lerna/run-lifecycle/-/run-lifecycle-3.2.0.tgz", + "integrity": "sha512-kGGdHJRyeZF+VTtal1DBptg6qwIsOLg3pKtmRm1rCMNN7j4kgrA9L07ZoRar8LjQXvfuheB1LSKHd5d04pr4Tg==", + "requires": { + "@lerna/npm-conf": "^3.0.0", + "npm-lifecycle": "^2.0.0", + "npmlog": "^4.1.2" + } + }, + "@lerna/run-parallel-batches": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@lerna/run-parallel-batches/-/run-parallel-batches-3.0.0.tgz", + "integrity": "sha512-Mj1ravlXF7AkkewKd9YFq9BtVrsStNrvVLedD/b2wIVbNqcxp8lS68vehXVOzoL/VWNEDotvqCQtyDBilCodGw==", + "requires": { + "p-map": "^1.2.0", + "p-map-series": "^1.0.0" + } + }, + "@lerna/symlink-binary": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@lerna/symlink-binary/-/symlink-binary-3.1.4.tgz", + "integrity": "sha512-uQ8pYxzygahshXJAeC/vY4eSi+kFM0S2Pi15hJsJI3W7Ec6ysSYU1lXemb6kqoIqkTDJZWnfKXEq/3FLE+JYhg==", + "requires": { + "@lerna/create-symlink": "^3.0.0", + "@lerna/package": "^3.0.0", + "fs-extra": "^6.0.1", + "p-map": "^1.2.0", + "read-pkg": "^3.0.0" + } + }, + "@lerna/symlink-dependencies": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@lerna/symlink-dependencies/-/symlink-dependencies-3.1.4.tgz", + "integrity": "sha512-iModwb0Xh0N0t55C6S4K2mzLdu1zXVsBc0qubUY1x0RSul92z8NeAe1aM5JzwMzuSoMA/LRiD1lNMWMRBf4JVg==", + "requires": { + "@lerna/create-symlink": "^3.0.0", + "@lerna/resolve-symlink": "^3.0.0", + "@lerna/symlink-binary": "^3.1.4", + "fs-extra": "^6.0.1", + "p-finally": "^1.0.0", + "p-map": "^1.2.0", + "p-map-series": "^1.0.0" + } + }, + "@lerna/validation-error": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@lerna/validation-error/-/validation-error-3.0.0.tgz", + "integrity": "sha512-5wjkd2PszV0kWvH+EOKZJWlHEqCTTKrWsvfHnHhcUaKBe/NagPZFWs+0xlsDPZ3DJt5FNfbAPAnEBQ05zLirFA==", + "requires": { + "npmlog": "^4.1.2" + } + }, + "@lerna/version": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@lerna/version/-/version-3.2.0.tgz", + "integrity": "sha512-1AVDMpeecSMiG1cacduE+f2KO0mC7F/9MvWsHtp+rjkpficMcsVme7IMtycuvu/F07wY4Xr9ioFKYTwTcybbIA==", + "requires": { + "@lerna/batch-packages": "^3.1.2", + "@lerna/check-working-tree": "^3.1.0", + "@lerna/child-process": "^3.0.0", + "@lerna/collect-updates": "^3.1.0", + "@lerna/command": "^3.1.3", + "@lerna/conventional-commits": "^3.0.2", + "@lerna/output": "^3.0.0", + "@lerna/prompt": "^3.0.0", + "@lerna/run-lifecycle": "^3.2.0", + "@lerna/validation-error": "^3.0.0", + "chalk": "^2.3.1", + "dedent": "^0.7.0", + "minimatch": "^3.0.4", + "npmlog": "^4.1.2", + "p-map": "^1.2.0", + "p-pipe": "^1.2.0", + "p-reduce": "^1.0.0", + "p-waterfall": "^1.0.0", + "semver": "^5.5.0", + "slash": "^1.0.0", + "temp-write": "^3.4.0" + } + }, + "@lerna/write-log-file": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@lerna/write-log-file/-/write-log-file-3.0.0.tgz", + "integrity": "sha512-SfbPp29lMeEVOb/M16lJwn4nnx5y+TwCdd7Uom9umd7KcZP0NOvpnX0PHehdonl7TyHZ1Xx2maklYuCLbQrd/A==", + "requires": { + "npmlog": "^4.1.2", + "write-file-atomic": "^2.3.0" + } + }, + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" + } + }, + "@nodelib/fs.stat": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.1.tgz", + "integrity": "sha512-KU/VDjC5RwtDUZiz3d+DHXJF2lp5hB9dn552TXIyptj8SH1vXmR40mG0JgGq03IlYsOgGfcv8xrLpSQ0YUMQdA==" + }, + "JSONStream": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.4.tgz", + "integrity": "sha512-Y7vfi3I5oMOYIr+WxV8NZxDSwcbNgzdKYsTNInmycOq9bUYwGg9ryu57Wg5NLmCjqdFPNUmpMBo3kSJN9tCbXg==", + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "agent-base": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", + "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "agentkeepalive": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.1.tgz", + "integrity": "sha512-Cte/sTY9/XcygXjJ0q58v//SnEQ7ViWExKyJpLJlLqomDbQyMLh6Is4KuWJ/wmxzhiwkGRple7Gqv1zf6Syz5w==", + "requires": { + "humanize-ms": "^1.2.1" + } + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, + "ansi-escapes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==" + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "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==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=" + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" + }, + "array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=" + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "requires": { + "inherits": "~2.0.0" + } + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "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==" + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" + }, + "builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=" + }, + "byline": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", + "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=" + }, + "byte-size": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/byte-size/-/byte-size-4.0.3.tgz", + "integrity": "sha512-JGC3EV2bCzJH/ENSh3afyJrH4vwxbHTuO5ljLoI5+2iJOcEpMgP8T782jH9b5qGxf2mSUIp1lfGnfKNrRHpvVg==" + }, + "cacache": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.2.0.tgz", + "integrity": "sha512-IFWl6lfK6wSeYCHUXh+N1lY72UDrpyrYQJNIVQf48paDuWbv5RbAtJYf/4gUQFObTCHZwdZ5sI8Iw7nqwP6nlQ==", + "requires": { + "bluebird": "^3.5.1", + "chownr": "^1.0.1", + "figgy-pudding": "^3.1.0", + "glob": "^7.1.2", + "graceful-fs": "^4.1.11", + "lru-cache": "^4.1.3", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^6.0.0", + "unique-filename": "^1.1.0", + "y18n": "^4.0.0" + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "call-me-maybe": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=" + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" + }, + "camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "requires": { + "camelcase": "^4.1.0", + "map-obj": "^2.0.0", + "quick-lru": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + } + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" + }, + "chownr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", + "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=" + }, + "ci-info": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.4.0.tgz", + "integrity": "sha512-Oqmw2pVfCl8sCL+1QgMywPfdxPJPkC51y4usw0iiE2S9qnEOAqXy8bwl1CpMpnoU39g4iKJTz6QZj+28FvOnjQ==" + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" + } + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" + }, + "cmd-shim": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-2.0.2.tgz", + "integrity": "sha1-b8vamUg6j9FdfTChlspp1oii79s=", + "requires": { + "graceful-fs": "^4.1.2", + "mkdirp": "~0.5.0" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.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==", + "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=" + }, + "columnify": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.5.4.tgz", + "integrity": "sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs=", + "requires": { + "strip-ansi": "^3.0.0", + "wcwidth": "^1.0.0" + } + }, + "combined-stream": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "compare-func": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.2.tgz", + "integrity": "sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg=", + "requires": { + "array-ify": "^1.0.0", + "dot-prop": "^3.0.0" + }, + "dependencies": { + "dot-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz", + "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=", + "requires": { + "is-obj": "^1.0.0" + } + } + } + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "config-chain": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.11.tgz", + "integrity": "sha1-q6CXR9++TD5w52am5BWG4YWfxvI=", + "requires": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" + }, + "conventional-changelog-angular": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-1.6.6.tgz", + "integrity": "sha512-suQnFSqCxRwyBxY68pYTsFkG0taIdinHLNEAX5ivtw8bCRnIgnpvcHmlR/yjUyZIrNPYAoXlY1WiEKWgSE4BNg==", + "requires": { + "compare-func": "^1.3.1", + "q": "^1.5.1" + } + }, + "conventional-changelog-core": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-2.0.11.tgz", + "integrity": "sha512-HvTE6RlqeEZ/NFPtQeFLsIDOLrGP3bXYr7lFLMhCVsbduF1MXIe8OODkwMFyo1i9ku9NWBwVnVn0jDmIFXjDRg==", + "requires": { + "conventional-changelog-writer": "^3.0.9", + "conventional-commits-parser": "^2.1.7", + "dateformat": "^3.0.0", + "get-pkg-repo": "^1.0.0", + "git-raw-commits": "^1.3.6", + "git-remote-origin-url": "^2.0.0", + "git-semver-tags": "^1.3.6", + "lodash": "^4.2.1", + "normalize-package-data": "^2.3.5", + "q": "^1.5.1", + "read-pkg": "^1.1.0", + "read-pkg-up": "^1.0.1", + "through2": "^2.0.0" + }, + "dependencies": { + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "^0.2.0" + } + } + } + }, + "conventional-changelog-preset-loader": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-1.1.8.tgz", + "integrity": "sha512-MkksM4G4YdrMlT2MbTsV2F6LXu/hZR0Tc/yenRrDIKRwBl/SP7ER4ZDlglqJsCzLJi4UonBc52Bkm5hzrOVCcw==" + }, + "conventional-changelog-writer": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-3.0.9.tgz", + "integrity": "sha512-n9KbsxlJxRQsUnK6wIBRnARacvNnN4C/nxnxCkH+B/R1JS2Fa+DiP1dU4I59mEDEjgnFaN2+9wr1P1s7GYB5/Q==", + "requires": { + "compare-func": "^1.3.1", + "conventional-commits-filter": "^1.1.6", + "dateformat": "^3.0.0", + "handlebars": "^4.0.2", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.2.1", + "meow": "^4.0.0", + "semver": "^5.5.0", + "split": "^1.0.0", + "through2": "^2.0.0" + } + }, + "conventional-commits-filter": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-1.1.6.tgz", + "integrity": "sha512-KcDgtCRKJCQhyk6VLT7zR+ZOyCnerfemE/CsR3iQpzRRFbLEs0Y6rwk3mpDvtOh04X223z+1xyJ582Stfct/0Q==", + "requires": { + "is-subset": "^0.1.1", + "modify-values": "^1.0.0" + } + }, + "conventional-commits-parser": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-2.1.7.tgz", + "integrity": "sha512-BoMaddIEJ6B4QVMSDu9IkVImlGOSGA1I2BQyOZHeLQ6qVOJLcLKn97+fL6dGbzWEiqDzfH4OkcveULmeq2MHFQ==", + "requires": { + "JSONStream": "^1.0.4", + "is-text-path": "^1.0.0", + "lodash": "^4.2.1", + "meow": "^4.0.0", + "split2": "^2.0.0", + "through2": "^2.0.0", + "trim-off-newlines": "^1.0.0" + } + }, + "conventional-recommended-bump": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-2.0.9.tgz", + "integrity": "sha512-YE6/o+648qkX3fTNvfBsvPW3tSnbZ6ec3gF0aBahCPgyoVHU2Mw0nUAZ1h1UN65GazpORngrgRC8QCltNYHPpQ==", + "requires": { + "concat-stream": "^1.6.0", + "conventional-changelog-preset-loader": "^1.1.8", + "conventional-commits-filter": "^1.1.6", + "conventional-commits-parser": "^2.1.7", + "git-raw-commits": "^1.3.6", + "git-semver-tags": "^1.3.6", + "meow": "^4.0.0", + "q": "^1.5.1" + } + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, + "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=" + }, + "cosmiconfig": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.0.6.tgz", + "integrity": "sha512-6DWfizHriCrFWURP1/qyhsiFvYdlJzbCzmtFWh744+KyWsJo5+kPzUZZaMRSSItoYc0pxFX7gEO7ZC1/gN/7AQ==", + "requires": { + "is-directory": "^0.3.1", + "js-yaml": "^3.9.0", + "parse-json": "^4.0.0" + } + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "requires": { + "array-find-index": "^1.0.1" + } + }, + "cyclist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=" + }, + "dargs": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-4.1.0.tgz", + "integrity": "sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "debuglog": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", + "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=" + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" + } + } + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=" + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "requires": { + "clone": "^1.0.2" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "detect-indent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", + "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=" + }, + "dezalgo": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", + "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "dir-glob": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", + "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "requires": { + "arrify": "^1.0.1", + "path-type": "^3.0.0" + } + }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "requires": { + "is-obj": "^1.0.0" + } + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" + }, + "duplexify": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", + "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "requires": { + "iconv-lite": "~0.4.13" + } + }, + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "requires": { + "once": "^1.4.0" + } + }, + "err-code": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", + "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=" + }, + "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==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es6-promise": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", + "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==" + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "requires": { + "es6-promise": "^4.0.3" + } + }, + "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=" + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "execa": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", + "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", + "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", + "requires": { + "chardet": "^0.4.0", + "iconv-lite": "^0.4.17", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" + }, + "fast-glob": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.2.tgz", + "integrity": "sha512-TR6zxCKftDQnUAPvkrCWdBgDq/gbqx8A3ApnBrR5rMvpp6+KMJI0Igw7fkWPgeVK0uhRXTXdvO3O+YP0CaUX2g==", + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.0.1", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.1", + "micromatch": "^3.1.10" + }, + "dependencies": { + "is-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", + "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "requires": { + "is-extglob": "^2.1.1" + } + } + } + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "figgy-pudding": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==" + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "^2.0.0" + } + }, + "flush-write-stream": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", + "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.4" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "1.0.6", + "mime-types": "^2.1.12" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "requires": { + "map-cache": "^0.2.2" + } + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-extra": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz", + "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-minipass": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", + "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", + "requires": { + "minipass": "^2.2.1" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fstream": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "genfun": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/genfun/-/genfun-4.0.1.tgz", + "integrity": "sha1-7RAEHy5KfxsKOEZtF6XD4n3x38E=" + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, + "get-pkg-repo": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz", + "integrity": "sha1-xztInAbYDMVTbCyFP54FIyBWly0=", + "requires": { + "hosted-git-info": "^2.1.4", + "meow": "^3.3.0", + "normalize-package-data": "^2.3.0", + "parse-github-repo-url": "^1.3.0", + "through2": "^2.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + } + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "requires": { + "repeating": "^2.0.0" + } + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "requires": { + "get-stdin": "^4.0.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" + } + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=" + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "git-raw-commits": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-1.3.6.tgz", + "integrity": "sha512-svsK26tQ8vEKnMshTDatSIQSMDdz8CxIIqKsvPqbtV23Etmw6VNaFAitu8zwZ0VrOne7FztwPyRLxK7/DIUTQg==", + "requires": { + "dargs": "^4.0.1", + "lodash.template": "^4.0.2", + "meow": "^4.0.0", + "split2": "^2.0.0", + "through2": "^2.0.0" + } + }, + "git-remote-origin-url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", + "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=", + "requires": { + "gitconfiglocal": "^1.0.0", + "pify": "^2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } + }, + "git-semver-tags": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-1.3.6.tgz", + "integrity": "sha512-2jHlJnln4D/ECk9FxGEBh3k44wgYdWjWDtMmJPaecjoRmxKo3Y1Lh8GMYuOPu04CHw86NTAODchYjC5pnpMQig==", + "requires": { + "meow": "^4.0.0", + "semver": "^5.5.0" + } + }, + "gitconfiglocal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", + "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=", + "requires": { + "ini": "^1.3.2" + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "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": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=" + }, + "globby": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.1.tgz", + "integrity": "sha512-oMrYrJERnKBLXNLVTqhm3vPEdJ/b2ZE28xN4YARiix1NOIOBPEpOUnm844K1iu/BkphCaf2WNFwMszv8Soi1pw==", + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "fast-glob": "^2.0.2", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "handlebars": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", + "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", + "requires": { + "async": "^1.4.0", + "optimist": "^0.6.1", + "source-map": "^0.4.4", + "uglify-js": "^2.6" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", + "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", + "requires": { + "ajv": "^5.3.0", + "har-schema": "^2.0.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hosted-git-info": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", + "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==" + }, + "http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==" + }, + "http-proxy-agent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "requires": { + "agent-base": "4", + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-proxy-agent": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", + "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", + "requires": { + "agent-base": "^4.1.0", + "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "requires": { + "ms": "^2.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==" + }, + "ignore-walk": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", + "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", + "requires": { + "minimatch": "^3.0.4" + } + }, + "import-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", + "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "requires": { + "pkg-dir": "^2.0.0", + "resolve-cwd": "^2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, + "init-package-json": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/init-package-json/-/init-package-json-1.10.3.tgz", + "integrity": "sha512-zKSiXKhQveNteyhcj1CoOP8tqp1QuxPIPBl8Bid99DGLFqA1p87M6lNgfjJHSBoWJJlidGOv5rWjyYKEB3g2Jw==", + "requires": { + "glob": "^7.1.1", + "npm-package-arg": "^4.0.0 || ^5.0.0 || ^6.0.0", + "promzard": "^0.3.0", + "read": "~1.0.1", + "read-package-json": "1 || 2", + "semver": "2.x || 3.x || 4 || 5", + "validate-npm-package-license": "^3.0.1", + "validate-npm-package-name": "^3.0.0" + } + }, + "inquirer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", + "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", + "requires": { + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.0", + "cli-cursor": "^2.1.0", + "cli-width": "^2.0.0", + "external-editor": "^2.1.0", + "figures": "^2.0.0", + "lodash": "^4.3.0", + "mute-stream": "0.0.7", + "run-async": "^2.2.0", + "rxjs": "^5.5.2", + "string-width": "^2.1.0", + "strip-ansi": "^4.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "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=" + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "requires": { + "builtin-modules": "^1.0.0" + } + }, + "is-ci": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.0.tgz", + "integrity": "sha512-plgvKjQtalH2P3Gytb7L61Lmz95g2DlpzFiQyRSFew8WoJKxtKRzrZMeyRN2supblm3Psc8OQGy7Xjb6XG11jw==", + "requires": { + "ci-info": "^1.3.0" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-subset": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", + "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=" + }, + "is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", + "requires": { + "text-extensions": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, + "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==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "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==" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "^1.0.0" + } + }, + "lerna": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/lerna/-/lerna-3.2.1.tgz", + "integrity": "sha512-nHa/TgRLOHlBm+NfeW62ffVO7hY7wJxnu6IJmZA3lrSmRlqrXZk2BPvnq0FSaCinVYjW0w0XeSNZdRKR//HAwQ==", + "requires": { + "@lerna/add": "^3.2.0", + "@lerna/bootstrap": "^3.2.0", + "@lerna/changed": "^3.2.0", + "@lerna/clean": "^3.1.3", + "@lerna/cli": "^3.2.0", + "@lerna/create": "^3.1.3", + "@lerna/diff": "^3.1.3", + "@lerna/exec": "^3.1.3", + "@lerna/import": "^3.1.3", + "@lerna/init": "^3.1.3", + "@lerna/link": "^3.1.4", + "@lerna/list": "^3.1.3", + "@lerna/publish": "^3.2.1", + "@lerna/run": "^3.1.3", + "@lerna/version": "^3.2.0", + "import-local": "^1.0.0", + "npmlog": "^4.1.2" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.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=", + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=" + }, + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=" + }, + "lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "lodash.templatesettings": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz", + "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=", + "requires": { + "lodash._reinterpolate": "~3.0.0" + } + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lru-cache": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "requires": { + "pify": "^3.0.0" + } + }, + "make-fetch-happen": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-4.0.1.tgz", + "integrity": "sha512-7R5ivfy9ilRJ1EMKIOziwrns9fGeAD4bAha8EB7BIiBBLHm2KeTUGCrICFt2rbHfzheTLynv50GnNTK1zDTrcQ==", + "requires": { + "agentkeepalive": "^3.4.1", + "cacache": "^11.0.1", + "http-cache-semantics": "^3.8.1", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.1", + "lru-cache": "^4.1.2", + "mississippi": "^3.0.0", + "node-fetch-npm": "^2.0.2", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^4.0.0", + "ssri": "^6.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=" + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "^1.0.0" + } + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "meow": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", + "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", + "requires": { + "camelcase-keys": "^4.0.0", + "decamelize-keys": "^1.0.0", + "loud-rejection": "^1.0.0", + "minimist": "^1.1.3", + "minimist-options": "^3.0.1", + "normalize-package-data": "^2.3.4", + "read-pkg-up": "^3.0.0", + "redent": "^2.0.0", + "trim-newlines": "^2.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + } + } + } + }, + "merge2": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.2.tgz", + "integrity": "sha512-bgM8twH86rWni21thii6WCMQMRMmwqqdW3sGWi9IipnVAszdLXRjwDwAnyrVXo6DuP3AjRMMttZKUB48QWIFGg==" + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "mime-db": { + "version": "1.36.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", + "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==" + }, + "mime-types": { + "version": "2.1.20", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", + "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", + "requires": { + "mime-db": "~1.36.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.1.0.tgz", + "integrity": "sha1-md9lelJXTCHJBXSX33QnkLK0wN4=" + }, + "minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0" + } + }, + "minipass": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.4.tgz", + "integrity": "sha512-mlouk1OHlaUE8Odt1drMtG1bAJA4ZA6B/ehysgV0LUIrDHdKgo1KorZq3pK0b/7Z7LJIQ12MNM6aC+Tn6lUZ5w==", + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + }, + "dependencies": { + "yallist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", + "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=" + } + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + } + } + }, + "modify-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", + "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==" + }, + "moment": { + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz", + "integrity": "sha1-PCV/mDn8DpP/UxSWMiOeuQeD/2Y=" + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "multimatch": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", + "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", + "requires": { + "array-differ": "^1.0.0", + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "minimatch": "^3.0.0" + } + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "node-fetch-npm": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz", + "integrity": "sha512-nJIxm1QmAj4v3nfCvEeCrYSoVwXyxLnaPBK5W1W5DGEJwjlKuC2VEUycGw5oxk+4zZahRrB84PUJJgEmhFTDFw==", + "requires": { + "encoding": "^0.1.11", + "json-parse-better-errors": "^1.0.0", + "safe-buffer": "^5.1.1" + } + }, + "node-gyp": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", + "requires": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" + } + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "requires": { + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "npm-bundled": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.5.tgz", + "integrity": "sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g==" + }, + "npm-lifecycle": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/npm-lifecycle/-/npm-lifecycle-2.1.0.tgz", + "integrity": "sha512-QbBfLlGBKsktwBZLj6AviHC6Q9Y3R/AY4a2PYSIRhSKSS0/CxRyD/PfxEX6tPeOCXQgMSNdwGeECacstgptc+g==", + "requires": { + "byline": "^5.0.0", + "graceful-fs": "^4.1.11", + "node-gyp": "^3.8.0", + "resolve-from": "^4.0.0", + "slide": "^1.1.6", + "uid-number": "0.0.6", + "umask": "^1.1.0", + "which": "^1.3.1" + } + }, + "npm-package-arg": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.0.tgz", + "integrity": "sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA==", + "requires": { + "hosted-git-info": "^2.6.0", + "osenv": "^0.1.5", + "semver": "^5.5.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-packlist": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.1.11.tgz", + "integrity": "sha512-CxKlZ24urLkJk+9kCm48RTQ7L4hsmgSVzEk0TLGPzzyuFxD7VNgy5Sl24tOLMzQv773a/NeJ1ce1DKeacqffEA==", + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npm-pick-manifest": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-2.1.0.tgz", + "integrity": "sha512-q9zLP8cTr8xKPmMZN3naxp1k/NxVFsjxN6uWuO1tiw9gxg7wZWQ/b5UTfzD0ANw2q1lQxdLKTeCCksq+bPSgbQ==", + "requires": { + "npm-package-arg": "^6.0.0", + "semver": "^5.4.1" + } + }, + "npm-registry-fetch": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-3.8.0.tgz", + "integrity": "sha512-hrw8UMD+Nob3Kl3h8Z/YjmKamb1gf7D1ZZch2otrIXM3uFLB5vjEY6DhMlq80z/zZet6eETLbOXcuQudCB3Zpw==", + "requires": { + "JSONStream": "^1.3.4", + "bluebird": "^3.5.1", + "figgy-pudding": "^3.4.1", + "lru-cache": "^4.1.3", + "make-fetch-happen": "^4.0.1", + "npm-package-arg": "^6.1.0" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "^2.0.0" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "requires": { + "isobject": "^3.0.0" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" + } + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "requires": { + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" + }, + "dependencies": { + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "requires": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "requires": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + } + } + }, + "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=" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "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=", + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==" + }, + "p-map-series": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-map-series/-/p-map-series-1.0.0.tgz", + "integrity": "sha1-v5j+V1cFZYqeE1G++4WuTB8Hvco=", + "requires": { + "p-reduce": "^1.0.0" + } + }, + "p-pipe": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-pipe/-/p-pipe-1.2.0.tgz", + "integrity": "sha1-SxoROZoRUgpneQ7loMHViB1r7+k=" + }, + "p-reduce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", + "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=" + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" + }, + "p-waterfall": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-waterfall/-/p-waterfall-1.0.0.tgz", + "integrity": "sha1-ftlLPOszMngjU69qrhGqn8I1uwA=", + "requires": { + "p-reduce": "^1.0.0" + } + }, + "pacote": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.1.0.tgz", + "integrity": "sha512-AFXaSWhOtQf3jHqEvg+ZYH/dfT8TKq6TKspJ4qEFwVVuh5aGvMIk6SNF8vqfzz+cBceDIs9drOcpBbrPai7i+g==", + "requires": { + "bluebird": "^3.5.1", + "cacache": "^11.0.2", + "figgy-pudding": "^3.2.1", + "get-stream": "^3.0.0", + "glob": "^7.1.2", + "lru-cache": "^4.1.3", + "make-fetch-happen": "^4.0.1", + "minimatch": "^3.0.4", + "minipass": "^2.3.3", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "normalize-package-data": "^2.4.0", + "npm-package-arg": "^6.1.0", + "npm-packlist": "^1.1.10", + "npm-pick-manifest": "^2.1.0", + "npm-registry-fetch": "^3.0.0", + "osenv": "^0.1.5", + "promise-inflight": "^1.0.1", + "promise-retry": "^1.1.1", + "protoduck": "^5.0.0", + "rimraf": "^2.6.2", + "safe-buffer": "^5.1.2", + "semver": "^5.5.0", + "ssri": "^6.0.0", + "tar": "^4.4.3", + "unique-filename": "^1.1.0", + "which": "^1.3.0" + }, + "dependencies": { + "chownr": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.2.tgz", + "integrity": "sha512-GkfeAQh+QNy3wquu9oIZr6SS5x7wGdSgNQvD10X3r+AZr1Oys22HW8kAmDMvNg2+Dm0TeGaEuO8gFwdBXxwO8A==" + }, + "minizlib": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", + "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", + "requires": { + "minipass": "^2.2.1" + } + }, + "tar": { + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.10.tgz", + "integrity": "sha512-g2SVs5QIxvo6OLp0GudTqEf05maawKUxXru104iaayWA09551tFCTI8f1Asb4lPfkBr91k07iL4c11XO3/b0tA==", + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.5", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + }, + "dependencies": { + "minipass": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", + "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" + } + } + }, + "yallist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", + "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=" + } + } + }, + "parallel-transform": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", + "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "requires": { + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "parse-github-repo-url": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz", + "integrity": "sha1-nn2LslKmy2ukJZUGC3v23z28H1A=" + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "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=" + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "path-type": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "requires": { + "pify": "^3.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": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "requires": { + "find-up": "^2.1.0" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + }, + "promise-retry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", + "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", + "requires": { + "err-code": "^1.0.0", + "retry": "^0.10.0" + } + }, + "promzard": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/promzard/-/promzard-0.3.0.tgz", + "integrity": "sha1-JqXW7ox97kyxIggwWs+5O6OCqe4=", + "requires": { + "read": "1" + } + }, + "proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=" + }, + "protoduck": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.0.tgz", + "integrity": "sha512-agsGWD8/RZrS4ga6v82Fxb0RHIS2RZnbsSue6A9/MBRhB/jcqOANAMNrqM9900b8duj+Gx+T/JMy5IowDoO/hQ==", + "requires": { + "genfun": "^4.0.1" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "psl": { + "version": "1.1.29", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", + "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==" + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=" + }, + "read": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", + "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", + "requires": { + "mute-stream": "~0.0.4" + } + }, + "read-cmd-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-1.0.1.tgz", + "integrity": "sha1-LV0Vd4ajfAVdIgd8MsU/gynpHHs=", + "requires": { + "graceful-fs": "^4.1.2" + } + }, + "read-package-json": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.0.13.tgz", + "integrity": "sha512-/1dZ7TRZvGrYqE0UAfN6qQb5GYBsNcqS1C0tNK601CFOJmtHI7NIGXwetEPU/OtoFHZL3hDxm4rolFFVE9Bnmg==", + "requires": { + "glob": "^7.1.1", + "graceful-fs": "^4.1.2", + "json-parse-better-errors": "^1.0.1", + "normalize-package-data": "^2.0.0", + "slash": "^1.0.0" + } + }, + "read-package-tree": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.2.1.tgz", + "integrity": "sha512-2CNoRoh95LxY47LvqrehIAfUVda2JbuFE/HaGYs42bNrGG+ojbw1h3zOcPcQ+1GQ3+rkzNndZn85u1XyZ3UsIA==", + "requires": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "once": "^1.3.0", + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "^1.2.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "^0.2.0" + } + } + } + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "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" + } + }, + "readdir-scoped-modules": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz", + "integrity": "sha1-n6+jfShr5dksuuve4DDcm19AZ0c=", + "requires": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "requires": { + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + } + } + }, + "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==" + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + }, + "retry": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", + "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=" + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "requires": { + "align-text": "^0.1.1" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "requires": { + "glob": "^7.0.5" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "requires": { + "is-promise": "^2.1.0" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "requires": { + "aproba": "^1.1.1" + } + }, + "rxjs": { + "version": "5.5.11", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.11.tgz", + "integrity": "sha512-3bjO7UwWfA2CV7lmwYMBzj4fQ6Cq+ftHc2MvUe+WMS7wcdJ1LosDWmdjPQanYp2dBRj572p7PeU81JUxHKOcBA==", + "requires": { + "symbol-observable": "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==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "semver": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", + "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==" + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "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=" + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" + }, + "slide": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=" + }, + "smart-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.0.1.tgz", + "integrity": "sha512-RFqinRVJVcCAL9Uh1oVqE6FZkqsyLiVOYEZ20TqIOjuX7iFVJ+zsbs4RIghnw/pTs7mZvt8ZHhvm1ZUrR4fykg==" + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "socks": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.2.1.tgz", + "integrity": "sha512-0GabKw7n9mI46vcNrVfs0o6XzWzjVa3h6GaSo2UPxtWAROXUWavfJWh1M4PR5tnE0dcnQXZIDFP4yrAysLze/w==", + "requires": { + "ip": "^1.1.5", + "smart-buffer": "^4.0.1" + } + }, + "socks-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.1.tgz", + "integrity": "sha512-Kezx6/VBguXOsEe5oU3lXYyKMi4+gva72TwJ7pQY5JfqUx2nMk7NXA6z/mpNqIlfQjWYVfeuNvQjexiTaTn6Nw==", + "requires": { + "agent-base": "~4.2.0", + "socks": "~2.2.0" + } + }, + "sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "requires": { + "atob": "^2.1.1", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" + }, + "spdx-correct": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", + "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==" + }, + "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==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", + "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==" + }, + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "requires": { + "through": "2" + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "split2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", + "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", + "requires": { + "through2": "^2.0.2" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "sshpk": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", + "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "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==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=" + }, + "strong-log-transformer": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-1.0.6.tgz", + "integrity": "sha1-9/uTdYpppXEUAYEnfuoMLrEwH6M=", + "requires": { + "byline": "^5.0.0", + "duplexer": "^0.1.1", + "minimist": "^0.1.0", + "moment": "^2.6.0", + "through": "^2.3.4" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=" + }, + "tar": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", + "requires": { + "block-stream": "*", + "fstream": "^1.0.12", + "inherits": "2" + }, + "dependencies": { + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + } + } + }, + "temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=" + }, + "temp-write": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/temp-write/-/temp-write-3.4.0.tgz", + "integrity": "sha1-jP9jD7fp2gXwR8dM5M5NaFRX1JI=", + "requires": { + "graceful-fs": "^4.1.2", + "is-stream": "^1.1.0", + "make-dir": "^1.0.0", + "pify": "^3.0.0", + "temp-dir": "^1.0.0", + "uuid": "^3.0.1" + } + }, + "text-extensions": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.7.0.tgz", + "integrity": "sha512-AKXZeDq230UaSzaO5s3qQUZOaC7iKbzq0jOFL614R7d9R593HLqAOL0cYoqLdkNrjBSOdmoQI06yigq1TSBXAg==" + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "requires": { + "readable-stream": "^2.1.5", + "xtend": "~4.0.1" + } + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + } + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "requires": { + "punycode": "^2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + } + } + }, + "trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=" + }, + "trim-off-newlines": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz", + "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=" + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "typescript": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.0.3.tgz", + "integrity": "sha512-tEu6DGxGgRJPb/mVPIZ48e69xCn2yRmCgYmDugAVwmJ6o+0u1RI18eO7E7WBTLYLaEVVOhwQmcdhQHweux/WPg==" + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "requires": { + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=" + }, + "uid-number": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", + "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=" + }, + "umask": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/umask/-/umask-1.1.0.tgz", + "integrity": "sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0=" + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.1", + "to-object-path": "^0.3.0" + } + } + } + }, + "unique-filename": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz", + "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.0.tgz", + "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + } + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + }, + "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==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "requires": { + "builtins": "^1.0.3" + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "requires": { + "defaults": "^1.0.3" + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + }, + "whatwg-url": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "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=" + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write-file-atomic": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "write-json-file": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-2.3.0.tgz", + "integrity": "sha1-K2TIozAE1UuGmMdtWFp3zrYdoy8=", + "requires": { + "detect-indent": "^5.0.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "pify": "^3.0.0", + "sort-keys": "^2.0.0", + "write-file-atomic": "^2.0.0" + } + }, + "write-pkg": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/write-pkg/-/write-pkg-3.2.0.tgz", + "integrity": "sha512-tX2ifZ0YqEFOF1wjRW2Pk93NLsj02+n1UP5RvO6rCs0K6R2g1padvf006cY74PQJKMGS2r42NK7FD0dG6Y6paw==", + "requires": { + "sort-keys": "^2.0.0", + "write-json-file": "^2.2.0" + } + }, + "xregexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz", + "integrity": "sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==" + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + }, + "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==" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + }, + "yargs-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "requires": { + "camelcase": "^4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + } + } + } + } +} diff --git a/packages/optimizely-sdk/__mocks__/@react-native-async-storage/async-storage.ts b/packages/optimizely-sdk/__mocks__/@react-native-async-storage/async-storage.ts new file mode 100644 index 000000000..6e1109103 --- /dev/null +++ b/packages/optimizely-sdk/__mocks__/@react-native-async-storage/async-storage.ts @@ -0,0 +1,51 @@ +/** + * Copyright 2020, Optimizely + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +let items: {[key: string]: string} = {} + +export default class AsyncStorage { + + static getItem(key: string, callback?: (error?: Error, result?: string) => void): Promise { + return new Promise(resolve => { + setTimeout(() => resolve(items[key] || null), 1) + }) + } + + static setItem(key: string, value: string, callback?: (error?: Error) => void): Promise { + return new Promise((resolve) => { + setTimeout(() => { + items[key] = value + resolve() + }, 1) + }) + } + + static removeItem(key: string, callback?: (error?: Error, result?: string) => void): Promise { + return new Promise(resolve => { + setTimeout(() => { + items[key] && delete items[key] + resolve() + }, 1) + }) + } + + static dumpItems(): {[key: string]: string} { + return items + } + + static clearStore(): void { + items = {} + } +} diff --git a/packages/optimizely-sdk/__mocks__/@react-native-community/netinfo.ts b/packages/optimizely-sdk/__mocks__/@react-native-community/netinfo.ts new file mode 100644 index 000000000..4a007aab7 --- /dev/null +++ b/packages/optimizely-sdk/__mocks__/@react-native-community/netinfo.ts @@ -0,0 +1,24 @@ +/** + * Copyright 2020, Optimizely + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +let localCallback: any + +export function addEventListener(callback: any) { + localCallback = callback +} + +export function triggerInternetState(isInternetReachable: boolean) { + localCallback({ isInternetReachable }) +} diff --git a/packages/optimizely-sdk/jest.config.js b/packages/optimizely-sdk/jest.config.js index 1f7958d49..a82c42cc8 100644 --- a/packages/optimizely-sdk/jest.config.js +++ b/packages/optimizely-sdk/jest.config.js @@ -14,4 +14,8 @@ module.exports = { "json", "node" ], + "setupFiles": ["jest-localstorage-mock"], + "moduleNameMapper": { + "@utils/(.*)": "/lib/utils/$1" +} } diff --git a/packages/optimizely-sdk/lib/core/event_builder/build_event_v1.ts b/packages/optimizely-sdk/lib/core/event_builder/build_event_v1.ts index ab00cfd76..313a53772 100644 --- a/packages/optimizely-sdk/lib/core/event_builder/build_event_v1.ts +++ b/packages/optimizely-sdk/lib/core/event_builder/build_event_v1.ts @@ -17,7 +17,7 @@ import { EventTags, ConversionEvent, ImpressionEvent, -} from '@optimizely/js-sdk-event-processor'; +} from '../../modules/event_processor'; import { Event } from '../../shared_types'; diff --git a/packages/optimizely-sdk/lib/core/event_builder/index.ts b/packages/optimizely-sdk/lib/core/event_builder/index.ts index 49949f02f..abffe6163 100644 --- a/packages/optimizely-sdk/lib/core/event_builder/index.ts +++ b/packages/optimizely-sdk/lib/core/event_builder/index.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { LoggerFacade } from '../../modules/logging'; -import { EventV1 as CommonEventParams } from '@optimizely/js-sdk-event-processor'; +import { EventV1 as CommonEventParams } from '../../modules/event_processor'; import fns from '@utils/fns'; import { CONTROL_ATTRIBUTES, RESERVED_EVENT_KEYWORDS } from '@utils/enums'; diff --git a/packages/optimizely-sdk/lib/index.browser.ts b/packages/optimizely-sdk/lib/index.browser.ts index a4e951107..8b909be6f 100644 --- a/packages/optimizely-sdk/lib/index.browser.ts +++ b/packages/optimizely-sdk/lib/index.browser.ts @@ -21,7 +21,7 @@ import { getErrorHandler, LogLevel } from './modules/logging'; -import { LocalStoragePendingEventsDispatcher } from '@optimizely/js-sdk-event-processor'; +import { LocalStoragePendingEventsDispatcher } from '../lib/modules/event_processor'; import configValidator from './utils/config_validator'; import defaultErrorHandler from './plugins/error_handler'; import defaultEventDispatcher from './plugins/event_dispatcher/index.browser'; diff --git a/packages/optimizely-sdk/lib/modules/event_processor/eventDispatcher.ts b/packages/optimizely-sdk/lib/modules/event_processor/eventDispatcher.ts new file mode 100644 index 000000000..28f9ae07c --- /dev/null +++ b/packages/optimizely-sdk/lib/modules/event_processor/eventDispatcher.ts @@ -0,0 +1,32 @@ +/** + * Copyright 2019, Optimizely + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { EventV1 } from "./v1/buildEventV1"; + +export type EventDispatcherResponse = { + statusCode: number +} + +export type EventDispatcherCallback = (response: EventDispatcherResponse) => void + +export interface EventDispatcher { + dispatchEvent(event: EventV1Request, callback: EventDispatcherCallback): void +} + +export interface EventV1Request { + url: string + httpVerb: 'POST' | 'PUT' | 'GET' | 'PATCH' + params: EventV1, +} \ No newline at end of file diff --git a/packages/optimizely-sdk/lib/modules/event_processor/eventProcessor.ts b/packages/optimizely-sdk/lib/modules/event_processor/eventProcessor.ts new file mode 100644 index 000000000..2cf3b343c --- /dev/null +++ b/packages/optimizely-sdk/lib/modules/event_processor/eventProcessor.ts @@ -0,0 +1,82 @@ +/** + * Copyright 2019-2020, Optimizely + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +// TODO change this to use Managed from js-sdk-models when available +import { Managed } from './managed' +import { ConversionEvent, ImpressionEvent } from './events' +import { EventV1Request } from './eventDispatcher' +import { EventQueue, DefaultEventQueue, SingleEventQueue } from './eventQueue' +import { getLogger } from '../logging' +import { NOTIFICATION_TYPES } from '@utils/enums' +import { NotificationSender } from '../../core/notification_center' + +export const DEFAULT_FLUSH_INTERVAL = 30000 // Unit is ms - default flush interval is 30s +export const DEFAULT_BATCH_SIZE = 10 + +const logger = getLogger('EventProcessor') + +export type ProcessableEvent = ConversionEvent | ImpressionEvent + +export type EventDispatchResult = { result: boolean; event: ProcessableEvent } + +export interface EventProcessor extends Managed { + process(event: ProcessableEvent): void +} + +export function validateAndGetFlushInterval(flushInterval: number): number { + if (flushInterval <= 0) { + logger.warn( + `Invalid flushInterval ${flushInterval}, defaulting to ${DEFAULT_FLUSH_INTERVAL}`, + ) + flushInterval = DEFAULT_FLUSH_INTERVAL + } + return flushInterval +} + +export function validateAndGetBatchSize(batchSize: number): number { + batchSize = Math.floor(batchSize) + if (batchSize < 1) { + logger.warn( + `Invalid batchSize ${batchSize}, defaulting to ${DEFAULT_BATCH_SIZE}`, + ) + batchSize = DEFAULT_BATCH_SIZE + } + batchSize = Math.max(1, batchSize) + return batchSize +} + +export function getQueue(batchSize: number, flushInterval: number, sink: any, batchComparator: any): EventQueue { + let queue: EventQueue + if (batchSize > 1) { + queue = new DefaultEventQueue({ + flushInterval, + maxQueueSize: batchSize, + sink, + batchComparator, + }) + } else { + queue = new SingleEventQueue({ sink }) + } + return queue +} + +export function sendEventNotification(notificationSender: NotificationSender | undefined, event: EventV1Request): void { + if (notificationSender) { + notificationSender.sendNotifications( + NOTIFICATION_TYPES.LOG_EVENT, + event, + ) + } +} diff --git a/packages/optimizely-sdk/lib/modules/event_processor/eventQueue.ts b/packages/optimizely-sdk/lib/modules/event_processor/eventQueue.ts new file mode 100644 index 000000000..dbb8bb5ef --- /dev/null +++ b/packages/optimizely-sdk/lib/modules/event_processor/eventQueue.ts @@ -0,0 +1,159 @@ +/** + * Copyright 2019, Optimizely + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { getLogger } from '../logging' +// TODO change this to use Managed from js-sdk-models when available +import { Managed } from './managed' + +const logger = getLogger('EventProcessor') + +export type EventQueueSink = (buffer: K[]) => Promise + +export interface EventQueue extends Managed { + enqueue(event: K): void +} + +export interface EventQueueFactory { + createEventQueue(config: { + sink: EventQueueSink + flushInterval: number + maxQueueSize: number + }): EventQueue +} + +class Timer { + private timeout: number + private callback: () => void + private timeoutId?: number + + constructor({ timeout, callback }: { timeout: number; callback: () => void }) { + this.timeout = Math.max(timeout, 0) + this.callback = callback + } + + start(): void { + this.timeoutId = setTimeout(this.callback, this.timeout) as any + } + + refresh(): void { + this.stop() + this.start() + } + + stop(): void { + if (this.timeoutId) { + clearTimeout(this.timeoutId as any) + } + } +} + +export class SingleEventQueue implements EventQueue { + private sink: EventQueueSink + + constructor({ sink }: { sink: EventQueueSink }) { + this.sink = sink + } + + start(): void { + // no-op + } + + stop(): Promise { + // no-op + return Promise.resolve() + } + + enqueue(event: K): void { + this.sink([event]) + } +} + +export class DefaultEventQueue implements EventQueue { + // expose for testing + public timer: Timer + private buffer: K[] + private maxQueueSize: number + private sink: EventQueueSink + // batchComparator is called to determine whether two events can be included + // together in the same batch + private batchComparator: (eventA: K, eventB: K) => boolean + private started: boolean + + constructor({ + flushInterval, + maxQueueSize, + sink, + batchComparator, + }: { + flushInterval: number + maxQueueSize: number + sink: EventQueueSink + batchComparator: (eventA: K, eventB: K) => boolean + }) { + this.buffer = [] + this.maxQueueSize = Math.max(maxQueueSize, 1) + this.sink = sink + this.batchComparator = batchComparator + this.timer = new Timer({ + callback: this.flush.bind(this), + timeout: flushInterval, + }) + this.started = false + } + + start(): void { + this.started = true + // dont start the timer until the first event is enqueued + } + + stop(): Promise { + this.started = false + const result = this.sink(this.buffer) + this.buffer = [] + this.timer.stop() + return result + } + + enqueue(event: K): void { + if (!this.started) { + logger.warn('Queue is stopped, not accepting event') + return + } + + // If new event cannot be included into the current batch, flush so it can + // be in its own new batch. + const bufferedEvent: K | undefined = this.buffer[0] + if (bufferedEvent && !this.batchComparator(bufferedEvent, event)) { + this.flush() + } + + // start the timer when the first event is put in + if (this.buffer.length === 0) { + this.timer.refresh() + } + this.buffer.push(event) + + if (this.buffer.length >= this.maxQueueSize) { + this.flush() + } + } + + flush() { + this.sink(this.buffer) + this.buffer = [] + this.timer.stop() + } +} diff --git a/packages/optimizely-sdk/lib/modules/event_processor/events.ts b/packages/optimizely-sdk/lib/modules/event_processor/events.ts new file mode 100644 index 000000000..a28d86773 --- /dev/null +++ b/packages/optimizely-sdk/lib/modules/event_processor/events.ts @@ -0,0 +1,101 @@ +/** + * Copyright 2019, Optimizely + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export type VisitorAttribute = { + entityId: string + key: string + value: string | number | boolean +} + +export interface BaseEvent { + type: 'impression' | 'conversion' + timestamp: number + uuid: string + + // projectConfig stuff + context: { + accountId: string + projectId: string + clientName: string + clientVersion: string + revision: string + anonymizeIP: boolean + botFiltering?: boolean + } +} + +export interface ImpressionEvent extends BaseEvent { + type: 'impression' + + user: { + id: string + attributes: VisitorAttribute[] + } + + layer: { + id: string | null + } | null + + experiment: { + id: string | null + key: string + } | null + + variation: { + id: string | null + key: string + } | null + + ruleKey: string + flagKey: string + ruleType: string + enabled: boolean +} + +export interface ConversionEvent extends BaseEvent { + type: 'conversion' + + user: { + id: string + attributes: VisitorAttribute[] + } + + event: { + id: string | null + key: string + } + + revenue: number | null + value: number | null + tags: EventTags | undefined +} + +export type EventTags = { + [key: string]: string | number | null +} + +export function areEventContextsEqual(eventA: BaseEvent, eventB: BaseEvent): boolean { + const contextA = eventA.context + const contextB = eventB.context + return ( + contextA.accountId === contextB.accountId && + contextA.projectId === contextB.projectId && + contextA.clientName === contextB.clientName && + contextA.clientVersion === contextB.clientVersion && + contextA.revision === contextB.revision && + contextA.anonymizeIP === contextB.anonymizeIP && + contextA.botFiltering === contextB.botFiltering + ) +} diff --git a/packages/optimizely-sdk/lib/modules/event_processor/index.react_native.ts b/packages/optimizely-sdk/lib/modules/event_processor/index.react_native.ts new file mode 100644 index 000000000..2e3ac34e4 --- /dev/null +++ b/packages/optimizely-sdk/lib/modules/event_processor/index.react_native.ts @@ -0,0 +1,23 @@ +/** + * Copyright 2020, Optimizely + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export * from './events' +export * from './eventProcessor' +export * from './eventDispatcher' +export * from './managed' +export * from './pendingEventsDispatcher' +export * from './v1/buildEventV1' +export * from './v1/v1EventProcessor.react_native' diff --git a/packages/optimizely-sdk/lib/modules/event_processor/index.ts b/packages/optimizely-sdk/lib/modules/event_processor/index.ts new file mode 100644 index 000000000..d2f916615 --- /dev/null +++ b/packages/optimizely-sdk/lib/modules/event_processor/index.ts @@ -0,0 +1,23 @@ +/** + * Copyright 2019-2020, Optimizely + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export * from './events' +export * from './eventProcessor' +export * from './eventDispatcher' +export * from './managed' +export * from './pendingEventsDispatcher' +export * from './v1/buildEventV1' +export * from './v1/v1EventProcessor' diff --git a/packages/optimizely-sdk/lib/modules/event_processor/managed.ts b/packages/optimizely-sdk/lib/modules/event_processor/managed.ts new file mode 100644 index 000000000..686d2aa0f --- /dev/null +++ b/packages/optimizely-sdk/lib/modules/event_processor/managed.ts @@ -0,0 +1,20 @@ +/** + * Copyright 2019, Optimizely + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export interface Managed { + start(): void + + stop(): Promise +} diff --git a/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsDispatcher.ts b/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsDispatcher.ts new file mode 100644 index 000000000..74380c2c7 --- /dev/null +++ b/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsDispatcher.ts @@ -0,0 +1,88 @@ +/** + * Copyright 2019, Optimizely + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { getLogger } from '../logging' +import { EventDispatcher, EventV1Request, EventDispatcherCallback } from './eventDispatcher' +import { PendingEventsStore, LocalStorageStore } from './pendingEventsStore' +import { uuid, getTimestamp } from '@utils/fns' + +const logger = getLogger('EventProcessor') + +export type DispatcherEntry = { + uuid: string + timestamp: number + request: EventV1Request +} + +export class PendingEventsDispatcher implements EventDispatcher { + protected dispatcher: EventDispatcher + protected store: PendingEventsStore + + constructor({ + eventDispatcher, + store, + }: { + eventDispatcher: EventDispatcher + store: PendingEventsStore + }) { + this.dispatcher = eventDispatcher + this.store = store + } + + dispatchEvent(request: EventV1Request, callback: EventDispatcherCallback): void { + this.send( + { + uuid: uuid(), + timestamp: getTimestamp(), + request, + }, + callback, + ) + } + + sendPendingEvents(): void { + const pendingEvents = this.store.values() + + logger.debug('Sending %s pending events from previous page', pendingEvents.length) + + pendingEvents.forEach(item => { + try { + this.send(item, () => {}) + } catch (e) {} + }) + } + + protected send(entry: DispatcherEntry, callback: EventDispatcherCallback): void { + this.store.set(entry.uuid, entry) + + this.dispatcher.dispatchEvent(entry.request, response => { + this.store.remove(entry.uuid) + callback(response) + }) + } +} + +export class LocalStoragePendingEventsDispatcher extends PendingEventsDispatcher { + constructor({ eventDispatcher }: { eventDispatcher: EventDispatcher }) { + super({ + eventDispatcher, + store: new LocalStorageStore({ + // TODO make this configurable + maxValues: 100, + key: 'fs_optly_pending_events', + }), + }) + } +} diff --git a/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsStore.ts b/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsStore.ts new file mode 100644 index 000000000..14ce857eb --- /dev/null +++ b/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsStore.ts @@ -0,0 +1,117 @@ +/** + * Copyright 2019, Optimizely + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { objectValues } from '@utils/fns' +import { getLogger } from '../logging'; + +const logger = getLogger('EventProcessor') + +export interface PendingEventsStore { + get(key: string): K | null + + set(key: string, value: K): void + + remove(key: string): void + + values(): K[] + + clear(): void + + replace(newMap: { [key: string]: K }): void +} + +interface StoreEntry { + uuid: string + timestamp: number +} + +export class LocalStorageStore implements PendingEventsStore { + protected LS_KEY: string + protected maxValues: number + + constructor({ key, maxValues = 1000 }: { key: string; maxValues?: number }) { + this.LS_KEY = key + this.maxValues = maxValues + } + + get(key: string): K | null { + return this.getMap()[key] || null + } + + set(key: string, value: K): void { + const map = this.getMap() + map[key] = value + this.replace(map) + } + + remove(key: string): void { + const map = this.getMap() + delete map[key] + this.replace(map) + } + + values(): K[] { + return objectValues(this.getMap()) + } + + clear(): void { + this.replace({}) + } + + replace(map: { [key: string]: K }): void { + try { + // This is a temporary fix to support React Native which does not have localStorage. + window.localStorage && localStorage.setItem(this.LS_KEY, JSON.stringify(map)) + this.clean() + } catch (e) { + logger.error(e) + } + } + + private clean() { + const map = this.getMap() + const keys = Object.keys(map) + const toRemove = keys.length - this.maxValues + if (toRemove < 1) { + return + } + + const entries = keys.map(key => ({ + key, + value: map[key] + })) + + entries.sort((a, b) => a.value.timestamp - b.value.timestamp) + + for (var i = 0; i < toRemove; i++) { + delete map[entries[i].key] + } + + this.replace(map) + } + + private getMap(): { [key: string]: K } { + try { + // This is a temporary fix to support React Native which does not have localStorage. + const data = window.localStorage && localStorage.getItem(this.LS_KEY); + if (data) { + return (JSON.parse(data) as { [key: string]: K }) || {} + } + } catch (e) { + logger.error(e) + } + return {} + } +} diff --git a/packages/optimizely-sdk/lib/modules/event_processor/persistentKeyValueCache.ts b/packages/optimizely-sdk/lib/modules/event_processor/persistentKeyValueCache.ts new file mode 100644 index 000000000..9b3ef9fac --- /dev/null +++ b/packages/optimizely-sdk/lib/modules/event_processor/persistentKeyValueCache.ts @@ -0,0 +1,60 @@ +/** + * Copyright 2020, Optimizely + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * An Interface to implement a persistent key value cache which supports strings as keys + * and JSON Object as value. + */ +export default interface PersistentKeyValueCache { + /** + * Returns value stored against a key or null if not found. + * @param key + * @returns + * Resolves promise with + * 1. Object if value found was stored as a JSON Object. + * 2. null if the key does not exist in the cache. + * Rejects the promise in case of an error + */ + get(key: string): Promise; + + /** + * Stores Object in the persistent cache against a key + * @param key + * @param val + * @returns + * Resolves promise without a value if successful + * Rejects the promise in case of an error + */ + set(key: string, val: any): Promise; + + /** + * Checks if a key exists in the cache + * @param key + * Resolves promise with + * 1. true if the key exists + * 2. false if the key does not exist + * Rejects the promise in case of an error + */ + contains(key: string): Promise; + + /** + * Removes the key value pair from cache. + * @param key + * Resolves promise without a value if successful + * Rejects the promise in case of an error + */ + remove(key: string): Promise; +} diff --git a/packages/optimizely-sdk/lib/modules/event_processor/reactNativeAsyncStorageCache.ts b/packages/optimizely-sdk/lib/modules/event_processor/reactNativeAsyncStorageCache.ts new file mode 100644 index 000000000..54d057cb1 --- /dev/null +++ b/packages/optimizely-sdk/lib/modules/event_processor/reactNativeAsyncStorageCache.ts @@ -0,0 +1,49 @@ +/** + * Copyright 2020, Optimizely + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import AsyncStorage from '@react-native-async-storage/async-storage'; + +import PersistentKeyValueCache from './persistentKeyValueCache'; + +export default class ReactNativeAsyncStorageCache implements PersistentKeyValueCache { + get(key: string): Promise { + return AsyncStorage.getItem(key).then((val: string | null) => { + if (!val) { + return null; + } + try { + return JSON.parse(val); + } catch (ex) { + throw ex; + } + }); + } + + set(key: string, val: any): Promise { + try { + return AsyncStorage.setItem(key, JSON.stringify(val)); + } catch (ex) { + return Promise.reject(ex); + } + } + + contains(key: string): Promise { + return AsyncStorage.getItem(key).then((val: string | null) => val !== null); + } + + remove(key: string): Promise { + return AsyncStorage.removeItem(key); + } +} diff --git a/packages/optimizely-sdk/lib/modules/event_processor/reactNativeEventsStore.ts b/packages/optimizely-sdk/lib/modules/event_processor/reactNativeEventsStore.ts new file mode 100644 index 000000000..38036863e --- /dev/null +++ b/packages/optimizely-sdk/lib/modules/event_processor/reactNativeEventsStore.ts @@ -0,0 +1,81 @@ + +/** + * Copyright 2020, Optimizely + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { getLogger } from '../logging' +import { objectValues } from "@utils/fns" + +import { Synchronizer } from './synchronizer' +import ReactNativeAsyncStorageCache from './reactNativeAsyncStorageCache' + +const logger = getLogger('ReactNativeEventsStore') + +/** + * A key value store which stores objects of type T with string keys + */ +export class ReactNativeEventsStore { + private maxSize: number + private storeKey: string + private synchronizer: Synchronizer = new Synchronizer() + private cache: ReactNativeAsyncStorageCache = new ReactNativeAsyncStorageCache() + + constructor(maxSize: number, storeKey: string) { + this.maxSize = maxSize + this.storeKey = storeKey + } + + public async set(key: string, event: T): Promise { + await this.synchronizer.getLock() + const eventsMap: {[key: string]: T} = await this.cache.get(this.storeKey) || {} + if (Object.keys(eventsMap).length < this.maxSize) { + eventsMap[key] = event + await this.cache.set(this.storeKey, eventsMap) + } else { + logger.warn('React native events store is full. Store key: %s', this.storeKey) + } + this.synchronizer.releaseLock() + return key + } + + public async get(key: string): Promise { + await this.synchronizer.getLock() + const eventsMap: {[key: string]: T} = await this.cache.get(this.storeKey) || {} + this.synchronizer.releaseLock() + return eventsMap[key] + } + + public async getEventsMap(): Promise<{[key: string]: T}> { + return await this.cache.get(this.storeKey) || {} + } + + public async getEventsList(): Promise { + await this.synchronizer.getLock() + const eventsMap: {[key: string]: T} = await this.cache.get(this.storeKey) || {} + this.synchronizer.releaseLock() + return objectValues(eventsMap) + } + + public async remove(key: string): Promise { + await this.synchronizer.getLock() + const eventsMap: {[key: string]: T} = await this.cache.get(this.storeKey) || {} + eventsMap[key] && delete eventsMap[key] + await this.cache.set(this.storeKey, eventsMap) + this.synchronizer.releaseLock() + } + + public async clear(): Promise { + await this.cache.remove(this.storeKey) + } +} diff --git a/packages/optimizely-sdk/lib/modules/event_processor/requestTracker.ts b/packages/optimizely-sdk/lib/modules/event_processor/requestTracker.ts new file mode 100644 index 000000000..e3f774690 --- /dev/null +++ b/packages/optimizely-sdk/lib/modules/event_processor/requestTracker.ts @@ -0,0 +1,60 @@ +/** + * Copyright 2020, Optimizely + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * RequestTracker keeps track of in-flight requests for EventProcessor using + * an internal counter. It exposes methods for adding a new request to be + * tracked, and getting a Promise representing the completion of currently + * tracked requests. + */ +class RequestTracker { + private reqsInFlightCount: number = 0 + private reqsCompleteResolvers: Array<() => void> = [] + + /** + * Track the argument request (represented by a Promise). reqPromise will feed + * into the state of Promises returned by onRequestsComplete. + * @param {Promise} reqPromise + */ + public trackRequest(reqPromise: Promise): void { + this.reqsInFlightCount++ + const onReqComplete = () => { + this.reqsInFlightCount-- + if (this.reqsInFlightCount === 0) { + this.reqsCompleteResolvers.forEach(resolver => resolver()) + this.reqsCompleteResolvers = [] + } + } + reqPromise.then(onReqComplete, onReqComplete) + } + + /** + * Return a Promise that fulfills after all currently-tracked request promises + * are resolved. + * @return {Promise} + */ + public onRequestsComplete(): Promise { + return new Promise(resolve => { + if (this.reqsInFlightCount === 0) { + resolve() + } else { + this.reqsCompleteResolvers.push(resolve) + } + }) + } +} + +export default RequestTracker diff --git a/packages/optimizely-sdk/lib/modules/event_processor/synchronizer.ts b/packages/optimizely-sdk/lib/modules/event_processor/synchronizer.ts new file mode 100644 index 000000000..2d5d861f2 --- /dev/null +++ b/packages/optimizely-sdk/lib/modules/event_processor/synchronizer.ts @@ -0,0 +1,42 @@ +/** + * Copyright 2020, Optimizely + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * This synchronizer makes sure the operations are atomic using promises. + */ +export class Synchronizer { + private lockPromises: Promise[] = [] + private resolvers: any[] = [] + + // Adds a promise to the existing list and returns the promise so that the code block can wait for its turn + public async getLock(): Promise { + this.lockPromises.push(new Promise(resolve => this.resolvers.push(resolve))) + if (this.lockPromises.length === 1) { + return + } + await this.lockPromises[this.lockPromises.length - 2] + } + + // Resolves first promise in the array so that the code block waiting on the first promise can continue execution + public releaseLock(): void { + if (this.lockPromises.length > 0) { + this.lockPromises.shift() + const resolver = this.resolvers.shift() + resolver() + return + } + } +} diff --git a/packages/optimizely-sdk/lib/modules/event_processor/v1/buildEventV1.ts b/packages/optimizely-sdk/lib/modules/event_processor/v1/buildEventV1.ts new file mode 100644 index 000000000..59ab01017 --- /dev/null +++ b/packages/optimizely-sdk/lib/modules/event_processor/v1/buildEventV1.ts @@ -0,0 +1,255 @@ +import { EventTags, ConversionEvent, ImpressionEvent, VisitorAttribute } from '../events' +import { ProcessableEvent } from '../eventProcessor' +import { EventV1Request } from '../eventDispatcher' + +const ACTIVATE_EVENT_KEY = 'campaign_activated' +const CUSTOM_ATTRIBUTE_FEATURE_TYPE = 'custom' +const BOT_FILTERING_KEY = '$opt_bot_filtering' + +export type EventV1 = { + account_id: string + project_id: string + revision: string + client_name: string + client_version: string + anonymize_ip: boolean + enrich_decisions: boolean + visitors: Visitor[] +} + +type Visitor = { + snapshots: Visitor.Snapshot[] + visitor_id: string + attributes: Visitor.Attribute[] +} + +namespace Visitor { + type AttributeType = 'custom' + + export type Attribute = { + // attribute id + entity_id: string + // attribute key + key: string + type: AttributeType + value: string | number | boolean + } + + export type Snapshot = { + decisions?: Decision[] + events: SnapshotEvent[] + } + + type Decision = { + campaign_id: string | null + experiment_id: string | null + variation_id: string | null + metadata: Metadata + } + + type Metadata = { + flag_key: string; + rule_key: string; + rule_type: string; + variation_key: string; + enabled: boolean; + } + + export type SnapshotEvent = { + entity_id: string | null + timestamp: number + uuid: string + key: string + revenue?: number + value?: number + tags?: EventTags + } +} + + + +type Attributes = { + [key: string]: string | number | boolean +} + +/** + * Given an array of batchable Decision or ConversionEvent events it returns + * a single EventV1 with proper batching + * + * @param {ProcessableEvent[]} events + * @returns {EventV1} + */ +export function makeBatchedEventV1(events: ProcessableEvent[]): EventV1 { + const visitors: Visitor[] = [] + const data = events[0] + + events.forEach(event => { + if (event.type === 'conversion' || event.type === 'impression') { + let visitor = makeVisitor(event) + + if (event.type === 'impression') { + visitor.snapshots.push(makeDecisionSnapshot(event)) + } else if (event.type === 'conversion') { + visitor.snapshots.push(makeConversionSnapshot(event)) + } + + visitors.push(visitor) + } + }) + + return { + client_name: data.context.clientName, + client_version: data.context.clientVersion, + + account_id: data.context.accountId, + project_id: data.context.projectId, + revision: data.context.revision, + anonymize_ip: data.context.anonymizeIP, + enrich_decisions: true, + + visitors, + } +} + +function makeConversionSnapshot(conversion: ConversionEvent): Visitor.Snapshot { + let tags: EventTags = { + ...conversion.tags, + } + + delete tags['revenue'] + delete tags['value'] + + const event: Visitor.SnapshotEvent = { + entity_id: conversion.event.id, + key: conversion.event.key, + timestamp: conversion.timestamp, + uuid: conversion.uuid, + } + + if (conversion.tags) { + event.tags = conversion.tags + } + + if (conversion.value != null) { + event.value = conversion.value + } + + if (conversion.revenue != null) { + event.revenue = conversion.revenue + } + + return { + events: [event], + } +} + +function makeDecisionSnapshot(event: ImpressionEvent): Visitor.Snapshot { + const { layer, experiment, variation, ruleKey, flagKey, ruleType, enabled } = event + let layerId = layer ? layer.id : null + let experimentId = experiment?.id ?? '' + let variationId = variation?.id ?? '' + let variationKey = variation ? variation.key : '' + + return { + decisions: [ + { + campaign_id: layerId, + experiment_id: experimentId, + variation_id: variationId, + metadata: { + flag_key: flagKey, + rule_key: ruleKey, + rule_type: ruleType, + variation_key: variationKey, + enabled: enabled, + }, + }, + ], + events: [ + { + entity_id: layerId, + timestamp: event.timestamp, + key: ACTIVATE_EVENT_KEY, + uuid: event.uuid, + }, + ], + } +} + +function makeVisitor(data: ImpressionEvent | ConversionEvent): Visitor { + const visitor: Visitor = { + snapshots: [], + visitor_id: data.user.id, + attributes: [], + } + + data.user.attributes.forEach(attr => { + visitor.attributes.push({ + entity_id: attr.entityId, + key: attr.key, + type: 'custom' as 'custom', // tell the compiler this is always string "custom" + value: attr.value, + }) + }) + + if (typeof data.context.botFiltering === 'boolean') { + visitor.attributes.push({ + entity_id: BOT_FILTERING_KEY, + key: BOT_FILTERING_KEY, + type: CUSTOM_ATTRIBUTE_FEATURE_TYPE, + value: data.context.botFiltering, + }) + } + return visitor +} + +/** + * Event for usage with v1 logtier + * + * @export + * @interface EventBuilderV1 + */ + +export function buildImpressionEventV1(data: ImpressionEvent): EventV1 { + const visitor = makeVisitor(data) + visitor.snapshots.push(makeDecisionSnapshot(data)) + + return { + client_name: data.context.clientName, + client_version: data.context.clientVersion, + + account_id: data.context.accountId, + project_id: data.context.projectId, + revision: data.context.revision, + anonymize_ip: data.context.anonymizeIP, + enrich_decisions: true, + + visitors: [visitor], + } +} + +export function buildConversionEventV1(data: ConversionEvent): EventV1 { + const visitor = makeVisitor(data) + visitor.snapshots.push(makeConversionSnapshot(data)) + + return { + client_name: data.context.clientName, + client_version: data.context.clientVersion, + + account_id: data.context.accountId, + project_id: data.context.projectId, + revision: data.context.revision, + anonymize_ip: data.context.anonymizeIP, + enrich_decisions: true, + + visitors: [visitor], + } +} + +export function formatEvents(events: ProcessableEvent[]): EventV1Request { + return { + url: 'https://logx.optimizely.com/v1/events', + httpVerb: 'POST', + params: makeBatchedEventV1(events), + } +} diff --git a/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.react_native.ts b/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.react_native.ts new file mode 100644 index 000000000..36692bfcc --- /dev/null +++ b/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.react_native.ts @@ -0,0 +1,235 @@ +/** + * Copyright 2020, Optimizely + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { + uuid, + objectEntries, +} from '@utils/fns' +import { + NetInfoState, + addEventListener as addConnectionListener, +} from "@react-native-community/netinfo" +import { getLogger } from '../../logging' +import { NotificationSender } from '../../../core/notification_center' + +import { + getQueue, + EventProcessor, + ProcessableEvent, + sendEventNotification, + validateAndGetBatchSize, + validateAndGetFlushInterval, + DEFAULT_BATCH_SIZE, + DEFAULT_FLUSH_INTERVAL, +} from "../eventProcessor" +import { ReactNativeEventsStore } from '../reactNativeEventsStore' +import { Synchronizer } from '../synchronizer' +import { EventQueue } from '../eventQueue' +import RequestTracker from '../requestTracker' +import { areEventContextsEqual } from '../events' +import { formatEvents } from './buildEventV1' +import { + EventV1Request, + EventDispatcher, + EventDispatcherResponse, +} from '../eventDispatcher' + +const logger = getLogger('ReactNativeEventProcessor') + +const DEFAULT_MAX_QUEUE_SIZE = 10000 +const PENDING_EVENTS_STORE_KEY = 'fs_optly_pending_events' +const EVENT_BUFFER_STORE_KEY = 'fs_optly_event_buffer' + +/** + * React Native Events Processor with Caching support for events when app is offline. + */ +export class LogTierV1EventProcessor implements EventProcessor { + private dispatcher: EventDispatcher + // expose for testing + public queue: EventQueue + private notificationSender?: NotificationSender + private requestTracker: RequestTracker + + private unsubscribeNetInfo: Function | null = null + private isInternetReachable: boolean = true + private pendingEventsPromise: Promise | null = null + private synchronizer: Synchronizer = new Synchronizer() + + // If a pending event fails to dispatch, this indicates skipping further events to preserve sequence in the next retry. + private shouldSkipDispatchToPreserveSequence: boolean = false + + /** + * This Stores Formatted events before dispatching. The events are removed after they are successfully dispatched. + * Stored events are retried on every new event dispatch, when connection becomes available again or when SDK initializes the next time. + */ + private pendingEventsStore: ReactNativeEventsStore + + /** + * This stores individual events generated from the SDK till they are part of the pending buffer. + * The store is cleared right before the event is formatted to be dispatched. + * This is to make sure that individual events are not lost when app closes before the buffer was flushed. + */ + private eventBufferStore: ReactNativeEventsStore + + constructor({ + dispatcher, + flushInterval = DEFAULT_FLUSH_INTERVAL, + batchSize = DEFAULT_BATCH_SIZE, + maxQueueSize = DEFAULT_MAX_QUEUE_SIZE, + notificationCenter, + }: { + dispatcher: EventDispatcher + flushInterval?: number + batchSize?: number + maxQueueSize?: number + notificationCenter?: NotificationSender + }) { + this.dispatcher = dispatcher + this.notificationSender = notificationCenter + this.requestTracker = new RequestTracker() + + flushInterval = validateAndGetFlushInterval(flushInterval) + batchSize = validateAndGetBatchSize(batchSize) + this.queue = getQueue(batchSize, flushInterval, this.drainQueue.bind(this), areEventContextsEqual) + this.pendingEventsStore = new ReactNativeEventsStore(maxQueueSize, PENDING_EVENTS_STORE_KEY) + this.eventBufferStore = new ReactNativeEventsStore(maxQueueSize, EVENT_BUFFER_STORE_KEY) + } + + private async connectionListener(state: NetInfoState) { + if (this.isInternetReachable && !state.isInternetReachable) { + this.isInternetReachable = false + logger.debug('Internet connection lost') + return + } + if (!this.isInternetReachable && state.isInternetReachable) { + this.isInternetReachable = true + logger.debug('Internet connection is restored, attempting to dispatch pending events') + await this.processPendingEvents() + this.shouldSkipDispatchToPreserveSequence = false + } + } + + private isSuccessResponse(status: number): boolean { + return status >= 200 && status < 400 + } + + private async drainQueue(buffer: ProcessableEvent[]): Promise { + if (buffer.length === 0) { + return + } + + await this.synchronizer.getLock() + + // Retry pending failed events while draining queue + await this.processPendingEvents() + + logger.debug('draining queue with %s events', buffer.length) + + const eventCacheKey = uuid() + const formattedEvent = formatEvents(buffer) + + // Store formatted event before dispatching to be retried later in case of failure. + await this.pendingEventsStore.set(eventCacheKey, formattedEvent) + + // Clear buffer because the buffer has become a formatted event and is already stored in pending cache. + for (const {uuid} of buffer) { + await this.eventBufferStore.remove(uuid) + } + + if (!this.shouldSkipDispatchToPreserveSequence) { + await this.dispatchEvent(eventCacheKey, formattedEvent) + } + + // Resetting skip flag because current sequence of events have all been processed + this.shouldSkipDispatchToPreserveSequence = false + + this.synchronizer.releaseLock() + } + + private async processPendingEvents(): Promise { + logger.debug('Processing pending events from offline storage') + if (!this.pendingEventsPromise) { + // Only process events if existing promise is not in progress + this.pendingEventsPromise = this.getPendingEventsPromise() + } else { + logger.debug('Already processing pending events, returning the existing promise') + } + await this.pendingEventsPromise + this.pendingEventsPromise = null + } + + private async getPendingEventsPromise(): Promise { + const formattedEvents: {[key: string]: any} = await this.pendingEventsStore.getEventsMap() + const eventEntries = objectEntries(formattedEvents) + logger.debug('Processing %s pending events', eventEntries.length) + // Using for loop to be able to wait for previous dispatch to finish before moving on to the new one + for (const [eventKey, event] of eventEntries) { + // If one event dispatch failed, skip subsequent events to preserve sequence + if (this.shouldSkipDispatchToPreserveSequence) { + return + } + await this.dispatchEvent(eventKey, event) + } + } + + private async dispatchEvent(eventCacheKey: string, event: EventV1Request): Promise { + const requestPromise = new Promise((resolve) => { + this.dispatcher.dispatchEvent(event, async ({ statusCode }: EventDispatcherResponse) => { + if (this.isSuccessResponse(statusCode)) { + await this.pendingEventsStore.remove(eventCacheKey) + } else { + this.shouldSkipDispatchToPreserveSequence = true + logger.warn('Failed to dispatch event, Response status Code: %s', statusCode) + } + resolve() + }) + sendEventNotification(this.notificationSender, event) + }) + // Tracking all the requests to dispatch to make sure request is completed before fulfilling the `stop` promise + this.requestTracker.trackRequest(requestPromise) + return requestPromise + } + + public async start(): Promise { + this.queue.start() + this.unsubscribeNetInfo = addConnectionListener(this.connectionListener.bind(this)) + + await this.processPendingEvents() + this.shouldSkipDispatchToPreserveSequence = false + + // Process individual events pending from the buffer. + const events: ProcessableEvent[] = await this.eventBufferStore.getEventsList() + await this.eventBufferStore.clear() + events.forEach(this.process.bind(this)) + } + + public process(event: ProcessableEvent): void { + // Adding events to buffer store. If app closes before dispatch, we can reprocess next time the app initializes + this.eventBufferStore.set(event.uuid, event).then(() => { + this.queue.enqueue(event) + }) + } + + public async stop(): Promise { + // swallow - an error stopping this queue shouldn't prevent this from stopping + try { + this.unsubscribeNetInfo && this.unsubscribeNetInfo() + await this.queue.stop() + return this.requestTracker.onRequestsComplete() + } catch (e) { + logger.error('Error stopping EventProcessor: "%s"', e.message, e) + } + } +} diff --git a/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.ts b/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.ts new file mode 100644 index 000000000..f984c13d2 --- /dev/null +++ b/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.ts @@ -0,0 +1,102 @@ +/** + * Copyright 2019-2020, Optimizely + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { getLogger } from '../../logging' +import { NotificationSender } from '../../../core/notification_center' + +import { EventDispatcher } from '../eventDispatcher' +import { + getQueue, + EventProcessor, + ProcessableEvent, + sendEventNotification, + validateAndGetBatchSize, + validateAndGetFlushInterval, + DEFAULT_BATCH_SIZE, + DEFAULT_FLUSH_INTERVAL, +} from '../eventProcessor' +import { EventQueue } from '../eventQueue' +import RequestTracker from '../requestTracker' +import { areEventContextsEqual } from '../events' +import { formatEvents } from './buildEventV1' + +const logger = getLogger('LogTierV1EventProcessor') + +export class LogTierV1EventProcessor implements EventProcessor { + private dispatcher: EventDispatcher + private queue: EventQueue + private notificationCenter?: NotificationSender + private requestTracker: RequestTracker + + constructor({ + dispatcher, + flushInterval = DEFAULT_FLUSH_INTERVAL, + batchSize = DEFAULT_BATCH_SIZE, + notificationCenter, + }: { + dispatcher: EventDispatcher + flushInterval?: number + batchSize?: number + notificationCenter?: NotificationSender + }) { + this.dispatcher = dispatcher + this.notificationCenter = notificationCenter + this.requestTracker = new RequestTracker() + + flushInterval = validateAndGetFlushInterval(flushInterval) + batchSize = validateAndGetBatchSize(batchSize) + this.queue = getQueue(batchSize, flushInterval, this.drainQueue.bind(this), areEventContextsEqual) + } + + drainQueue(buffer: ProcessableEvent[]): Promise { + const reqPromise = new Promise(resolve => { + logger.debug('draining queue with %s events', buffer.length) + + if (buffer.length === 0) { + resolve() + return + } + + const formattedEvent = formatEvents(buffer) + this.dispatcher.dispatchEvent(formattedEvent, () => { + resolve() + }) + sendEventNotification(this.notificationCenter, formattedEvent) + }) + this.requestTracker.trackRequest(reqPromise) + return reqPromise + } + + process(event: ProcessableEvent): void { + this.queue.enqueue(event) + } + + // TODO[OASIS-6649]: Don't use any type + // eslint-disable-next-line @typescript-eslint/no-explicit-any + stop(): Promise { + // swallow - an error stopping this queue shouldn't prevent this from stopping + try { + this.queue.stop() + return this.requestTracker.onRequestsComplete() + } catch (e) { + logger.error('Error stopping EventProcessor: "%s"', e.message, e) + } + return Promise.resolve() + } + + async start(): Promise { + this.queue.start() + } +} diff --git a/packages/optimizely-sdk/lib/modules/logging/logger.ts b/packages/optimizely-sdk/lib/modules/logging/logger.ts index 2f4b12097..a310c19d4 100644 --- a/packages/optimizely-sdk/lib/modules/logging/logger.ts +++ b/packages/optimizely-sdk/lib/modules/logging/logger.ts @@ -111,12 +111,12 @@ export class ConsoleLogHandler implements LogHandler { * @param {string} message * @memberof ConsoleLogger */ - log(level: LogLevel, message: string) { + log(level: LogLevel, message: string) : void { if (!this.shouldLog(level) || !this.logToConsole) { return } - let logMessage: string = `${this.prefix} - ${this.getLogLevelName( + const logMessage = `${this.prefix} - ${this.getLogLevelName( level, )} ${this.getTime()} ${message}` @@ -127,7 +127,7 @@ export class ConsoleLogHandler implements LogHandler { * @param {LogLevel} level * @memberof ConsoleLogger */ - setLogLevel(level: LogLevel | string) { + setLogLevel(level: LogLevel | string) : void { level = coerceLogLevel(level) if (!isValidEnum(LogLevel, level) || level === undefined) { this.logLevel = LogLevel.ERROR @@ -184,19 +184,19 @@ export class ConsoleLogHandler implements LogHandler { private consoleLog(logLevel: LogLevel, logArguments: [string, ...string[]]) { switch (logLevel) { case LogLevel.DEBUG: - console.log.apply(console, logArguments) + console.log(...logArguments) break case LogLevel.INFO: - console.info.apply(console, logArguments) + console.info(...logArguments) break case LogLevel.WARNING: - console.warn.apply(console, logArguments) + console.warn(...logArguments) break case LogLevel.ERROR: - console.error.apply(console, logArguments) + console.error(...logArguments) break default: - console.log.apply(console, logArguments) + console.log(...logArguments) } } } @@ -205,7 +205,7 @@ let globalLogLevel: LogLevel = LogLevel.NOTSET let globalLogHandler: LogHandler | null = null class OptimizelyLogger implements LoggerFacade { - private messagePrefix: string = '' + private messagePrefix = '' constructor(opts: { messagePrefix?: string } = {}) { if (opts.messagePrefix) { @@ -302,11 +302,11 @@ export function getLogger(name?: string): LoggerFacade { return globalLogManager.getLogger(name) } -export function setLogHandler(logger: LogHandler | null) { +export function setLogHandler(logger: LogHandler | null) : void { globalLogHandler = logger } -export function setLogLevel(level: LogLevel | string) { +export function setLogLevel(level: LogLevel | string) : void { level = coerceLogLevel(level) if (!isValidEnum(LogLevel, level) || level === undefined) { globalLogLevel = LogLevel.ERROR @@ -322,7 +322,7 @@ export function getLogLevel(): LogLevel { /** * Resets all global logger state to it's original */ -export function resetLogger() { +export function resetLogger() : void { globalLogManager = new DefaultLogManager() globalLogLevel = LogLevel.NOTSET } diff --git a/packages/optimizely-sdk/lib/optimizely/index.ts b/packages/optimizely-sdk/lib/optimizely/index.ts index 926360be6..b28af2370 100644 --- a/packages/optimizely-sdk/lib/optimizely/index.ts +++ b/packages/optimizely-sdk/lib/optimizely/index.ts @@ -16,7 +16,7 @@ import { LoggerFacade, ErrorHandler } from '../modules/logging'; import { sprintf, objectValues } from '@utils/fns'; import { NotificationCenter } from '../core/notification_center'; -import { EventProcessor } from '@optimizely/js-sdk-event-processor'; +import { EventProcessor } from '../../lib/modules/event_processor'; import { UserAttributes, diff --git a/packages/optimizely-sdk/lib/plugins/event_processor/forwarding_event_processor.ts b/packages/optimizely-sdk/lib/plugins/event_processor/forwarding_event_processor.ts index 1efd1368f..fbc9239a8 100644 --- a/packages/optimizely-sdk/lib/plugins/event_processor/forwarding_event_processor.ts +++ b/packages/optimizely-sdk/lib/plugins/event_processor/forwarding_event_processor.ts @@ -17,7 +17,7 @@ import { EventProcessor, ProcessableEvent, -} from '@optimizely/js-sdk-event-processor'; +} from '../../../lib/modules/event_processor'; import { NotificationSender } from '../../core/notification_center'; import { EventDispatcher } from '../../shared_types'; diff --git a/packages/optimizely-sdk/lib/plugins/event_processor/index.ts b/packages/optimizely-sdk/lib/plugins/event_processor/index.ts index b12502ce8..4904a3302 100644 --- a/packages/optimizely-sdk/lib/plugins/event_processor/index.ts +++ b/packages/optimizely-sdk/lib/plugins/event_processor/index.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { LogTierV1EventProcessor, LocalStoragePendingEventsDispatcher } from '@optimizely/js-sdk-event-processor'; +import { LogTierV1EventProcessor, LocalStoragePendingEventsDispatcher } from '../../../lib/modules/event_processor'; export function createEventProcessor( ...args: ConstructorParameters diff --git a/packages/optimizely-sdk/lib/shared_types.ts b/packages/optimizely-sdk/lib/shared_types.ts index b6b1527ca..cb09f4ada 100644 --- a/packages/optimizely-sdk/lib/shared_types.ts +++ b/packages/optimizely-sdk/lib/shared_types.ts @@ -13,8 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { ErrorHandler, LogHandler, LogLevel, LoggerFacade } from '@optimizely/js-sdk-logging'; -import { EventProcessor } from '@optimizely/js-sdk-event-processor'; +import { ErrorHandler, LogHandler, LogLevel, LoggerFacade } from '../lib/modules/logging'; +import { EventProcessor } from '../lib/modules/event_processor'; import {NotificationCenter as NotificationCenterImpl} from './core/notification_center' import { NOTIFICATION_TYPES } from './utils/enums'; diff --git a/packages/optimizely-sdk/lib/utils/event_tag_utils/index.ts b/packages/optimizely-sdk/lib/utils/event_tag_utils/index.ts index d47ab1944..4fbc60597 100644 --- a/packages/optimizely-sdk/lib/utils/event_tag_utils/index.ts +++ b/packages/optimizely-sdk/lib/utils/event_tag_utils/index.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { EventTags } from '@optimizely/js-sdk-event-processor'; +import { EventTags } from '../../../lib/modules/event_processor'; import { LoggerFacade } from '../../modules/logging'; import { diff --git a/packages/optimizely-sdk/package-lock.json b/packages/optimizely-sdk/package-lock.json index 777034ba9..a3e0b633b 100644 --- a/packages/optimizely-sdk/package-lock.json +++ b/packages/optimizely-sdk/package-lock.json @@ -344,6 +344,21 @@ "uuid": "^3.3.2" } }, + "@react-native-async-storage/async-storage": { + "version": "1.17.4", + "resolved": "https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-1.17.4.tgz", + "integrity": "sha512-c6GglKBRaWkjNyYd0FM8f0/neQEcwQom4MjZNqYSsIz55LcddJb7W8GM/n2dkzZ0JnaMylMX3+Vo+fpmkFEGTQ==", + "dev": true, + "requires": { + "merge-options": "^3.0.4" + } + }, + "@react-native-community/netinfo": { + "version": "5.9.10", + "resolved": "https://registry.npmjs.org/@react-native-community/netinfo/-/netinfo-5.9.10.tgz", + "integrity": "sha512-1NPlBA2Hu/KWc3EnQcDRPRX0x8Dg9tuQlQQVWVQjlg+u+PjCq7ANEtbikOFKp5yQqfF8tqzU5+84/IfDO8zpiA==", + "dev": true + }, "@rollup/plugin-commonjs": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-11.1.0.tgz", @@ -4990,6 +5005,12 @@ "has-tostringtag": "^1.0.0" } }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true + }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -6206,6 +6227,12 @@ "pretty-format": "^23.6.0" } }, + "jest-localstorage-mock": { + "version": "2.4.21", + "resolved": "https://registry.npmjs.org/jest-localstorage-mock/-/jest-localstorage-mock-2.4.21.tgz", + "integrity": "sha512-IBXPBufnfPyr4VkoQeJ+zlfWlG84P0KbL4ejcV9j3xNI0v6OWznQlH6Ke9xjSarleR11090oSeWADSUow0PmFw==", + "dev": true + }, "jest-matcher-utils": { "version": "23.6.0", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-23.6.0.tgz", @@ -7389,6 +7416,15 @@ "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==", "dev": true }, + "merge-options": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-3.0.4.tgz", + "integrity": "sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==", + "dev": true, + "requires": { + "is-plain-obj": "^2.1.0" + } + }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", diff --git a/packages/optimizely-sdk/package.json b/packages/optimizely-sdk/package.json index 586e685b2..a5f61451a 100644 --- a/packages/optimizely-sdk/package.json +++ b/packages/optimizely-sdk/package.json @@ -84,7 +84,22 @@ "ts-node": "^8.10.2", "tsconfig-paths": "^4.0.0", "typescript": "^4.0.3", - "webpack": "^4.42.1" + "webpack": "^4.42.1", + "@react-native-community/netinfo": "^5.9.4", + "@react-native-async-storage/async-storage": "^1.2.0", + "jest-localstorage-mock": "^2.4.0" + }, + "peerDependencies": { + "@react-native-community/netinfo": "5.9.4", + "@react-native-async-storage/async-storage": "^1.2.0" + }, + "peerDependenciesMeta": { + "@react-native-async-storage/async-storage": { + "optional": true + }, + "@react-native-community/netinfo": { + "optional": true + } }, "publishConfig": { "access": "public" diff --git a/packages/optimizely-sdk/tests/buildEventV1.spec.ts b/packages/optimizely-sdk/tests/buildEventV1.spec.ts new file mode 100644 index 000000000..616f16c67 --- /dev/null +++ b/packages/optimizely-sdk/tests/buildEventV1.spec.ts @@ -0,0 +1,812 @@ +/** + * Copyright 2019, 2021, Optimizely + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/// + +import { + buildConversionEventV1, + buildImpressionEventV1, + makeBatchedEventV1, +} from '../lib/modules/event_processor/v1/buildEventV1' +import { ImpressionEvent, ConversionEvent } from '../lib/modules/event_processor/events' + +describe('buildEventV1', () => { + describe('buildImpressionEventV1', () => { + it('should build an ImpressionEventV1 when experiment and variation are defined', () => { + const impressionEvent: ImpressionEvent = { + type: 'impression', + timestamp: 69, + uuid: 'uuid', + + context: { + accountId: 'accountId', + projectId: 'projectId', + clientName: 'node-sdk', + clientVersion: '3.0.0', + revision: 'revision', + botFiltering: true, + anonymizeIP: true, + }, + + user: { + id: 'userId', + attributes: [{ entityId: 'attr1-id', key: 'attr1-key', value: 'attr1-value' }], + }, + + layer: { + id: 'layerId', + }, + + experiment: { + id: 'expId', + key: 'expKey', + }, + + variation: { + id: 'varId', + key: 'varKey', + }, + + ruleKey: 'expKey', + flagKey: 'flagKey1', + ruleType: 'experiment', + enabled: true, + } + + const result = buildImpressionEventV1(impressionEvent) + expect(result).toEqual({ + client_name: 'node-sdk', + client_version: '3.0.0', + account_id: 'accountId', + project_id: 'projectId', + revision: 'revision', + anonymize_ip: true, + enrich_decisions: true, + + visitors: [ + { + snapshots: [ + { + decisions: [ + { + campaign_id: 'layerId', + experiment_id: 'expId', + variation_id: 'varId', + metadata: { + flag_key: 'flagKey1', + rule_key: 'expKey', + rule_type: 'experiment', + variation_key: 'varKey', + enabled: true, + }, + }, + ], + events: [ + { + entity_id: 'layerId', + timestamp: 69, + key: 'campaign_activated', + uuid: 'uuid', + }, + ], + }, + ], + visitor_id: 'userId', + attributes: [ + { + entity_id: 'attr1-id', + key: 'attr1-key', + type: 'custom', + value: 'attr1-value', + }, + { + entity_id: '$opt_bot_filtering', + key: '$opt_bot_filtering', + type: 'custom', + value: true, + }, + ], + }, + ], + }) + }) + + it('should build an ImpressionEventV1 when experiment and variation are not defined', () => { + const impressionEvent: ImpressionEvent = { + type: 'impression', + timestamp: 69, + uuid: 'uuid', + + context: { + accountId: 'accountId', + projectId: 'projectId', + clientName: 'node-sdk', + clientVersion: '3.0.0', + revision: 'revision', + botFiltering: true, + anonymizeIP: true, + }, + + user: { + id: 'userId', + attributes: [{ entityId: 'attr1-id', key: 'attr1-key', value: 'attr1-value' }], + }, + + layer: { + id: null, + }, + + experiment: { + id: null, + key: '', + }, + + variation: { + id: null, + key: '', + }, + + ruleKey: '', + flagKey: 'flagKey1', + ruleType: 'rollout', + enabled: true, + } + + const result = buildImpressionEventV1(impressionEvent) + expect(result).toEqual({ + client_name: 'node-sdk', + client_version: '3.0.0', + account_id: 'accountId', + project_id: 'projectId', + revision: 'revision', + anonymize_ip: true, + enrich_decisions: true, + + visitors: [ + { + snapshots: [ + { + decisions: [ + { + campaign_id: null, + experiment_id: "", + variation_id: "", + metadata: { + flag_key: 'flagKey1', + rule_key: '', + rule_type: 'rollout', + variation_key: '', + enabled: true, + }, + }, + ], + events: [ + { + entity_id: null, + timestamp: 69, + key: 'campaign_activated', + uuid: 'uuid', + }, + ], + }, + ], + visitor_id: 'userId', + attributes: [ + { + entity_id: 'attr1-id', + key: 'attr1-key', + type: 'custom', + value: 'attr1-value', + }, + { + entity_id: '$opt_bot_filtering', + key: '$opt_bot_filtering', + type: 'custom', + value: true, + }, + ], + }, + ], + }) + }) + }) + + describe('buildConversionEventV1', () => { + it('should build a ConversionEventV1 when tags object is defined', () => { + const conversionEvent: ConversionEvent = { + type: 'conversion', + timestamp: 69, + uuid: 'uuid', + + context: { + accountId: 'accountId', + projectId: 'projectId', + clientName: 'node-sdk', + clientVersion: '3.0.0', + revision: 'revision', + botFiltering: true, + anonymizeIP: true, + }, + + user: { + id: 'userId', + attributes: [{ entityId: 'attr1-id', key: 'attr1-key', value: 'attr1-value' }], + }, + + event: { + id: 'event-id', + key: 'event-key', + }, + + tags: { + foo: 'bar', + value: '123', + revenue: '1000', + }, + + revenue: 1000, + value: 123, + } + + const result = buildConversionEventV1(conversionEvent) + expect(result).toEqual({ + client_name: 'node-sdk', + client_version: '3.0.0', + account_id: 'accountId', + project_id: 'projectId', + revision: 'revision', + anonymize_ip: true, + enrich_decisions: true, + + visitors: [ + { + snapshots: [ + { + events: [ + { + entity_id: 'event-id', + timestamp: 69, + key: 'event-key', + uuid: 'uuid', + tags: { + foo: 'bar', + value: '123', + revenue: '1000', + }, + revenue: 1000, + value: 123, + }, + ], + }, + ], + visitor_id: 'userId', + attributes: [ + { + entity_id: 'attr1-id', + key: 'attr1-key', + type: 'custom', + value: 'attr1-value', + }, + { + entity_id: '$opt_bot_filtering', + key: '$opt_bot_filtering', + type: 'custom', + value: true, + }, + ], + }, + ], + }) + }) + + it('should build a ConversionEventV1 when tags object is undefined', () => { + const conversionEvent: ConversionEvent = { + type: 'conversion', + timestamp: 69, + uuid: 'uuid', + + context: { + accountId: 'accountId', + projectId: 'projectId', + clientName: 'node-sdk', + clientVersion: '3.0.0', + revision: 'revision', + botFiltering: true, + anonymizeIP: true, + }, + + user: { + id: 'userId', + attributes: [{ entityId: 'attr1-id', key: 'attr1-key', value: 'attr1-value' }], + }, + + event: { + id: 'event-id', + key: 'event-key', + }, + + tags: undefined, + + revenue: 1000, + value: 123, + } + + const result = buildConversionEventV1(conversionEvent) + expect(result).toEqual({ + client_name: 'node-sdk', + client_version: '3.0.0', + account_id: 'accountId', + project_id: 'projectId', + revision: 'revision', + anonymize_ip: true, + enrich_decisions: true, + + visitors: [ + { + snapshots: [ + { + events: [ + { + entity_id: 'event-id', + timestamp: 69, + key: 'event-key', + uuid: 'uuid', + tags: undefined, + revenue: 1000, + value: 123, + }, + ], + }, + ], + visitor_id: 'userId', + attributes: [ + { + entity_id: 'attr1-id', + key: 'attr1-key', + type: 'custom', + value: 'attr1-value', + }, + { + entity_id: '$opt_bot_filtering', + key: '$opt_bot_filtering', + type: 'custom', + value: true, + }, + ], + }, + ], + }) + }) + + it('should build a ConversionEventV1 when event id is null', () => { + const conversionEvent: ConversionEvent = { + type: 'conversion', + timestamp: 69, + uuid: 'uuid', + + context: { + accountId: 'accountId', + projectId: 'projectId', + clientName: 'node-sdk', + clientVersion: '3.0.0', + revision: 'revision', + botFiltering: true, + anonymizeIP: true, + }, + + user: { + id: 'userId', + attributes: [{ entityId: 'attr1-id', key: 'attr1-key', value: 'attr1-value' }], + }, + + event: { + id: null, + key: 'event-key', + }, + + tags: undefined, + + revenue: 1000, + value: 123, + } + + const result = buildConversionEventV1(conversionEvent) + expect(result).toEqual({ + client_name: 'node-sdk', + client_version: '3.0.0', + account_id: 'accountId', + project_id: 'projectId', + revision: 'revision', + anonymize_ip: true, + enrich_decisions: true, + + visitors: [ + { + snapshots: [ + { + events: [ + { + entity_id: null, + timestamp: 69, + key: 'event-key', + uuid: 'uuid', + tags: undefined, + revenue: 1000, + value: 123, + }, + ], + }, + ], + visitor_id: 'userId', + attributes: [ + { + entity_id: 'attr1-id', + key: 'attr1-key', + type: 'custom', + value: 'attr1-value', + }, + { + entity_id: '$opt_bot_filtering', + key: '$opt_bot_filtering', + type: 'custom', + value: true, + }, + ], + }, + ], + }) + }) + + it('should include revenue and value if they are 0', () => { + const conversionEvent: ConversionEvent = { + type: 'conversion', + timestamp: 69, + uuid: 'uuid', + + context: { + accountId: 'accountId', + projectId: 'projectId', + clientName: 'node-sdk', + clientVersion: '3.0.0', + revision: 'revision', + botFiltering: true, + anonymizeIP: true, + }, + + user: { + id: 'userId', + attributes: [{ entityId: 'attr1-id', key: 'attr1-key', value: 'attr1-value' }], + }, + + event: { + id: 'event-id', + key: 'event-key', + }, + + tags: { + foo: 'bar', + value: 0, + revenue: 0, + }, + + revenue: 0, + value: 0, + } + + const result = buildConversionEventV1(conversionEvent) + expect(result).toEqual({ + client_name: 'node-sdk', + client_version: '3.0.0', + account_id: 'accountId', + project_id: 'projectId', + revision: 'revision', + anonymize_ip: true, + enrich_decisions: true, + + visitors: [ + { + snapshots: [ + { + events: [ + { + entity_id: 'event-id', + timestamp: 69, + key: 'event-key', + uuid: 'uuid', + tags: { + foo: 'bar', + value: 0, + revenue: 0, + }, + revenue: 0, + value: 0, + }, + ], + }, + ], + visitor_id: 'userId', + attributes: [ + { + entity_id: 'attr1-id', + key: 'attr1-key', + type: 'custom', + value: 'attr1-value', + }, + { + entity_id: '$opt_bot_filtering', + key: '$opt_bot_filtering', + type: 'custom', + value: true, + }, + ], + }, + ], + }) + }) + + it('should not include $opt_bot_filtering attribute if context.botFiltering is undefined', () => { + const conversionEvent: ConversionEvent = { + type: 'conversion', + timestamp: 69, + uuid: 'uuid', + + context: { + accountId: 'accountId', + projectId: 'projectId', + clientName: 'node-sdk', + clientVersion: '3.0.0', + revision: 'revision', + anonymizeIP: true, + }, + + user: { + id: 'userId', + attributes: [{ entityId: 'attr1-id', key: 'attr1-key', value: 'attr1-value' }], + }, + + event: { + id: 'event-id', + key: 'event-key', + }, + + tags: { + foo: 'bar', + value: '123', + revenue: '1000', + }, + + revenue: 1000, + value: 123, + } + + const result = buildConversionEventV1(conversionEvent) + expect(result).toEqual({ + client_name: 'node-sdk', + client_version: '3.0.0', + account_id: 'accountId', + project_id: 'projectId', + revision: 'revision', + anonymize_ip: true, + enrich_decisions: true, + + visitors: [ + { + snapshots: [ + { + events: [ + { + entity_id: 'event-id', + timestamp: 69, + key: 'event-key', + uuid: 'uuid', + tags: { + foo: 'bar', + value: '123', + revenue: '1000', + }, + revenue: 1000, + value: 123, + }, + ], + }, + ], + visitor_id: 'userId', + attributes: [ + { + entity_id: 'attr1-id', + key: 'attr1-key', + type: 'custom', + value: 'attr1-value', + }, + ], + }, + ], + }) + }) + }) + + describe('makeBatchedEventV1', () => { + it('should batch Conversion and Impression events together', () => { + const conversionEvent: ConversionEvent = { + type: 'conversion', + timestamp: 69, + uuid: 'uuid', + + context: { + accountId: 'accountId', + projectId: 'projectId', + clientName: 'node-sdk', + clientVersion: '3.0.0', + revision: 'revision', + botFiltering: true, + anonymizeIP: true, + }, + + user: { + id: 'userId', + attributes: [{ entityId: 'attr1-id', key: 'attr1-key', value: 'attr1-value' }], + }, + + event: { + id: 'event-id', + key: 'event-key', + }, + + tags: { + foo: 'bar', + value: '123', + revenue: '1000', + }, + + revenue: 1000, + value: 123, + } + + const impressionEvent: ImpressionEvent = { + type: 'impression', + timestamp: 69, + uuid: 'uuid', + + context: { + accountId: 'accountId', + projectId: 'projectId', + clientName: 'node-sdk', + clientVersion: '3.0.0', + revision: 'revision', + botFiltering: true, + anonymizeIP: true, + }, + + user: { + id: 'userId', + attributes: [{ entityId: 'attr1-id', key: 'attr1-key', value: 'attr1-value' }], + }, + + layer: { + id: 'layerId', + }, + + experiment: { + id: 'expId', + key: 'expKey', + }, + + variation: { + id: 'varId', + key: 'varKey', + }, + + ruleKey: 'expKey', + flagKey: 'flagKey1', + ruleType: 'experiment', + enabled: true, + } + + const result = makeBatchedEventV1([impressionEvent, conversionEvent]) + + expect(result).toEqual({ + client_name: 'node-sdk', + client_version: '3.0.0', + account_id: 'accountId', + project_id: 'projectId', + revision: 'revision', + anonymize_ip: true, + enrich_decisions: true, + + visitors: [ + { + snapshots: [ + { + decisions: [ + { + campaign_id: 'layerId', + experiment_id: 'expId', + variation_id: 'varId', + metadata: { + flag_key: 'flagKey1', + rule_key: 'expKey', + rule_type: 'experiment', + variation_key: 'varKey', + enabled: true, + }, + }, + ], + events: [ + { + entity_id: 'layerId', + timestamp: 69, + key: 'campaign_activated', + uuid: 'uuid', + }, + ], + }, + ], + visitor_id: 'userId', + attributes: [ + { + entity_id: 'attr1-id', + key: 'attr1-key', + type: 'custom', + value: 'attr1-value', + }, + { + entity_id: '$opt_bot_filtering', + key: '$opt_bot_filtering', + type: 'custom', + value: true, + }, + ], + }, + { + snapshots: [ + { + events: [ + { + entity_id: 'event-id', + timestamp: 69, + key: 'event-key', + uuid: 'uuid', + tags: { + foo: 'bar', + value: '123', + revenue: '1000', + }, + revenue: 1000, + value: 123, + }, + ], + }, + ], + visitor_id: 'userId', + attributes: [ + { + entity_id: 'attr1-id', + key: 'attr1-key', + type: 'custom', + value: 'attr1-value', + }, + { + entity_id: '$opt_bot_filtering', + key: '$opt_bot_filtering', + type: 'custom', + value: true, + }, + ], + }, + ], + }) + }) + }) +}) diff --git a/packages/optimizely-sdk/tests/eventQueue.spec.ts b/packages/optimizely-sdk/tests/eventQueue.spec.ts new file mode 100644 index 000000000..6dbaa10cb --- /dev/null +++ b/packages/optimizely-sdk/tests/eventQueue.spec.ts @@ -0,0 +1,290 @@ +/** + * Copyright 2019, Optimizely + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/// + +import { DefaultEventQueue, SingleEventQueue } from '../lib/modules/event_processor/eventQueue' + +describe('eventQueue', () => { + beforeEach(() => { + jest.useFakeTimers() + }) + + afterEach(() => { + jest.useRealTimers() + jest.resetAllMocks() + }) + + describe('SingleEventQueue', () => { + it('should immediately invoke the sink function when items are enqueued', () => { + const sinkFn = jest.fn() + const queue = new SingleEventQueue({ + sink: sinkFn, + }) + + queue.start() + + queue.enqueue(1) + + expect(sinkFn).toBeCalledTimes(1) + expect(sinkFn).toHaveBeenLastCalledWith([1]) + + queue.enqueue(2) + expect(sinkFn).toBeCalledTimes(2) + expect(sinkFn).toHaveBeenLastCalledWith([2]) + + queue.stop() + }) + }) + + describe('DefaultEventQueue', () => { + it('should treat maxQueueSize = -1 as 1', () => { + const sinkFn = jest.fn() + const queue = new DefaultEventQueue({ + flushInterval: 100, + maxQueueSize: -1, + sink: sinkFn, + batchComparator: () => true + }) + + queue.start() + + queue.enqueue(1) + expect(sinkFn).toHaveBeenCalledTimes(1) + expect(sinkFn).toHaveBeenCalledWith([1]) + queue.enqueue(2) + expect(sinkFn).toHaveBeenCalledTimes(2) + expect(sinkFn).toHaveBeenCalledWith([2]) + + queue.stop() + }) + + it('should treat maxQueueSize = 0 as 1', () => { + const sinkFn = jest.fn() + const queue = new DefaultEventQueue({ + flushInterval: 100, + maxQueueSize: 0, + sink: sinkFn, + batchComparator: () => true + }) + + queue.start() + + queue.enqueue(1) + expect(sinkFn).toHaveBeenCalledTimes(1) + expect(sinkFn).toHaveBeenCalledWith([1]) + queue.enqueue(2) + expect(sinkFn).toHaveBeenCalledTimes(2) + expect(sinkFn).toHaveBeenCalledWith([2]) + + queue.stop() + }) + + it('should invoke the sink function when maxQueueSize is reached', () => { + const sinkFn = jest.fn() + const queue = new DefaultEventQueue({ + flushInterval: 100, + maxQueueSize: 3, + sink: sinkFn, + batchComparator: () => true + }) + + queue.start() + + queue.enqueue(1) + queue.enqueue(2) + expect(sinkFn).not.toHaveBeenCalled() + + queue.enqueue(3) + expect(sinkFn).toHaveBeenCalledTimes(1) + expect(sinkFn).toHaveBeenCalledWith([1, 2, 3]) + + queue.enqueue(4) + queue.enqueue(5) + queue.enqueue(6) + expect(sinkFn).toHaveBeenCalledTimes(2) + expect(sinkFn).toHaveBeenCalledWith([4, 5, 6]) + + queue.stop() + }) + + it('should invoke the sink function when the interval has expired', () => { + const sinkFn = jest.fn() + const queue = new DefaultEventQueue({ + flushInterval: 100, + maxQueueSize: 100, + sink: sinkFn, + batchComparator: () => true + }) + + queue.start() + + queue.enqueue(1) + queue.enqueue(2) + expect(sinkFn).not.toHaveBeenCalled() + + jest.advanceTimersByTime(100) + + expect(sinkFn).toHaveBeenCalledTimes(1) + expect(sinkFn).toHaveBeenCalledWith([1, 2]) + + queue.enqueue(3) + jest.advanceTimersByTime(100) + + expect(sinkFn).toHaveBeenCalledTimes(2) + expect(sinkFn).toHaveBeenCalledWith([3]) + + queue.stop() + }) + + it('should invoke the sink function when an item incompatable with the current batch (according to batchComparator) is received', () => { + const sinkFn = jest.fn() + const queue = new DefaultEventQueue({ + flushInterval: 100, + maxQueueSize: 100, + sink: sinkFn, + // This batchComparator returns true when the argument strings start with the same letter + batchComparator: (s1, s2) => s1[0] === s2[0] + }) + + queue.start() + + queue.enqueue('a1') + queue.enqueue('a2') + // After enqueuing these strings, both starting with 'a', the sinkFn should not yet be called. Thus far all the items enqueued are + // compatible according to the batchComparator. + expect(sinkFn).not.toHaveBeenCalled() + + // Enqueuing a string starting with 'b' should cause the sinkFn to be called + queue.enqueue('b1') + expect(sinkFn).toHaveBeenCalledTimes(1) + expect(sinkFn).toHaveBeenCalledWith(['a1', 'a2']) + }) + + it('stop() should flush the existing queue and call timer.stop()', () => { + const sinkFn = jest.fn() + const queue = new DefaultEventQueue({ + flushInterval: 100, + maxQueueSize: 100, + sink: sinkFn, + batchComparator: () => true + }) + + jest.spyOn(queue.timer, 'stop') + + queue.start() + queue.enqueue(1) + + // stop + start is called when the first item is enqueued + expect(queue.timer.stop).toHaveBeenCalledTimes(1) + + queue.stop() + + expect(sinkFn).toHaveBeenCalledTimes(1) + expect(sinkFn).toHaveBeenCalledWith([1]) + expect(queue.timer.stop).toHaveBeenCalledTimes(2) + }) + + it('flush() should clear the current batch', () => { + const sinkFn = jest.fn() + const queue = new DefaultEventQueue({ + flushInterval: 100, + maxQueueSize: 100, + sink: sinkFn, + batchComparator: () => true + }) + + jest.spyOn(queue.timer, 'refresh') + + queue.start() + queue.enqueue(1) + queue.flush() + + expect(sinkFn).toHaveBeenCalledTimes(1) + expect(sinkFn).toHaveBeenCalledWith([1]) + expect(queue.timer.refresh).toBeCalledTimes(1) + + queue.stop() + }) + + it('stop() should return a promise', () => { + const promise = Promise.resolve() + const sinkFn = jest.fn().mockReturnValue(promise) + const queue = new DefaultEventQueue({ + flushInterval: 100, + maxQueueSize: 100, + sink: sinkFn, + batchComparator: () => true + }) + + expect(queue.stop()).toBe(promise) + }) + + it('should start the timer when the first event is put into the queue', () => { + const sinkFn = jest.fn() + const queue = new DefaultEventQueue({ + flushInterval: 100, + maxQueueSize: 100, + sink: sinkFn, + batchComparator: () => true + }) + + queue.start() + jest.advanceTimersByTime(99) + queue.enqueue(1) + + jest.advanceTimersByTime(2) + expect(sinkFn).toHaveBeenCalledTimes(0) + jest.advanceTimersByTime(98) + + expect(sinkFn).toHaveBeenCalledTimes(1) + expect(sinkFn).toHaveBeenCalledWith([1]) + + jest.advanceTimersByTime(500) + // ensure sink function wasnt called again since no events have + // been added + expect(sinkFn).toHaveBeenCalledTimes(1) + + queue.enqueue(2) + + jest.advanceTimersByTime(100) + expect(sinkFn).toHaveBeenCalledTimes(2) + expect(sinkFn).toHaveBeenLastCalledWith([2]) + + queue.stop() + + }) + + it('should not enqueue additional events after stop() is called', () => { + const sinkFn = jest.fn() + const queue = new DefaultEventQueue({ + flushInterval: 30000, + maxQueueSize: 3, + sink: sinkFn, + batchComparator: () => true + }) + queue.start() + queue.enqueue(1) + queue.stop() + expect(sinkFn).toHaveBeenCalledTimes(1) + expect(sinkFn).toHaveBeenCalledWith([1]) + sinkFn.mockClear() + queue.enqueue(2) + queue.enqueue(3) + queue.enqueue(4) + expect(sinkFn).toBeCalledTimes(0) + }) + }) +}) diff --git a/packages/optimizely-sdk/tests/pendingEventsDispatcher.spec.ts b/packages/optimizely-sdk/tests/pendingEventsDispatcher.spec.ts new file mode 100644 index 000000000..faa22b119 --- /dev/null +++ b/packages/optimizely-sdk/tests/pendingEventsDispatcher.spec.ts @@ -0,0 +1,261 @@ +/** + * Copyright 2019, Optimizely + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/// + +jest.mock('../lib/utils/fns', () => ({ + __esModule: true, + uuid: jest.fn(), + getTimestamp: jest.fn(), + objectValues: jest.requireActual('../lib/utils/fns').objectValues, +})) + +import { + LocalStoragePendingEventsDispatcher, + PendingEventsDispatcher, + DispatcherEntry, +} from '../lib/modules/event_processor/pendingEventsDispatcher' +import { EventDispatcher, EventV1Request } from '../lib/modules/event_processor/eventDispatcher' +import { EventV1 } from '../lib/modules/event_processor/v1/buildEventV1' +import { PendingEventsStore, LocalStorageStore } from '../lib/modules/event_processor/pendingEventsStore' +import { uuid, getTimestamp } from '../lib/utils/fns' + +describe('LocalStoragePendingEventsDispatcher', () => { + let originalEventDispatcher: EventDispatcher + let pendingEventsDispatcher: PendingEventsDispatcher + + beforeEach(() => { + originalEventDispatcher = { + dispatchEvent: jest.fn(), + } + pendingEventsDispatcher = new LocalStoragePendingEventsDispatcher({ + eventDispatcher: originalEventDispatcher, + }) + ;((getTimestamp as unknown) as jest.Mock).mockReturnValue(1) + ;((uuid as unknown) as jest.Mock).mockReturnValue('uuid') + }) + + afterEach(() => { + localStorage.clear() + }) + + it('should properly send the events to the passed in eventDispatcher, when callback statusCode=200', () => { + const callback = jest.fn() + const eventV1Request: EventV1Request = { + url: 'http://cdn.com', + httpVerb: 'POST', + params: ({ id: 'event' } as unknown) as EventV1, + } + + pendingEventsDispatcher.dispatchEvent(eventV1Request, callback) + + expect(callback).not.toHaveBeenCalled() + // manually invoke original eventDispatcher callback + const internalDispatchCall = ((originalEventDispatcher.dispatchEvent as unknown) as jest.Mock) + .mock.calls[0] + internalDispatchCall[1]({ statusCode: 200 }) + + // assert that the original dispatch function was called with the request + expect((originalEventDispatcher.dispatchEvent as unknown) as jest.Mock).toBeCalledTimes(1) + expect(internalDispatchCall[0]).toEqual(eventV1Request) + + // assert that the passed in callback to pendingEventsDispatcher was called + expect(callback).toHaveBeenCalledTimes(1) + expect(callback).toHaveBeenCalledWith({ statusCode: 200 }) + }) + + it('should properly send the events to the passed in eventDispatcher, when callback statusCode=400', () => { + const callback = jest.fn() + const eventV1Request: EventV1Request = { + url: 'http://cdn.com', + httpVerb: 'POST', + params: ({ id: 'event' } as unknown) as EventV1, + } + + pendingEventsDispatcher.dispatchEvent(eventV1Request, callback) + + expect(callback).not.toHaveBeenCalled() + // manually invoke original eventDispatcher callback + const internalDispatchCall = ((originalEventDispatcher.dispatchEvent as unknown) as jest.Mock) + .mock.calls[0] + internalDispatchCall[1]({ statusCode: 400 }) + + // assert that the original dispatch function was called with the request + expect((originalEventDispatcher.dispatchEvent as unknown) as jest.Mock).toBeCalledTimes(1) + expect(internalDispatchCall[0]).toEqual(eventV1Request) + + // assert that the passed in callback to pendingEventsDispatcher was called + expect(callback).toHaveBeenCalledTimes(1) + expect(callback).toHaveBeenCalledWith({ statusCode: 400}) + }) +}) + +describe('PendingEventsDispatcher', () => { + let originalEventDispatcher: EventDispatcher + let pendingEventsDispatcher: PendingEventsDispatcher + let store: PendingEventsStore + + beforeEach(() => { + originalEventDispatcher = { + dispatchEvent: jest.fn(), + } + store = new LocalStorageStore({ + key: 'test', + maxValues: 3, + }) + pendingEventsDispatcher = new PendingEventsDispatcher({ + store, + eventDispatcher: originalEventDispatcher, + }) + ;((getTimestamp as unknown) as jest.Mock).mockReturnValue(1) + ;((uuid as unknown) as jest.Mock).mockReturnValue('uuid') + }) + + afterEach(() => { + localStorage.clear() + }) + + describe('dispatch', () => { + describe('when the dispatch is successful', () => { + it('should save the pendingEvent to the store and remove it once dispatch is completed', () => { + const callback = jest.fn() + const eventV1Request: EventV1Request = { + url: 'http://cdn.com', + httpVerb: 'POST', + params: ({ id: 'event' } as unknown) as EventV1, + } + + pendingEventsDispatcher.dispatchEvent(eventV1Request, callback) + + expect(store.values()).toHaveLength(1) + expect(store.get('uuid')).toEqual({ + uuid: 'uuid', + timestamp: 1, + request: eventV1Request, + }) + expect(callback).not.toHaveBeenCalled() + + // manually invoke original eventDispatcher callback + const internalDispatchCall = ((originalEventDispatcher.dispatchEvent as unknown) as jest.Mock) + .mock.calls[0] + const internalCallback = internalDispatchCall[1]({ statusCode: 200 }) + + // assert that the original dispatch function was called with the request + expect( + (originalEventDispatcher.dispatchEvent as unknown) as jest.Mock, + ).toBeCalledTimes(1) + expect(internalDispatchCall[0]).toEqual(eventV1Request) + + // assert that the passed in callback to pendingEventsDispatcher was called + expect(callback).toHaveBeenCalledTimes(1) + expect(callback).toHaveBeenCalledWith({ statusCode: 200 }) + + expect(store.values()).toHaveLength(0) + }) + }) + + describe('when the dispatch is unsuccessful', () => { + it('should save the pendingEvent to the store and remove it once dispatch is completed', () => { + const callback = jest.fn() + const eventV1Request: EventV1Request = { + url: 'http://cdn.com', + httpVerb: 'POST', + params: ({ id: 'event' } as unknown) as EventV1, + } + + pendingEventsDispatcher.dispatchEvent(eventV1Request, callback) + + expect(store.values()).toHaveLength(1) + expect(store.get('uuid')).toEqual({ + uuid: 'uuid', + timestamp: 1, + request: eventV1Request, + }) + expect(callback).not.toHaveBeenCalled() + + // manually invoke original eventDispatcher callback + const internalDispatchCall = ((originalEventDispatcher.dispatchEvent as unknown) as jest.Mock) + .mock.calls[0] + internalDispatchCall[1]({ statusCode: 400 }) + + // assert that the original dispatch function was called with the request + expect( + (originalEventDispatcher.dispatchEvent as unknown) as jest.Mock, + ).toBeCalledTimes(1) + expect(internalDispatchCall[0]).toEqual(eventV1Request) + + // assert that the passed in callback to pendingEventsDispatcher was called + expect(callback).toHaveBeenCalledTimes(1) + expect(callback).toHaveBeenCalledWith({ statusCode: 400 }) + + expect(store.values()).toHaveLength(0) + }) + }) + }) + + describe('sendPendingEvents', () => { + describe('when no pending events are in the store', () => { + it('should not invoked dispatch', () => { + expect(store.values()).toHaveLength(0) + + pendingEventsDispatcher.sendPendingEvents() + expect(originalEventDispatcher.dispatchEvent).not.toHaveBeenCalled() + }) + }) + + describe('when there are multiple pending events in the store', () => { + it('should dispatch all of the pending events, and remove them from store', () => { + expect(store.values()).toHaveLength(0) + + const callback = jest.fn() + const eventV1Request1: EventV1Request = { + url: 'http://cdn.com', + httpVerb: 'POST', + params: ({ id: 'event1' } as unknown) as EventV1, + } + + const eventV1Request2: EventV1Request = { + url: 'http://cdn.com', + httpVerb: 'POST', + params: ({ id: 'event2' } as unknown) as EventV1, + } + + store.set('uuid1', { + uuid: 'uuid1', + timestamp: 1, + request: eventV1Request1, + }) + store.set('uuid2', { + uuid: 'uuid2', + timestamp: 2, + request: eventV1Request2, + }) + + expect(store.values()).toHaveLength(2) + + pendingEventsDispatcher.sendPendingEvents() + expect(originalEventDispatcher.dispatchEvent).toHaveBeenCalledTimes(2) + + // manually invoke original eventDispatcher callback + const internalDispatchCalls = ((originalEventDispatcher.dispatchEvent as unknown) as jest.Mock) + .mock.calls + internalDispatchCalls[0][1]({ statusCode: 200 }) + internalDispatchCalls[1][1]({ statusCode: 200 }) + + expect(store.values()).toHaveLength(0) + }) + }) + }) +}) diff --git a/packages/optimizely-sdk/tests/pendingEventsStore.spec.ts b/packages/optimizely-sdk/tests/pendingEventsStore.spec.ts new file mode 100644 index 000000000..4b0f4758a --- /dev/null +++ b/packages/optimizely-sdk/tests/pendingEventsStore.spec.ts @@ -0,0 +1,143 @@ +/** + * Copyright 2019, Optimizely + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/// + +import { LocalStorageStore } from '../lib/modules/event_processor/pendingEventsStore' + +type TestEntry = { + uuid: string + timestamp: number + value: string +} + +describe('LocalStorageStore', () => { + let store: LocalStorageStore + beforeEach(() => { + store = new LocalStorageStore({ + key: 'test_key', + maxValues: 3, + }) + }) + + afterEach(() => { + localStorage.clear() + }) + + it('should get, set and remove items', () => { + store.set('1', { + uuid: '1', + timestamp: 1, + value: 'first', + }) + + expect(store.get('1')).toEqual({ + uuid: '1', + timestamp: 1, + value: 'first', + }) + + store.set('1', { + uuid: '1', + timestamp: 2, + value: 'second', + }) + + expect(store.get('1')).toEqual({ + uuid: '1', + timestamp: 2, + value: 'second', + }) + + expect(store.values()).toHaveLength(1) + + store.remove('1') + + expect(store.values()).toHaveLength(0) + }) + + it('should allow replacement of the entire map', () => { + store.set('1', { + uuid: '1', + timestamp: 1, + value: 'first', + }) + + store.set('2', { + uuid: '2', + timestamp: 2, + value: 'second', + }) + + store.set('3', { + uuid: '3', + timestamp: 3, + value: 'third', + }) + + expect(store.values()).toEqual([ + { uuid: '1', timestamp: 1, value: 'first' }, + { uuid: '2', timestamp: 2, value: 'second' }, + { uuid: '3', timestamp: 3, value: 'third' }, + ]) + + const newMap: { [key: string]: TestEntry } = {} + store.values().forEach(item => { + newMap[item.uuid] = { + ...item, + value: 'new', + } + }) + store.replace(newMap) + + expect(store.values()).toEqual([ + { uuid: '1', timestamp: 1, value: 'new' }, + { uuid: '2', timestamp: 2, value: 'new' }, + { uuid: '3', timestamp: 3, value: 'new' }, + ]) + }) + + it(`shouldn't allow more than the configured maxValues, using timestamp to remove the oldest entries`, () => { + store.set('2', { + uuid: '2', + timestamp: 2, + value: 'second', + }) + + store.set('3', { + uuid: '3', + timestamp: 3, + value: 'third', + }) + + store.set('1', { + uuid: '1', + timestamp: 1, + value: 'first', + }) + + store.set('4', { + uuid: '4', + timestamp: 4, + value: 'fourth', + }) + + expect(store.values()).toEqual([ + { uuid: '2', timestamp: 2, value: 'second' }, + { uuid: '3', timestamp: 3, value: 'third' }, + { uuid: '4', timestamp: 4, value: 'fourth' }, + ]) + }) +}) diff --git a/packages/optimizely-sdk/tests/reactNativeEventsStore.spec.ts b/packages/optimizely-sdk/tests/reactNativeEventsStore.spec.ts new file mode 100644 index 000000000..4e36dbf17 --- /dev/null +++ b/packages/optimizely-sdk/tests/reactNativeEventsStore.spec.ts @@ -0,0 +1,219 @@ +/** + * Copyright 2020, Optimizely + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/// + +import { ReactNativeEventsStore } from '../lib/modules/event_processor/reactNativeEventsStore' +import AsyncStorage from '../__mocks__/@react-native-async-storage/async-storage' + +const STORE_KEY = 'test-store' + +describe('ReactNativeEventsStore', () => { + let store: ReactNativeEventsStore + + beforeEach(() => { + store = new ReactNativeEventsStore(5, STORE_KEY) + }) + + describe('set', () => { + it('should store all the events correctly in the store', async () => { + await store.set('event1', {'name': 'event1'}) + await store.set('event2', {'name': 'event2'}) + await store.set('event3', {'name': 'event3'}) + await store.set('event4', {'name': 'event4'}) + const storedPendingEvents = JSON.parse(AsyncStorage.dumpItems()[STORE_KEY]) + expect(storedPendingEvents).toEqual({ + "event1": { "name": "event1" }, + "event2": { "name": "event2" }, + "event3": { "name": "event3" }, + "event4": { "name": "event4" }, + }) + }) + + it('should store all the events when set asynchronously', async (done) => { + const promises = [] + promises.push(store.set('event1', {'name': 'event1'})) + promises.push(store.set('event2', {'name': 'event2'})) + promises.push(store.set('event3', {'name': 'event3'})) + promises.push(store.set('event4', {'name': 'event4'})) + Promise.all(promises).then(() => { + const storedPendingEvents = JSON.parse(AsyncStorage.dumpItems()[STORE_KEY]) + expect(storedPendingEvents).toEqual({ + "event1": { "name": "event1" }, + "event2": { "name": "event2" }, + "event3": { "name": "event3" }, + "event4": { "name": "event4" }, + }) + done() + }) + }) + }) + + describe('get', () => { + it('should correctly get items', async () => { + await store.set('event1', {'name': 'event1'}) + await store.set('event2', {'name': 'event2'}) + await store.set('event3', {'name': 'event3'}) + await store.set('event4', {'name': 'event4'}) + expect(await store.get('event1')).toEqual({'name': 'event1'}) + expect(await store.get('event2')).toEqual({'name': 'event2'}) + expect(await store.get('event3')).toEqual({'name': 'event3'}) + expect(await store.get('event4')).toEqual({'name': 'event4'}) + }) + }) + + describe('getEventsMap', () => { + it('should get the whole map correctly', async () => { + await store.set('event1', {'name': 'event1'}) + await store.set('event2', {'name': 'event2'}) + await store.set('event3', {'name': 'event3'}) + await store.set('event4', {'name': 'event4'}) + const mapResult = await store.getEventsMap() + expect(mapResult).toEqual({ + "event1": { "name": "event1" }, + "event2": { "name": "event2" }, + "event3": { "name": "event3" }, + "event4": { "name": "event4" }, + }) + }) + }) + + describe('getEventsList', () => { + it('should get all the events as a list', async () => { + await store.set('event1', {'name': 'event1'}) + await store.set('event2', {'name': 'event2'}) + await store.set('event3', {'name': 'event3'}) + await store.set('event4', {'name': 'event4'}) + const listResult = await store.getEventsList() + expect(listResult).toEqual([ + { "name": "event1" }, + { "name": "event2" }, + { "name": "event3" }, + { "name": "event4" }, + ]) + }) + }) + + describe('remove', () => { + it('should correctly remove items from the store', async () => { + await store.set('event1', {'name': 'event1'}) + await store.set('event2', {'name': 'event2'}) + await store.set('event3', {'name': 'event3'}) + await store.set('event4', {'name': 'event4'}) + let storedPendingEvents = JSON.parse(AsyncStorage.dumpItems()[STORE_KEY]) + expect(storedPendingEvents).toEqual({ + "event1": { "name": "event1" }, + "event2": { "name": "event2" }, + "event3": { "name": "event3" }, + "event4": { "name": "event4" }, + }) + + await store.remove('event1') + storedPendingEvents = JSON.parse(AsyncStorage.dumpItems()[STORE_KEY]) + expect(storedPendingEvents).toEqual({ + "event2": { "name": "event2" }, + "event3": { "name": "event3" }, + "event4": { "name": "event4" }, + }) + + await store.remove('event2') + storedPendingEvents = JSON.parse(AsyncStorage.dumpItems()[STORE_KEY]) + expect(storedPendingEvents).toEqual({ + "event3": { "name": "event3" }, + "event4": { "name": "event4" }, + }) + }) + + it('should correctly remove items from the store when removed asynchronously', async (done) => { + await store.set('event1', {'name': 'event1'}) + await store.set('event2', {'name': 'event2'}) + await store.set('event3', {'name': 'event3'}) + await store.set('event4', {'name': 'event4'}) + let storedPendingEvents = JSON.parse(AsyncStorage.dumpItems()[STORE_KEY]) + expect(storedPendingEvents).toEqual({ + "event1": { "name": "event1" }, + "event2": { "name": "event2" }, + "event3": { "name": "event3" }, + "event4": { "name": "event4" }, + }) + + const promises = [] + promises.push(store.remove('event1')) + promises.push(store.remove('event2')) + promises.push(store.remove('event3')) + Promise.all(promises).then(() => { + let storedPendingEvents = JSON.parse(AsyncStorage.dumpItems()[STORE_KEY]) + expect(storedPendingEvents).toEqual({ "event4": { "name": "event4" }}) + done() + }) + }) + }) + + describe('clear', () => { + it('should clear the whole store',async () => { + await store.set('event1', {'name': 'event1'}) + await store.set('event2', {'name': 'event2'}) + await store.set('event3', {'name': 'event3'}) + await store.set('event4', {'name': 'event4'}) + let storedPendingEvents = JSON.parse(AsyncStorage.dumpItems()[STORE_KEY]) + expect(storedPendingEvents).toEqual({ + "event1": { "name": "event1" }, + "event2": { "name": "event2" }, + "event3": { "name": "event3" }, + "event4": { "name": "event4" }, + }) + await store.clear() + storedPendingEvents = JSON.parse(AsyncStorage.dumpItems()[STORE_KEY] || '{}') + expect(storedPendingEvents).toEqual({}) + }) + }) + + describe('maxSize', () => { + it('should not add anymore events if the store if full', async () => { + await store.set('event1', {'name': 'event1'}) + await store.set('event2', {'name': 'event2'}) + await store.set('event3', {'name': 'event3'}) + await store.set('event4', {'name': 'event4'}) + + let storedPendingEvents = JSON.parse(AsyncStorage.dumpItems()[STORE_KEY]) + expect(storedPendingEvents).toEqual({ + "event1": { "name": "event1" }, + "event2": { "name": "event2" }, + "event3": { "name": "event3" }, + "event4": { "name": "event4" }, + }) + await store.set('event5', {'name': 'event5'}) + + storedPendingEvents = JSON.parse(AsyncStorage.dumpItems()[STORE_KEY]) + expect(storedPendingEvents).toEqual({ + "event1": { "name": "event1" }, + "event2": { "name": "event2" }, + "event3": { "name": "event3" }, + "event4": { "name": "event4" }, + "event5": { "name": "event5" }, + }) + + await store.set('event6', {'name': 'event6'}) + storedPendingEvents = JSON.parse(AsyncStorage.dumpItems()[STORE_KEY]) + expect(storedPendingEvents).toEqual({ + "event1": { "name": "event1" }, + "event2": { "name": "event2" }, + "event3": { "name": "event3" }, + "event4": { "name": "event4" }, + "event5": { "name": "event5" }, + }) + }) + }) +}) diff --git a/packages/optimizely-sdk/tests/requestTracker.spec.ts b/packages/optimizely-sdk/tests/requestTracker.spec.ts new file mode 100644 index 000000000..d7c70d1dd --- /dev/null +++ b/packages/optimizely-sdk/tests/requestTracker.spec.ts @@ -0,0 +1,64 @@ +/** + * Copyright 2020, Optimizely + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import RequestTracker from '../lib/modules/event_processor/requestTracker' + +describe('requestTracker', () => { + describe('onRequestsComplete', () => { + it('returns an immediately-fulfilled promise when no requests are in flight', async () => { + const tracker = new RequestTracker() + await tracker.onRequestsComplete() + }) + + it('returns a promise that fulfills after in-flight requests are complete', async () => { + let resolveReq1: () => void + const req1 = new Promise(resolve => { + resolveReq1 = resolve + }) + let resolveReq2: () => void + const req2 = new Promise(resolve => { + resolveReq2 = resolve + }) + let resolveReq3: () => void + const req3 = new Promise(resolve => { + resolveReq3 = resolve + }) + + const tracker = new RequestTracker() + tracker.trackRequest(req1) + tracker.trackRequest(req2) + tracker.trackRequest(req3) + + let reqsComplete = false + const reqsCompletePromise = tracker.onRequestsComplete().then(() => { + reqsComplete = true + }) + + resolveReq1!() + await req1 + expect(reqsComplete).toBe(false) + + resolveReq2!() + await req2 + expect(reqsComplete).toBe(false) + + resolveReq3!() + await req3 + await reqsCompletePromise + expect(reqsComplete).toBe(true) + }) + }) +}) diff --git a/packages/optimizely-sdk/tests/v1EventProcessor.react_native.spec.ts b/packages/optimizely-sdk/tests/v1EventProcessor.react_native.spec.ts new file mode 100644 index 000000000..72e0e0e8a --- /dev/null +++ b/packages/optimizely-sdk/tests/v1EventProcessor.react_native.spec.ts @@ -0,0 +1,887 @@ +/** + * Copyright 2020, Optimizely + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/// +import { NotificationSender } from '../lib/core/notification_center' +import { NOTIFICATION_TYPES } from '../lib/utils/enums' + +import { LogTierV1EventProcessor } from '../lib/modules/event_processor/v1/v1EventProcessor.react_native' +import { + EventDispatcher, + EventV1Request, + EventDispatcherCallback, +} from '../lib/modules/event_processor/eventDispatcher' +import { EventProcessor, ProcessableEvent } from '../lib/modules/event_processor/eventProcessor' +import { buildImpressionEventV1, makeBatchedEventV1 } from '../lib/modules/event_processor/v1/buildEventV1' +import AsyncStorage from '../__mocks__/@react-native-async-storage/async-storage' +import { triggerInternetState } from '../__mocks__/@react-native-community/netinfo' +import { DefaultEventQueue } from '../lib/modules/event_processor/eventQueue' + +function createImpressionEvent() { + return { + type: 'impression' as 'impression', + timestamp: 69, + uuid: 'uuid', + + context: { + accountId: 'accountId', + projectId: 'projectId', + clientName: 'node-sdk', + clientVersion: '3.0.0', + revision: '1', + botFiltering: true, + anonymizeIP: true, + }, + + user: { + id: 'userId', + attributes: [{ entityId: 'attr1-id', key: 'attr1-key', value: 'attr1-value' }], + }, + + layer: { + id: 'layerId', + }, + + experiment: { + id: 'expId', + key: 'expKey', + }, + + variation: { + id: 'varId', + key: 'varKey', + }, + + ruleKey: 'expKey', + flagKey: 'flagKey1', + ruleType: 'experiment', + enabled: false, + } +} + +function createConversionEvent() { + return { + type: 'conversion' as 'conversion', + timestamp: 69, + uuid: 'uuid', + + context: { + accountId: 'accountId', + projectId: 'projectId', + clientName: 'node-sdk', + clientVersion: '3.0.0', + revision: '1', + botFiltering: true, + anonymizeIP: true, + }, + + user: { + id: 'userId', + attributes: [{ entityId: 'attr1-id', key: 'attr1-key', value: 'attr1-value' }], + }, + + event: { + id: 'event-id', + key: 'event-key', + }, + + tags: { + foo: 'bar', + value: '123', + revenue: '1000', + }, + + revenue: 1000, + value: 123, + } +} + +describe('LogTierV1EventProcessorReactNative', () => { + describe('New Events', () => { + let stubDispatcher: EventDispatcher + let dispatchStub: jest.Mock + + beforeEach(() => { + dispatchStub = jest.fn() + + stubDispatcher = { + dispatchEvent(event: EventV1Request, callback: EventDispatcherCallback): void { + dispatchStub(event) + callback({ statusCode: 200 }) + }, + } + }) + + afterEach(() => { + jest.resetAllMocks() + AsyncStorage.clearStore() + }) + + describe('stop()', () => { + let localCallback: EventDispatcherCallback + beforeEach(async () => { + stubDispatcher = { + dispatchEvent(event: EventV1Request, callback: EventDispatcherCallback): void { + dispatchStub(event) + localCallback = callback + }, + } + }) + + it('should return a resolved promise when there is nothing in queue', async () => { + const processor = new LogTierV1EventProcessor({ + dispatcher: stubDispatcher, + flushInterval: 100, + batchSize: 100, + }) + + await processor.start() + + await processor.stop() + }) + + it('should return a promise that is resolved when the dispatcher callback returns a 200 response', async (done) => { + const processor = new LogTierV1EventProcessor({ + dispatcher: stubDispatcher, + flushInterval: 100, + batchSize: 100, + }) + await processor.start() + const impressionEvent = createImpressionEvent() + processor.process(impressionEvent) + + await new Promise(resolve => setTimeout(resolve, 150)) + processor.stop().then(() => { + done() + }) + + localCallback({ statusCode: 200 }) + }) + + it('should return a promise that is resolved when the dispatcher callback returns a 400 response', async (done) => { + // This test is saying that even if the request fails to send but + // the `dispatcher` yielded control back, then the `.stop()` promise should be resolved + let localCallback: any + stubDispatcher = { + dispatchEvent(event: EventV1Request, callback: EventDispatcherCallback): void { + dispatchStub(event) + localCallback = callback + }, + } + + const processor = new LogTierV1EventProcessor({ + dispatcher: stubDispatcher, + flushInterval: 100, + batchSize: 100, + }) + await processor.start() + + const impressionEvent = createImpressionEvent() + processor.process(impressionEvent) + + await new Promise(resolve => setTimeout(resolve, 150)) + processor.stop().then(() => { + done() + }) + + localCallback({ statusCode: 400 }) + }) + + it('should return a promise when multiple event batches are sent', async () => { + stubDispatcher = { + dispatchEvent(event: EventV1Request, callback: EventDispatcherCallback): void { + dispatchStub(event) + callback({ statusCode: 200 }) + }, + } + + const processor = new LogTierV1EventProcessor({ + dispatcher: stubDispatcher, + flushInterval: 100, + batchSize: 100, + }) + + await processor.start() + + const impressionEvent1 = createImpressionEvent() + const impressionEvent2 = createImpressionEvent() + impressionEvent2.context.revision = '2' + processor.process(impressionEvent1) + processor.process(impressionEvent2) + + await new Promise(resolve => setTimeout(resolve, 150)) + await processor.stop() + expect(dispatchStub).toBeCalledTimes(2) + }) + + it('should stop accepting events after stop is called', async () => { + const dispatcher = { + dispatchEvent: jest.fn((event: EventV1Request, callback: EventDispatcherCallback) => { + setTimeout(() => callback({ statusCode: 204 }), 0) + }) + } + const processor = new LogTierV1EventProcessor({ + dispatcher, + flushInterval: 100, + batchSize: 3, + }) + await processor.start() + + const impressionEvent1 = createImpressionEvent() + processor.process(impressionEvent1) + await new Promise(resolve => setTimeout(resolve, 150)) + + await processor.stop() + // calling stop should haver flushed the current batch of size 1 + expect(dispatcher.dispatchEvent).toBeCalledTimes(1) + + dispatcher.dispatchEvent.mockClear(); + + // From now on, subsequent events should be ignored. + // Process 3 more, which ordinarily would have triggered + // a flush due to the batch size. + const impressionEvent2 = createImpressionEvent() + processor.process(impressionEvent2) + const impressionEvent3 = createImpressionEvent() + processor.process(impressionEvent3) + const impressionEvent4 = createImpressionEvent() + processor.process(impressionEvent4) + // Since we already stopped the processor, the dispatcher should + // not have been called again. + await new Promise(resolve => setTimeout(resolve, 150)) + expect(dispatcher.dispatchEvent).toBeCalledTimes(0) + }) + }) + + describe('when batchSize = 1', () => { + let processor: EventProcessor + beforeEach(async () => { + processor = new LogTierV1EventProcessor({ + dispatcher: stubDispatcher, + flushInterval: 100, + batchSize: 1, + }) + await processor.start() + }) + + afterEach(async () => { + await processor.stop() + }) + + it('should immediately flush events as they are processed', async () => { + const impressionEvent = createImpressionEvent() + processor.process(impressionEvent) + + await new Promise(resolve => setTimeout(resolve, 50)) + + expect(dispatchStub).toHaveBeenCalledTimes(1) + expect(dispatchStub).toHaveBeenCalledWith({ + url: 'https://logx.optimizely.com/v1/events', + httpVerb: 'POST', + params: buildImpressionEventV1(impressionEvent), + }) + }) + }) + + describe('when batchSize = 3, flushInterval = 300', () => { + let processor: EventProcessor + beforeEach(async () => { + processor = new LogTierV1EventProcessor({ + dispatcher: stubDispatcher, + flushInterval: 300, + batchSize: 3, + }) + await processor.start() + }) + + afterEach(async () => { + await processor.stop() + }) + + it('should wait until 3 events to be in the queue before it flushes', async () => { + const impressionEvent1 = createImpressionEvent() + const impressionEvent2 = createImpressionEvent() + const impressionEvent3 = createImpressionEvent() + + processor.process(impressionEvent1) + processor.process(impressionEvent2) + + await new Promise(resolve => setTimeout(resolve, 50)) + expect(dispatchStub).toHaveBeenCalledTimes(0) + + processor.process(impressionEvent3) + + await new Promise(resolve => setTimeout(resolve, 50)) + expect(dispatchStub).toHaveBeenCalledTimes(1) + expect(dispatchStub).toHaveBeenCalledWith({ + url: 'https://logx.optimizely.com/v1/events', + httpVerb: 'POST', + params: makeBatchedEventV1([ + impressionEvent1, + impressionEvent2, + impressionEvent3, + ]), + }) + }) + + it('should flush the current batch when it receives an event with a different context revision than the current batch', async () => { + const impressionEvent1 = createImpressionEvent() + const conversionEvent = createConversionEvent() + const impressionEvent2 = createImpressionEvent() + + // createImpressionEvent and createConversionEvent create events with revision '1' + // We modify this one's revision to '2' in order to test that the queue is flushed + // when an event with a different revision is processed. + impressionEvent2.context.revision = '2' + + processor.process(impressionEvent1) + processor.process(conversionEvent) + + await new Promise(resolve => setTimeout(resolve, 50)) + expect(dispatchStub).toHaveBeenCalledTimes(0) + + processor.process(impressionEvent2) + + await new Promise(resolve => setTimeout(resolve, 50)) + expect(dispatchStub).toHaveBeenCalledTimes(1) + expect(dispatchStub).toHaveBeenCalledWith({ + url: 'https://logx.optimizely.com/v1/events', + httpVerb: 'POST', + params: makeBatchedEventV1([impressionEvent1, conversionEvent]), + }) + }) + + it('should flush the current batch when it receives an event with a different context projectId than the current batch', async () => { + const impressionEvent1 = createImpressionEvent() + const conversionEvent = createConversionEvent() + const impressionEvent2 = createImpressionEvent() + + impressionEvent2.context.projectId = 'projectId2' + + processor.process(impressionEvent1) + processor.process(conversionEvent) + + await new Promise(resolve => setTimeout(resolve, 50)) + expect(dispatchStub).toHaveBeenCalledTimes(0) + + processor.process(impressionEvent2) + + await new Promise(resolve => setTimeout(resolve, 50)) + expect(dispatchStub).toHaveBeenCalledTimes(1) + expect(dispatchStub).toHaveBeenCalledWith({ + url: 'https://logx.optimizely.com/v1/events', + httpVerb: 'POST', + params: makeBatchedEventV1([impressionEvent1, conversionEvent]), + }) + }) + + it('should flush the queue when the flush interval happens', async () => { + const impressionEvent1 = createImpressionEvent() + + processor.process(impressionEvent1) + + expect(dispatchStub).toHaveBeenCalledTimes(0) + + await new Promise(resolve => setTimeout(resolve, 350)) + + expect(dispatchStub).toHaveBeenCalledTimes(1) + expect(dispatchStub).toHaveBeenCalledWith({ + url: 'https://logx.optimizely.com/v1/events', + httpVerb: 'POST', + params: makeBatchedEventV1([impressionEvent1]), + }) + + processor.process(createImpressionEvent()) + processor.process(createImpressionEvent()) + // flushing should reset queue, at this point only has two events + expect(dispatchStub).toHaveBeenCalledTimes(1) + }) + }) + + describe('when a notification center is provided', () => { + it('should trigger a notification when the event dispatcher dispatches an event', async () => { + const dispatcher: EventDispatcher = { + dispatchEvent: jest.fn() + } + + const notificationCenter: NotificationSender = { + sendNotifications: jest.fn() + } + + const processor = new LogTierV1EventProcessor({ + dispatcher, + notificationCenter, + batchSize: 1, + }) + await processor.start() + + const impressionEvent1 = createImpressionEvent() + processor.process(impressionEvent1) + + await new Promise(resolve => setTimeout(resolve, 150)) + expect(notificationCenter.sendNotifications).toBeCalledTimes(1) + const event = (dispatcher.dispatchEvent as jest.Mock).mock.calls[0][0] + expect(notificationCenter.sendNotifications).toBeCalledWith(NOTIFICATION_TYPES.LOG_EVENT, event) + }) + }) + + describe('invalid batchSize', () => { + it('should ignore a batchSize of 0 and use the default', async () => { + const processor = new LogTierV1EventProcessor({ + dispatcher: stubDispatcher, + flushInterval: 30000, + batchSize: 0, + }) + await processor.start() + + const impressionEvent1 = createImpressionEvent() + processor.process(impressionEvent1) + + await new Promise(resolve => setTimeout(resolve, 150)) + expect(dispatchStub).toHaveBeenCalledTimes(0) + const impressionEvents = [impressionEvent1] + for (let i = 0; i < 9; i++) { + const evt = createImpressionEvent() + processor.process(evt) + impressionEvents.push(evt) + } + + await new Promise(resolve => setTimeout(resolve, 150)) + expect(dispatchStub).toHaveBeenCalledTimes(1) + expect(dispatchStub).toHaveBeenCalledWith({ + url: 'https://logx.optimizely.com/v1/events', + httpVerb: 'POST', + params: makeBatchedEventV1(impressionEvents), + }) + }) + }) + }) + + describe('Pending Events', () => { + let stubDispatcher: EventDispatcher + let dispatchStub: jest.Mock + + beforeEach(() => { + dispatchStub = jest.fn() + }) + + afterEach(() => { + jest.clearAllMocks() + AsyncStorage.clearStore() + }) + + describe('Retry Pending Events', () => { + describe('App start', () => { + it('should dispatch all the pending events in correct order', async () => { + let receivedEvents: EventV1Request[] = [] + + stubDispatcher = { + dispatchEvent(event: EventV1Request, callback: EventDispatcherCallback): void { + dispatchStub(event) + callback({ statusCode: 400 }) + }, + } + + let processor = new LogTierV1EventProcessor({ + dispatcher: stubDispatcher, + flushInterval: 100, + batchSize: 1, + }) + + await processor.start() + let event1 = createConversionEvent() + event1.user.id = 'user1' + let event2 = createConversionEvent() + event2.user.id = 'user2' + let event3 = createConversionEvent() + event3.user.id = 'user3' + let event4 = createConversionEvent() + event4.user.id = 'user4' + + processor.process(event1) + processor.process(event2) + processor.process(event3) + processor.process(event4) + + await new Promise(resolve => setTimeout(resolve, 100)) + + expect(dispatchStub).toBeCalledTimes(4) + + await processor.stop() + + jest.clearAllMocks() + + receivedEvents = [] + stubDispatcher = { + dispatchEvent(event: EventV1Request, callback: EventDispatcherCallback): void { + receivedEvents.push(event) + dispatchStub(event) + callback({ statusCode: 200 }) + }, + } + + processor = new LogTierV1EventProcessor({ + dispatcher: stubDispatcher, + flushInterval: 100, + batchSize: 1, + }) + + await processor.start() + + receivedEvents.forEach((e, i) => { + expect(e.params.visitors[0].visitor_id).toEqual(`user${i+1}`) + }) + + expect(dispatchStub).toBeCalledTimes(4) + + await processor.stop() + }) + + it('should process all the events left in buffer when the app closed last time', async () => { + stubDispatcher = { + dispatchEvent(event: EventV1Request, callback: EventDispatcherCallback): void { + dispatchStub(event) + callback({ statusCode: 200 }) + }, + } + + let processor = new LogTierV1EventProcessor({ + dispatcher: stubDispatcher, + flushInterval: 1000, + batchSize: 4, + }) + + await processor.start() + let event1 = createConversionEvent() + event1.user.id = 'user1' + event1.uuid = 'user1' + let event2 = createConversionEvent() + event2.user.id = 'user2' + event2.uuid = 'user2' + + processor.process(event1) + processor.process(event2) + + await new Promise(resolve => setTimeout(resolve, 100)) + + // Explicitly stopping the timer to simulate app close + ;(processor.queue as DefaultEventQueue).timer.stop() + + let receivedEvents: EventV1Request[] = [] + stubDispatcher = { + dispatchEvent(event: EventV1Request, callback: EventDispatcherCallback): void { + receivedEvents.push(event) + dispatchStub(event) + callback({ statusCode: 200 }) + }, + } + + processor = new LogTierV1EventProcessor({ + dispatcher: stubDispatcher, + flushInterval: 100, + batchSize: 4, + }) + + await processor.start() + + await new Promise(resolve => setTimeout(resolve, 150)) + expect(dispatchStub).toBeCalledTimes(1) + expect(receivedEvents.length).toEqual(1) + const receivedEvent = receivedEvents[0] + + receivedEvent.params.visitors.forEach((v, i) => { + expect(v.visitor_id).toEqual(`user${i+1}`) + }) + + await processor.stop() + }) + + it('should dispatch pending events first and then process events in buffer store', async () => { + stubDispatcher = { + dispatchEvent(event: EventV1Request, callback: EventDispatcherCallback): void { + dispatchStub(event) + callback({ statusCode: 400 }) + }, + } + + let processor = new LogTierV1EventProcessor({ + dispatcher: stubDispatcher, + flushInterval: 300, + batchSize: 3, + }) + + await processor.start() + + for (let i = 0; i < 8; i++) { + let event = createConversionEvent() + event.user.id = `user${i}` + event.uuid = `user${i}` + processor.process(event) + } + + await new Promise(resolve => setTimeout(resolve, 50)) + + expect(dispatchStub).toBeCalledTimes(2) + + ;(processor.queue as DefaultEventQueue).timer.stop() + + jest.clearAllMocks() + + const visitorIds: string[] = [] + stubDispatcher = { + dispatchEvent(event: EventV1Request, callback: EventDispatcherCallback): void { + dispatchStub(event) + event.params.visitors.forEach(visitor => visitorIds.push(visitor.visitor_id)) + callback({ statusCode: 200 }) + }, + } + + processor = new LogTierV1EventProcessor({ + dispatcher: stubDispatcher, + flushInterval: 200, + batchSize: 3, + }) + + await processor.start() + + expect(dispatchStub).toBeCalledTimes(2) + + await new Promise(resolve => setTimeout(resolve, 250)) + expect(visitorIds.length).toEqual(8) + expect(visitorIds).toEqual(['user0', 'user1', 'user2', 'user3', 'user4', 'user5', 'user6', 'user7']) + }) + }) + + describe('When a new event is dispatched', () => { + it('should dispatch all the pending events first and then new event in correct order', async () => { + let receivedVisitorIds: string[] = [] + let dispatchCount = 0 + stubDispatcher = { + dispatchEvent(event: EventV1Request, callback: EventDispatcherCallback): void { + dispatchStub(event) + dispatchCount++ + if (dispatchCount > 4) { + event.params.visitors.forEach(visitor => receivedVisitorIds.push(visitor.visitor_id)) + callback({ statusCode: 200 }) + } else { + callback({ statusCode: 400 }) + } + }, + } + + let processor = new LogTierV1EventProcessor({ + dispatcher: stubDispatcher, + flushInterval: 100, + batchSize: 1, + }) + + await processor.start() + let event1 = createConversionEvent() + event1.user.id = event1.uuid = 'user1' + let event2 = createConversionEvent() + event2.user.id = event2.uuid = 'user2' + let event3 = createConversionEvent() + event3.user.id = event3.uuid = 'user3' + let event4 = createConversionEvent() + event4.user.id = event4.uuid = 'user4' + + processor.process(event1) + processor.process(event2) + processor.process(event3) + processor.process(event4) + + await new Promise(resolve => setTimeout(resolve, 100)) + + // Four events will return response code 400 which means only the first pending event will be tried each time and rest will be skipped + expect(dispatchStub).toBeCalledTimes(4) + + jest.resetAllMocks() + + let event5 = createConversionEvent() + event5.user.id = event5.uuid = 'user5' + + processor.process(event5) + + await new Promise(resolve => setTimeout(resolve, 100)) + expect(dispatchStub).toBeCalledTimes(5) + expect(receivedVisitorIds).toEqual(['user1', 'user2', 'user3', 'user4', 'user5']) + await processor.stop() + }) + + it('should skip dispatching subsequent events if an event fails to dispatch', async () => { + let receivedVisitorIds: string[] = [] + let dispatchCount = 0 + stubDispatcher = { + dispatchEvent(event: EventV1Request, callback: EventDispatcherCallback): void { + dispatchStub(event) + dispatchCount++ + event.params.visitors.forEach(visitor => receivedVisitorIds.push(visitor.visitor_id)) + callback({ statusCode: 400 }) + }, + } + + let processor = new LogTierV1EventProcessor({ + dispatcher: stubDispatcher, + flushInterval: 100, + batchSize: 1, + }) + + await processor.start() + let event1 = createConversionEvent() + event1.user.id = event1.uuid = 'user1' + let event2 = createConversionEvent() + event2.user.id = event2.uuid = 'user2' + let event3 = createConversionEvent() + event3.user.id = event3.uuid = 'user3' + let event4 = createConversionEvent() + event4.user.id = event4.uuid = 'user4' + + processor.process(event1) + await new Promise(resolve => setTimeout(resolve, 50)) + expect(dispatchStub).toBeCalledTimes(1) + + processor.process(event2) + await new Promise(resolve => setTimeout(resolve, 50)) + expect(dispatchStub).toBeCalledTimes(2) + + processor.process(event3) + await new Promise(resolve => setTimeout(resolve, 50)) + expect(dispatchStub).toBeCalledTimes(3) + + processor.process(event4) + await new Promise(resolve => setTimeout(resolve, 50)) + expect(dispatchStub).toBeCalledTimes(4) + + expect(dispatchCount).toEqual(4) + + // subsequent events were skipped with each attempt because of request failure + expect(receivedVisitorIds).toEqual(['user1', 'user1', 'user1', 'user1']) + await processor.stop() + }) + }) + + describe('When internet connection is restored', () => { + it('should dispatch all the pending events in correct order when internet connection is restored', async () => { + let receivedVisitorIds: string[] = [] + let dispatchCount = 0 + stubDispatcher = { + dispatchEvent(event: EventV1Request, callback: EventDispatcherCallback): void { + dispatchStub(event) + dispatchCount++ + if (dispatchCount > 4) { + event.params.visitors.forEach(visitor => receivedVisitorIds.push(visitor.visitor_id)) + callback({ statusCode: 200 }) + } else { + callback({ statusCode: 400 }) + } + }, + } + + let processor = new LogTierV1EventProcessor({ + dispatcher: stubDispatcher, + flushInterval: 100, + batchSize: 1, + }) + + await processor.start() + triggerInternetState(false) + let event1 = createConversionEvent() + event1.user.id = event1.uuid = 'user1' + let event2 = createConversionEvent() + event2.user.id = event2.uuid = 'user2' + let event3 = createConversionEvent() + event3.user.id = event3.uuid = 'user3' + let event4 = createConversionEvent() + event4.user.id = event4.uuid = 'user4' + + processor.process(event1) + processor.process(event2) + processor.process(event3) + processor.process(event4) + + await new Promise(resolve => setTimeout(resolve, 50)) + + // Four events will return response code 400 which means only the first pending event will be tried each time and rest will be skipped + expect(dispatchStub).toBeCalledTimes(4) + + jest.resetAllMocks() + + triggerInternetState(true) + await new Promise(resolve => setTimeout(resolve, 50)) + expect(dispatchStub).toBeCalledTimes(4) + expect(receivedVisitorIds).toEqual(['user1', 'user2', 'user3', 'user4']) + await processor.stop() + }) + + it('should not dispatch duplicate events if internet is lost and restored twice in a short interval', async () => { + let receivedVisitorIds: string[] = [] + let dispatchCount = 0 + stubDispatcher = { + dispatchEvent(event: EventV1Request, callback: EventDispatcherCallback): void { + dispatchStub(event) + dispatchCount++ + if (dispatchCount > 4) { + event.params.visitors.forEach(visitor => receivedVisitorIds.push(visitor.visitor_id)) + callback({ statusCode: 200 }) + } else { + callback({ statusCode: 400 }) + } + }, + } + + let processor = new LogTierV1EventProcessor({ + dispatcher: stubDispatcher, + flushInterval: 100, + batchSize: 1, + }) + + await processor.start() + triggerInternetState(false) + let event1 = createConversionEvent() + event1.user.id = event1.uuid = 'user1' + let event2 = createConversionEvent() + event2.user.id = event2.uuid = 'user2' + let event3 = createConversionEvent() + event3.user.id = event3.uuid = 'user3' + let event4 = createConversionEvent() + event4.user.id = event4.uuid = 'user4' + + processor.process(event1) + processor.process(event2) + processor.process(event3) + processor.process(event4) + + await new Promise(resolve => setTimeout(resolve, 100)) + + // Four events will return response code 400 which means only the first pending event will be tried each time and rest will be skipped + expect(dispatchStub).toBeCalledTimes(4) + + jest.resetAllMocks() + + triggerInternetState(true) + triggerInternetState(false) + triggerInternetState(true) + triggerInternetState(false) + triggerInternetState(true) + + await new Promise(resolve => setTimeout(resolve, 100)) + expect(dispatchStub).toBeCalledTimes(4) + expect(receivedVisitorIds).toEqual(['user1', 'user2', 'user3', 'user4']) + await processor.stop() + }) + }) + }) + }) +}) diff --git a/packages/optimizely-sdk/tests/v1EventProcessor.spec.ts b/packages/optimizely-sdk/tests/v1EventProcessor.spec.ts new file mode 100644 index 000000000..d4ddcbddf --- /dev/null +++ b/packages/optimizely-sdk/tests/v1EventProcessor.spec.ts @@ -0,0 +1,530 @@ +/** + * Copyright 2019-2020, Optimizely + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/// + +import { LogTierV1EventProcessor } from '../lib/modules/event_processor/v1/v1EventProcessor' +import { + EventDispatcher, + EventV1Request, + EventDispatcherCallback, +} from '../lib/modules/event_processor/eventDispatcher' +import { EventProcessor } from '../lib/modules/event_processor/eventProcessor' +import { buildImpressionEventV1, makeBatchedEventV1 } from '../lib/modules/event_processor/v1/buildEventV1' +import { NotificationCenter, NotificationSender } from '../lib/core/notification_center' +import { NOTIFICATION_TYPES } from '../lib/utils/enums' + +function createImpressionEvent() { + return { + type: 'impression' as 'impression', + timestamp: 69, + uuid: 'uuid', + + context: { + accountId: 'accountId', + projectId: 'projectId', + clientName: 'node-sdk', + clientVersion: '3.0.0', + revision: '1', + botFiltering: true, + anonymizeIP: true, + }, + + user: { + id: 'userId', + attributes: [{ entityId: 'attr1-id', key: 'attr1-key', value: 'attr1-value' }], + }, + + layer: { + id: 'layerId', + }, + + experiment: { + id: 'expId', + key: 'expKey', + }, + + variation: { + id: 'varId', + key: 'varKey', + }, + + ruleKey: 'expKey', + flagKey: 'flagKey1', + ruleType: 'experiment', + enabled: true, + } +} + +function createConversionEvent() { + return { + type: 'conversion' as 'conversion', + timestamp: 69, + uuid: 'uuid', + + context: { + accountId: 'accountId', + projectId: 'projectId', + clientName: 'node-sdk', + clientVersion: '3.0.0', + revision: '1', + botFiltering: true, + anonymizeIP: true, + }, + + user: { + id: 'userId', + attributes: [{ entityId: 'attr1-id', key: 'attr1-key', value: 'attr1-value' }], + }, + + event: { + id: 'event-id', + key: 'event-key', + }, + + tags: { + foo: 'bar', + value: '123', + revenue: '1000', + }, + + revenue: 1000, + value: 123, + } +} + +describe('LogTierV1EventProcessor', () => { + let stubDispatcher: EventDispatcher + let dispatchStub: jest.Mock + // TODO change this to ProjectConfig when js-sdk-models is available + let testProjectConfig: any + + beforeEach(() => { + jest.useFakeTimers() + + testProjectConfig = {} + dispatchStub = jest.fn() + + stubDispatcher = { + dispatchEvent(event: EventV1Request, callback: EventDispatcherCallback): void { + dispatchStub(event) + callback({ statusCode: 200 }) + }, + } + }) + + afterEach(() => { + jest.resetAllMocks() + }) + + describe('stop()', () => { + let localCallback: EventDispatcherCallback + beforeEach(() => { + stubDispatcher = { + dispatchEvent(event: EventV1Request, callback: EventDispatcherCallback): void { + dispatchStub(event) + localCallback = callback + }, + } + }) + + it('should return a resolved promise when there is nothing in queue', done => { + const processor = new LogTierV1EventProcessor({ + dispatcher: stubDispatcher, + flushInterval: 100, + batchSize: 100, + }) + + processor.stop().then(() => { + done() + }) + }) + + it('should return a promise that is resolved when the dispatcher callback returns a 200 response', done => { + const processor = new LogTierV1EventProcessor({ + dispatcher: stubDispatcher, + flushInterval: 100, + batchSize: 100, + }) + processor.start() + + const impressionEvent = createImpressionEvent() + processor.process(impressionEvent) + + processor.stop().then(() => { + done() + }) + + localCallback({ statusCode: 200 }) + }) + + it('should return a promise that is resolved when the dispatcher callback returns a 400 response', done => { + // This test is saying that even if the request fails to send but + // the `dispatcher` yielded control back, then the `.stop()` promise should be resolved + let localCallback: any + stubDispatcher = { + dispatchEvent(event: EventV1Request, callback: EventDispatcherCallback): void { + dispatchStub(event) + localCallback = callback + }, + } + + const processor = new LogTierV1EventProcessor({ + dispatcher: stubDispatcher, + flushInterval: 100, + batchSize: 100, + }) + processor.start() + + const impressionEvent = createImpressionEvent() + processor.process(impressionEvent) + + processor.stop().then(() => { + done() + }) + + localCallback({ + statusCode: 400, + }) + }) + + it('should return a promise when multiple event batches are sent', done => { + stubDispatcher = { + dispatchEvent(event: EventV1Request, callback: EventDispatcherCallback): void { + dispatchStub(event) + callback({ statusCode: 200 }) + }, + } + + const processor = new LogTierV1EventProcessor({ + dispatcher: stubDispatcher, + flushInterval: 100, + batchSize: 100, + }) + processor.start() + + const impressionEvent1 = createImpressionEvent() + const impressionEvent2 = createImpressionEvent() + impressionEvent2.context.revision = '2' + processor.process(impressionEvent1) + processor.process(impressionEvent2) + + processor.stop().then(() => { + expect(dispatchStub).toBeCalledTimes(2) + done() + }) + }) + + it('should stop accepting events after stop is called', () => { + const dispatcher = { + dispatchEvent: jest.fn((event: EventV1Request, callback: EventDispatcherCallback) => { + setTimeout(() => callback({ statusCode: 204 }), 0) + }) + } + const processor = new LogTierV1EventProcessor({ + dispatcher, + flushInterval: 100, + batchSize: 3, + }) + processor.start() + + const impressionEvent1 = createImpressionEvent() + processor.process(impressionEvent1) + processor.stop() + // calling stop should haver flushed the current batch of size 1 + expect(dispatcher.dispatchEvent).toBeCalledTimes(1) + + dispatcher.dispatchEvent.mockClear(); + + // From now on, subsequent events should be ignored. + // Process 3 more, which ordinarily would have triggered + // a flush due to the batch size. + const impressionEvent2 = createImpressionEvent() + processor.process(impressionEvent2) + const impressionEvent3 = createImpressionEvent() + processor.process(impressionEvent3) + const impressionEvent4 = createImpressionEvent() + processor.process(impressionEvent4) + // Since we already stopped the processor, the dispatcher should + // not have been called again. + expect(dispatcher.dispatchEvent).toBeCalledTimes(0) + }) + + it('should resolve the stop promise after all dispatcher requests are done', async () => { + const dispatchCbs: Array = [] + const dispatcher = { + dispatchEvent: jest.fn((event: EventV1Request, callback: EventDispatcherCallback) => { + dispatchCbs.push(callback) + }) + } + + const processor = new LogTierV1EventProcessor({ + dispatcher, + flushInterval: 100, + batchSize: 2, + }) + processor.start() + + for (let i = 0; i < 4; i++) { + processor.process(createImpressionEvent()) + } + expect(dispatchCbs.length).toBe(2) + + let stopPromiseResolved = false + const stopPromise = processor.stop().then(() => { + stopPromiseResolved = true + }) + expect(stopPromiseResolved).toBe(false) + + dispatchCbs[0]({ statusCode: 204 }) + jest.advanceTimersByTime(100) + expect(stopPromiseResolved).toBe(false) + dispatchCbs[1]({ statusCode: 204 }) + await stopPromise + expect(stopPromiseResolved).toBe(true) + }) + }) + + describe('when batchSize = 1', () => { + let processor: EventProcessor + beforeEach(() => { + processor = new LogTierV1EventProcessor({ + dispatcher: stubDispatcher, + flushInterval: 100, + batchSize: 1, + }) + processor.start() + }) + + afterEach(() => { + processor.stop() + }) + + it('should immediately flush events as they are processed', () => { + const impressionEvent = createImpressionEvent() + processor.process(impressionEvent) + + expect(dispatchStub).toHaveBeenCalledTimes(1) + expect(dispatchStub).toHaveBeenCalledWith({ + url: 'https://logx.optimizely.com/v1/events', + httpVerb: 'POST', + params: buildImpressionEventV1(impressionEvent), + }) + }) + }) + + describe('when batchSize = 3, flushInterval = 100', () => { + let processor: EventProcessor + beforeEach(() => { + processor = new LogTierV1EventProcessor({ + dispatcher: stubDispatcher, + flushInterval: 100, + batchSize: 3, + }) + processor.start() + }) + + afterEach(() => { + processor.stop() + }) + + it('should wait until 3 events to be in the queue before it flushes', () => { + const impressionEvent1 = createImpressionEvent() + const impressionEvent2 = createImpressionEvent() + const impressionEvent3 = createImpressionEvent() + + processor.process(impressionEvent1) + processor.process(impressionEvent2) + + expect(dispatchStub).toHaveBeenCalledTimes(0) + + processor.process(impressionEvent3) + + expect(dispatchStub).toHaveBeenCalledTimes(1) + expect(dispatchStub).toHaveBeenCalledWith({ + url: 'https://logx.optimizely.com/v1/events', + httpVerb: 'POST', + params: makeBatchedEventV1([ + impressionEvent1, + impressionEvent2, + impressionEvent3, + ]), + }) + }) + + it('should flush the current batch when it receives an event with a different context revision than the current batch', async () => { + const impressionEvent1 = createImpressionEvent() + const conversionEvent = createConversionEvent() + const impressionEvent2 = createImpressionEvent() + + // createImpressionEvent and createConversionEvent create events with revision '1' + // We modify this one's revision to '2' in order to test that the queue is flushed + // when an event with a different revision is processed. + impressionEvent2.context.revision = '2' + + processor.process(impressionEvent1) + processor.process(conversionEvent) + + expect(dispatchStub).toHaveBeenCalledTimes(0) + + processor.process(impressionEvent2) + + expect(dispatchStub).toHaveBeenCalledTimes(1) + expect(dispatchStub).toHaveBeenCalledWith({ + url: 'https://logx.optimizely.com/v1/events', + httpVerb: 'POST', + params: makeBatchedEventV1([impressionEvent1, conversionEvent]), + }) + + await processor.stop() + + expect(dispatchStub).toHaveBeenCalledTimes(2) + + expect(dispatchStub).toHaveBeenCalledWith({ + url: 'https://logx.optimizely.com/v1/events', + httpVerb: 'POST', + params: makeBatchedEventV1([impressionEvent2]), + }) + }) + + it('should flush the current batch when it receives an event with a different context projectId than the current batch', async () => { + const impressionEvent1 = createImpressionEvent() + const conversionEvent = createConversionEvent() + const impressionEvent2 = createImpressionEvent() + + impressionEvent2.context.projectId = 'projectId2' + + processor.process(impressionEvent1) + processor.process(conversionEvent) + + expect(dispatchStub).toHaveBeenCalledTimes(0) + + processor.process(impressionEvent2) + + expect(dispatchStub).toHaveBeenCalledTimes(1) + expect(dispatchStub).toHaveBeenCalledWith({ + url: 'https://logx.optimizely.com/v1/events', + httpVerb: 'POST', + params: makeBatchedEventV1([impressionEvent1, conversionEvent]), + }) + + await processor.stop() + + expect(dispatchStub).toHaveBeenCalledTimes(2) + + expect(dispatchStub).toHaveBeenCalledWith({ + url: 'https://logx.optimizely.com/v1/events', + httpVerb: 'POST', + params: makeBatchedEventV1([impressionEvent2]), + }) + }) + + it('should flush the queue when the flush interval happens', () => { + const impressionEvent1 = createImpressionEvent() + + processor.process(impressionEvent1) + + expect(dispatchStub).toHaveBeenCalledTimes(0) + + jest.advanceTimersByTime(100) + + expect(dispatchStub).toHaveBeenCalledTimes(1) + expect(dispatchStub).toHaveBeenCalledWith({ + url: 'https://logx.optimizely.com/v1/events', + httpVerb: 'POST', + params: makeBatchedEventV1([impressionEvent1]), + }) + + processor.process(createImpressionEvent()) + processor.process(createImpressionEvent()) + // flushing should reset queue, at this point only has two events + expect(dispatchStub).toHaveBeenCalledTimes(1) + }) + + }) + + describe('when a notification center is provided', () => { + it('should trigger a notification when the event dispatcher dispatches an event', () => { + const dispatcher: EventDispatcher = { + dispatchEvent: jest.fn() + } + + const notificationCenter: NotificationSender = { + sendNotifications: jest.fn() + } + + const processor = new LogTierV1EventProcessor({ + dispatcher, + notificationCenter, + batchSize: 1, + }) + processor.start() + + const impressionEvent1 = createImpressionEvent() + processor.process(impressionEvent1) + + expect(notificationCenter.sendNotifications).toBeCalledTimes(1) + const event = (dispatcher.dispatchEvent as jest.Mock).mock.calls[0][0] + expect(notificationCenter.sendNotifications).toBeCalledWith(NOTIFICATION_TYPES.LOG_EVENT, event) + }) + }) + + describe('invalid flushInterval or batchSize', () => { + it('should ignore a flushInterval of 0 and use the default', () => { + const processor = new LogTierV1EventProcessor({ + dispatcher: stubDispatcher, + flushInterval: 0, + batchSize: 10, + }) + processor.start() + + const impressionEvent1 = createImpressionEvent() + processor.process(impressionEvent1) + expect(dispatchStub).toHaveBeenCalledTimes(0) + jest.advanceTimersByTime(30000) + expect(dispatchStub).toHaveBeenCalledTimes(1) + expect(dispatchStub).toHaveBeenCalledWith({ + url: 'https://logx.optimizely.com/v1/events', + httpVerb: 'POST', + params: makeBatchedEventV1([impressionEvent1]), + }) + }) + + it('should ignore a batchSize of 0 and use the default', () => { + const processor = new LogTierV1EventProcessor({ + dispatcher: stubDispatcher, + flushInterval: 30000, + batchSize: 0, + }) + processor.start() + + const impressionEvent1 = createImpressionEvent() + processor.process(impressionEvent1) + expect(dispatchStub).toHaveBeenCalledTimes(0) + const impressionEvents = [impressionEvent1] + for (let i = 0; i < 9; i++) { + const evt = createImpressionEvent() + processor.process(evt) + impressionEvents.push(evt) + } + expect(dispatchStub).toHaveBeenCalledTimes(1) + expect(dispatchStub).toHaveBeenCalledWith({ + url: 'https://logx.optimizely.com/v1/events', + httpVerb: 'POST', + params: makeBatchedEventV1(impressionEvents), + }) + }) + }) +}) diff --git a/packages/optimizely-sdk/tsconfig.json b/packages/optimizely-sdk/tsconfig.json index 4df20d46a..3fefaecfe 100644 --- a/packages/optimizely-sdk/tsconfig.json +++ b/packages/optimizely-sdk/tsconfig.json @@ -27,6 +27,8 @@ ], "include": [ "./lib/**/*.ts", - "./lib/**/*.js" + "./lib/**/*.js", + "./lib/modules/**/*.ts", + "./lib/modules/**/**/*.ts" ] } From 2718f0fc28a934ac53365c95e6ea50e6792c2d51 Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Wed, 18 May 2022 17:50:25 +0500 Subject: [PATCH 38/59] lint fixed --- .../modules/event_processor/eventProcessor.ts | 4 ++-- .../lib/modules/event_processor/eventQueue.ts | 2 +- .../event_processor/pendingEventsDispatcher.ts | 5 ++++- .../event_processor/pendingEventsStore.ts | 2 +- .../reactNativeAsyncStorageCache.ts | 8 +++----- .../modules/event_processor/requestTracker.ts | 2 +- .../modules/event_processor/v1/buildEventV1.ts | 16 +++++++++------- .../v1/v1EventProcessor.react_native.ts | 10 ++++++---- packages/optimizely-sdk/package.json | 8 ++++---- 9 files changed, 31 insertions(+), 26 deletions(-) diff --git a/packages/optimizely-sdk/lib/modules/event_processor/eventProcessor.ts b/packages/optimizely-sdk/lib/modules/event_processor/eventProcessor.ts index 2cf3b343c..a46b31aa8 100644 --- a/packages/optimizely-sdk/lib/modules/event_processor/eventProcessor.ts +++ b/packages/optimizely-sdk/lib/modules/event_processor/eventProcessor.ts @@ -17,7 +17,7 @@ import { Managed } from './managed' import { ConversionEvent, ImpressionEvent } from './events' import { EventV1Request } from './eventDispatcher' -import { EventQueue, DefaultEventQueue, SingleEventQueue } from './eventQueue' +import { EventQueue, DefaultEventQueue, SingleEventQueue, EventQueueSink } from './eventQueue' import { getLogger } from '../logging' import { NOTIFICATION_TYPES } from '@utils/enums' import { NotificationSender } from '../../core/notification_center' @@ -57,7 +57,7 @@ export function validateAndGetBatchSize(batchSize: number): number { return batchSize } -export function getQueue(batchSize: number, flushInterval: number, sink: any, batchComparator: any): EventQueue { +export function getQueue(batchSize: number, flushInterval: number, sink: EventQueueSink, batchComparator: (eventA: ProcessableEvent, eventB: ProcessableEvent) => boolean ): EventQueue { let queue: EventQueue if (batchSize > 1) { queue = new DefaultEventQueue({ diff --git a/packages/optimizely-sdk/lib/modules/event_processor/eventQueue.ts b/packages/optimizely-sdk/lib/modules/event_processor/eventQueue.ts index dbb8bb5ef..ce8f35478 100644 --- a/packages/optimizely-sdk/lib/modules/event_processor/eventQueue.ts +++ b/packages/optimizely-sdk/lib/modules/event_processor/eventQueue.ts @@ -151,7 +151,7 @@ export class DefaultEventQueue implements EventQueue { } } - flush() { + flush() : void { this.sink(this.buffer) this.buffer = [] this.timer.stop() diff --git a/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsDispatcher.ts b/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsDispatcher.ts index 74380c2c7..a4c419f4f 100644 --- a/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsDispatcher.ts +++ b/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsDispatcher.ts @@ -60,7 +60,10 @@ export class PendingEventsDispatcher implements EventDispatcher { pendingEvents.forEach(item => { try { this.send(item, () => {}) - } catch (e) {} + } catch (e) + { + logger.debug(e) + } }) } diff --git a/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsStore.ts b/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsStore.ts index 14ce857eb..4d8dbd2fa 100644 --- a/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsStore.ts +++ b/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsStore.ts @@ -95,7 +95,7 @@ export class LocalStorageStore implements PendingEventsSto entries.sort((a, b) => a.value.timestamp - b.value.timestamp) - for (var i = 0; i < toRemove; i++) { + for (let i = 0; i < toRemove; i++) { delete map[entries[i].key] } diff --git a/packages/optimizely-sdk/lib/modules/event_processor/reactNativeAsyncStorageCache.ts b/packages/optimizely-sdk/lib/modules/event_processor/reactNativeAsyncStorageCache.ts index 54d057cb1..51886c825 100644 --- a/packages/optimizely-sdk/lib/modules/event_processor/reactNativeAsyncStorageCache.ts +++ b/packages/optimizely-sdk/lib/modules/event_processor/reactNativeAsyncStorageCache.ts @@ -23,14 +23,11 @@ export default class ReactNativeAsyncStorageCache implements PersistentKeyValueC if (!val) { return null; } - try { - return JSON.parse(val); - } catch (ex) { - throw ex; - } + return JSON.parse(val); }); } + /* eslint-disable */ set(key: string, val: any): Promise { try { return AsyncStorage.setItem(key, JSON.stringify(val)); @@ -38,6 +35,7 @@ export default class ReactNativeAsyncStorageCache implements PersistentKeyValueC return Promise.reject(ex); } } + /* eslint-enable */ contains(key: string): Promise { return AsyncStorage.getItem(key).then((val: string | null) => val !== null); diff --git a/packages/optimizely-sdk/lib/modules/event_processor/requestTracker.ts b/packages/optimizely-sdk/lib/modules/event_processor/requestTracker.ts index e3f774690..494b5864e 100644 --- a/packages/optimizely-sdk/lib/modules/event_processor/requestTracker.ts +++ b/packages/optimizely-sdk/lib/modules/event_processor/requestTracker.ts @@ -21,7 +21,7 @@ * tracked requests. */ class RequestTracker { - private reqsInFlightCount: number = 0 + private reqsInFlightCount = 0 private reqsCompleteResolvers: Array<() => void> = [] /** diff --git a/packages/optimizely-sdk/lib/modules/event_processor/v1/buildEventV1.ts b/packages/optimizely-sdk/lib/modules/event_processor/v1/buildEventV1.ts index 59ab01017..7ef6e73ac 100644 --- a/packages/optimizely-sdk/lib/modules/event_processor/v1/buildEventV1.ts +++ b/packages/optimizely-sdk/lib/modules/event_processor/v1/buildEventV1.ts @@ -23,6 +23,7 @@ type Visitor = { attributes: Visitor.Attribute[] } +// eslint-disable-next-line @typescript-eslint/no-namespace namespace Visitor { type AttributeType = 'custom' @@ -85,7 +86,7 @@ export function makeBatchedEventV1(events: ProcessableEvent[]): EventV1 { events.forEach(event => { if (event.type === 'conversion' || event.type === 'impression') { - let visitor = makeVisitor(event) + const visitor = makeVisitor(event) if (event.type === 'impression') { visitor.snapshots.push(makeDecisionSnapshot(event)) @@ -112,7 +113,7 @@ export function makeBatchedEventV1(events: ProcessableEvent[]): EventV1 { } function makeConversionSnapshot(conversion: ConversionEvent): Visitor.Snapshot { - let tags: EventTags = { + const tags: EventTags = { ...conversion.tags, } @@ -145,10 +146,10 @@ function makeConversionSnapshot(conversion: ConversionEvent): Visitor.Snapshot { function makeDecisionSnapshot(event: ImpressionEvent): Visitor.Snapshot { const { layer, experiment, variation, ruleKey, flagKey, ruleType, enabled } = event - let layerId = layer ? layer.id : null - let experimentId = experiment?.id ?? '' - let variationId = variation?.id ?? '' - let variationKey = variation ? variation.key : '' + const layerId = layer ? layer.id : null + const experimentId = experiment?.id ?? '' + const variationId = variation?.id ?? '' + const variationKey = variation ? variation.key : '' return { decisions: [ @@ -183,11 +184,12 @@ function makeVisitor(data: ImpressionEvent | ConversionEvent): Visitor { attributes: [], } + const type = 'custom' data.user.attributes.forEach(attr => { visitor.attributes.push({ entity_id: attr.entityId, key: attr.key, - type: 'custom' as 'custom', // tell the compiler this is always string "custom" + type: type as 'custom', // tell the compiler this is always string "custom" value: attr.value, }) }) diff --git a/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.react_native.ts b/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.react_native.ts index 36692bfcc..fae5d9e89 100644 --- a/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.react_native.ts +++ b/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.react_native.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { - uuid, + uuid as id, objectEntries, } from '@utils/fns' import { @@ -62,13 +62,15 @@ export class LogTierV1EventProcessor implements EventProcessor { private notificationSender?: NotificationSender private requestTracker: RequestTracker + /* eslint-disable */ private unsubscribeNetInfo: Function | null = null - private isInternetReachable: boolean = true + /* eslint-enable */ + private isInternetReachable = true private pendingEventsPromise: Promise | null = null private synchronizer: Synchronizer = new Synchronizer() // If a pending event fails to dispatch, this indicates skipping further events to preserve sequence in the next retry. - private shouldSkipDispatchToPreserveSequence: boolean = false + private shouldSkipDispatchToPreserveSequence = false /** * This Stores Formatted events before dispatching. The events are removed after they are successfully dispatched. @@ -137,7 +139,7 @@ export class LogTierV1EventProcessor implements EventProcessor { logger.debug('draining queue with %s events', buffer.length) - const eventCacheKey = uuid() + const eventCacheKey = id() const formattedEvent = formatEvents(buffer) // Store formatted event before dispatching to be retried later in case of failure. diff --git a/packages/optimizely-sdk/package.json b/packages/optimizely-sdk/package.json index a5f61451a..842d64a4b 100644 --- a/packages/optimizely-sdk/package.json +++ b/packages/optimizely-sdk/package.json @@ -49,6 +49,8 @@ "uuid": "^3.3.2" }, "devDependencies": { + "@react-native-async-storage/async-storage": "^1.2.0", + "@react-native-community/netinfo": "^5.9.4", "@rollup/plugin-commonjs": "^11.0.2", "@rollup/plugin-node-resolve": "^7.1.1", "@types/chai": "^4.2.11", @@ -62,6 +64,7 @@ "coveralls": "^3.0.2", "eslint": "^6.7.2", "jest": "^23.6.0", + "jest-localstorage-mock": "^2.4.21", "json-loader": "^0.5.4", "karma": "^4.4.1", "karma-browserstack-launcher": "^1.5.1", @@ -84,10 +87,7 @@ "ts-node": "^8.10.2", "tsconfig-paths": "^4.0.0", "typescript": "^4.0.3", - "webpack": "^4.42.1", - "@react-native-community/netinfo": "^5.9.4", - "@react-native-async-storage/async-storage": "^1.2.0", - "jest-localstorage-mock": "^2.4.0" + "webpack": "^4.42.1" }, "peerDependencies": { "@react-native-community/netinfo": "5.9.4", From 3bca0f9ea637dd86817b9d5e9954a484efa1a594 Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Thu, 4 Aug 2022 17:13:14 +0500 Subject: [PATCH 39/59] fix --- packages/optimizely-sdk/lib/core/bucketer/index.ts | 2 +- .../custom_attribute_condition_evaluator/index.ts | 6 +++--- .../lib/core/decision_service/index.ts | 6 +++--- .../lib/core/event_builder/event_helpers.ts | 6 +++--- .../optimizely-sdk/lib/core/event_builder/index.ts | 8 ++++---- .../lib/core/notification_center/index.ts | 2 +- .../lib/core/project_config/index.ts | 4 ++-- .../lib/modules/event_processor/eventProcessor.ts | 2 +- .../event_processor/pendingEventsDispatcher.ts | 2 +- .../modules/event_processor/pendingEventsStore.ts | 2 +- .../event_processor/reactNativeEventsStore.ts | 2 +- .../v1/v1EventProcessor.react_native.ts | 2 +- packages/optimizely-sdk/lib/optimizely/index.ts | 14 +++++++------- .../lib/optimizely_user_context/index.ts | 2 +- .../http_polling_datafile_manager.ts | 2 +- .../event_processor/forwarding_event_processor.ts | 2 +- .../lib/utils/attributes_validator/index.ts | 2 +- 17 files changed, 33 insertions(+), 33 deletions(-) diff --git a/packages/optimizely-sdk/lib/core/bucketer/index.ts b/packages/optimizely-sdk/lib/core/bucketer/index.ts index 30dccb158..3931d1b02 100644 --- a/packages/optimizely-sdk/lib/core/bucketer/index.ts +++ b/packages/optimizely-sdk/lib/core/bucketer/index.ts @@ -31,7 +31,7 @@ import { ERROR_MESSAGES, LOG_LEVEL, LOG_MESSAGES, -} from '@utils/enums'; +} from '../../utils/enums'; const HASH_SEED = 1; const MAX_HASH_VALUE = Math.pow(2, 32); diff --git a/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.ts b/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.ts index e3429b7b7..24f412652 100644 --- a/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.ts +++ b/packages/optimizely-sdk/lib/core/custom_attribute_condition_evaluator/index.ts @@ -16,9 +16,9 @@ import { getLogger } from '../../modules/logging'; import { UserAttributes, Condition } from '../../shared_types'; -import fns from '@utils/fns'; -import { LOG_MESSAGES } from '@utils/enums'; -import { compareVersion } from '@utils/semantic_version'; +import fns from '../../utils/fns'; +import { LOG_MESSAGES } from '../../utils/enums'; +import { compareVersion } from '../../utils/semantic_version'; const MODULE_NAME = 'CUSTOM_ATTRIBUTE_CONDITION_EVALUATOR'; diff --git a/packages/optimizely-sdk/lib/core/decision_service/index.ts b/packages/optimizely-sdk/lib/core/decision_service/index.ts index bee899905..495ea412d 100644 --- a/packages/optimizely-sdk/lib/core/decision_service/index.ts +++ b/packages/optimizely-sdk/lib/core/decision_service/index.ts @@ -16,7 +16,7 @@ import { LogHandler } from '../../modules/logging'; import { sprintf } from '../../utils/fns'; -import fns from '@utils/fns'; +import fns from '../../utils/fns'; import { bucket } from '../bucketer'; import { AUDIENCE_EVALUATION_TYPES, @@ -25,7 +25,7 @@ import { ERROR_MESSAGES, LOG_LEVEL, LOG_MESSAGES, -} from '@utils/enums'; +} from '../../utils/enums'; import { getAudiencesById, getExperimentAudienceConditions, @@ -40,7 +40,7 @@ import { ProjectConfig, } from '../project_config'; import { AudienceEvaluator, createAudienceEvaluator } from '../audience_evaluator'; -import * as stringValidator from '@utils/string_value_validator'; +import * as stringValidator from '../../utils/string_value_validator'; import { BucketerParams, DecisionResponse, diff --git a/packages/optimizely-sdk/lib/core/event_builder/event_helpers.ts b/packages/optimizely-sdk/lib/core/event_builder/event_helpers.ts index 7e0c55752..e6f57fdbd 100644 --- a/packages/optimizely-sdk/lib/core/event_builder/event_helpers.ts +++ b/packages/optimizely-sdk/lib/core/event_builder/event_helpers.ts @@ -15,9 +15,9 @@ */ import { getLogger } from '../../modules/logging'; -import fns from '@utils/fns'; -import * as eventTagUtils from '@utils/event_tag_utils'; -import * as attributesValidator from '@utils/attributes_validator'; +import fns from '../../utils/fns'; +import * as eventTagUtils from '../../utils/event_tag_utils'; +import * as attributesValidator from '../../utils/attributes_validator'; import * as decision from '../decision'; import { EventTags, UserAttributes } from '../../shared_types'; diff --git a/packages/optimizely-sdk/lib/core/event_builder/index.ts b/packages/optimizely-sdk/lib/core/event_builder/index.ts index 1cefd24a7..093994aa0 100644 --- a/packages/optimizely-sdk/lib/core/event_builder/index.ts +++ b/packages/optimizely-sdk/lib/core/event_builder/index.ts @@ -16,8 +16,8 @@ import { LoggerFacade } from '../../modules/logging'; import { EventV1 as CommonEventParams } from '../../modules/event_processor'; -import fns from '@utils/fns'; -import { CONTROL_ATTRIBUTES, RESERVED_EVENT_KEYWORDS } from '@utils/enums'; +import fns from '../../utils/fns'; +import { CONTROL_ATTRIBUTES, RESERVED_EVENT_KEYWORDS } from '../../utils/enums'; import { getAttributeId, getEventId, @@ -25,8 +25,8 @@ import { getVariationKeyFromId, ProjectConfig, } from '../project_config'; -import * as eventTagUtils from '@utils/event_tag_utils'; -import { isAttributeValid } from '@utils/attributes_validator'; +import * as eventTagUtils from '../../utils/event_tag_utils'; +import { isAttributeValid } from '../../utils/attributes_validator'; import { EventTags, UserAttributes, Event as EventLoggingEndpoint } from '../../shared_types'; const ACTIVATE_EVENT_KEY = 'campaign_activated'; diff --git a/packages/optimizely-sdk/lib/core/notification_center/index.ts b/packages/optimizely-sdk/lib/core/notification_center/index.ts index deaebbcbb..34a3320bc 100644 --- a/packages/optimizely-sdk/lib/core/notification_center/index.ts +++ b/packages/optimizely-sdk/lib/core/notification_center/index.ts @@ -21,7 +21,7 @@ import { LOG_LEVEL, LOG_MESSAGES, NOTIFICATION_TYPES, -} from '@utils/enums'; +} from '../../utils/enums'; const MODULE_NAME = 'NOTIFICATION_CENTER'; diff --git a/packages/optimizely-sdk/lib/core/project_config/index.ts b/packages/optimizely-sdk/lib/core/project_config/index.ts index 055b50312..c8b9ec4bd 100644 --- a/packages/optimizely-sdk/lib/core/project_config/index.ts +++ b/packages/optimizely-sdk/lib/core/project_config/index.ts @@ -27,8 +27,8 @@ import { LOG_LEVEL, LOG_MESSAGES, FEATURE_VARIABLE_TYPES, -} from '@utils/enums'; -import configValidator from '@utils/config_validator'; +} from '../../utils/enums'; +import configValidator from '../../utils/config_validator'; import { LogHandler } from '../../modules/logging'; import { diff --git a/packages/optimizely-sdk/lib/modules/event_processor/eventProcessor.ts b/packages/optimizely-sdk/lib/modules/event_processor/eventProcessor.ts index a46b31aa8..026fa24cd 100644 --- a/packages/optimizely-sdk/lib/modules/event_processor/eventProcessor.ts +++ b/packages/optimizely-sdk/lib/modules/event_processor/eventProcessor.ts @@ -19,7 +19,7 @@ import { ConversionEvent, ImpressionEvent } from './events' import { EventV1Request } from './eventDispatcher' import { EventQueue, DefaultEventQueue, SingleEventQueue, EventQueueSink } from './eventQueue' import { getLogger } from '../logging' -import { NOTIFICATION_TYPES } from '@utils/enums' +import { NOTIFICATION_TYPES } from '../../utils/enums' import { NotificationSender } from '../../core/notification_center' export const DEFAULT_FLUSH_INTERVAL = 30000 // Unit is ms - default flush interval is 30s diff --git a/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsDispatcher.ts b/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsDispatcher.ts index a4c419f4f..029cb1935 100644 --- a/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsDispatcher.ts +++ b/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsDispatcher.ts @@ -16,7 +16,7 @@ import { getLogger } from '../logging' import { EventDispatcher, EventV1Request, EventDispatcherCallback } from './eventDispatcher' import { PendingEventsStore, LocalStorageStore } from './pendingEventsStore' -import { uuid, getTimestamp } from '@utils/fns' +import { uuid, getTimestamp } from '../../utils/fns' const logger = getLogger('EventProcessor') diff --git a/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsStore.ts b/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsStore.ts index 4d8dbd2fa..1e42dba3a 100644 --- a/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsStore.ts +++ b/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsStore.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { objectValues } from '@utils/fns' +import { objectValues } from '../../utils/fns' import { getLogger } from '../logging'; const logger = getLogger('EventProcessor') diff --git a/packages/optimizely-sdk/lib/modules/event_processor/reactNativeEventsStore.ts b/packages/optimizely-sdk/lib/modules/event_processor/reactNativeEventsStore.ts index 38036863e..e7b160e71 100644 --- a/packages/optimizely-sdk/lib/modules/event_processor/reactNativeEventsStore.ts +++ b/packages/optimizely-sdk/lib/modules/event_processor/reactNativeEventsStore.ts @@ -15,7 +15,7 @@ * limitations under the License. */ import { getLogger } from '../logging' -import { objectValues } from "@utils/fns" +import { objectValues } from "../../utils/fns" import { Synchronizer } from './synchronizer' import ReactNativeAsyncStorageCache from './reactNativeAsyncStorageCache' diff --git a/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.react_native.ts b/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.react_native.ts index fae5d9e89..3b0d7fb56 100644 --- a/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.react_native.ts +++ b/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.react_native.ts @@ -16,7 +16,7 @@ import { uuid as id, objectEntries, -} from '@utils/fns' +} from '../../../utils/fns' import { NetInfoState, addEventListener as addConnectionListener, diff --git a/packages/optimizely-sdk/lib/optimizely/index.ts b/packages/optimizely-sdk/lib/optimizely/index.ts index 6509feced..3229fa4ec 100644 --- a/packages/optimizely-sdk/lib/optimizely/index.ts +++ b/packages/optimizely-sdk/lib/optimizely/index.ts @@ -37,13 +37,13 @@ import { createProjectConfigManager, ProjectConfigManager } from '../core/projec import { createDecisionService, DecisionService, DecisionObj } from '../core/decision_service'; import { getImpressionEvent, getConversionEvent } from '../core/event_builder'; import { buildImpressionEvent, buildConversionEvent } from '../core/event_builder/event_helpers'; -import fns from '@utils/fns' -import { validate } from '@utils/attributes_validator'; -import * as enums from '@utils/enums'; -import * as eventTagsValidator from '@utils/event_tags_validator'; +import fns from '../utils/fns' +import { validate } from '../utils/attributes_validator'; +import * as enums from '../utils/enums'; +import * as eventTagsValidator from '../utils/event_tags_validator'; import * as projectConfig from '../core/project_config'; -import * as userProfileServiceValidator from '@utils/user_profile_service_validator'; -import * as stringValidator from '@utils/string_value_validator'; +import * as userProfileServiceValidator from '../utils/user_profile_service_validator'; +import * as stringValidator from '../utils/string_value_validator'; import * as decision from '../core/decision'; import { ERROR_MESSAGES, @@ -54,7 +54,7 @@ import { FEATURE_VARIABLE_TYPES, DECISION_NOTIFICATION_TYPES, NOTIFICATION_TYPES -} from '@utils/enums'; +} from '../utils/enums'; const MODULE_NAME = 'OPTIMIZELY'; diff --git a/packages/optimizely-sdk/lib/optimizely_user_context/index.ts b/packages/optimizely-sdk/lib/optimizely_user_context/index.ts index 73356073a..7ab5f0a22 100644 --- a/packages/optimizely-sdk/lib/optimizely_user_context/index.ts +++ b/packages/optimizely-sdk/lib/optimizely_user_context/index.ts @@ -22,7 +22,7 @@ import { OptimizelyForcedDecision, UserAttributes, } from '../../lib/shared_types'; -import { CONTROL_ATTRIBUTES } from '@utils/enums'; +import { CONTROL_ATTRIBUTES } from '../utils/enums'; export default class OptimizelyUserContext { private optimizely: Optimizely; diff --git a/packages/optimizely-sdk/lib/plugins/datafile_manager/http_polling_datafile_manager.ts b/packages/optimizely-sdk/lib/plugins/datafile_manager/http_polling_datafile_manager.ts index 6b3d1dea3..32b3e9905 100644 --- a/packages/optimizely-sdk/lib/plugins/datafile_manager/http_polling_datafile_manager.ts +++ b/packages/optimizely-sdk/lib/plugins/datafile_manager/http_polling_datafile_manager.ts @@ -17,7 +17,7 @@ import { LoggerFacade } from '../../modules/logging'; import { HttpPollingDatafileManager } from '@optimizely/js-sdk-datafile-manager'; import { DatafileOptions, DatafileManagerConfig, DatafileManager } from '../../shared_types'; import { toDatafile, tryCreatingProjectConfig } from '../../core/project_config'; -import fns from '@utils/fns'; +import fns from '../../utils/fns'; export function createHttpPollingDatafileManager( sdkKey: string, diff --git a/packages/optimizely-sdk/lib/plugins/event_processor/forwarding_event_processor.ts b/packages/optimizely-sdk/lib/plugins/event_processor/forwarding_event_processor.ts index fbc9239a8..dd0473ac1 100644 --- a/packages/optimizely-sdk/lib/plugins/event_processor/forwarding_event_processor.ts +++ b/packages/optimizely-sdk/lib/plugins/event_processor/forwarding_event_processor.ts @@ -21,7 +21,7 @@ import { import { NotificationSender } from '../../core/notification_center'; import { EventDispatcher } from '../../shared_types'; -import { NOTIFICATION_TYPES } from '@utils/enums'; +import { NOTIFICATION_TYPES } from '../../utils/enums'; import { formatEvents } from '../../core/event_builder/build_event_v1'; class ForwardingEventProcessor implements EventProcessor { diff --git a/packages/optimizely-sdk/lib/utils/attributes_validator/index.ts b/packages/optimizely-sdk/lib/utils/attributes_validator/index.ts index aacdde6a5..5f33e85d4 100644 --- a/packages/optimizely-sdk/lib/utils/attributes_validator/index.ts +++ b/packages/optimizely-sdk/lib/utils/attributes_validator/index.ts @@ -16,7 +16,7 @@ import { sprintf } from '../../utils/fns'; import { ObjectWithUnknownProperties } from '../../shared_types'; -import fns from '@utils/fns'; +import fns from '../../utils/fns'; import { ERROR_MESSAGES } from '../enums'; const MODULE_NAME = 'ATTRIBUTES_VALIDATOR'; From 32d29092edc41d34daf8bd4afebccb4eb9d1217a Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Fri, 5 Aug 2022 20:33:35 +0500 Subject: [PATCH 40/59] react native event processor seperate package for entry point --- .../optimizely-sdk/lib/index.react_native.ts | 2 +- .../event_processor/index.react_native.ts | 26 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 packages/optimizely-sdk/lib/plugins/event_processor/index.react_native.ts diff --git a/packages/optimizely-sdk/lib/index.react_native.ts b/packages/optimizely-sdk/lib/index.react_native.ts index d6b377580..384e97420 100644 --- a/packages/optimizely-sdk/lib/index.react_native.ts +++ b/packages/optimizely-sdk/lib/index.react_native.ts @@ -29,7 +29,7 @@ import * as loggerPlugin from './plugins/logger/index.react_native'; import defaultEventDispatcher from './plugins/event_dispatcher/index.browser'; import eventProcessorConfigValidator from './utils/event_processor_config_validator'; import { createNotificationCenter } from './core/notification_center'; -import { createEventProcessor } from './plugins/event_processor'; +import { createEventProcessor } from './plugins/event_processor/index.react_native'; import { OptimizelyDecideOption, Client, Config } from './shared_types'; import { createHttpPollingDatafileManager } from './plugins/datafile_manager/http_polling_datafile_manager'; diff --git a/packages/optimizely-sdk/lib/plugins/event_processor/index.react_native.ts b/packages/optimizely-sdk/lib/plugins/event_processor/index.react_native.ts new file mode 100644 index 000000000..eb6bbf8ad --- /dev/null +++ b/packages/optimizely-sdk/lib/plugins/event_processor/index.react_native.ts @@ -0,0 +1,26 @@ +/** + * Copyright 2022, Optimizely + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { LogTierV1EventProcessor, LocalStoragePendingEventsDispatcher } from '../../../lib/modules/event_processor/index.react_native'; + +export function createEventProcessor( + ...args: ConstructorParameters +): LogTierV1EventProcessor { + return new LogTierV1EventProcessor(...args); +} + +export default { createEventProcessor, LocalStoragePendingEventsDispatcher }; + \ No newline at end of file From 241a8697d49a343669929207f991771a7c3ceb1e Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Wed, 10 Aug 2022 10:40:37 +0500 Subject: [PATCH 41/59] refactor --- .../async-storage.ts | 2 +- .../@react-native-community/netinfo.ts | 2 +- .../lib/core/event_builder/build_event_v1.ts | 2 +- .../event_processor/eventDispatcher.ts | 4 +- .../modules/event_processor/eventProcessor.ts | 2 +- .../lib/modules/event_processor/eventQueue.ts | 2 +- .../lib/modules/event_processor/events.ts | 2 +- .../event_processor/index.react_native.ts | 2 +- .../lib/modules/event_processor/index.ts | 2 +- .../lib/modules/event_processor/managed.ts | 2 +- .../pendingEventsDispatcher.ts | 2 +- .../event_processor/pendingEventsStore.ts | 2 +- .../persistentKeyValueCache.ts | 2 +- .../reactNativeAsyncStorageCache.ts | 2 +- .../event_processor/reactNativeEventsStore.ts | 2 +- .../modules/event_processor/requestTracker.ts | 2 +- .../modules/event_processor/synchronizer.ts | 2 +- .../event_processor/v1/buildEventV1.ts | 15 + .../v1/v1EventProcessor.react_native.ts | 2 +- .../event_processor/v1/v1EventProcessor.ts | 2 +- .../event_processor/index.react_native.ts | 2 +- .../lib/plugins/event_processor/index.ts | 2 +- packages/optimizely-sdk/package-lock.json | 1996 +---------------- packages/optimizely-sdk/package.json | 5 +- packages/optimizely-sdk/rollup.config.js | 2 +- .../optimizely-sdk/tests/buildEventV1.spec.ts | 2 +- .../optimizely-sdk/tests/eventQueue.spec.ts | 2 +- .../tests/pendingEventsDispatcher.spec.ts | 2 +- .../tests/pendingEventsStore.spec.ts | 2 +- .../tests/reactNativeEventsStore.spec.ts | 2 +- .../tests/requestTracker.spec.ts | 2 +- .../v1EventProcessor.react_native.spec.ts | 2 +- .../tests/v1EventProcessor.spec.ts | 2 +- 33 files changed, 67 insertions(+), 2011 deletions(-) diff --git a/packages/optimizely-sdk/__mocks__/@react-native-async-storage/async-storage.ts b/packages/optimizely-sdk/__mocks__/@react-native-async-storage/async-storage.ts index 6e1109103..de319027d 100644 --- a/packages/optimizely-sdk/__mocks__/@react-native-async-storage/async-storage.ts +++ b/packages/optimizely-sdk/__mocks__/@react-native-async-storage/async-storage.ts @@ -1,5 +1,5 @@ /** - * Copyright 2020, Optimizely + * Copyright 2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/__mocks__/@react-native-community/netinfo.ts b/packages/optimizely-sdk/__mocks__/@react-native-community/netinfo.ts index 4a007aab7..12fab972a 100644 --- a/packages/optimizely-sdk/__mocks__/@react-native-community/netinfo.ts +++ b/packages/optimizely-sdk/__mocks__/@react-native-community/netinfo.ts @@ -1,5 +1,5 @@ /** - * Copyright 2020, Optimizely + * Copyright 2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/core/event_builder/build_event_v1.ts b/packages/optimizely-sdk/lib/core/event_builder/build_event_v1.ts index 313a53772..b1f5b271d 100644 --- a/packages/optimizely-sdk/lib/core/event_builder/build_event_v1.ts +++ b/packages/optimizely-sdk/lib/core/event_builder/build_event_v1.ts @@ -1,5 +1,5 @@ /** - * Copyright 2021 Optimizely + * Copyright 2021-2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/modules/event_processor/eventDispatcher.ts b/packages/optimizely-sdk/lib/modules/event_processor/eventDispatcher.ts index 28f9ae07c..15d261cf2 100644 --- a/packages/optimizely-sdk/lib/modules/event_processor/eventDispatcher.ts +++ b/packages/optimizely-sdk/lib/modules/event_processor/eventDispatcher.ts @@ -1,5 +1,5 @@ /** - * Copyright 2019, Optimizely + * Copyright 2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -29,4 +29,4 @@ export interface EventV1Request { url: string httpVerb: 'POST' | 'PUT' | 'GET' | 'PATCH' params: EventV1, -} \ No newline at end of file +} diff --git a/packages/optimizely-sdk/lib/modules/event_processor/eventProcessor.ts b/packages/optimizely-sdk/lib/modules/event_processor/eventProcessor.ts index 026fa24cd..9dd91bdc6 100644 --- a/packages/optimizely-sdk/lib/modules/event_processor/eventProcessor.ts +++ b/packages/optimizely-sdk/lib/modules/event_processor/eventProcessor.ts @@ -1,5 +1,5 @@ /** - * Copyright 2019-2020, Optimizely + * Copyright 2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/modules/event_processor/eventQueue.ts b/packages/optimizely-sdk/lib/modules/event_processor/eventQueue.ts index ce8f35478..a61d37918 100644 --- a/packages/optimizely-sdk/lib/modules/event_processor/eventQueue.ts +++ b/packages/optimizely-sdk/lib/modules/event_processor/eventQueue.ts @@ -1,5 +1,5 @@ /** - * Copyright 2019, Optimizely + * Copyright 2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/modules/event_processor/events.ts b/packages/optimizely-sdk/lib/modules/event_processor/events.ts index a28d86773..65cce503b 100644 --- a/packages/optimizely-sdk/lib/modules/event_processor/events.ts +++ b/packages/optimizely-sdk/lib/modules/event_processor/events.ts @@ -1,5 +1,5 @@ /** - * Copyright 2019, Optimizely + * Copyright 2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/modules/event_processor/index.react_native.ts b/packages/optimizely-sdk/lib/modules/event_processor/index.react_native.ts index 2e3ac34e4..91bb29a58 100644 --- a/packages/optimizely-sdk/lib/modules/event_processor/index.react_native.ts +++ b/packages/optimizely-sdk/lib/modules/event_processor/index.react_native.ts @@ -1,5 +1,5 @@ /** - * Copyright 2020, Optimizely + * Copyright 2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/modules/event_processor/index.ts b/packages/optimizely-sdk/lib/modules/event_processor/index.ts index d2f916615..c4eaef01d 100644 --- a/packages/optimizely-sdk/lib/modules/event_processor/index.ts +++ b/packages/optimizely-sdk/lib/modules/event_processor/index.ts @@ -1,5 +1,5 @@ /** - * Copyright 2019-2020, Optimizely + * Copyright 2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/modules/event_processor/managed.ts b/packages/optimizely-sdk/lib/modules/event_processor/managed.ts index 686d2aa0f..6d89843de 100644 --- a/packages/optimizely-sdk/lib/modules/event_processor/managed.ts +++ b/packages/optimizely-sdk/lib/modules/event_processor/managed.ts @@ -1,5 +1,5 @@ /** - * Copyright 2019, Optimizely + * Copyright 2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsDispatcher.ts b/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsDispatcher.ts index 029cb1935..6d7782575 100644 --- a/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsDispatcher.ts +++ b/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsDispatcher.ts @@ -1,5 +1,5 @@ /** - * Copyright 2019, Optimizely + * Copyright 2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsStore.ts b/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsStore.ts index 1e42dba3a..f226f37ee 100644 --- a/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsStore.ts +++ b/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsStore.ts @@ -1,5 +1,5 @@ /** - * Copyright 2019, Optimizely + * Copyright 2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/modules/event_processor/persistentKeyValueCache.ts b/packages/optimizely-sdk/lib/modules/event_processor/persistentKeyValueCache.ts index 9b3ef9fac..7dd508df9 100644 --- a/packages/optimizely-sdk/lib/modules/event_processor/persistentKeyValueCache.ts +++ b/packages/optimizely-sdk/lib/modules/event_processor/persistentKeyValueCache.ts @@ -1,5 +1,5 @@ /** - * Copyright 2020, Optimizely + * Copyright 2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/modules/event_processor/reactNativeAsyncStorageCache.ts b/packages/optimizely-sdk/lib/modules/event_processor/reactNativeAsyncStorageCache.ts index 51886c825..26b2ac315 100644 --- a/packages/optimizely-sdk/lib/modules/event_processor/reactNativeAsyncStorageCache.ts +++ b/packages/optimizely-sdk/lib/modules/event_processor/reactNativeAsyncStorageCache.ts @@ -1,5 +1,5 @@ /** - * Copyright 2020, Optimizely + * Copyright 2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/modules/event_processor/reactNativeEventsStore.ts b/packages/optimizely-sdk/lib/modules/event_processor/reactNativeEventsStore.ts index e7b160e71..d07928afa 100644 --- a/packages/optimizely-sdk/lib/modules/event_processor/reactNativeEventsStore.ts +++ b/packages/optimizely-sdk/lib/modules/event_processor/reactNativeEventsStore.ts @@ -1,6 +1,6 @@ /** - * Copyright 2020, Optimizely + * Copyright 2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/modules/event_processor/requestTracker.ts b/packages/optimizely-sdk/lib/modules/event_processor/requestTracker.ts index 494b5864e..ab18b36d1 100644 --- a/packages/optimizely-sdk/lib/modules/event_processor/requestTracker.ts +++ b/packages/optimizely-sdk/lib/modules/event_processor/requestTracker.ts @@ -1,5 +1,5 @@ /** - * Copyright 2020, Optimizely + * Copyright 2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/modules/event_processor/synchronizer.ts b/packages/optimizely-sdk/lib/modules/event_processor/synchronizer.ts index 2d5d861f2..d6bf32b7b 100644 --- a/packages/optimizely-sdk/lib/modules/event_processor/synchronizer.ts +++ b/packages/optimizely-sdk/lib/modules/event_processor/synchronizer.ts @@ -1,5 +1,5 @@ /** - * Copyright 2020, Optimizely + * Copyright 2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/modules/event_processor/v1/buildEventV1.ts b/packages/optimizely-sdk/lib/modules/event_processor/v1/buildEventV1.ts index 7ef6e73ac..699498dc4 100644 --- a/packages/optimizely-sdk/lib/modules/event_processor/v1/buildEventV1.ts +++ b/packages/optimizely-sdk/lib/modules/event_processor/v1/buildEventV1.ts @@ -1,3 +1,18 @@ +/** + * Copyright 2022, Optimizely + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ import { EventTags, ConversionEvent, ImpressionEvent, VisitorAttribute } from '../events' import { ProcessableEvent } from '../eventProcessor' import { EventV1Request } from '../eventDispatcher' diff --git a/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.react_native.ts b/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.react_native.ts index 3b0d7fb56..7bd3db47e 100644 --- a/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.react_native.ts +++ b/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.react_native.ts @@ -1,5 +1,5 @@ /** - * Copyright 2020, Optimizely + * Copyright 2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.ts b/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.ts index f984c13d2..6dfb5e3d1 100644 --- a/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.ts +++ b/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.ts @@ -1,5 +1,5 @@ /** - * Copyright 2019-2020, Optimizely + * Copyright 2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/lib/plugins/event_processor/index.react_native.ts b/packages/optimizely-sdk/lib/plugins/event_processor/index.react_native.ts index eb6bbf8ad..277512a6e 100644 --- a/packages/optimizely-sdk/lib/plugins/event_processor/index.react_native.ts +++ b/packages/optimizely-sdk/lib/plugins/event_processor/index.react_native.ts @@ -23,4 +23,4 @@ export function createEventProcessor( } export default { createEventProcessor, LocalStoragePendingEventsDispatcher }; - \ No newline at end of file + diff --git a/packages/optimizely-sdk/lib/plugins/event_processor/index.ts b/packages/optimizely-sdk/lib/plugins/event_processor/index.ts index 4904a3302..b515b7b63 100644 --- a/packages/optimizely-sdk/lib/plugins/event_processor/index.ts +++ b/packages/optimizely-sdk/lib/plugins/event_processor/index.ts @@ -1,5 +1,5 @@ /** - * Copyright 2020, Optimizely + * Copyright 2020, 2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/package-lock.json b/packages/optimizely-sdk/package-lock.json index fbc6fdb22..94cd6f9d9 100644 --- a/packages/optimizely-sdk/package-lock.json +++ b/packages/optimizely-sdk/package-lock.json @@ -533,193 +533,6 @@ "eslint-visitor-keys": "^1.1.0" } }, - "@webassemblyjs/ast": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", - "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", - "dev": true, - "requires": { - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", - "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", - "dev": true - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", - "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", - "dev": true, - "requires": { - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", - "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", - "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", - "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", - "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", - "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", - "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/helper-wasm-section": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-opt": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", - "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", - "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", - "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", - "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/floating-point-hex-parser": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-code-frame": "1.9.0", - "@webassemblyjs/helper-fsm": "1.9.0", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", - "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0", - "@xtuc/long": "4.2.2" - } - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, "abab": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", @@ -878,12 +691,6 @@ "default-require-extensions": "^3.0.0" } }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, "archy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", @@ -956,53 +763,6 @@ "safer-buffer": "~2.1.0" } }, - "asn1.js": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", - "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "safer-buffer": "^2.1.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", @@ -1036,13 +796,6 @@ "lodash": "^4.17.14" } }, - "async-each": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", - "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true, - "optional": true - }, "async-limiter": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", @@ -1670,12 +1423,6 @@ "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", "dev": true }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, "base64id": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", @@ -1734,12 +1481,6 @@ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", "dev": true }, - "bn.js": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", - "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==", - "dev": true - }, "body-parser": { "version": "1.19.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", @@ -1800,12 +1541,6 @@ "fill-range": "^7.0.1" } }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, "browser-process-hrtime": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", @@ -1835,100 +1570,6 @@ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "dev": true, - "requires": { - "buffer-xor": "^1.0.3", - "cipher-base": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.3", - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "browserify-cipher": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "dev": true, - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "randombytes": "^2.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, - "browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", - "dev": true, - "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", - "create-hash": "^1.2.0", - "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", - "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "browserify-zlib": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, "browserslist": { "version": "4.16.6", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz", @@ -2027,70 +1668,18 @@ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, "builtin-modules": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", "dev": true }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, "bytes": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", "dev": true }, - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - } - } - }, "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", @@ -2222,37 +1811,12 @@ "readdirp": "~3.4.0" } }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, - "chrome-trace-event": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", - "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, "ci-info": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", "dev": true }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", @@ -2424,18 +1988,6 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, "connect": { "version": "3.7.0", "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", @@ -2465,18 +2017,6 @@ } } }, - "console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, "content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", @@ -2506,20 +2046,6 @@ "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", "dev": true }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", @@ -2551,51 +2077,6 @@ "request": "^2.88.2" } }, - "create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, - "create-hash": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", - "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.1", - "inherits": "^2.0.1", - "md5.js": "^1.3.4", - "ripemd160": "^2.0.1", - "sha.js": "^2.4.0" - } - }, - "create-hmac": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", - "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", - "dev": true, - "requires": { - "cipher-base": "^1.0.3", - "create-hash": "^1.1.0", - "inherits": "^2.0.1", - "ripemd160": "^2.0.0", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -2617,25 +2098,6 @@ } } }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, "cssom": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", @@ -2657,12 +2119,6 @@ "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", "dev": true }, - "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", - "dev": true - }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -2831,16 +2287,6 @@ "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", "dev": true }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, "detect-indent": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", @@ -2868,25 +2314,6 @@ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -2908,12 +2335,6 @@ "void-elements": "^2.0.0" } }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, "domexception": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", @@ -2929,18 +2350,6 @@ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", "dev": true }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -2963,29 +2372,6 @@ "integrity": "sha512-+LPJVRsN7hGZ9EIUUiWCpO7l4E3qBYHNadazlucBfsXBbccDFNKUBAgzE68FnkWGJPwD/AfKhSzL+G+Iqb8A4A==", "dev": true }, - "elliptic": { - "version": "6.5.3", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", - "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", - "dev": true, - "requires": { - "bn.js": "^4.4.0", - "brorand": "^1.0.1", - "hash.js": "^1.0.0", - "hmac-drbg": "^1.0.0", - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.0" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -3406,22 +2792,6 @@ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "dev": true }, - "events": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", - "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", - "dev": true - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, "exec-sh": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz", @@ -3717,12 +3087,6 @@ "bser": "2.1.1" } }, - "figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", - "dev": true - }, "figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", @@ -3843,16 +3207,6 @@ "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", "dev": true }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, "follow-redirects": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.0.tgz", @@ -3977,16 +3331,6 @@ "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", "dev": true }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - } - }, "fromentries": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.2.1.tgz", @@ -4013,18 +3357,6 @@ "universalify": "^0.1.0" } }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - } - }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -4370,40 +3702,6 @@ } } }, - "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", - "dev": true, - "requires": { - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "hash.js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", - "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, "hasha": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.1.tgz", @@ -4420,17 +3718,6 @@ "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", "dev": true }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, "home-or-tmp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", @@ -4505,12 +3792,6 @@ "sshpk": "^1.7.0" } }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", - "dev": true - }, "https-proxy-agent": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", @@ -4541,18 +3822,6 @@ "safer-buffer": ">= 2.1.2 < 3" } }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true - }, "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -4657,12 +3926,6 @@ "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", "dev": true }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -4993,6 +4256,12 @@ "has-tostringtag": "^1.0.0" } }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true + }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", @@ -5852,204 +5121,6 @@ "yargs-parser": "^9.0.2" } }, - "yargs-parser": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", - "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", - "dev": true, - "requires": { - "camelcase": "^4.1.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" - } - }, - "merge-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", - "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "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-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 - }, - "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 - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "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 - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "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" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", - "dev": true - }, - "yargs": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.1.tgz", - "integrity": "sha512-PRU7gJrJaXv3q3yQZ/+/X6KBswZiaQ+zOmdprZcouPYtQgvNU35i+68M4b1ZHLZtYFT5QObFLV+ZkmJYcwKdiw==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.1.1", - "find-up": "^2.1.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.1.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^9.0.2" - } - }, "yargs-parser": { "version": "9.0.2", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", @@ -7141,12 +6212,6 @@ "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", "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": { "version": "0.4.0", "resolved": "https://nexus.es.ecg.tools/repository/npm-all/json-schema/-/json-schema-0.4.0.tgz", @@ -7387,12 +6452,6 @@ } } }, - "loader-runner": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", - "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", - "dev": true - }, "loader-utils": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", @@ -7552,17 +6611,6 @@ "integrity": "sha512-rUxjysqif/BZQH2yhd5Aaq7vXMSx9NdEsQcyA07uEzIvxgI7zIr33gGsh+RU0/XjmQpCW7RsVof1vlkvQVCK5A==", "dev": true }, - "md5.js": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", - "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -7596,6 +6644,15 @@ "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==", "dev": true }, + "merge-options": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-3.0.4.tgz", + "integrity": "sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==", + "dev": true, + "requires": { + "is-plain-obj": "^2.1.0" + } + }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -7612,24 +6669,6 @@ "picomatch": "^2.0.5" } }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, "mime": { "version": "2.4.6", "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.6.tgz", @@ -7662,18 +6701,6 @@ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -7689,24 +6716,6 @@ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, "mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", @@ -7817,20 +6826,6 @@ "integrity": "sha1-Rpve9PivyaEWBW8HnfYYLQr7A4Q=", "dev": true }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } - }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -7983,62 +6978,6 @@ "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", "dev": true }, - "node-libs-browser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", - "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", - "dev": true, - "requires": { - "assert": "^1.1.1", - "browserify-zlib": "^0.2.0", - "buffer": "^4.3.0", - "console-browserify": "^1.1.0", - "constants-browserify": "^1.0.0", - "crypto-browserify": "^3.11.0", - "domain-browser": "^1.1.1", - "events": "^3.0.0", - "https-browserify": "^1.0.0", - "os-browserify": "^0.3.0", - "path-browserify": "0.0.1", - "process": "^0.11.10", - "punycode": "^1.2.4", - "querystring-es3": "^0.2.0", - "readable-stream": "^2.3.3", - "stream-browserify": "^2.0.1", - "stream-http": "^2.7.2", - "string_decoder": "^1.0.0", - "timers-browserify": "^2.0.4", - "tty-browserify": "0.0.0", - "url": "^0.11.0", - "util": "^0.11.0", - "vm-browserify": "^1.0.1" - }, - "dependencies": { - "buffer": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", - "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, "node-notifier": { "version": "5.4.5", "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.5.tgz", @@ -8457,12 +7396,6 @@ "word-wrap": "~1.2.3" } }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", - "dev": true - }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", @@ -8549,23 +7482,6 @@ "release-zalgo": "^1.0.0" } }, - "pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "dev": true, - "requires": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - } - }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -8575,19 +7491,6 @@ "callsites": "^3.0.0" } }, - "parse-asn1": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", - "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", - "dev": true, - "requires": { - "asn1.js": "^5.2.0", - "browserify-aes": "^1.0.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3", - "safe-buffer": "^5.1.1" - } - }, "parse-glob": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", @@ -8662,19 +7565,6 @@ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", "dev": true }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true, - "optional": true - }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -8750,19 +7640,6 @@ "through": "~2.3" } }, - "pbkdf2": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", - "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", - "dev": true, - "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" - } - }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -8775,12 +7652,6 @@ "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", "dev": true }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, "pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", @@ -8853,42 +7724,6 @@ "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", "dev": true }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, - "pretty-format": { - "version": "23.6.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.6.0.tgz", - "integrity": "sha512-zf9NV1NSlDLDjycnwm6hpFATCGl/K1lt0R/GdkAK2O5LN/rwJoB+Mh93gGJjut4YbmecbfgLWVGSTCr0Ewvvbw==", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0", - "ansi-styles": "^3.2.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 - } - } - }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", - "dev": true - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -8910,12 +7745,6 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true - }, "promise-polyfill": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.1.0.tgz", @@ -8965,28 +7794,6 @@ "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, - "public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dev": true, - "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - }, - "dependencies": { - "bn.js": { - "version": "4.11.9", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", - "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", - "dev": true - } - } - }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -8997,29 +7804,6 @@ "once": "^1.3.1" } }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -9044,18 +7828,6 @@ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", "dev": true }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, "randomatic": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", @@ -9084,16 +7856,6 @@ "safe-buffer": "^5.1.0" } }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dev": true, - "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -9355,26 +8117,6 @@ "tough-cookie": "^2.3.3" } }, - "request-promise-core": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.4.tgz", - "integrity": "sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==", - "dev": true, - "requires": { - "lodash": "^4.17.19" - } - }, - "request-promise-native": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.9.tgz", - "integrity": "sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==", - "dev": true, - "requires": { - "request-promise-core": "1.1.4", - "stealthy-require": "^1.1.1", - "tough-cookie": "^2.3.3" - } - }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -9462,16 +8204,6 @@ "glob": "^7.1.3" } }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "dev": true, - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, "rollup": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.2.0.tgz", @@ -9555,15 +8287,6 @@ "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", "dev": true }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, - "requires": { - "aproba": "^1.1.1" - } - }, "rxjs": { "version": "6.6.3", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", @@ -9813,28 +8536,12 @@ } } }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, "setprototypeof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", "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==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, "shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", @@ -10169,12 +8876,6 @@ } } }, - "source-list-map": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -10323,15 +9024,6 @@ "tweetnacl": "~0.14.0" } }, - "ssri": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", - "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", - "dev": true, - "requires": { - "figgy-pudding": "^3.5.1" - } - }, "stack-utils": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.5.tgz", @@ -10382,16 +9074,6 @@ "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", "dev": true }, - "stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, - "requires": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, "stream-combiner": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", @@ -10401,35 +9083,6 @@ "duplexer": "~0.1.1" } }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-http": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", - "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", - "dev": true, - "requires": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.3.6", - "to-arraybuffer": "^1.0.0", - "xtend": "^4.0.0" - } - }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "dev": true - }, "streamroller": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-1.0.6.tgz", @@ -10714,99 +9367,10 @@ } } }, - "terser-webpack-plugin": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", - "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", - "dev": true, - "requires": { - "cacache": "^12.0.2", - "find-cache-dir": "^2.1.0", - "is-wsl": "^1.1.0", - "schema-utils": "^1.0.0", - "serialize-javascript": "^4.0.0", - "source-map": "^0.6.1", - "terser": "^4.1.2", - "webpack-sources": "^1.4.0", - "worker-farm": "^1.7.0" - }, - "dependencies": { - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, - "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" - } - }, - "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" - } - }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.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" - } - }, - "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 - }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "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==", + "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", @@ -10838,25 +9402,6 @@ "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" - } - }, - "timers-browserify": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", - "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", - "dev": true, - "requires": { - "setimmediate": "^1.0.4" - } - }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -10878,12 +9423,6 @@ "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", "dev": true }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, "to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", @@ -11099,12 +9638,6 @@ "tslib": "^1.8.1" } }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -11151,12 +9684,6 @@ "mime-types": "~2.1.24" } }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, "typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -11217,24 +9744,6 @@ "set-value": "^2.0.1" } }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -11293,13 +9802,6 @@ } } }, - "upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true, - "optional": true - }, "uri-js": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz", @@ -11315,24 +9817,6 @@ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", "dev": true }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", @@ -11349,23 +9833,6 @@ "tmp": "0.0.x" } }, - "util": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", - "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", - "dev": true, - "requires": { - "inherits": "2.0.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } - } - }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -11423,12 +9890,6 @@ "extsprintf": "^1.2.0" } }, - "vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true - }, "void-elements": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", @@ -11463,406 +9924,12 @@ "minimist": "^1.2.0" } }, - "watchpack": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz", - "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==", - "dev": true, - "requires": { - "chokidar": "^3.4.1", - "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0", - "watchpack-chokidar2": "^2.0.0" - } - }, - "watchpack-chokidar2": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", - "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", - "dev": true, - "optional": true, - "requires": { - "chokidar": "^2.1.8" - }, - "dependencies": { - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "optional": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "optional": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true, - "optional": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "optional": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "optional": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "optional": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "optional": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "optional": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "optional": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "optional": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "optional": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "optional": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "optional": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "optional": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "optional": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, "webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", "dev": true }, - "webpack": { - "version": "4.44.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.44.2.tgz", - "integrity": "sha512-6KJVGlCxYdISyurpQ0IPTklv+DULv05rs2hseIXer6D7KrUicRDLFb4IUM1S6LUAKypPM/nSiVSuv8jHu1m3/Q==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/wasm-edit": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "acorn": "^6.4.1", - "ajv": "^6.10.2", - "ajv-keywords": "^3.4.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^4.3.0", - "eslint-scope": "^4.0.3", - "json-parse-better-errors": "^1.0.2", - "loader-runner": "^2.4.0", - "loader-utils": "^1.2.3", - "memory-fs": "^0.4.1", - "micromatch": "^3.1.10", - "mkdirp": "^0.5.3", - "neo-async": "^2.6.1", - "node-libs-browser": "^2.2.1", - "schema-utils": "^1.0.0", - "tapable": "^1.1.3", - "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.7.4", - "webpack-sources": "^1.4.1" - }, - "dependencies": { - "acorn": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", - "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "eslint-scope": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", - "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, "webpack-dev-middleware": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", @@ -11894,16 +9961,6 @@ } } }, - "webpack-sources": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", - "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, - "requires": { - "source-list-map": "^2.0.0", - "source-map": "~0.6.1" - } - }, "whatwg-encoding": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", @@ -11970,15 +10027,6 @@ "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", "dev": true }, - "worker-farm": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", - "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", - "dev": true, - "requires": { - "errno": "~0.1.7" - } - }, "wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -12083,12 +10131,6 @@ "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", "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", diff --git a/packages/optimizely-sdk/package.json b/packages/optimizely-sdk/package.json index dfb01d52e..c7bf569f0 100644 --- a/packages/optimizely-sdk/package.json +++ b/packages/optimizely-sdk/package.json @@ -48,7 +48,7 @@ }, "devDependencies": { "@react-native-async-storage/async-storage": "^1.2.0", - "@react-native-community/netinfo": "^5.9.4", + "@react-native-community/netinfo": "^5.9.10", "@rollup/plugin-commonjs": "^11.0.2", "@rollup/plugin-node-resolve": "^7.1.1", "@types/chai": "^4.2.11", @@ -83,8 +83,7 @@ "ts-loader": "^7.0.5", "ts-node": "^8.10.2", "tsconfig-paths": "^4.0.0", - "typescript": "^4.0.3", - "webpack": "^4.42.1" + "typescript": "^4.0.3" }, "peerDependencies": { "@react-native-community/netinfo": "5.9.4", diff --git a/packages/optimizely-sdk/rollup.config.js b/packages/optimizely-sdk/rollup.config.js index 7afe33aea..a89700a7e 100644 --- a/packages/optimizely-sdk/rollup.config.js +++ b/packages/optimizely-sdk/rollup.config.js @@ -42,7 +42,7 @@ const cjsBundleFor = (platform) => ({ commonjs(), typescript(typescriptPluginOptions), ], - external: ['https', 'http', 'url'].concat(Object.keys(dependencies || {})), + external: ['https', 'http', 'url' ].concat(Object.keys(dependencies || {})), input: `lib/index.${platform}.ts`, output: { exports: 'named', diff --git a/packages/optimizely-sdk/tests/buildEventV1.spec.ts b/packages/optimizely-sdk/tests/buildEventV1.spec.ts index 616f16c67..273bcea6e 100644 --- a/packages/optimizely-sdk/tests/buildEventV1.spec.ts +++ b/packages/optimizely-sdk/tests/buildEventV1.spec.ts @@ -1,5 +1,5 @@ /** - * Copyright 2019, 2021, Optimizely + * Copyright 2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/tests/eventQueue.spec.ts b/packages/optimizely-sdk/tests/eventQueue.spec.ts index 6dbaa10cb..0ebf82454 100644 --- a/packages/optimizely-sdk/tests/eventQueue.spec.ts +++ b/packages/optimizely-sdk/tests/eventQueue.spec.ts @@ -1,5 +1,5 @@ /** - * Copyright 2019, Optimizely + * Copyright 2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/tests/pendingEventsDispatcher.spec.ts b/packages/optimizely-sdk/tests/pendingEventsDispatcher.spec.ts index faa22b119..214b1e939 100644 --- a/packages/optimizely-sdk/tests/pendingEventsDispatcher.spec.ts +++ b/packages/optimizely-sdk/tests/pendingEventsDispatcher.spec.ts @@ -1,5 +1,5 @@ /** - * Copyright 2019, Optimizely + * Copyright 2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/tests/pendingEventsStore.spec.ts b/packages/optimizely-sdk/tests/pendingEventsStore.spec.ts index 4b0f4758a..9e8062429 100644 --- a/packages/optimizely-sdk/tests/pendingEventsStore.spec.ts +++ b/packages/optimizely-sdk/tests/pendingEventsStore.spec.ts @@ -1,5 +1,5 @@ /** - * Copyright 2019, Optimizely + * Copyright 2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/tests/reactNativeEventsStore.spec.ts b/packages/optimizely-sdk/tests/reactNativeEventsStore.spec.ts index 4e36dbf17..dd26a13a4 100644 --- a/packages/optimizely-sdk/tests/reactNativeEventsStore.spec.ts +++ b/packages/optimizely-sdk/tests/reactNativeEventsStore.spec.ts @@ -1,5 +1,5 @@ /** - * Copyright 2020, Optimizely + * Copyright 2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/tests/requestTracker.spec.ts b/packages/optimizely-sdk/tests/requestTracker.spec.ts index d7c70d1dd..70f241500 100644 --- a/packages/optimizely-sdk/tests/requestTracker.spec.ts +++ b/packages/optimizely-sdk/tests/requestTracker.spec.ts @@ -1,5 +1,5 @@ /** - * Copyright 2020, Optimizely + * Copyright 2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/tests/v1EventProcessor.react_native.spec.ts b/packages/optimizely-sdk/tests/v1EventProcessor.react_native.spec.ts index 72e0e0e8a..dc490d990 100644 --- a/packages/optimizely-sdk/tests/v1EventProcessor.react_native.spec.ts +++ b/packages/optimizely-sdk/tests/v1EventProcessor.react_native.spec.ts @@ -1,5 +1,5 @@ /** - * Copyright 2020, Optimizely + * Copyright 2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/packages/optimizely-sdk/tests/v1EventProcessor.spec.ts b/packages/optimizely-sdk/tests/v1EventProcessor.spec.ts index d4ddcbddf..59f6cdb79 100644 --- a/packages/optimizely-sdk/tests/v1EventProcessor.spec.ts +++ b/packages/optimizely-sdk/tests/v1EventProcessor.spec.ts @@ -1,5 +1,5 @@ /** - * Copyright 2019-2020, Optimizely + * Copyright 2022, Optimizely * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. From 1658fcf45ef1f34501480e6605cffeb8d65502c5 Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Wed, 10 Aug 2022 11:10:41 +0500 Subject: [PATCH 42/59] Update rollup.config.js --- packages/optimizely-sdk/rollup.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/optimizely-sdk/rollup.config.js b/packages/optimizely-sdk/rollup.config.js index a89700a7e..3534610c9 100644 --- a/packages/optimizely-sdk/rollup.config.js +++ b/packages/optimizely-sdk/rollup.config.js @@ -42,7 +42,7 @@ const cjsBundleFor = (platform) => ({ commonjs(), typescript(typescriptPluginOptions), ], - external: ['https', 'http', 'url' ].concat(Object.keys(dependencies || {})), + external: ['https', 'http', 'url', 'react-native' ].concat(Object.keys(dependencies || {})), input: `lib/index.${platform}.ts`, output: { exports: 'named', From 19f9cf328c89f70260b6f5660bd81dfcd8a98e77 Mon Sep 17 00:00:00 2001 From: zashraf1985 Date: Tue, 9 Aug 2022 23:28:20 -0700 Subject: [PATCH 43/59] added peer depencies in rollup config --- packages/optimizely-sdk/rollup.config.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/optimizely-sdk/rollup.config.js b/packages/optimizely-sdk/rollup.config.js index 3534610c9..70d60c278 100644 --- a/packages/optimizely-sdk/rollup.config.js +++ b/packages/optimizely-sdk/rollup.config.js @@ -17,7 +17,7 @@ import commonjs from '@rollup/plugin-commonjs'; import { terser } from 'rollup-plugin-terser'; import resolve from '@rollup/plugin-node-resolve'; -import { dependencies } from './package.json'; +import { dependencies, peerDependencies } from './package.json'; import typescript from 'rollup-plugin-typescript2'; const typescriptPluginOptions = { @@ -42,7 +42,7 @@ const cjsBundleFor = (platform) => ({ commonjs(), typescript(typescriptPluginOptions), ], - external: ['https', 'http', 'url', 'react-native' ].concat(Object.keys(dependencies || {})), + external: ['https', 'http', 'url'].concat(Object.keys({ ...dependencies, ...peerDependencies } || {})), input: `lib/index.${platform}.ts`, output: { exports: 'named', From 7337ddc4c131c0589f48216f58fd05fe65e2cbdb Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Thu, 11 Aug 2022 16:05:48 +0500 Subject: [PATCH 44/59] Update package.json --- packages/optimizely-sdk/package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/optimizely-sdk/package.json b/packages/optimizely-sdk/package.json index c7bf569f0..de4b6c0df 100644 --- a/packages/optimizely-sdk/package.json +++ b/packages/optimizely-sdk/package.json @@ -87,7 +87,8 @@ }, "peerDependencies": { "@react-native-community/netinfo": "5.9.4", - "@react-native-async-storage/async-storage": "^1.2.0" + "@react-native-async-storage/async-storage": "^1.2.0", + "@babel/runtime": "^7.0.0" }, "peerDependenciesMeta": { "@react-native-async-storage/async-storage": { From 829e0c216fd30f2f60c5814ddb7c8b83b3de3897 Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Thu, 11 Aug 2022 16:51:26 +0500 Subject: [PATCH 45/59] Update package.json --- packages/optimizely-sdk/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/optimizely-sdk/package.json b/packages/optimizely-sdk/package.json index de4b6c0df..fa4a8c8aa 100644 --- a/packages/optimizely-sdk/package.json +++ b/packages/optimizely-sdk/package.json @@ -40,8 +40,8 @@ }, "homepage": "https://github.com/optimizely/javascript-sdk/tree/master/packages/optimizely-sdk", "dependencies": { + "@babel/runtime": "^7.18.9", "@optimizely/js-sdk-datafile-manager": "^0.9.5", - "@optimizely/js-sdk-event-processor": "^0.9.2", "json-schema": "^0.4.0", "murmurhash": "^2.0.1", "uuid": "^8.3.2" From 7be6d84b4a1acc43d2f2fc41ab54429b1be5901a Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Thu, 11 Aug 2022 17:09:18 +0500 Subject: [PATCH 46/59] Update package.json --- packages/optimizely-sdk/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/optimizely-sdk/package.json b/packages/optimizely-sdk/package.json index fa4a8c8aa..bf04fc446 100644 --- a/packages/optimizely-sdk/package.json +++ b/packages/optimizely-sdk/package.json @@ -44,6 +44,7 @@ "@optimizely/js-sdk-datafile-manager": "^0.9.5", "json-schema": "^0.4.0", "murmurhash": "^2.0.1", + "react": "^18.2.0", "uuid": "^8.3.2" }, "devDependencies": { From 233461f0ff256ea027d8a01b0f9a32470cafdd19 Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Thu, 11 Aug 2022 17:18:13 +0500 Subject: [PATCH 47/59] Update package.json --- packages/optimizely-sdk/package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/optimizely-sdk/package.json b/packages/optimizely-sdk/package.json index bf04fc446..0af205b9c 100644 --- a/packages/optimizely-sdk/package.json +++ b/packages/optimizely-sdk/package.json @@ -45,6 +45,7 @@ "json-schema": "^0.4.0", "murmurhash": "^2.0.1", "react": "^18.2.0", + "react-native": "^0.69.4", "uuid": "^8.3.2" }, "devDependencies": { From 63a135df3d26531240d70065a8c0dc9e769f3efb Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Sat, 13 Aug 2022 01:49:55 +0500 Subject: [PATCH 48/59] sinon converted --- .../tests/index.react_native.spec.ts | 330 ++++++++++++++++++ 1 file changed, 330 insertions(+) create mode 100644 packages/optimizely-sdk/tests/index.react_native.spec.ts diff --git a/packages/optimizely-sdk/tests/index.react_native.spec.ts b/packages/optimizely-sdk/tests/index.react_native.spec.ts new file mode 100644 index 000000000..7fcd5728b --- /dev/null +++ b/packages/optimizely-sdk/tests/index.react_native.spec.ts @@ -0,0 +1,330 @@ +/** + * Copyright 2019-2020, 2022 Optimizely + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { assert } from 'chai'; +import sinon from 'sinon'; +import * as logging from './modules/logging/logger'; +import * as eventProcessor from './plugins/event_processor'; + +import Optimizely from './optimizely'; +import testData from './tests/test_data'; +import packageJSON from '../package.json'; +import optimizelyFactory from './index.react_native'; +import configValidator from './utils/config_validator'; +import eventProcessorConfigValidator from './utils/event_processor_config_validator'; + +describe('javascript-sdk/react-native', function () { + var clock; + beforeEach(function () { + sinon.stub(optimizelyFactory.eventDispatcher, 'dispatchEvent'); + clock = sinon.useFakeTimers(new Date()); + }); + + afterEach(function () { + optimizelyFactory.eventDispatcher.dispatchEvent.restore(); + clock.restore(); + }); + + describe('APIs', function () { + it('should expose logger, errorHandler, eventDispatcher and enums', function () { + assert.isDefined(optimizelyFactory.logging); + assert.isDefined(optimizelyFactory.logging.createLogger); + assert.isDefined(optimizelyFactory.logging.createNoOpLogger); + assert.isDefined(optimizelyFactory.errorHandler); + assert.isDefined(optimizelyFactory.eventDispatcher); + assert.isDefined(optimizelyFactory.enums); + }); + + describe('createInstance', function () { + var fakeErrorHandler = { handleError: function () { } }; + var fakeEventDispatcher = { dispatchEvent: function () { } }; + var silentLogger; + + beforeEach(function () { + silentLogger = optimizelyFactory.logging.createLogger({ + logLevel: optimizelyFactory.enums.LOG_LEVEL.INFO, + logToConsole: false, + }); + sinon.spy(console, 'error'); + sinon.stub(configValidator, 'validate'); + }); + + afterEach(function () { + console.error.restore(); + configValidator.validate.restore(); + }); + + it('should not throw if the provided config is not valid', function () { + configValidator.validate.throws(new Error('Invalid config or something')); + assert.doesNotThrow(function () { + var optlyInstance = optimizelyFactory.createInstance({ + datafile: {}, + logger: silentLogger, + }); + // Invalid datafile causes onReady Promise rejection - catch this error + optlyInstance.onReady().catch(function () { }); + }); + }); + + it('should create an instance of optimizely', function () { + var optlyInstance = optimizelyFactory.createInstance({ + datafile: {}, + errorHandler: fakeErrorHandler, + eventDispatcher: fakeEventDispatcher, + logger: silentLogger, + }); + // Invalid datafile causes onReady Promise rejection - catch this error + optlyInstance.onReady().catch(function () { }); + + assert.instanceOf(optlyInstance, Optimizely); + assert.equal(optlyInstance.clientVersion, '4.9.2'); + }); + + it('should set the React Native JS client engine and javascript SDK version', function () { + var optlyInstance = optimizelyFactory.createInstance({ + datafile: {}, + errorHandler: fakeErrorHandler, + eventDispatcher: fakeEventDispatcher, + logger: silentLogger, + }); + // Invalid datafile causes onReady Promise rejection - catch this error + optlyInstance.onReady().catch(function () { }); + assert.equal('react-native-js-sdk', optlyInstance.clientEngine); + assert.equal(packageJSON.version, optlyInstance.clientVersion); + }); + + it('should allow passing of "react-sdk" as the clientEngine and convert it to "react-native-sdk"', function () { + var optlyInstance = optimizelyFactory.createInstance({ + clientEngine: 'react-sdk', + datafile: {}, + errorHandler: fakeErrorHandler, + eventDispatcher: fakeEventDispatcher, + logger: silentLogger, + }); + // Invalid datafile causes onReady Promise rejection - catch this error + optlyInstance.onReady().catch(function () { }); + assert.equal('react-native-sdk', optlyInstance.clientEngine); + }); + + it('should activate with provided event dispatcher', function () { + var optlyInstance = optimizelyFactory.createInstance({ + datafile: testData.getTestProjectConfig(), + errorHandler: fakeErrorHandler, + eventDispatcher: optimizelyFactory.eventDispatcher, + logger: silentLogger, + }); + var activate = optlyInstance.activate('testExperiment', 'testUser'); + assert.strictEqual(activate, 'control'); + }); + + describe('when no event dispatcher passed to createInstance', function () { + it('uses the default event dispatcher', function () { + var optlyInstance = optimizelyFactory.createInstance({ + datafile: testData.getTestProjectConfig(), + errorHandler: fakeErrorHandler, + logger: silentLogger, + }); + optlyInstance.activate('testExperiment', 'testUser'); + clock.tick(30001) + sinon.assert.calledOnce(optimizelyFactory.eventDispatcher.dispatchEvent); + }); + }); + + describe('when passing in logLevel', function () { + beforeEach(function () { + sinon.stub(logging, 'setLogLevel'); + }); + + afterEach(function () { + logging.setLogLevel.restore(); + }); + + it('should call logging.setLogLevel', function () { + optimizelyFactory.createInstance({ + datafile: testData.getTestProjectConfig(), + logLevel: optimizelyFactory.enums.LOG_LEVEL.ERROR, + }); + sinon.assert.calledOnce(logging.setLogLevel); + sinon.assert.calledWithExactly(logging.setLogLevel, optimizelyFactory.enums.LOG_LEVEL.ERROR); + }); + }); + + describe('when passing in logger', function () { + beforeEach(function () { + sinon.stub(logging, 'setLogHandler'); + }); + + afterEach(function () { + logging.setLogHandler.restore(); + }); + + it('should call logging.setLogHandler with the supplied logger', function () { + var fakeLogger = { log: function () { } }; + optimizelyFactory.createInstance({ + datafile: testData.getTestProjectConfig(), + logger: fakeLogger, + }); + sinon.assert.calledOnce(logging.setLogHandler); + sinon.assert.calledWithExactly(logging.setLogHandler, fakeLogger); + }); + }); + + describe('event processor configuration', function () { + var eventProcessorSpy; + beforeEach(function () { + eventProcessorSpy = sinon.spy(eventProcessor, 'createEventProcessor'); + }); + + afterEach(function () { + eventProcessor.createEventProcessor.restore(); + }); + + it('should use default event flush interval when none is provided', function () { + optimizelyFactory.createInstance({ + datafile: testData.getTestProjectConfigWithFeatures(), + errorHandler: fakeErrorHandler, + eventDispatcher: fakeEventDispatcher, + logger: silentLogger, + }); + sinon.assert.calledWithExactly( + eventProcessorSpy, + sinon.match({ + flushInterval: 1000, + }) + ); + }); + + describe('with an invalid flush interval', function () { + beforeEach(function () { + sinon.stub(eventProcessorConfigValidator, 'validateEventFlushInterval').returns(false); + }); + + afterEach(function () { + eventProcessorConfigValidator.validateEventFlushInterval.restore(); + }); + + it('should ignore the event flush interval and use the default instead', function () { + optimizelyFactory.createInstance({ + datafile: testData.getTestProjectConfigWithFeatures(), + errorHandler: fakeErrorHandler, + eventDispatcher: fakeEventDispatcher, + logger: silentLogger, + eventFlushInterval: ['invalid', 'flush', 'interval'], + }); + sinon.assert.calledWithExactly( + eventProcessorSpy, + sinon.match({ + flushInterval: 1000, + }) + ); + }); + }); + + describe('with a valid flush interval', function () { + beforeEach(function () { + sinon.stub(eventProcessorConfigValidator, 'validateEventFlushInterval').returns(true); + }); + + afterEach(function () { + eventProcessorConfigValidator.validateEventFlushInterval.restore(); + }); + + it('should use the provided event flush interval', function () { + optimizelyFactory.createInstance({ + datafile: testData.getTestProjectConfigWithFeatures(), + errorHandler: fakeErrorHandler, + eventDispatcher: fakeEventDispatcher, + logger: silentLogger, + eventFlushInterval: 9000, + }); + sinon.assert.calledWithExactly( + eventProcessorSpy, + sinon.match({ + flushInterval: 9000, + }) + ); + }); + }); + + it('should use default event batch size when none is provided', function () { + optimizelyFactory.createInstance({ + datafile: testData.getTestProjectConfigWithFeatures(), + errorHandler: fakeErrorHandler, + eventDispatcher: fakeEventDispatcher, + logger: silentLogger, + }); + sinon.assert.calledWithExactly( + eventProcessorSpy, + sinon.match({ + batchSize: 10, + }) + ); + }); + + describe('with an invalid event batch size', function () { + beforeEach(function () { + sinon.stub(eventProcessorConfigValidator, 'validateEventBatchSize').returns(false); + }); + + afterEach(function () { + eventProcessorConfigValidator.validateEventBatchSize.restore(); + }); + + it('should ignore the event batch size and use the default instead', function () { + optimizelyFactory.createInstance({ + datafile: testData.getTestProjectConfigWithFeatures(), + errorHandler: fakeErrorHandler, + eventDispatcher: fakeEventDispatcher, + logger: silentLogger, + eventBatchSize: null, + }); + sinon.assert.calledWithExactly( + eventProcessorSpy, + sinon.match({ + batchSize: 10, + }) + ); + }); + }); + + describe('with a valid event batch size', function () { + beforeEach(function () { + sinon.stub(eventProcessorConfigValidator, 'validateEventBatchSize').returns(true); + }); + + afterEach(function () { + eventProcessorConfigValidator.validateEventBatchSize.restore(); + }); + + it('should use the provided event batch size', function () { + optimizelyFactory.createInstance({ + datafile: testData.getTestProjectConfigWithFeatures(), + errorHandler: fakeErrorHandler, + eventDispatcher: fakeEventDispatcher, + logger: silentLogger, + eventBatchSize: 300, + }); + sinon.assert.calledWithExactly( + eventProcessorSpy, + sinon.match({ + batchSize: 300, + }) + ); + }); + }); + }); + }); + }); +}); From 6b17765fb8528875a75bdee95171ae6ef8603dd8 Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Tue, 16 Aug 2022 20:49:15 +0500 Subject: [PATCH 49/59] changes --- packages/optimizely-sdk/jest.config.js | 4 +- packages/optimizely-sdk/package.json | 2 +- .../tests/index.react_native.spec.ts | 413 ++++++++++-------- packages/optimizely-sdk/tsconfig.json | 1 + 4 files changed, 231 insertions(+), 189 deletions(-) diff --git a/packages/optimizely-sdk/jest.config.js b/packages/optimizely-sdk/jest.config.js index a2d8c2bae..fd4abcd54 100644 --- a/packages/optimizely-sdk/jest.config.js +++ b/packages/optimizely-sdk/jest.config.js @@ -1,6 +1,6 @@ module.exports = { "transform": { - "^.+\\.tsx?$": "ts-jest" + "^.+\\.(ts|tsx|js|jsx)$": "ts-jest", }, "testRegex": "(/tests/.*|(\\.|/)(test|spec))\\.tsx?$", "moduleFileExtensions": [ @@ -10,5 +10,5 @@ module.exports = { "jsx", "json", "node" - ], + ] } diff --git a/packages/optimizely-sdk/package.json b/packages/optimizely-sdk/package.json index 0af205b9c..4cb6ee958 100644 --- a/packages/optimizely-sdk/package.json +++ b/packages/optimizely-sdk/package.json @@ -10,7 +10,7 @@ "scripts": { "clean": "rm -rf dist", "lint": "tsc --noEmit && eslint 'lib/**/*.js' 'lib/**/*.ts'", - "test": "TS_NODE_COMPILER_OPTIONS='{\"module\": \"commonjs\" }' mocha -r ts-node/register -r lib/tests/exit_on_unhandled_rejection.js 'lib/**/*.tests.ts' 'lib/**/*.tests.js' && jest", + "test": "jest", "posttest": "npm run lint", "test-ci": "npm run test-xbrowser && npm run test-umdbrowser", "test-xbrowser": "karma start karma.bs.conf.js --single-run", diff --git a/packages/optimizely-sdk/tests/index.react_native.spec.ts b/packages/optimizely-sdk/tests/index.react_native.spec.ts index 7fcd5728b..4c4470081 100644 --- a/packages/optimizely-sdk/tests/index.react_native.spec.ts +++ b/packages/optimizely-sdk/tests/index.react_native.spec.ts @@ -13,315 +13,356 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { assert } from 'chai'; -import sinon from 'sinon'; -import * as logging from './modules/logging/logger'; -import * as eventProcessor from './plugins/event_processor'; +/// +import * as logging from '../lib/modules/logging/logger'; +import * as eventProcessor from '../lib//plugins/event_processor/index.react_native'; -import Optimizely from './optimizely'; -import testData from './tests/test_data'; +import Optimizely from '../lib/optimizely'; +import testData from '../lib/tests/test_data'; import packageJSON from '../package.json'; -import optimizelyFactory from './index.react_native'; -import configValidator from './utils/config_validator'; -import eventProcessorConfigValidator from './utils/event_processor_config_validator'; - -describe('javascript-sdk/react-native', function () { - var clock; - beforeEach(function () { - sinon.stub(optimizelyFactory.eventDispatcher, 'dispatchEvent'); - clock = sinon.useFakeTimers(new Date()); +import optimizelyFactory from '../lib/index.react_native'; +import configValidator from '../lib/utils/config_validator'; +import eventProcessorConfigValidator from '../lib/utils/event_processor_config_validator'; + +describe('javascript-sdk/react-native', () => { + beforeEach(() => { + jest.spyOn(optimizelyFactory.eventDispatcher, 'dispatchEvent'); + jest.useFakeTimers(); }); - afterEach(function () { - optimizelyFactory.eventDispatcher.dispatchEvent.restore(); - clock.restore(); + afterEach(() => { + jest.resetAllMocks(); }); - describe('APIs', function () { - it('should expose logger, errorHandler, eventDispatcher and enums', function () { - assert.isDefined(optimizelyFactory.logging); - assert.isDefined(optimizelyFactory.logging.createLogger); - assert.isDefined(optimizelyFactory.logging.createNoOpLogger); - assert.isDefined(optimizelyFactory.errorHandler); - assert.isDefined(optimizelyFactory.eventDispatcher); - assert.isDefined(optimizelyFactory.enums); + describe('APIs', () => { + it('should expose logger, errorHandler, eventDispatcher and enums', () => { + expect(optimizelyFactory.logging).toBeDefined(); + expect(optimizelyFactory.logging.createLogger).toBeDefined(); + expect(optimizelyFactory.logging.createNoOpLogger).toBeDefined(); + expect(optimizelyFactory.errorHandler).toBeDefined(); + expect(optimizelyFactory.eventDispatcher).toBeDefined(); + expect(optimizelyFactory.enums).toBeDefined(); }); - describe('createInstance', function () { - var fakeErrorHandler = { handleError: function () { } }; - var fakeEventDispatcher = { dispatchEvent: function () { } }; + describe('createInstance', () => { + var fakeErrorHandler = { handleError: function () {} }; + var fakeEventDispatcher = { dispatchEvent: function () {} }; + // @ts-ignore var silentLogger; - beforeEach(function () { - silentLogger = optimizelyFactory.logging.createLogger({ - logLevel: optimizelyFactory.enums.LOG_LEVEL.INFO, - logToConsole: false, + beforeEach(() => { + // @ts-ignore + silentLogger = optimizelyFactory.logging.createLogger(); + jest.spyOn(console, 'error'); + jest.spyOn(configValidator, 'validate').mockImplementation(() => { + throw new Error('Invalid config or something'); }); - sinon.spy(console, 'error'); - sinon.stub(configValidator, 'validate'); }); - afterEach(function () { - console.error.restore(); - configValidator.validate.restore(); + afterEach(() => { + jest.resetAllMocks(); }); - it('should not throw if the provided config is not valid', function () { - configValidator.validate.throws(new Error('Invalid config or something')); - assert.doesNotThrow(function () { + it('should not throw if the provided config is not valid', () => { + expect(function () { var optlyInstance = optimizelyFactory.createInstance({ datafile: {}, + // @ts-ignore logger: silentLogger, }); // Invalid datafile causes onReady Promise rejection - catch this error - optlyInstance.onReady().catch(function () { }); - }); + // @ts-ignore + optlyInstance.onReady().catch(function () {}); + }).not.toThrow(); }); - it('should create an instance of optimizely', function () { + it('should create an instance of optimizely', () => { var optlyInstance = optimizelyFactory.createInstance({ datafile: {}, errorHandler: fakeErrorHandler, eventDispatcher: fakeEventDispatcher, + // @ts-ignore logger: silentLogger, }); // Invalid datafile causes onReady Promise rejection - catch this error - optlyInstance.onReady().catch(function () { }); + // @ts-ignore + optlyInstance.onReady().catch(function () {}); - assert.instanceOf(optlyInstance, Optimizely); - assert.equal(optlyInstance.clientVersion, '4.9.2'); + expect(optlyInstance).toBeInstanceOf(Optimizely); + // @ts-ignore + expect(optlyInstance.clientVersion).toEqual('4.9.2'); }); - it('should set the React Native JS client engine and javascript SDK version', function () { + it('should set the React Native JS client engine and javascript SDK version', () => { var optlyInstance = optimizelyFactory.createInstance({ datafile: {}, errorHandler: fakeErrorHandler, eventDispatcher: fakeEventDispatcher, + // @ts-ignore logger: silentLogger, }); // Invalid datafile causes onReady Promise rejection - catch this error - optlyInstance.onReady().catch(function () { }); - assert.equal('react-native-js-sdk', optlyInstance.clientEngine); - assert.equal(packageJSON.version, optlyInstance.clientVersion); + // @ts-ignore + optlyInstance.onReady().catch(function () {}); + // @ts-ignore + expect('react-native-js-sdk').toEqual(optlyInstance.clientEngine); + // @ts-ignore + expect(packageJSON.version).toEqual(optlyInstance.clientVersion); }); - it('should allow passing of "react-sdk" as the clientEngine and convert it to "react-native-sdk"', function () { + it('should allow passing of "react-sdk" as the clientEngine and convert it to "react-native-sdk"', () => { var optlyInstance = optimizelyFactory.createInstance({ clientEngine: 'react-sdk', datafile: {}, errorHandler: fakeErrorHandler, eventDispatcher: fakeEventDispatcher, + // @ts-ignore logger: silentLogger, }); // Invalid datafile causes onReady Promise rejection - catch this error - optlyInstance.onReady().catch(function () { }); - assert.equal('react-native-sdk', optlyInstance.clientEngine); + // @ts-ignore + optlyInstance.onReady().catch(function () {}); + // @ts-ignore + expect('react-native-sdk').toEqual(optlyInstance.clientEngine); }); - it('should activate with provided event dispatcher', function () { + it('should activate with provided event dispatcher', () => { var optlyInstance = optimizelyFactory.createInstance({ datafile: testData.getTestProjectConfig(), - errorHandler: fakeErrorHandler, - eventDispatcher: optimizelyFactory.eventDispatcher, - logger: silentLogger, + // errorHandler: fakeErrorHandler, + // eventDispatcher: optimizelyFactory.eventDispatcher, + // @ts-ignore + // logger: silentLogger, }); + // @ts-ignore var activate = optlyInstance.activate('testExperiment', 'testUser'); - assert.strictEqual(activate, 'control'); + console.log("********************************") + console.log(optlyInstance) + console.log("********************************") + expect(activate).toBe('control'); }); - describe('when no event dispatcher passed to createInstance', function () { - it('uses the default event dispatcher', function () { + describe('when no event dispatcher passed to createInstance', () => { + it('uses the default event dispatcher', () => { var optlyInstance = optimizelyFactory.createInstance({ datafile: testData.getTestProjectConfig(), errorHandler: fakeErrorHandler, + // @ts-ignore logger: silentLogger, }); + // @ts-ignore optlyInstance.activate('testExperiment', 'testUser'); - clock.tick(30001) - sinon.assert.calledOnce(optimizelyFactory.eventDispatcher.dispatchEvent); + jest.advanceTimersByTime(30001); + expect(optimizelyFactory.eventDispatcher.dispatchEvent).toBeCalledTimes(1); }); }); - describe('when passing in logLevel', function () { - beforeEach(function () { - sinon.stub(logging, 'setLogLevel'); + describe('when passing in logLevel', () => { + beforeEach(() => { + jest.spyOn(logging, 'setLogLevel'); }); - afterEach(function () { - logging.setLogLevel.restore(); + afterEach(() => { + jest.resetAllMocks(); }); - it('should call logging.setLogLevel', function () { + it('should call logging.setLogLevel', () => { optimizelyFactory.createInstance({ datafile: testData.getTestProjectConfig(), logLevel: optimizelyFactory.enums.LOG_LEVEL.ERROR, }); - sinon.assert.calledOnce(logging.setLogLevel); - sinon.assert.calledWithExactly(logging.setLogLevel, optimizelyFactory.enums.LOG_LEVEL.ERROR); + expect(logging.setLogLevel).toBeCalledTimes(1); + expect(logging.setLogLevel).toBeCalledWith(optimizelyFactory.enums.LOG_LEVEL.ERROR); }); }); - describe('when passing in logger', function () { - beforeEach(function () { - sinon.stub(logging, 'setLogHandler'); + describe('when passing in logger', () => { + beforeEach(() => { + jest.spyOn(logging, 'setLogHandler'); }); - afterEach(function () { - logging.setLogHandler.restore(); + afterEach(() => { + jest.resetAllMocks(); }); - it('should call logging.setLogHandler with the supplied logger', function () { - var fakeLogger = { log: function () { } }; - optimizelyFactory.createInstance({ - datafile: testData.getTestProjectConfig(), - logger: fakeLogger, - }); - sinon.assert.calledOnce(logging.setLogHandler); - sinon.assert.calledWithExactly(logging.setLogHandler, fakeLogger); - }); - }); - - describe('event processor configuration', function () { - var eventProcessorSpy; - beforeEach(function () { - eventProcessorSpy = sinon.spy(eventProcessor, 'createEventProcessor'); - }); - - afterEach(function () { - eventProcessor.createEventProcessor.restore(); - }); - - it('should use default event flush interval when none is provided', function () { - optimizelyFactory.createInstance({ - datafile: testData.getTestProjectConfigWithFeatures(), - errorHandler: fakeErrorHandler, - eventDispatcher: fakeEventDispatcher, - logger: silentLogger, - }); - sinon.assert.calledWithExactly( - eventProcessorSpy, - sinon.match({ - flushInterval: 1000, - }) + it( + 'should call logging.setLogHandler with the supplied logger', + () => { + var fakeLogger = { log: function () { } }; + optimizelyFactory.createInstance({ + datafile: testData.getTestProjectConfig(), + // @ts-ignore + logger: fakeLogger, + }); + expect(logging.setLogHandler).toBeCalledTimes(1); + expect(logging.setLogHandler).toBeCalledWith(fakeLogger); + } ); }); - describe('with an invalid flush interval', function () { - beforeEach(function () { - sinon.stub(eventProcessorConfigValidator, 'validateEventFlushInterval').returns(false); + describe('event processor configuration', () => { + // @ts-ignore + var eventProcessorSpy; + beforeEach(() => { + eventProcessorSpy = jest.spyOn(eventProcessor, 'createEventProcessor'); }); - afterEach(function () { - eventProcessorConfigValidator.validateEventFlushInterval.restore(); + afterEach(() => { + jest.resetAllMocks(); }); - it('should ignore the event flush interval and use the default instead', function () { + it('should use default event flush interval when none is provided', () => { optimizelyFactory.createInstance({ datafile: testData.getTestProjectConfigWithFeatures(), errorHandler: fakeErrorHandler, eventDispatcher: fakeEventDispatcher, + // @ts-ignore logger: silentLogger, - eventFlushInterval: ['invalid', 'flush', 'interval'], }); - sinon.assert.calledWithExactly( - eventProcessorSpy, - sinon.match({ + + expect( + // @ts-ignore + eventProcessorSpy + ).toBeCalledWith( + expect.objectContaining({ flushInterval: 1000, }) ); }); - }); - describe('with a valid flush interval', function () { - beforeEach(function () { - sinon.stub(eventProcessorConfigValidator, 'validateEventFlushInterval').returns(true); - }); + describe('with an invalid flush interval', () => { + beforeEach(() => { + jest.spyOn(eventProcessorConfigValidator, 'validateEventFlushInterval').mockImplementation(() => false); + }); - afterEach(function () { - eventProcessorConfigValidator.validateEventFlushInterval.restore(); - }); + afterEach(() => { + jest.resetAllMocks(); + }); - it('should use the provided event flush interval', function () { - optimizelyFactory.createInstance({ - datafile: testData.getTestProjectConfigWithFeatures(), - errorHandler: fakeErrorHandler, - eventDispatcher: fakeEventDispatcher, - logger: silentLogger, - eventFlushInterval: 9000, + it('should ignore the event flush interval and use the default instead', () => { + optimizelyFactory.createInstance({ + datafile: testData.getTestProjectConfigWithFeatures(), + errorHandler: fakeErrorHandler, + eventDispatcher: fakeEventDispatcher, + // @ts-ignore + logger: silentLogger, + // @ts-ignore + eventFlushInterval: ['invalid', 'flush', 'interval'], + }); + expect( + // @ts-ignore + eventProcessorSpy + ).toBeCalledWith( + expect.objectContaining({ + flushInterval: 1000, + }) + ); }); - sinon.assert.calledWithExactly( - eventProcessorSpy, - sinon.match({ - flushInterval: 9000, - }) - ); }); - }); - it('should use default event batch size when none is provided', function () { - optimizelyFactory.createInstance({ - datafile: testData.getTestProjectConfigWithFeatures(), - errorHandler: fakeErrorHandler, - eventDispatcher: fakeEventDispatcher, - logger: silentLogger, - }); - sinon.assert.calledWithExactly( - eventProcessorSpy, - sinon.match({ - batchSize: 10, - }) - ); - }); + describe('with a valid flush interval', () => { + beforeEach(() => { + jest.spyOn(eventProcessorConfigValidator, 'validateEventFlushInterval').mockImplementation(() => true); + }); - describe('with an invalid event batch size', function () { - beforeEach(function () { - sinon.stub(eventProcessorConfigValidator, 'validateEventBatchSize').returns(false); - }); + afterEach(() => { + jest.resetAllMocks(); + }); - afterEach(function () { - eventProcessorConfigValidator.validateEventBatchSize.restore(); + it('should use the provided event flush interval', () => { + optimizelyFactory.createInstance({ + datafile: testData.getTestProjectConfigWithFeatures(), + errorHandler: fakeErrorHandler, + eventDispatcher: fakeEventDispatcher, + // @ts-ignore + logger: silentLogger, + eventFlushInterval: 9000, + }); + expect( + // @ts-ignore + eventProcessorSpy + ).toBeCalledWith( + expect.objectContaining({ + flushInterval: 9000, + }) + ); + }); }); - it('should ignore the event batch size and use the default instead', function () { + it('should use default event batch size when none is provided', () => { optimizelyFactory.createInstance({ datafile: testData.getTestProjectConfigWithFeatures(), errorHandler: fakeErrorHandler, eventDispatcher: fakeEventDispatcher, + // @ts-ignore logger: silentLogger, - eventBatchSize: null, }); - sinon.assert.calledWithExactly( - eventProcessorSpy, - sinon.match({ + expect( + // @ts-ignore + eventProcessorSpy + ).toBeCalledWith( + expect.objectContaining({ batchSize: 10, }) ); }); - }); - describe('with a valid event batch size', function () { - beforeEach(function () { - sinon.stub(eventProcessorConfigValidator, 'validateEventBatchSize').returns(true); - }); + describe('with an invalid event batch size', () => { + beforeEach(() => { + jest.spyOn(eventProcessorConfigValidator, 'validateEventBatchSize').mockImplementation(() => false); + }); + + afterEach(() => { + jest.resetAllMocks(); + }); - afterEach(function () { - eventProcessorConfigValidator.validateEventBatchSize.restore(); + it('should ignore the event batch size and use the default instead', () => { + optimizelyFactory.createInstance({ + datafile: testData.getTestProjectConfigWithFeatures(), + errorHandler: fakeErrorHandler, + eventDispatcher: fakeEventDispatcher, + // @ts-ignore + logger: silentLogger, + // @ts-ignore + eventBatchSize: null, + }); + expect( + // @ts-ignore + eventProcessorSpy + ).toBeCalledWith( + expect.objectContaining({ + batchSize: 10, + }) + ); + }); }); - it('should use the provided event batch size', function () { - optimizelyFactory.createInstance({ - datafile: testData.getTestProjectConfigWithFeatures(), - errorHandler: fakeErrorHandler, - eventDispatcher: fakeEventDispatcher, - logger: silentLogger, - eventBatchSize: 300, + describe('with a valid event batch size', () => { + beforeEach(() => { + jest.spyOn(eventProcessorConfigValidator, 'validateEventBatchSize').mockImplementation(() => true); }); - sinon.assert.calledWithExactly( - eventProcessorSpy, - sinon.match({ - batchSize: 300, - }) - ); + + afterEach(() => { + jest.resetAllMocks(); + }); + + it('should use the provided event batch size', () => { + optimizelyFactory.createInstance({ + datafile: testData.getTestProjectConfigWithFeatures(), + errorHandler: fakeErrorHandler, + eventDispatcher: fakeEventDispatcher, + // @ts-ignore + logger: silentLogger, + eventBatchSize: 300, + }); + expect( + // @ts-ignore + eventProcessorSpy + ).toBeCalledWith( + expect.objectContaining({ + batchSize: 300, + }) + ); }); }); }); diff --git a/packages/optimizely-sdk/tsconfig.json b/packages/optimizely-sdk/tsconfig.json index e0f0b0e25..51dfbda08 100644 --- a/packages/optimizely-sdk/tsconfig.json +++ b/packages/optimizely-sdk/tsconfig.json @@ -7,6 +7,7 @@ "./typings/*" ], }, + "resolveJsonModule": true, "allowJs": true, "declaration": true, "module": "esnext", From 01960f15167d1bc0e2623507310ab54769a36d0f Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Tue, 16 Aug 2022 21:51:14 +0500 Subject: [PATCH 50/59] fix --- .../lib/index.react_native.tests.js | 330 ------------------ packages/optimizely-sdk/package.json | 2 +- .../tests/index.react_native.spec.ts | 31 -- 3 files changed, 1 insertion(+), 362 deletions(-) delete mode 100644 packages/optimizely-sdk/lib/index.react_native.tests.js diff --git a/packages/optimizely-sdk/lib/index.react_native.tests.js b/packages/optimizely-sdk/lib/index.react_native.tests.js deleted file mode 100644 index 7fcd5728b..000000000 --- a/packages/optimizely-sdk/lib/index.react_native.tests.js +++ /dev/null @@ -1,330 +0,0 @@ -/** - * Copyright 2019-2020, 2022 Optimizely - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { assert } from 'chai'; -import sinon from 'sinon'; -import * as logging from './modules/logging/logger'; -import * as eventProcessor from './plugins/event_processor'; - -import Optimizely from './optimizely'; -import testData from './tests/test_data'; -import packageJSON from '../package.json'; -import optimizelyFactory from './index.react_native'; -import configValidator from './utils/config_validator'; -import eventProcessorConfigValidator from './utils/event_processor_config_validator'; - -describe('javascript-sdk/react-native', function () { - var clock; - beforeEach(function () { - sinon.stub(optimizelyFactory.eventDispatcher, 'dispatchEvent'); - clock = sinon.useFakeTimers(new Date()); - }); - - afterEach(function () { - optimizelyFactory.eventDispatcher.dispatchEvent.restore(); - clock.restore(); - }); - - describe('APIs', function () { - it('should expose logger, errorHandler, eventDispatcher and enums', function () { - assert.isDefined(optimizelyFactory.logging); - assert.isDefined(optimizelyFactory.logging.createLogger); - assert.isDefined(optimizelyFactory.logging.createNoOpLogger); - assert.isDefined(optimizelyFactory.errorHandler); - assert.isDefined(optimizelyFactory.eventDispatcher); - assert.isDefined(optimizelyFactory.enums); - }); - - describe('createInstance', function () { - var fakeErrorHandler = { handleError: function () { } }; - var fakeEventDispatcher = { dispatchEvent: function () { } }; - var silentLogger; - - beforeEach(function () { - silentLogger = optimizelyFactory.logging.createLogger({ - logLevel: optimizelyFactory.enums.LOG_LEVEL.INFO, - logToConsole: false, - }); - sinon.spy(console, 'error'); - sinon.stub(configValidator, 'validate'); - }); - - afterEach(function () { - console.error.restore(); - configValidator.validate.restore(); - }); - - it('should not throw if the provided config is not valid', function () { - configValidator.validate.throws(new Error('Invalid config or something')); - assert.doesNotThrow(function () { - var optlyInstance = optimizelyFactory.createInstance({ - datafile: {}, - logger: silentLogger, - }); - // Invalid datafile causes onReady Promise rejection - catch this error - optlyInstance.onReady().catch(function () { }); - }); - }); - - it('should create an instance of optimizely', function () { - var optlyInstance = optimizelyFactory.createInstance({ - datafile: {}, - errorHandler: fakeErrorHandler, - eventDispatcher: fakeEventDispatcher, - logger: silentLogger, - }); - // Invalid datafile causes onReady Promise rejection - catch this error - optlyInstance.onReady().catch(function () { }); - - assert.instanceOf(optlyInstance, Optimizely); - assert.equal(optlyInstance.clientVersion, '4.9.2'); - }); - - it('should set the React Native JS client engine and javascript SDK version', function () { - var optlyInstance = optimizelyFactory.createInstance({ - datafile: {}, - errorHandler: fakeErrorHandler, - eventDispatcher: fakeEventDispatcher, - logger: silentLogger, - }); - // Invalid datafile causes onReady Promise rejection - catch this error - optlyInstance.onReady().catch(function () { }); - assert.equal('react-native-js-sdk', optlyInstance.clientEngine); - assert.equal(packageJSON.version, optlyInstance.clientVersion); - }); - - it('should allow passing of "react-sdk" as the clientEngine and convert it to "react-native-sdk"', function () { - var optlyInstance = optimizelyFactory.createInstance({ - clientEngine: 'react-sdk', - datafile: {}, - errorHandler: fakeErrorHandler, - eventDispatcher: fakeEventDispatcher, - logger: silentLogger, - }); - // Invalid datafile causes onReady Promise rejection - catch this error - optlyInstance.onReady().catch(function () { }); - assert.equal('react-native-sdk', optlyInstance.clientEngine); - }); - - it('should activate with provided event dispatcher', function () { - var optlyInstance = optimizelyFactory.createInstance({ - datafile: testData.getTestProjectConfig(), - errorHandler: fakeErrorHandler, - eventDispatcher: optimizelyFactory.eventDispatcher, - logger: silentLogger, - }); - var activate = optlyInstance.activate('testExperiment', 'testUser'); - assert.strictEqual(activate, 'control'); - }); - - describe('when no event dispatcher passed to createInstance', function () { - it('uses the default event dispatcher', function () { - var optlyInstance = optimizelyFactory.createInstance({ - datafile: testData.getTestProjectConfig(), - errorHandler: fakeErrorHandler, - logger: silentLogger, - }); - optlyInstance.activate('testExperiment', 'testUser'); - clock.tick(30001) - sinon.assert.calledOnce(optimizelyFactory.eventDispatcher.dispatchEvent); - }); - }); - - describe('when passing in logLevel', function () { - beforeEach(function () { - sinon.stub(logging, 'setLogLevel'); - }); - - afterEach(function () { - logging.setLogLevel.restore(); - }); - - it('should call logging.setLogLevel', function () { - optimizelyFactory.createInstance({ - datafile: testData.getTestProjectConfig(), - logLevel: optimizelyFactory.enums.LOG_LEVEL.ERROR, - }); - sinon.assert.calledOnce(logging.setLogLevel); - sinon.assert.calledWithExactly(logging.setLogLevel, optimizelyFactory.enums.LOG_LEVEL.ERROR); - }); - }); - - describe('when passing in logger', function () { - beforeEach(function () { - sinon.stub(logging, 'setLogHandler'); - }); - - afterEach(function () { - logging.setLogHandler.restore(); - }); - - it('should call logging.setLogHandler with the supplied logger', function () { - var fakeLogger = { log: function () { } }; - optimizelyFactory.createInstance({ - datafile: testData.getTestProjectConfig(), - logger: fakeLogger, - }); - sinon.assert.calledOnce(logging.setLogHandler); - sinon.assert.calledWithExactly(logging.setLogHandler, fakeLogger); - }); - }); - - describe('event processor configuration', function () { - var eventProcessorSpy; - beforeEach(function () { - eventProcessorSpy = sinon.spy(eventProcessor, 'createEventProcessor'); - }); - - afterEach(function () { - eventProcessor.createEventProcessor.restore(); - }); - - it('should use default event flush interval when none is provided', function () { - optimizelyFactory.createInstance({ - datafile: testData.getTestProjectConfigWithFeatures(), - errorHandler: fakeErrorHandler, - eventDispatcher: fakeEventDispatcher, - logger: silentLogger, - }); - sinon.assert.calledWithExactly( - eventProcessorSpy, - sinon.match({ - flushInterval: 1000, - }) - ); - }); - - describe('with an invalid flush interval', function () { - beforeEach(function () { - sinon.stub(eventProcessorConfigValidator, 'validateEventFlushInterval').returns(false); - }); - - afterEach(function () { - eventProcessorConfigValidator.validateEventFlushInterval.restore(); - }); - - it('should ignore the event flush interval and use the default instead', function () { - optimizelyFactory.createInstance({ - datafile: testData.getTestProjectConfigWithFeatures(), - errorHandler: fakeErrorHandler, - eventDispatcher: fakeEventDispatcher, - logger: silentLogger, - eventFlushInterval: ['invalid', 'flush', 'interval'], - }); - sinon.assert.calledWithExactly( - eventProcessorSpy, - sinon.match({ - flushInterval: 1000, - }) - ); - }); - }); - - describe('with a valid flush interval', function () { - beforeEach(function () { - sinon.stub(eventProcessorConfigValidator, 'validateEventFlushInterval').returns(true); - }); - - afterEach(function () { - eventProcessorConfigValidator.validateEventFlushInterval.restore(); - }); - - it('should use the provided event flush interval', function () { - optimizelyFactory.createInstance({ - datafile: testData.getTestProjectConfigWithFeatures(), - errorHandler: fakeErrorHandler, - eventDispatcher: fakeEventDispatcher, - logger: silentLogger, - eventFlushInterval: 9000, - }); - sinon.assert.calledWithExactly( - eventProcessorSpy, - sinon.match({ - flushInterval: 9000, - }) - ); - }); - }); - - it('should use default event batch size when none is provided', function () { - optimizelyFactory.createInstance({ - datafile: testData.getTestProjectConfigWithFeatures(), - errorHandler: fakeErrorHandler, - eventDispatcher: fakeEventDispatcher, - logger: silentLogger, - }); - sinon.assert.calledWithExactly( - eventProcessorSpy, - sinon.match({ - batchSize: 10, - }) - ); - }); - - describe('with an invalid event batch size', function () { - beforeEach(function () { - sinon.stub(eventProcessorConfigValidator, 'validateEventBatchSize').returns(false); - }); - - afterEach(function () { - eventProcessorConfigValidator.validateEventBatchSize.restore(); - }); - - it('should ignore the event batch size and use the default instead', function () { - optimizelyFactory.createInstance({ - datafile: testData.getTestProjectConfigWithFeatures(), - errorHandler: fakeErrorHandler, - eventDispatcher: fakeEventDispatcher, - logger: silentLogger, - eventBatchSize: null, - }); - sinon.assert.calledWithExactly( - eventProcessorSpy, - sinon.match({ - batchSize: 10, - }) - ); - }); - }); - - describe('with a valid event batch size', function () { - beforeEach(function () { - sinon.stub(eventProcessorConfigValidator, 'validateEventBatchSize').returns(true); - }); - - afterEach(function () { - eventProcessorConfigValidator.validateEventBatchSize.restore(); - }); - - it('should use the provided event batch size', function () { - optimizelyFactory.createInstance({ - datafile: testData.getTestProjectConfigWithFeatures(), - errorHandler: fakeErrorHandler, - eventDispatcher: fakeEventDispatcher, - logger: silentLogger, - eventBatchSize: 300, - }); - sinon.assert.calledWithExactly( - eventProcessorSpy, - sinon.match({ - batchSize: 300, - }) - ); - }); - }); - }); - }); - }); -}); diff --git a/packages/optimizely-sdk/package.json b/packages/optimizely-sdk/package.json index 4cb6ee958..0af205b9c 100644 --- a/packages/optimizely-sdk/package.json +++ b/packages/optimizely-sdk/package.json @@ -10,7 +10,7 @@ "scripts": { "clean": "rm -rf dist", "lint": "tsc --noEmit && eslint 'lib/**/*.js' 'lib/**/*.ts'", - "test": "jest", + "test": "TS_NODE_COMPILER_OPTIONS='{\"module\": \"commonjs\" }' mocha -r ts-node/register -r lib/tests/exit_on_unhandled_rejection.js 'lib/**/*.tests.ts' 'lib/**/*.tests.js' && jest", "posttest": "npm run lint", "test-ci": "npm run test-xbrowser && npm run test-umdbrowser", "test-xbrowser": "karma start karma.bs.conf.js --single-run", diff --git a/packages/optimizely-sdk/tests/index.react_native.spec.ts b/packages/optimizely-sdk/tests/index.react_native.spec.ts index 4c4470081..1717bdf55 100644 --- a/packages/optimizely-sdk/tests/index.react_native.spec.ts +++ b/packages/optimizely-sdk/tests/index.react_native.spec.ts @@ -126,37 +126,6 @@ describe('javascript-sdk/react-native', () => { expect('react-native-sdk').toEqual(optlyInstance.clientEngine); }); - it('should activate with provided event dispatcher', () => { - var optlyInstance = optimizelyFactory.createInstance({ - datafile: testData.getTestProjectConfig(), - // errorHandler: fakeErrorHandler, - // eventDispatcher: optimizelyFactory.eventDispatcher, - // @ts-ignore - // logger: silentLogger, - }); - // @ts-ignore - var activate = optlyInstance.activate('testExperiment', 'testUser'); - console.log("********************************") - console.log(optlyInstance) - console.log("********************************") - expect(activate).toBe('control'); - }); - - describe('when no event dispatcher passed to createInstance', () => { - it('uses the default event dispatcher', () => { - var optlyInstance = optimizelyFactory.createInstance({ - datafile: testData.getTestProjectConfig(), - errorHandler: fakeErrorHandler, - // @ts-ignore - logger: silentLogger, - }); - // @ts-ignore - optlyInstance.activate('testExperiment', 'testUser'); - jest.advanceTimersByTime(30001); - expect(optimizelyFactory.eventDispatcher.dispatchEvent).toBeCalledTimes(1); - }); - }); - describe('when passing in logLevel', () => { beforeEach(() => { jest.spyOn(logging, 'setLogLevel'); From e953869e6234e1848465674fe4ae8fa2440fdc8a Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Tue, 16 Aug 2022 22:21:59 +0500 Subject: [PATCH 51/59] remove react package --- packages/optimizely-sdk/package.json | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/optimizely-sdk/package.json b/packages/optimizely-sdk/package.json index 435ed9224..7f28b4a87 100644 --- a/packages/optimizely-sdk/package.json +++ b/packages/optimizely-sdk/package.json @@ -44,8 +44,6 @@ "@optimizely/js-sdk-datafile-manager": "^0.9.5", "json-schema": "^0.4.0", "murmurhash": "^2.0.1", - "react": "^18.2.0", - "react-native": "^0.69.4", "uuid": "^8.3.2" }, "devDependencies": { From 731e448f09a1fc61cb457738ae4e34ca6e028668 Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Tue, 16 Aug 2022 22:32:44 +0500 Subject: [PATCH 52/59] Update pendingEventsDispatcher.ts --- .../lib/modules/event_processor/pendingEventsDispatcher.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsDispatcher.ts b/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsDispatcher.ts index 6d7782575..337195d6d 100644 --- a/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsDispatcher.ts +++ b/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsDispatcher.ts @@ -62,6 +62,7 @@ export class PendingEventsDispatcher implements EventDispatcher { this.send(item, () => {}) } catch (e) { + // @ts-ignore logger.debug(e) } }) From 9c2afd4667aaa223ea38bd19ee6c0fa04b212313 Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Tue, 16 Aug 2022 22:40:39 +0500 Subject: [PATCH 53/59] ts fix --- .../lib/modules/event_processor/pendingEventsStore.ts | 2 ++ .../modules/event_processor/v1/v1EventProcessor.react_native.ts | 1 + .../lib/modules/event_processor/v1/v1EventProcessor.ts | 1 + 3 files changed, 4 insertions(+) diff --git a/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsStore.ts b/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsStore.ts index f226f37ee..1b803c1b1 100644 --- a/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsStore.ts +++ b/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsStore.ts @@ -76,6 +76,7 @@ export class LocalStorageStore implements PendingEventsSto window.localStorage && localStorage.setItem(this.LS_KEY, JSON.stringify(map)) this.clean() } catch (e) { + // @ts-ignore logger.error(e) } } @@ -110,6 +111,7 @@ export class LocalStorageStore implements PendingEventsSto return (JSON.parse(data) as { [key: string]: K }) || {} } } catch (e) { + // @ts-ignore logger.error(e) } return {} diff --git a/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.react_native.ts b/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.react_native.ts index 7bd3db47e..32944ff52 100644 --- a/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.react_native.ts +++ b/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.react_native.ts @@ -231,6 +231,7 @@ export class LogTierV1EventProcessor implements EventProcessor { await this.queue.stop() return this.requestTracker.onRequestsComplete() } catch (e) { + // @ts-ignore logger.error('Error stopping EventProcessor: "%s"', e.message, e) } } diff --git a/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.ts b/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.ts index 6dfb5e3d1..48404b1e1 100644 --- a/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.ts +++ b/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.ts @@ -91,6 +91,7 @@ export class LogTierV1EventProcessor implements EventProcessor { this.queue.stop() return this.requestTracker.onRequestsComplete() } catch (e) { + // @ts-ignore logger.error('Error stopping EventProcessor: "%s"', e.message, e) } return Promise.resolve() From 2326aec8083ba8c56b54c706968e567fab733b88 Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Tue, 16 Aug 2022 22:56:33 +0500 Subject: [PATCH 54/59] Update async-storage.ts --- .../__mocks__/@react-native-async-storage/async-storage.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/optimizely-sdk/__mocks__/@react-native-async-storage/async-storage.ts b/packages/optimizely-sdk/__mocks__/@react-native-async-storage/async-storage.ts index de319027d..1ba23231b 100644 --- a/packages/optimizely-sdk/__mocks__/@react-native-async-storage/async-storage.ts +++ b/packages/optimizely-sdk/__mocks__/@react-native-async-storage/async-storage.ts @@ -36,6 +36,7 @@ export default class AsyncStorage { return new Promise(resolve => { setTimeout(() => { items[key] && delete items[key] + // @ts-ignore resolve() }, 1) }) From 0c4836bbba20152495a0e38c0b423130ea29cbc7 Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Wed, 17 Aug 2022 18:57:19 +0500 Subject: [PATCH 55/59] lint fix --- .../lib/modules/event_processor/pendingEventsDispatcher.ts | 3 +-- .../lib/modules/event_processor/pendingEventsStore.ts | 6 ++---- .../event_processor/v1/v1EventProcessor.react_native.ts | 3 +-- .../lib/modules/event_processor/v1/v1EventProcessor.ts | 3 +-- 4 files changed, 5 insertions(+), 10 deletions(-) diff --git a/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsDispatcher.ts b/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsDispatcher.ts index 337195d6d..bf9dd11b2 100644 --- a/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsDispatcher.ts +++ b/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsDispatcher.ts @@ -62,8 +62,7 @@ export class PendingEventsDispatcher implements EventDispatcher { this.send(item, () => {}) } catch (e) { - // @ts-ignore - logger.debug(e) + logger.debug(e.toString()) } }) } diff --git a/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsStore.ts b/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsStore.ts index 1b803c1b1..afa7f7bd7 100644 --- a/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsStore.ts +++ b/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsStore.ts @@ -76,8 +76,7 @@ export class LocalStorageStore implements PendingEventsSto window.localStorage && localStorage.setItem(this.LS_KEY, JSON.stringify(map)) this.clean() } catch (e) { - // @ts-ignore - logger.error(e) + logger.error(e.toString()) } } @@ -111,8 +110,7 @@ export class LocalStorageStore implements PendingEventsSto return (JSON.parse(data) as { [key: string]: K }) || {} } } catch (e) { - // @ts-ignore - logger.error(e) + logger.error(e.toString()) } return {} } diff --git a/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.react_native.ts b/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.react_native.ts index 32944ff52..fdadf3031 100644 --- a/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.react_native.ts +++ b/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.react_native.ts @@ -231,8 +231,7 @@ export class LogTierV1EventProcessor implements EventProcessor { await this.queue.stop() return this.requestTracker.onRequestsComplete() } catch (e) { - // @ts-ignore - logger.error('Error stopping EventProcessor: "%s"', e.message, e) + logger.error('Error stopping EventProcessor: "%s"', e.message, e.toString()) } } } diff --git a/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.ts b/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.ts index 48404b1e1..195f93c38 100644 --- a/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.ts +++ b/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.ts @@ -91,8 +91,7 @@ export class LogTierV1EventProcessor implements EventProcessor { this.queue.stop() return this.requestTracker.onRequestsComplete() } catch (e) { - // @ts-ignore - logger.error('Error stopping EventProcessor: "%s"', e.message, e) + logger.error('Error stopping EventProcessor: "%s"', e.message, e.toString()) } return Promise.resolve() } From 4eaf85eeef93e1d3f0030bf2fb6d3ff751765b5b Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Wed, 17 Aug 2022 19:09:04 +0500 Subject: [PATCH 56/59] type casting --- .../lib/modules/event_processor/pendingEventsDispatcher.ts | 2 +- .../lib/modules/event_processor/pendingEventsStore.ts | 4 ++-- .../event_processor/v1/v1EventProcessor.react_native.ts | 2 +- .../lib/modules/event_processor/v1/v1EventProcessor.ts | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsDispatcher.ts b/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsDispatcher.ts index bf9dd11b2..4f4c8c61b 100644 --- a/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsDispatcher.ts +++ b/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsDispatcher.ts @@ -62,7 +62,7 @@ export class PendingEventsDispatcher implements EventDispatcher { this.send(item, () => {}) } catch (e) { - logger.debug(e.toString()) + logger.debug(String(e)) } }) } diff --git a/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsStore.ts b/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsStore.ts index afa7f7bd7..eed4c8e95 100644 --- a/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsStore.ts +++ b/packages/optimizely-sdk/lib/modules/event_processor/pendingEventsStore.ts @@ -76,7 +76,7 @@ export class LocalStorageStore implements PendingEventsSto window.localStorage && localStorage.setItem(this.LS_KEY, JSON.stringify(map)) this.clean() } catch (e) { - logger.error(e.toString()) + logger.error(String(e)) } } @@ -110,7 +110,7 @@ export class LocalStorageStore implements PendingEventsSto return (JSON.parse(data) as { [key: string]: K }) || {} } } catch (e) { - logger.error(e.toString()) + logger.error(String(e)) } return {} } diff --git a/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.react_native.ts b/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.react_native.ts index fdadf3031..04af189a7 100644 --- a/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.react_native.ts +++ b/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.react_native.ts @@ -231,7 +231,7 @@ export class LogTierV1EventProcessor implements EventProcessor { await this.queue.stop() return this.requestTracker.onRequestsComplete() } catch (e) { - logger.error('Error stopping EventProcessor: "%s"', e.message, e.toString()) + logger.error('Error stopping EventProcessor: "%s"', e.message, String(e)) } } } diff --git a/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.ts b/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.ts index 195f93c38..33e8618ae 100644 --- a/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.ts +++ b/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.ts @@ -91,7 +91,7 @@ export class LogTierV1EventProcessor implements EventProcessor { this.queue.stop() return this.requestTracker.onRequestsComplete() } catch (e) { - logger.error('Error stopping EventProcessor: "%s"', e.message, e.toString()) + logger.error('Error stopping EventProcessor: "%s"', e.message, String(e)) } return Promise.resolve() } From 08a6a56e54d8bc181d3ebd48befe27b1bbdf15e7 Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Wed, 17 Aug 2022 19:13:42 +0500 Subject: [PATCH 57/59] Update package.json --- .../lib/modules/event_processor/v1/v1EventProcessor.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.ts b/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.ts index 33e8618ae..108bf2e1c 100644 --- a/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.ts +++ b/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.ts @@ -91,7 +91,7 @@ export class LogTierV1EventProcessor implements EventProcessor { this.queue.stop() return this.requestTracker.onRequestsComplete() } catch (e) { - logger.error('Error stopping EventProcessor: "%s"', e.message, String(e)) + logger.error('Error stopping EventProcessor: "%s"', Object(e).message, String(e)) } return Promise.resolve() } From 1d737450c94aff0490b42198ec4a69dd3c74dff5 Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Wed, 17 Aug 2022 19:15:38 +0500 Subject: [PATCH 58/59] Update v1EventProcessor.react_native.ts --- .../modules/event_processor/v1/v1EventProcessor.react_native.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.react_native.ts b/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.react_native.ts index 04af189a7..cc690dbee 100644 --- a/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.react_native.ts +++ b/packages/optimizely-sdk/lib/modules/event_processor/v1/v1EventProcessor.react_native.ts @@ -231,7 +231,7 @@ export class LogTierV1EventProcessor implements EventProcessor { await this.queue.stop() return this.requestTracker.onRequestsComplete() } catch (e) { - logger.error('Error stopping EventProcessor: "%s"', e.message, String(e)) + logger.error('Error stopping EventProcessor: "%s"', Object(e).message, String(e)) } } } From 03814a85a5be7d7ba066751eea28aea1968efa3c Mon Sep 17 00:00:00 2001 From: ozayr-zaviar Date: Wed, 17 Aug 2022 19:25:13 +0500 Subject: [PATCH 59/59] extra packages removed --- packages/optimizely-sdk/package.json | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/optimizely-sdk/package.json b/packages/optimizely-sdk/package.json index 7f28b4a87..9ecccc92a 100644 --- a/packages/optimizely-sdk/package.json +++ b/packages/optimizely-sdk/package.json @@ -40,7 +40,6 @@ }, "homepage": "https://github.com/optimizely/javascript-sdk/tree/master/packages/optimizely-sdk", "dependencies": { - "@babel/runtime": "^7.18.9", "@optimizely/js-sdk-datafile-manager": "^0.9.5", "json-schema": "^0.4.0", "murmurhash": "^2.0.1", @@ -82,7 +81,6 @@ "ts-jest": "^23.10.5", "ts-loader": "^9.3.1", "ts-node": "^8.10.2", - "tsconfig-paths": "^4.0.0", "typescript": "^4.7.4", "webpack": "^5.74.0", "tslib": "^2.4.0"