UNPKG

5.67 kBJavaScriptView Raw
1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6
7var _regenerator = require('babel-runtime/regenerator');
8
9var _regenerator2 = _interopRequireDefault(_regenerator);
10
11var _defineProperty2 = require('babel-runtime/helpers/defineProperty');
12
13var _defineProperty3 = _interopRequireDefault(_defineProperty2);
14
15var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator');
16
17var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);
18
19var _isEqual = require('lodash/isEqual');
20
21var _isEqual2 = _interopRequireDefault(_isEqual);
22
23var _pick = require('lodash/pick');
24
25var _pick2 = _interopRequireDefault(_pick);
26
27var _fromPairs = require('lodash/fromPairs');
28
29var _fromPairs2 = _interopRequireDefault(_fromPairs);
30
31var _dynamodbClientInstance = require('./dynamodbClientInstance');
32
33var _dynamodbClientInstance2 = _interopRequireDefault(_dynamodbClientInstance);
34
35function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
36
37var matchProps = ['AttributeDefinitions', 'KeySchema'];
38
39exports.default = function () {
40 var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(tableProperties) {
41 var client, tableNameProp, existing, keyAttributesNames, expressionAttributeNames, scanParams, scanRequest, scanResponse, captureResponse, scan, createProps;
42 return _regenerator2.default.wrap(function _callee$(_context) {
43 while (1) {
44 switch (_context.prev = _context.next) {
45 case 0:
46 if (tableProperties.TableName) {
47 _context.next = 2;
48 break;
49 }
50
51 throw new Error('If you are using a CloudFormation generated TableName you need to Output it and pass it in');
52
53 case 2:
54 _context.next = 4;
55 return (0, _dynamodbClientInstance2.default)();
56
57 case 4:
58 client = _context.sent;
59 tableNameProp = { TableName: tableProperties.TableName };
60 existing = null;
61 _context.prev = 7;
62 _context.next = 10;
63 return client.describeTable(tableNameProp).promise();
64
65 case 10:
66 existing = _context.sent;
67 _context.next = 17;
68 break;
69
70 case 13:
71 _context.prev = 13;
72 _context.t0 = _context['catch'](7);
73
74 if (!(_context.t0.code !== 'ResourceNotFoundException')) {
75 _context.next = 17;
76 break;
77 }
78
79 throw _context.t0;
80
81 case 17:
82 if (!existing) {
83 _context.next = 44;
84 break;
85 }
86
87 if (!(0, _isEqual2.default)((0, _pick2.default)(existing.Table, matchProps), (0, _pick2.default)(tableProperties, matchProps))) {
88 _context.next = 39;
89 break;
90 }
91
92 // Just empty it
93 keyAttributesNames = existing.Table.KeySchema.map(function (s) {
94 return s.AttributeName;
95 });
96 expressionAttributeNames = (0, _fromPairs2.default)(keyAttributesNames.map(function (a, i) {
97 return ['#A' + i, a];
98 }));
99 scanParams = Object.assign({}, tableNameProp, {
100 ExpressionAttributeNames: expressionAttributeNames,
101 ProjectionExpression: Object.keys(expressionAttributeNames).join(', ')
102 });
103 _context.next = 24;
104 return client.scan(scanParams);
105
106 case 24:
107 scanRequest = _context.sent;
108 scanResponse = null;
109
110 captureResponse = function captureResponse(response) {
111 scanResponse = response;
112 };
113
114 case 27:
115 scanRequest.on('success', captureResponse);
116 _context.next = 30;
117 return scanRequest.promise();
118
119 case 30:
120 scan = _context.sent;
121
122 if (scan.Items.length) {
123 _context.next = 33;
124 break;
125 }
126
127 return _context.abrupt('return');
128
129 case 33:
130 _context.next = 35;
131 return client.batchWriteItem({
132 RequestItems: (0, _defineProperty3.default)({}, tableNameProp.TableName, scan.Items.map(function (k) {
133 return {
134 DeleteRequest: { Key: k }
135 };
136 }))
137 }).promise();
138
139 case 35:
140 scanRequest = scanResponse.nextPage();
141
142 case 36:
143 if (scanRequest) {
144 _context.next = 27;
145 break;
146 }
147
148 case 37:
149 _context.next = 42;
150 break;
151
152 case 39:
153 console.log('Reverting to delete as table properties have changed');
154 // Have to delete, this can be slow with DynamoDB local
155 _context.next = 42;
156 return client.deleteTable(tableNameProp).promise();
157
158 case 42:
159 _context.next = 48;
160 break;
161
162 case 44:
163 createProps = Object.assign({}, tableProperties);
164
165 if (createProps.StreamSpecification && !('StreamEnabled' in createProps.StreamSpecification)) {
166 // This is needed by the SDK, but not in CloudFormation
167 createProps.StreamSpecification.StreamEnabled = true;
168 }
169 _context.next = 48;
170 return client.createTable(createProps).promise();
171
172 case 48:
173 case 'end':
174 return _context.stop();
175 }
176 }
177 }, _callee, undefined, [[7, 13]]);
178 }));
179
180 return function (_x) {
181 return _ref.apply(this, arguments);
182 };
183}();
\No newline at end of file