From 8a6191c95f789410ea8b0fffe4bbfdb37c13a2ff Mon Sep 17 00:00:00 2001 From: Jeff Bradford Date: Mon, 13 May 2019 23:44:18 -0700 Subject: [PATCH] update devDependencies to latest version of Jasmine, simplify async syntax in Jasmine unit tests --- lib/dynamodb-wrapper.spec.ts | 1059 +++++++++++++++------------------- package-lock.json | 340 ++--------- package.json | 4 +- 3 files changed, 506 insertions(+), 897 deletions(-) diff --git a/lib/dynamodb-wrapper.spec.ts b/lib/dynamodb-wrapper.spec.ts index d306292..9bf8f66 100644 --- a/lib/dynamodb-wrapper.spec.ts +++ b/lib/dynamodb-wrapper.spec.ts @@ -2,14 +2,6 @@ import { DynamoDB } from 'aws-sdk'; import { IMockDynamoDBOptions, MockDynamoDB } from '../test/mock-dynamodb'; import { DynamoDBWrapper } from './dynamodb-wrapper'; -function testAsync(fn) { - return (done) => { - fn.apply(null, arguments) - .then(() => done()) - .catch((err) => done.fail(err)); - }; -} - describe('lib/dynamodb-wrapper', () => { function _setupDynamoDBWrapper(options?: IMockDynamoDBOptions) { @@ -89,25 +81,21 @@ describe('lib/dynamodb-wrapper', () => { 'deleteItem', 'batchGetItem' ].forEach(method => { - it('should pass ' + method + '() calls straight through to the AWS SDK', testAsync(() => { - async function test() { - let params: any = { - TableName: 'Test' - }; - let mock = _setupDynamoDBWrapper(); - let dynamoDB = mock.dynamoDB; - let dynamoDBWrapper = mock.dynamoDBWrapper; - dynamoDBWrapper.tableNamePrefix = 'local-'; - - spyOn(dynamoDB, method).and.callThrough(); - await dynamoDBWrapper[method](params); + it('should pass ' + method + '() calls straight through to the AWS SDK', async () => { + let params: any = { + TableName: 'Test' + }; + let mock = _setupDynamoDBWrapper(); + let dynamoDB = mock.dynamoDB; + let dynamoDBWrapper = mock.dynamoDBWrapper; + dynamoDBWrapper.tableNamePrefix = 'local-'; - expect(params.TableName).toBe('local-Test'); - expect(dynamoDB[method]).toHaveBeenCalledWith(params); - } + spyOn(dynamoDB, method).and.callThrough(); + await dynamoDBWrapper[method](params); - return test(); - })); + expect(params.TableName).toBe('local-Test'); + expect(dynamoDB[method]).toHaveBeenCalledWith(params); + }); }); describe('putItem()', () => { @@ -129,155 +117,131 @@ describe('lib/dynamodb-wrapper', () => { return params; } - it('should put item', testAsync(() => { - async function test() { - let params = _setupPutItemParams(); - let mock = _setupDynamoDBWrapper(); - let dynamoDB = mock.dynamoDB; - let dynamoDBWrapper = mock.dynamoDBWrapper; - - spyOn(dynamoDB, 'putItem').and.callThrough(); - await dynamoDBWrapper.putItem(params); - - expect(dynamoDB.putItem).toHaveBeenCalledWith(params); - } - - return test(); - })); + it('should put item', async () => { + let params = _setupPutItemParams(); + let mock = _setupDynamoDBWrapper(); + let dynamoDB = mock.dynamoDB; + let dynamoDBWrapper = mock.dynamoDBWrapper; - it('should emit a "consumedCapacity" event when a response contains a ConsumedCapacity object', testAsync(() => { - async function test() { - let params = _setupPutItemParams({ ReturnConsumedCapacity: 'TOTAL' }); - let mock = _setupDynamoDBWrapper(); - let dynamoDB = mock.dynamoDB; - let dynamoDBWrapper = mock.dynamoDBWrapper; + spyOn(dynamoDB, 'putItem').and.callThrough(); + await dynamoDBWrapper.putItem(params); - let event = null; - - dynamoDBWrapper.events.on('consumedCapacity', function onConsumedCapacity(e) { - event = e; - }); - - await dynamoDBWrapper.putItem(params); + expect(dynamoDB.putItem).toHaveBeenCalledWith(params); + }); - expect(event).toEqual({ - method: 'putItem', - capacityType: 'WriteCapacityUnits', - consumedCapacity: { - TableName: 'Test', - CapacityUnits: 1 - } - }); - } + it('should emit a "consumedCapacity" event when a response contains a ConsumedCapacity object', async () => { + let params = _setupPutItemParams({ ReturnConsumedCapacity: 'TOTAL' }); + let mock = _setupDynamoDBWrapper(); + let dynamoDB = mock.dynamoDB; + let dynamoDBWrapper = mock.dynamoDBWrapper; - return test(); - })); + let event = null; - it('should retry a failed request (throttled)', testAsync(() => { - async function test() { - let params = _setupPutItemParams(); - let mock = _setupDynamoDBWrapper({ - customResponses: { - 1: 'ProvisionedThroughputExceededException' - } - }); - let dynamoDB = mock.dynamoDB; - let dynamoDBWrapper = mock.dynamoDBWrapper; + dynamoDBWrapper.events.on('consumedCapacity', function onConsumedCapacity(e) { + event = e; + }); - spyOn(dynamoDB, 'putItem').and.callThrough(); - await dynamoDBWrapper.putItem(params); + await dynamoDBWrapper.putItem(params); - expect(dynamoDB.putItem).toHaveBeenCalledTimes(2); - } + expect(event).toEqual({ + method: 'putItem', + capacityType: 'WriteCapacityUnits', + consumedCapacity: { + TableName: 'Test', + CapacityUnits: 1 + } + }); + }); - return test(); - })); + it('should retry a failed request (throttled)', async () => { + let params = _setupPutItemParams(); + let mock = _setupDynamoDBWrapper({ + customResponses: { + 1: 'ProvisionedThroughputExceededException' + } + }); + let dynamoDB = mock.dynamoDB; + let dynamoDBWrapper = mock.dynamoDBWrapper; - it('should emit a "retry" event when retrying a failed request', testAsync(() => { - async function test() { - let params = _setupPutItemParams(); - let mock = _setupDynamoDBWrapper({ - customResponses: { - 1: 'ProvisionedThroughputExceededException' - } - }); - let dynamoDB = mock.dynamoDB; - let dynamoDBWrapper = mock.dynamoDBWrapper; + spyOn(dynamoDB, 'putItem').and.callThrough(); + await dynamoDBWrapper.putItem(params); - let event = null; + expect(dynamoDB.putItem).toHaveBeenCalledTimes(2); + }); - dynamoDBWrapper.events.on('retry', function onRetry(e) { - event = e; - }); + it('should emit a "retry" event when retrying a failed request', async () => { + let params = _setupPutItemParams(); + let mock = _setupDynamoDBWrapper({ + customResponses: { + 1: 'ProvisionedThroughputExceededException' + } + }); + let dynamoDB = mock.dynamoDB; + let dynamoDBWrapper = mock.dynamoDBWrapper; - await dynamoDBWrapper.putItem(params); + let event = null; - expect(event).toEqual({ - tableName: 'Test', - method: 'putItem', - retryCount: 1, - retryDelayMs: 0 - }); - } + dynamoDBWrapper.events.on('retry', function onRetry(e) { + event = e; + }); - return test(); - })); - - it('should throw a fatal exception when the maximum number of retries is exceeded', testAsync(() => { - async function test() { - let params = _setupPutItemParams(); - let mock = _setupDynamoDBWrapper({ - customResponses: { - 1: 'ProvisionedThroughputExceededException', - 2: 'ProvisionedThroughputExceededException', - 3: 'ProvisionedThroughputExceededException' - } - }); - let dynamoDB = mock.dynamoDB; - let dynamoDBWrapper = mock.dynamoDBWrapper; - dynamoDBWrapper.retryDelayOptions.customBackoff = () => 0; + await dynamoDBWrapper.putItem(params); - spyOn(dynamoDB, 'putItem').and.callThrough(); + expect(event).toEqual({ + tableName: 'Test', + method: 'putItem', + retryCount: 1, + retryDelayMs: 0 + }); + }); - let exception; - try { - await dynamoDBWrapper.putItem(params); - } catch (e) { - exception = e; + it('should throw a fatal exception when the maximum number of retries is exceeded', async () => { + let params = _setupPutItemParams(); + let mock = _setupDynamoDBWrapper({ + customResponses: { + 1: 'ProvisionedThroughputExceededException', + 2: 'ProvisionedThroughputExceededException', + 3: 'ProvisionedThroughputExceededException' } + }); + let dynamoDB = mock.dynamoDB; + let dynamoDBWrapper = mock.dynamoDBWrapper; + dynamoDBWrapper.retryDelayOptions.customBackoff = () => 0; - expect(dynamoDB.putItem).toHaveBeenCalledTimes(3); - expect(exception.code).toBe('ProvisionedThroughputExceededException'); - expect(exception.statusCode).toBe(400); + spyOn(dynamoDB, 'putItem').and.callThrough(); + + let exception; + try { + await dynamoDBWrapper.putItem(params); + } catch (e) { + exception = e; } - return test(); - })); + expect(dynamoDB.putItem).toHaveBeenCalledTimes(3); + expect(exception.code).toBe('ProvisionedThroughputExceededException'); + expect(exception.statusCode).toBe(400); + }); - it('should pass AWS non-retryable errors through', testAsync(() => { - async function test() { - let params = _setupPutItemParams(); - let mock = _setupDynamoDBWrapper({ - customResponses: { - 1: 'ValidationException' - } - }); - let dynamoDB = mock.dynamoDB; - let dynamoDBWrapper = mock.dynamoDBWrapper; - - let exception; - try { - await dynamoDBWrapper.putItem(params); - } catch (e) { - exception = e; + it('should pass AWS non-retryable errors through', async () => { + let params = _setupPutItemParams(); + let mock = _setupDynamoDBWrapper({ + customResponses: { + 1: 'ValidationException' } + }); + let dynamoDB = mock.dynamoDB; + let dynamoDBWrapper = mock.dynamoDBWrapper; - expect(exception.code).toBe('ValidationException'); - expect(exception.statusCode).toBe(400); + let exception; + try { + await dynamoDBWrapper.putItem(params); + } catch (e) { + exception = e; } - return test(); - })); + expect(exception.code).toBe('ValidationException'); + expect(exception.statusCode).toBe(400); + }); }); describe('query()', () => { @@ -301,79 +265,66 @@ describe('lib/dynamodb-wrapper', () => { return params; } - it('should query by LastEvaluatedKey to return all pages of data', testAsync(() => { - async function test() { - let params = _setupQueryParams(); - let mock = _setupDynamoDBWrapper(); - let dynamoDB = mock.dynamoDB; - let dynamoDBWrapper = mock.dynamoDBWrapper; + it('should query by LastEvaluatedKey to return all pages of data', async () => { + let params = _setupQueryParams(); + let mock = _setupDynamoDBWrapper(); + let dynamoDB = mock.dynamoDB; + let dynamoDBWrapper = mock.dynamoDBWrapper; - spyOn(dynamoDB, 'query').and.callThrough(); - let response = await dynamoDBWrapper.query(params); + spyOn(dynamoDB, 'query').and.callThrough(); + let response = await dynamoDBWrapper.query(params); - expect(dynamoDB.query).toHaveBeenCalledTimes(3); - expect(response.Items.length).toBe(6); - expect(response.ConsumedCapacity).not.toBeDefined(); - } - - return test(); - })); - - it('should aggregate consumed capacity (TOTAL) from multiple responses', testAsync(() => { - async function test() { - let params = _setupQueryParams('TOTAL'); - let mock = _setupDynamoDBWrapper(); - let dynamoDB = mock.dynamoDB; - let dynamoDBWrapper = mock.dynamoDBWrapper; - - spyOn(dynamoDB, 'query').and.callThrough(); - let response = await dynamoDBWrapper.query(params); - - expect(dynamoDB.query).toHaveBeenCalledTimes(3); - expect(response.Items.length).toBe(6); - expect(response.ConsumedCapacity).toEqual({ - CapacityUnits: 21, - TableName: 'Test' - }); - } + expect(dynamoDB.query).toHaveBeenCalledTimes(3); + expect(response.Items.length).toBe(6); + expect(response.ConsumedCapacity).not.toBeDefined(); + }); - return test(); - })); + it('should aggregate consumed capacity (TOTAL) from multiple responses', async () => { + let params = _setupQueryParams('TOTAL'); + let mock = _setupDynamoDBWrapper(); + let dynamoDB = mock.dynamoDB; + let dynamoDBWrapper = mock.dynamoDBWrapper; + + spyOn(dynamoDB, 'query').and.callThrough(); + let response = await dynamoDBWrapper.query(params); + + expect(dynamoDB.query).toHaveBeenCalledTimes(3); + expect(response.Items.length).toBe(6); + expect(response.ConsumedCapacity).toEqual({ + CapacityUnits: 21, + TableName: 'Test' + }); + }); - it('should aggregate consumed capacity (INDEXES) from multiple responses', testAsync(() => { - async function test() { - let params = _setupQueryParams('INDEXES'); - let mock = _setupDynamoDBWrapper(); - let dynamoDB = mock.dynamoDB; - let dynamoDBWrapper = mock.dynamoDBWrapper; + it('should aggregate consumed capacity (INDEXES) from multiple responses', async () => { + let params = _setupQueryParams('INDEXES'); + let mock = _setupDynamoDBWrapper(); + let dynamoDB = mock.dynamoDB; + let dynamoDBWrapper = mock.dynamoDBWrapper; - spyOn(dynamoDB, 'query').and.callThrough(); - let response = await dynamoDBWrapper.query(params); + spyOn(dynamoDB, 'query').and.callThrough(); + let response = await dynamoDBWrapper.query(params); - expect(dynamoDB.query).toHaveBeenCalledTimes(3); - expect(response.Items.length).toBe(6); - expect(response.ConsumedCapacity).toEqual({ - CapacityUnits: 21, - TableName: 'Test', - Table: { - CapacityUnits: 6 - }, - LocalSecondaryIndexes: { - MyLocalIndex: { - CapacityUnits: 12 - } - }, - GlobalSecondaryIndexes: { - MyGlobalIndex: { - CapacityUnits: 3 - } + expect(dynamoDB.query).toHaveBeenCalledTimes(3); + expect(response.Items.length).toBe(6); + expect(response.ConsumedCapacity).toEqual({ + CapacityUnits: 21, + TableName: 'Test', + Table: { + CapacityUnits: 6 + }, + LocalSecondaryIndexes: { + MyLocalIndex: { + CapacityUnits: 12 } - }); - } - - return test(); - })); - + }, + GlobalSecondaryIndexes: { + MyGlobalIndex: { + CapacityUnits: 3 + } + } + }); + }); }); describe('scan()', () => { @@ -397,79 +348,66 @@ describe('lib/dynamodb-wrapper', () => { return params; } - it('should scan by LastEvaluatedKey to return all pages of data', testAsync(() => { - async function test() { - let params = _setupScanParams(); - let mock = _setupDynamoDBWrapper(); - let dynamoDB = mock.dynamoDB; - let dynamoDBWrapper = mock.dynamoDBWrapper; - - spyOn(dynamoDB, 'scan').and.callThrough(); - let response = await dynamoDBWrapper.scan(params); - - expect(dynamoDB.scan).toHaveBeenCalledTimes(3); - expect(response.Items.length).toBe(6); - expect(response.ConsumedCapacity).not.toBeDefined(); - } - - return test(); - })); - - it('should aggregate consumed capacity (TOTAL) from multiple responses', testAsync(() => { - async function test() { - let params = _setupScanParams('TOTAL'); - let mock = _setupDynamoDBWrapper(); - let dynamoDB = mock.dynamoDB; - let dynamoDBWrapper = mock.dynamoDBWrapper; + it('should scan by LastEvaluatedKey to return all pages of data', async () => { + let params = _setupScanParams(); + let mock = _setupDynamoDBWrapper(); + let dynamoDB = mock.dynamoDB; + let dynamoDBWrapper = mock.dynamoDBWrapper; - spyOn(dynamoDB, 'scan').and.callThrough(); - let response = await dynamoDBWrapper.scan(params); + spyOn(dynamoDB, 'scan').and.callThrough(); + let response = await dynamoDBWrapper.scan(params); - expect(dynamoDB.scan).toHaveBeenCalledTimes(3); - expect(response.Items.length).toBe(6); - expect(response.ConsumedCapacity).toEqual({ - CapacityUnits: 21, - TableName: 'Test' - }); - } + expect(dynamoDB.scan).toHaveBeenCalledTimes(3); + expect(response.Items.length).toBe(6); + expect(response.ConsumedCapacity).not.toBeDefined(); + }); - return test(); - })); + it('should aggregate consumed capacity (TOTAL) from multiple responses', async () => { + let params = _setupScanParams('TOTAL'); + let mock = _setupDynamoDBWrapper(); + let dynamoDB = mock.dynamoDB; + let dynamoDBWrapper = mock.dynamoDBWrapper; + + spyOn(dynamoDB, 'scan').and.callThrough(); + let response = await dynamoDBWrapper.scan(params); + + expect(dynamoDB.scan).toHaveBeenCalledTimes(3); + expect(response.Items.length).toBe(6); + expect(response.ConsumedCapacity).toEqual({ + CapacityUnits: 21, + TableName: 'Test' + }); + }); - it('should aggregate consumed capacity (INDEXES) from multiple responses', testAsync(() => { - async function test() { - let params = _setupScanParams('INDEXES'); - let mock = _setupDynamoDBWrapper(); - let dynamoDB = mock.dynamoDB; - let dynamoDBWrapper = mock.dynamoDBWrapper; + it('should aggregate consumed capacity (INDEXES) from multiple responses', async () => { + let params = _setupScanParams('INDEXES'); + let mock = _setupDynamoDBWrapper(); + let dynamoDB = mock.dynamoDB; + let dynamoDBWrapper = mock.dynamoDBWrapper; - spyOn(dynamoDB, 'scan').and.callThrough(); - let response = await dynamoDBWrapper.scan(params); + spyOn(dynamoDB, 'scan').and.callThrough(); + let response = await dynamoDBWrapper.scan(params); - expect(dynamoDB.scan).toHaveBeenCalledTimes(3); - expect(response.Items.length).toBe(6); - expect(response.ConsumedCapacity).toEqual({ - CapacityUnits: 21, - TableName: 'Test', - Table: { - CapacityUnits: 6 - }, - LocalSecondaryIndexes: { - MyLocalIndex: { - CapacityUnits: 12 - } - }, - GlobalSecondaryIndexes: { - MyGlobalIndex: { - CapacityUnits: 3 - } + expect(dynamoDB.scan).toHaveBeenCalledTimes(3); + expect(response.Items.length).toBe(6); + expect(response.ConsumedCapacity).toEqual({ + CapacityUnits: 21, + TableName: 'Test', + Table: { + CapacityUnits: 6 + }, + LocalSecondaryIndexes: { + MyLocalIndex: { + CapacityUnits: 12 } - }); - } - - return test(); - })); - + }, + GlobalSecondaryIndexes: { + MyGlobalIndex: { + CapacityUnits: 3 + } + } + }); + }); }); describe('batchWriteItem()', () => { @@ -516,374 +454,319 @@ describe('lib/dynamodb-wrapper', () => { return params; } - it('should throw a NotYetImplemented exception for item collection metrics', testAsync(() => { - async function test() { - let mock = _setupDynamoDBWrapper(); - let dynamoDBWrapper = mock.dynamoDBWrapper; - let params: any = { - ReturnItemCollectionMetrics: 'SIZE' - }; - - let exception; - try { - await dynamoDBWrapper.batchWriteItem(params); - } catch (e) { - exception = e; - } - - expect(exception.code).toBe('NotYetImplementedError'); - expect(exception.message).toBe('ReturnItemCollectionMetrics is supported in the AWS DynamoDB API, ' + - 'but this capability is not yet implemented by this wrapper library.'); - } - - return test(); - })); - - it('should batch write items with default options', testAsync(() => { - async function test() { - let params = _setupBatchWriteItemParams(); - let mock = _setupDynamoDBWrapper(); - let dynamoDB = mock.dynamoDB; - let dynamoDBWrapper = mock.dynamoDBWrapper; - - spyOn(dynamoDB, 'batchWriteItem').and.callThrough(); + it('should throw a NotYetImplemented exception for item collection metrics', async () => { + let mock = _setupDynamoDBWrapper(); + let dynamoDBWrapper = mock.dynamoDBWrapper; + let params: any = { + ReturnItemCollectionMetrics: 'SIZE' + }; + let exception; + try { await dynamoDBWrapper.batchWriteItem(params); - - expect(dynamoDB.batchWriteItem).toHaveBeenCalledTimes(1); - + } catch (e) { + exception = e; } - return test(); - })); - - it('should emit batchGroupWritten after processing a group', testAsync(() => { - async function test() { - let params = _setupBatchWriteItemParams({ - isMultipleTables: true - }); - let mock = _setupDynamoDBWrapper(); - let dynamoDB = mock.dynamoDB; - let dynamoDBWrapper = mock.dynamoDBWrapper; - - let counts = new Map(); - dynamoDBWrapper.events.on('batchGroupWritten', function onConsumedCapacity(e) { - counts.set(e.tableName, e.processedCount); - }); + expect(exception.code).toBe('NotYetImplementedError'); + expect(exception.message).toBe('ReturnItemCollectionMetrics is supported in the AWS DynamoDB API, ' + + 'but this capability is not yet implemented by this wrapper library.'); + }); - await dynamoDBWrapper.batchWriteItem(params); + it('should batch write items with default options', async () => { + let params = _setupBatchWriteItemParams(); + let mock = _setupDynamoDBWrapper(); + let dynamoDB = mock.dynamoDB; + let dynamoDBWrapper = mock.dynamoDBWrapper; - expect(counts.size).toEqual(2); - expect(counts.get('Test')).toEqual(10); - expect(counts.get('AnotherTest')).toEqual(4); - } + spyOn(dynamoDB, 'batchWriteItem').and.callThrough(); - return test(); - })); + await dynamoDBWrapper.batchWriteItem(params); - it('should batch write items with custom options per table', testAsync(() => { - async function test() { - let params = _setupBatchWriteItemParams(); - let mock = _setupDynamoDBWrapper(); - let dynamoDB = mock.dynamoDB; - let dynamoDBWrapper = mock.dynamoDBWrapper; + expect(dynamoDB.batchWriteItem).toHaveBeenCalledTimes(1); + }); - spyOn(dynamoDB, 'batchWriteItem').and.callThrough(); + it('should emit batchGroupWritten after processing a group', async () => { + let params = _setupBatchWriteItemParams({ + isMultipleTables: true + }); + let mock = _setupDynamoDBWrapper(); + let dynamoDB = mock.dynamoDB; + let dynamoDBWrapper = mock.dynamoDBWrapper; - await dynamoDBWrapper.batchWriteItem(params, { - Test: { - partitionStrategy: 'EvenlyDistributedGroupWCU', - targetGroupWCU: 4 - } - }); + let counts = new Map(); + dynamoDBWrapper.events.on('batchGroupWritten', function onConsumedCapacity(e) { + counts.set(e.tableName, e.processedCount); + }); - expect(dynamoDB.batchWriteItem).toHaveBeenCalledTimes(3); + await dynamoDBWrapper.batchWriteItem(params); - } - - return test(); - })); + expect(counts.size).toEqual(2); + expect(counts.get('Test')).toEqual(10); + expect(counts.get('AnotherTest')).toEqual(4); + }); - it('should batch write items with custom options (legacy for backwards compatibility)', testAsync(() => { - async function test() { - let params = _setupBatchWriteItemParams(); - let mock = _setupDynamoDBWrapper(); - let dynamoDB = mock.dynamoDB; - let dynamoDBWrapper = mock.dynamoDBWrapper; + it('should batch write items with custom options per table', async () => { + let params = _setupBatchWriteItemParams(); + let mock = _setupDynamoDBWrapper(); + let dynamoDB = mock.dynamoDB; + let dynamoDBWrapper = mock.dynamoDBWrapper; - spyOn(dynamoDB, 'batchWriteItem').and.callThrough(); + spyOn(dynamoDB, 'batchWriteItem').and.callThrough(); - await dynamoDBWrapper.batchWriteItem(params, { + await dynamoDBWrapper.batchWriteItem(params, { + Test: { partitionStrategy: 'EvenlyDistributedGroupWCU', targetGroupWCU: 4 - }); - - expect(dynamoDB.batchWriteItem).toHaveBeenCalledTimes(3); + } + }); - } + expect(dynamoDB.batchWriteItem).toHaveBeenCalledTimes(3); + }); - return test(); - })); + it('should batch write items with custom options (legacy for backwards compatibility)', async () => { + let params = _setupBatchWriteItemParams(); + let mock = _setupDynamoDBWrapper(); + let dynamoDB = mock.dynamoDB; + let dynamoDBWrapper = mock.dynamoDBWrapper; - it('should retry failed requests when there are UnprocessedItems', testAsync(() => { - async function test() { - let params = _setupBatchWriteItemParams(); - let mock = _setupDynamoDBWrapper({ - customResponses: { - 1: 'SomeUnprocessedItems' - } - }); - let dynamoDB = mock.dynamoDB; - let dynamoDBWrapper = mock.dynamoDBWrapper; + spyOn(dynamoDB, 'batchWriteItem').and.callThrough(); - spyOn(dynamoDB, 'batchWriteItem').and.callThrough(); + await dynamoDBWrapper.batchWriteItem(params, { + partitionStrategy: 'EvenlyDistributedGroupWCU', + targetGroupWCU: 4 + }); - await dynamoDBWrapper.batchWriteItem(params, { - partitionStrategy: 'EqualItemCount', - targetItemCount: 10 - }); + expect(dynamoDB.batchWriteItem).toHaveBeenCalledTimes(3); + }); - expect(dynamoDB.batchWriteItem).toHaveBeenCalledTimes(2); + it('should retry failed requests when there are UnprocessedItems', async () => { + let params = _setupBatchWriteItemParams(); + let mock = _setupDynamoDBWrapper({ + customResponses: { + 1: 'SomeUnprocessedItems' + } + }); + let dynamoDB = mock.dynamoDB; + let dynamoDBWrapper = mock.dynamoDBWrapper; - } + spyOn(dynamoDB, 'batchWriteItem').and.callThrough(); - return test(); - })); - - it('should return a 200 OK response if some items were unprocessed', testAsync(() => { - async function test() { - let params = _setupBatchWriteItemParams(); - let mock = _setupDynamoDBWrapper({ - customResponses: { - 1: 'ProvisionedThroughputExceededException', - 2: 'ProvisionedThroughputExceededException', - 3: 'SomeUnprocessedItems' - } - }); - let dynamoDB = mock.dynamoDB; - let dynamoDBWrapper = mock.dynamoDBWrapper; + await dynamoDBWrapper.batchWriteItem(params, { + partitionStrategy: 'EqualItemCount', + targetItemCount: 10 + }); - spyOn(dynamoDB, 'batchWriteItem').and.callThrough(); + expect(dynamoDB.batchWriteItem).toHaveBeenCalledTimes(2); + }); - let response = await dynamoDBWrapper.batchWriteItem(params, { - partitionStrategy: 'EqualItemCount', - targetItemCount: 10 - }); + it('should return a 200 OK response if some items were unprocessed', async () => { + let params = _setupBatchWriteItemParams(); + let mock = _setupDynamoDBWrapper({ + customResponses: { + 1: 'ProvisionedThroughputExceededException', + 2: 'ProvisionedThroughputExceededException', + 3: 'SomeUnprocessedItems' + } + }); + let dynamoDB = mock.dynamoDB; + let dynamoDBWrapper = mock.dynamoDBWrapper; - expect(dynamoDB.batchWriteItem).toHaveBeenCalledTimes(3); - expect(response.UnprocessedItems['Test'].length).toEqual(9); - } + spyOn(dynamoDB, 'batchWriteItem').and.callThrough(); - return test(); - })); - - it('should throw a ProvisionedThroughputExceededException if ALL items are unprocessed', testAsync(() => { - async function test() { - let params = _setupBatchWriteItemParams(); - let mock = _setupDynamoDBWrapper({ - customResponses: { - 1: 'ProvisionedThroughputExceededException', - 2: 'ProvisionedThroughputExceededException', - 3: 'ProvisionedThroughputExceededException' - } - }); - let dynamoDB = mock.dynamoDB; - let dynamoDBWrapper = mock.dynamoDBWrapper; + let response = await dynamoDBWrapper.batchWriteItem(params, { + partitionStrategy: 'EqualItemCount', + targetItemCount: 10 + }); - spyOn(dynamoDB, 'batchWriteItem').and.callThrough(); + expect(dynamoDB.batchWriteItem).toHaveBeenCalledTimes(3); + expect(response.UnprocessedItems['Test'].length).toEqual(9); + }); - let exception; - try { - await dynamoDBWrapper.batchWriteItem(params, { - partitionStrategy: 'EqualItemCount', - targetItemCount: 10 - }); - } catch (e) { - exception = e; + it('should throw a ProvisionedThroughputExceededException if ALL items are unprocessed', async () => { + let params = _setupBatchWriteItemParams(); + let mock = _setupDynamoDBWrapper({ + customResponses: { + 1: 'ProvisionedThroughputExceededException', + 2: 'ProvisionedThroughputExceededException', + 3: 'ProvisionedThroughputExceededException' } + }); + let dynamoDB = mock.dynamoDB; + let dynamoDBWrapper = mock.dynamoDBWrapper; - expect(dynamoDB.batchWriteItem).toHaveBeenCalledTimes(3); - expect(exception.code).toBe('ProvisionedThroughputExceededException'); - expect(exception.message).toBe('The level of configured provisioned throughput for the table was exceeded. ' + - 'Consider increasing your provisioning level with the UpdateTable API'); - } - - return test(); - })); + spyOn(dynamoDB, 'batchWriteItem').and.callThrough(); - it('should aggregate consumed capacity (TOTAL) from multiple responses', testAsync(() => { - async function test() { - let params = _setupBatchWriteItemParams({ - returnConsumedCapacity: 'TOTAL' + let exception; + try { + await dynamoDBWrapper.batchWriteItem(params, { + partitionStrategy: 'EqualItemCount', + targetItemCount: 10 }); - let mock = _setupDynamoDBWrapper(); - let dynamoDB = mock.dynamoDB; - let dynamoDBWrapper = mock.dynamoDBWrapper; + } catch (e) { + exception = e; + } - spyOn(dynamoDB, 'batchWriteItem').and.callThrough(); + expect(dynamoDB.batchWriteItem).toHaveBeenCalledTimes(3); + expect(exception.code).toBe('ProvisionedThroughputExceededException'); + expect(exception.message).toBe('The level of configured provisioned throughput for the table was exceeded. ' + + 'Consider increasing your provisioning level with the UpdateTable API'); + }); - let response = await dynamoDBWrapper.batchWriteItem(params, { - Test: { - partitionStrategy: 'EqualItemCount', - targetItemCount: 4 - } - }); + it('should aggregate consumed capacity (TOTAL) from multiple responses', async () => { + let params = _setupBatchWriteItemParams({ + returnConsumedCapacity: 'TOTAL' + }); + let mock = _setupDynamoDBWrapper(); + let dynamoDB = mock.dynamoDB; + let dynamoDBWrapper = mock.dynamoDBWrapper; - expect(dynamoDB.batchWriteItem).toHaveBeenCalledTimes(3); - expect(response.ConsumedCapacity).toEqual([ - { - CapacityUnits: 60, - TableName: 'Test' - } - ]); + spyOn(dynamoDB, 'batchWriteItem').and.callThrough(); - } + let response = await dynamoDBWrapper.batchWriteItem(params, { + Test: { + partitionStrategy: 'EqualItemCount', + targetItemCount: 4 + } + }); - return test(); - })); + expect(dynamoDB.batchWriteItem).toHaveBeenCalledTimes(3); + expect(response.ConsumedCapacity).toEqual([ + { + CapacityUnits: 60, + TableName: 'Test' + } + ]); + }); - it('should aggregate consumed capacity (INDEXES) from multiple responses', testAsync(() => { - async function test() { - let params = _setupBatchWriteItemParams({ - returnConsumedCapacity: 'INDEXES' - }); - let mock = _setupDynamoDBWrapper(); - let dynamoDB = mock.dynamoDB; - let dynamoDBWrapper = mock.dynamoDBWrapper; + it('should aggregate consumed capacity (INDEXES) from multiple responses', async () => { + let params = _setupBatchWriteItemParams({ + returnConsumedCapacity: 'INDEXES' + }); + let mock = _setupDynamoDBWrapper(); + let dynamoDB = mock.dynamoDB; + let dynamoDBWrapper = mock.dynamoDBWrapper; - spyOn(dynamoDB, 'batchWriteItem').and.callThrough(); + spyOn(dynamoDB, 'batchWriteItem').and.callThrough(); - let response = await dynamoDBWrapper.batchWriteItem(params, { - Test: { - partitionStrategy: 'EqualItemCount', - targetItemCount: 4 - } - }); + let response = await dynamoDBWrapper.batchWriteItem(params, { + Test: { + partitionStrategy: 'EqualItemCount', + targetItemCount: 4 + } + }); - expect(dynamoDB.batchWriteItem).toHaveBeenCalledTimes(3); - expect(response.ConsumedCapacity).toEqual([ - { - CapacityUnits: 60, - TableName: 'Test', - Table: { - CapacityUnits: 10 - }, - LocalSecondaryIndexes: { - MyLocalIndex: { - CapacityUnits: 30 - } - }, - GlobalSecondaryIndexes: { - MyGlobalIndex: { - CapacityUnits: 20 - } + expect(dynamoDB.batchWriteItem).toHaveBeenCalledTimes(3); + expect(response.ConsumedCapacity).toEqual([ + { + CapacityUnits: 60, + TableName: 'Test', + Table: { + CapacityUnits: 10 + }, + LocalSecondaryIndexes: { + MyLocalIndex: { + CapacityUnits: 30 + } + }, + GlobalSecondaryIndexes: { + MyGlobalIndex: { + CapacityUnits: 20 } } - ]); - - } - - return test(); - })); - - it('should aggregate consumed capacity (TOTAL) when some requests are throttled', testAsync(() => { - async function test() { - let params = _setupBatchWriteItemParams({ - returnConsumedCapacity: 'TOTAL' - }); - let mock = _setupDynamoDBWrapper({ - customResponses: { - 1: 'SomeUnprocessedItems' - } - }); - let dynamoDB = mock.dynamoDB; - let dynamoDBWrapper = mock.dynamoDBWrapper; + } + ]); + }); - spyOn(dynamoDB, 'batchWriteItem').and.callThrough(); + it('should aggregate consumed capacity (TOTAL) when some requests are throttled', async () => { + let params = _setupBatchWriteItemParams({ + returnConsumedCapacity: 'TOTAL' + }); + let mock = _setupDynamoDBWrapper({ + customResponses: { + 1: 'SomeUnprocessedItems' + } + }); + let dynamoDB = mock.dynamoDB; + let dynamoDBWrapper = mock.dynamoDBWrapper; - let response = await dynamoDBWrapper.batchWriteItem(params, { - partitionStrategy: 'EqualItemCount', - targetItemCount: 10 - }); + spyOn(dynamoDB, 'batchWriteItem').and.callThrough(); - expect(dynamoDB.batchWriteItem).toHaveBeenCalledTimes(2); - expect(response.ConsumedCapacity).toEqual([ - { - CapacityUnits: 60, - TableName: 'Test' - } - ]); + let response = await dynamoDBWrapper.batchWriteItem(params, { + partitionStrategy: 'EqualItemCount', + targetItemCount: 10 + }); - } + expect(dynamoDB.batchWriteItem).toHaveBeenCalledTimes(2); + expect(response.ConsumedCapacity).toEqual([ + { + CapacityUnits: 60, + TableName: 'Test' + } + ]); + }); - return test(); - })); + it('should support batch writing to multiple tables', async () => { + let params = _setupBatchWriteItemParams({ + isMultipleTables: true, + returnConsumedCapacity: 'INDEXES' + }); + let mock = _setupDynamoDBWrapper(); + let dynamoDB = mock.dynamoDB; + let dynamoDBWrapper = mock.dynamoDBWrapper; - it('should support batch writing to multiple tables', testAsync(() => { - async function test() { - let params = _setupBatchWriteItemParams({ - isMultipleTables: true, - returnConsumedCapacity: 'INDEXES' - }); - let mock = _setupDynamoDBWrapper(); - let dynamoDB = mock.dynamoDB; - let dynamoDBWrapper = mock.dynamoDBWrapper; + spyOn(dynamoDB, 'batchWriteItem').and.callThrough(); - spyOn(dynamoDB, 'batchWriteItem').and.callThrough(); + let response = await dynamoDBWrapper.batchWriteItem(params, { + Test: { + partitionStrategy: 'EqualItemCount', + targetItemCount: 6 + }, + AnotherTest: { + partitionStrategy: 'EqualItemCount', + targetItemCount: 1 + } + }); - let response = await dynamoDBWrapper.batchWriteItem(params, { - Test: { - partitionStrategy: 'EqualItemCount', - targetItemCount: 6 + expect(dynamoDB.batchWriteItem).toHaveBeenCalledTimes(2 + 4); + expect(response.ConsumedCapacity).toEqual([ + { + CapacityUnits: 60, + TableName: 'Test', + Table: { + CapacityUnits: 10 }, - AnotherTest: { - partitionStrategy: 'EqualItemCount', - targetItemCount: 1 + LocalSecondaryIndexes: { + MyLocalIndex: { + CapacityUnits: 30 + } + }, + GlobalSecondaryIndexes: { + MyGlobalIndex: { + CapacityUnits: 20 + } } - }); - - expect(dynamoDB.batchWriteItem).toHaveBeenCalledTimes(2 + 4); - expect(response.ConsumedCapacity).toEqual([ - { - CapacityUnits: 60, - TableName: 'Test', - Table: { - CapacityUnits: 10 - }, - LocalSecondaryIndexes: { - MyLocalIndex: { - CapacityUnits: 30 - } - }, - GlobalSecondaryIndexes: { - MyGlobalIndex: { - CapacityUnits: 20 - } + }, + { + CapacityUnits: 24, + TableName: 'AnotherTest', + Table: { + CapacityUnits: 4 + }, + LocalSecondaryIndexes: { + MyLocalIndex: { + CapacityUnits: 12 } }, - { - CapacityUnits: 24, - TableName: 'AnotherTest', - Table: { - CapacityUnits: 4 - }, - LocalSecondaryIndexes: { - MyLocalIndex: { - CapacityUnits: 12 - } - }, - GlobalSecondaryIndexes: { - MyGlobalIndex: { - CapacityUnits: 8 - } + GlobalSecondaryIndexes: { + MyGlobalIndex: { + CapacityUnits: 8 } } - ]); - - } + } + ]); - return test(); - })); + }); }); diff --git a/package-lock.json b/package-lock.json index d3f6900..9fce305 100644 --- a/package-lock.json +++ b/package-lock.json @@ -94,9 +94,9 @@ } }, "@types/jasmine": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-2.6.0.tgz", - "integrity": "sha512-1ZZdFvYA5zARDXPj5+VF0bwDZWH/o0QQWJVDc5srdC/DngcCZXskR33eR/4PielGvBjLQpQOd6KiQbmtqVkeZA==", + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.3.12.tgz", + "integrity": "sha512-lXvr2xFQEVQLkIhuGaR3GC1L9lMU1IxeWnAF/wNY5ZWpC4p9dgxkKkzMp7pntpAdv9pZSnYqgsBkCg32MXSZMg==", "dev": true }, "@types/minimatch": { @@ -178,12 +178,6 @@ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, "ansi-wrap": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", @@ -260,12 +254,6 @@ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", "dev": true }, - "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", - "dev": true - }, "array-each": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", @@ -555,12 +543,6 @@ "tweetnacl": "^0.14.3" } }, - "beeper": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", - "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", - "dev": true - }, "binary-extensions": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", @@ -664,19 +646,6 @@ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "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" - } - }, "chokidar": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.5.tgz", @@ -772,12 +741,6 @@ "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", "dev": true }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", - "dev": true - }, "cloneable-readable": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz", @@ -991,12 +954,6 @@ "assert-plus": "^1.0.0" } }, - "dateformat": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", - "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", - "dev": true - }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -1139,15 +1096,6 @@ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, - "duplexer2": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", - "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", - "dev": true, - "requires": { - "readable-stream": "~1.1.9" - } - }, "duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", @@ -1329,12 +1277,6 @@ "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", "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", @@ -2434,16 +2376,30 @@ } }, "gulp-jasmine": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/gulp-jasmine/-/gulp-jasmine-2.4.2.tgz", - "integrity": "sha1-Wn9H4nNww2GawKKkQr45lnFAnbM=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/gulp-jasmine/-/gulp-jasmine-4.0.0.tgz", + "integrity": "sha512-0UqY2fA6RCdUDJDsVym3zXYSWmt0AV7YY/6PAeKb+oGTKEgS7zZOH5w/4gcSKs+2FXiWrucQwLDvtEKIDbpF4A==", "dev": true, "requires": { - "arrify": "^1.0.0", - "gulp-util": "^3.0.0", - "jasmine": "^2.3.0", - "jasmine-terminal-reporter": "^1.0.0", - "through2": "^2.0.0" + "arrify": "^1.0.1", + "jasmine": "^3.1.0", + "jasmine-terminal-reporter": "^1.0.3", + "plugin-error": "^1.0.1", + "through2": "^2.0.3" + }, + "dependencies": { + "plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "dev": true, + "requires": { + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + } + } } }, "gulp-tslint": { @@ -2586,40 +2542,6 @@ } } }, - "gulp-util": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", - "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", - "dev": true, - "requires": { - "array-differ": "^1.0.0", - "array-uniq": "^1.0.2", - "beeper": "^1.0.0", - "chalk": "^1.0.0", - "dateformat": "^2.0.0", - "fancy-log": "^1.1.0", - "gulplog": "^1.0.0", - "has-gulplog": "^0.1.0", - "lodash._reescape": "^3.0.0", - "lodash._reevaluate": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.template": "^3.0.0", - "minimist": "^1.1.0", - "multipipe": "^0.1.2", - "object-assign": "^3.0.0", - "replace-ext": "0.0.1", - "through2": "^2.0.0", - "vinyl": "^0.5.0" - }, - "dependencies": { - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", - "dev": true - } - } - }, "gulplog": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", @@ -2665,30 +2587,12 @@ "har-schema": "^2.0.0" } }, - "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" - } - }, "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 }, - "has-gulplog": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", - "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", - "dev": true, - "requires": { - "sparkles": "^1.0.0" - } - }, "has-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", @@ -3125,14 +3029,13 @@ } }, "jasmine": { - "version": "2.99.0", - "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.99.0.tgz", - "integrity": "sha1-jKctEC5jm4Z8ZImFbg4YqceqQrc=", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-3.4.0.tgz", + "integrity": "sha512-sR9b4n+fnBFDEd7VS2el2DeHgKcPiMVn44rtKFumq9q7P/t8WrxsVIZPob4UDdgcDNCwyDqwxCt4k9TDRmjPoQ==", "dev": true, "requires": { - "exit": "^0.1.2", - "glob": "^7.0.6", - "jasmine-core": "~2.99.0" + "glob": "^7.1.3", + "jasmine-core": "~3.4.0" } }, "jasmine-console-reporter": { @@ -3187,9 +3090,9 @@ } }, "jasmine-core": { - "version": "2.99.1", - "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.99.1.tgz", - "integrity": "sha1-5kAN8ea1bhMLYcS80JPap/boyhU=", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.4.0.tgz", + "integrity": "sha512-HU/YxV4i6GcmiH4duATwAbJQMlE0MsDIR5XmSVxURxKHn3aGAdbY1/ZJFmVRbKtnLwIxxMJD7gYaPsypcbYimg==", "dev": true }, "jasmine-terminal-reporter": { @@ -3400,125 +3303,6 @@ "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", "dev": true }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._basetostring": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", - "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", - "dev": true - }, - "lodash._basevalues": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", - "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", - "dev": true - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, - "lodash._reescape": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", - "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", - "dev": true - }, - "lodash._reevaluate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", - "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", - "dev": true - }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", - "dev": true - }, - "lodash._root": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", - "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", - "dev": true - }, - "lodash.escape": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", - "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", - "dev": true, - "requires": { - "lodash._root": "^3.0.0" - } - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", - "dev": true - }, - "lodash.template": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", - "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", - "dev": true, - "requires": { - "lodash._basecopy": "^3.0.0", - "lodash._basetostring": "^3.0.0", - "lodash._basevalues": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0", - "lodash.keys": "^3.0.0", - "lodash.restparam": "^3.0.0", - "lodash.templatesettings": "^3.0.0" - } - }, - "lodash.templatesettings": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", - "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", - "dev": true, - "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0" - } - }, "lodash.toarray": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", @@ -3743,15 +3527,6 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "multipipe": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", - "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", - "dev": true, - "requires": { - "duplexer2": "0.0.2" - } - }, "mute-stdout": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", @@ -4419,26 +4194,6 @@ "read-pkg": "^1.0.0" } }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - } - } - }, "readdirp": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", @@ -4543,12 +4298,6 @@ "is-finite": "^1.0.0" } }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", - "dev": true - }, "replace-homedir": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", @@ -4988,12 +4737,6 @@ "strip-ansi": "^3.0.0" } }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -5012,12 +4755,6 @@ "is-utf8": "^0.2.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 - }, "sver-compat": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", @@ -5507,17 +5244,6 @@ "extsprintf": "^1.2.0" } }, - "vinyl": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", - "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", - "dev": true, - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - } - }, "vinyl-fs": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", diff --git a/package.json b/package.json index 448446d..10858cc 100644 --- a/package.json +++ b/package.json @@ -48,13 +48,13 @@ }, "devDependencies": { "@types/aws-sdk": "2.7.0", - "@types/jasmine": "2.6.0", + "@types/jasmine": "3.3.12", "@types/node": "12.0.1", "coveralls": "3.0.3", "del": "4.1.1", "gulp": "4.0.2", "gulp-istanbul": "1.1.3", - "gulp-jasmine": "2.4.2", + "gulp-jasmine": "4.0.0", "gulp-tslint": "8.1.4", "gulp-typescript": "5.0.1", "jasmine-console-reporter": "3.1.0",