ddb-table
Version:
Strongly typed library for querying and modeling DynamoDB documents.
117 lines (111 loc) • 18.6 kB
JavaScript
;
require("mocha");
var _chai = require("chai");
var _ = _interopRequireDefault(require("./"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
/* eslint-disable @typescript-eslint/no-unused-vars */
describe('README.md', () => {
let documentClient;
before(() => {
// stub instance
documentClient = {
update: params => Promise.resolve(params),
query: params => Promise.resolve({
Items: [_objectSpread({
i: 0
}, params), _objectSpread({
i: 1
}, params)],
LastEvaluatedKey: params.ExclusiveStartKey ? undefined : {
key: 2
}
})
};
});
it('Usage 1', async () => {
// create the basic table definition
const messages = new _.default({
tableName: 'Messages',
primaryKey: 'threadId',
sortKey: 'timestamp',
documentClient
});
const updateRes = await messages.update('john@gmail.com', 1588191225322).set('message', 'Hello World!').add('tags', new Set(['unread', 'important'])).set('attachments', exp => exp.listAppend([{
name: 'Test',
URL: 'demo.com'
}])).return('ALL_NEW').exec();
_chai.assert.deepEqual(updateRes, {
TableName: 'Messages',
Key: {
threadId: 'john@gmail.com',
timestamp: 1588191225322
},
UpdateExpression: 'SET #message = :message, #attachments = list_append(#attachments, :attachments) ' + 'ADD #tags :tags',
ExpressionAttributeNames: {
'#attachments': 'attachments',
'#message': 'message',
'#tags': 'tags'
},
ExpressionAttributeValues: {
':attachments': [{
URL: 'demo.com',
name: 'Test'
}],
':message': 'Hello World!',
':tags': new Set(['unread', 'important'])
},
ReturnValues: 'ALL_NEW'
});
// console.log(updateRes.Attributes);
});
it('Usage 2', async () => {
const messages = new _.default({
tableName: 'Messages',
primaryKey: 'threadId',
sortKey: 'timestamp',
documentClient
});
// create a secondary index definition
const outboxIndex = messages.index('senderId-timestamp-index', 'senderId', 'timestamp');
const now = Date.now();
const hourAgo = now - 3600e3;
const it = outboxIndex.query().keyCondition(cond => cond.eq('senderId', 'john@gmail.com')).keyCondition(cond => cond.between('timestamp', hourAgo, now)).project({
threadId: 1,
message: 1
}).reverseIndex().entries();
let i = 0;
for await (const item of it) {
_chai.assert.deepEqual(item, _objectSpread({
i: i % 2,
TableName: 'Messages',
IndexName: 'senderId-timestamp-index',
KeyConditionExpression: '#senderId = :senderId' + ' AND #timestamp BETWEEN :timestamp AND :timestamp2',
ProjectionExpression: '#threadId, #message',
ExpressionAttributeNames: {
'#message': 'message',
'#senderId': 'senderId',
'#threadId': 'threadId',
'#timestamp': 'timestamp'
},
ExpressionAttributeValues: {
':senderId': 'john@gmail.com',
':timestamp': hourAgo,
':timestamp2': now
},
ScanIndexForward: false
}, i >= 2 ? {
ExclusiveStartKey: {
key: 2
}
} : null));
i += 1;
}
_chai.assert.equal(i, 4);
});
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZXF1aXJlIiwiX2NoYWkiLCJfIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIm9iaiIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0Iiwib3duS2V5cyIsIm9iamVjdCIsImVudW1lcmFibGVPbmx5Iiwia2V5cyIsIk9iamVjdCIsImdldE93blByb3BlcnR5U3ltYm9scyIsInN5bWJvbHMiLCJmaWx0ZXIiLCJzeW0iLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsInRhcmdldCIsImkiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJzb3VyY2UiLCJmb3JFYWNoIiwia2V5IiwiX2RlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsInZhbHVlIiwiX3RvUHJvcGVydHlLZXkiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsImFyZyIsIl90b1ByaW1pdGl2ZSIsIlN0cmluZyIsImlucHV0IiwiaGludCIsInByaW0iLCJTeW1ib2wiLCJ0b1ByaW1pdGl2ZSIsInVuZGVmaW5lZCIsInJlcyIsImNhbGwiLCJUeXBlRXJyb3IiLCJOdW1iZXIiLCJkZXNjcmliZSIsImRvY3VtZW50Q2xpZW50IiwiYmVmb3JlIiwidXBkYXRlIiwicGFyYW1zIiwiUHJvbWlzZSIsInJlc29sdmUiLCJxdWVyeSIsIkl0ZW1zIiwiTGFzdEV2YWx1YXRlZEtleSIsIkV4Y2x1c2l2ZVN0YXJ0S2V5IiwiaXQiLCJtZXNzYWdlcyIsIlRhYmxlIiwidGFibGVOYW1lIiwicHJpbWFyeUtleSIsInNvcnRLZXkiLCJ1cGRhdGVSZXMiLCJzZXQiLCJhZGQiLCJTZXQiLCJleHAiLCJsaXN0QXBwZW5kIiwibmFtZSIsIlVSTCIsInJldHVybiIsImV4ZWMiLCJhc3NlcnQiLCJkZWVwRXF1YWwiLCJUYWJsZU5hbWUiLCJLZXkiLCJ0aHJlYWRJZCIsInRpbWVzdGFtcCIsIlVwZGF0ZUV4cHJlc3Npb24iLCJFeHByZXNzaW9uQXR0cmlidXRlTmFtZXMiLCJFeHByZXNzaW9uQXR0cmlidXRlVmFsdWVzIiwiUmV0dXJuVmFsdWVzIiwib3V0Ym94SW5kZXgiLCJpbmRleCIsIm5vdyIsIkRhdGUiLCJob3VyQWdvIiwia2V5Q29uZGl0aW9uIiwiY29uZCIsImVxIiwiYmV0d2VlbiIsInByb2plY3QiLCJtZXNzYWdlIiwicmV2ZXJzZUluZGV4IiwiZW50cmllcyIsIml0ZW0iLCJJbmRleE5hbWUiLCJLZXlDb25kaXRpb25FeHByZXNzaW9uIiwiUHJvamVjdGlvbkV4cHJlc3Npb24iLCJTY2FuSW5kZXhGb3J3YXJkIiwiZXF1YWwiXSwic291cmNlcyI6WyIuLi9zcmMvcmVhZG1lLnRlc3QudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICdtb2NoYSc7XG5pbXBvcnQgeyBhc3NlcnQgfSBmcm9tICdjaGFpJztcbmltcG9ydCBUYWJsZSBmcm9tICcuLyc7XG5pbXBvcnQgeyBEeW5hbW9EQkRvY3VtZW50IH0gZnJvbSAnQGF3cy1zZGsvbGliLWR5bmFtb2RiJztcblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG5cbmRlc2NyaWJlKCdSRUFETUUubWQnLCAoKSA9PiB7XG4gIGxldCBkb2N1bWVudENsaWVudDogRHluYW1vREJEb2N1bWVudDtcblxuICBiZWZvcmUoKCkgPT4ge1xuICAgIC8vIHN0dWIgaW5zdGFuY2VcbiAgICBkb2N1bWVudENsaWVudCA9IHtcbiAgICAgIHVwZGF0ZTogKHBhcmFtczogdW5rbm93bikgPT4gUHJvbWlzZS5yZXNvbHZlKHBhcmFtcyksXG4gICAgICBxdWVyeTogKHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5kZWZpbmVkPikgPT5cbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHtcbiAgICAgICAgICBJdGVtczogW1xuICAgICAgICAgICAgeyBpOiAwLCAuLi5wYXJhbXMgfSxcbiAgICAgICAgICAgIHsgaTogMSwgLi4ucGFyYW1zIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBMYXN0RXZhbHVhdGVkS2V5OiBwYXJhbXMuRXhjbHVzaXZlU3RhcnRLZXkgPyB1bmRlZmluZWQgOiB7IGtleTogMiB9LFxuICAgICAgICB9KSxcbiAgICB9IGFzIG5ldmVyO1xuICB9KTtcblxuICBpdCgnVXNhZ2UgMScsIGFzeW5jICgpID0+IHtcbiAgICBpbnRlcmZhY2UgTWVzc2FnZVNjaGVtYSB7XG4gICAgICB0aHJlYWRJZDogc3RyaW5nO1xuICAgICAgdGltZXN0YW1wOiBudW1iZXI7XG4gICAgICBzZW5kZXJJZDogc3RyaW5nO1xuICAgICAgbWVzc2FnZTogc3RyaW5nO1xuICAgICAgc3RhdHVzOiAnc2VudCcgfCAncmVjZWl2ZWQnO1xuICAgICAgdGFncz86IFNldDxzdHJpbmc+O1xuICAgICAgYXR0YWNobWVudHM6IHtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICBVUkw6IHN0cmluZztcbiAgICAgIH1bXTtcbiAgICB9XG5cbiAgICAvLyBjcmVhdGUgdGhlIGJhc2ljIHRhYmxlIGRlZmluaXRpb25cbiAgICBjb25zdCBtZXNzYWdlcyA9IG5ldyBUYWJsZTxNZXNzYWdlU2NoZW1hLCAndGhyZWFkSWQnLCAndGltZXN0YW1wJz4oe1xuICAgICAgdGFibGVOYW1lOiAnTWVzc2FnZXMnLFxuICAgICAgcHJpbWFyeUtleTogJ3RocmVhZElkJyxcbiAgICAgIHNvcnRLZXk6ICd0aW1lc3RhbXAnLFxuICAgICAgZG9jdW1lbnRDbGllbnQsXG4gICAgfSk7XG5cbiAgICBjb25zdCB1cGRhdGVSZXMgPSBhd2FpdCBtZXNzYWdlc1xuICAgICAgLnVwZGF0ZSgnam9obkBnbWFpbC5jb20nLCAxNTg4MTkxMjI1MzIyKVxuICAgICAgLnNldCgnbWVzc2FnZScsICdIZWxsbyBXb3JsZCEnKVxuICAgICAgLmFkZCgndGFncycsIG5ldyBTZXQoWyd1bnJlYWQnLCAnaW1wb3J0YW50J10pKVxuICAgICAgLnNldCgnYXR0YWNobWVudHMnLCAoZXhwKSA9PlxuICAgICAgICBleHAubGlzdEFwcGVuZChbeyBuYW1lOiAnVGVzdCcsIFVSTDogJ2RlbW8uY29tJyB9XSksXG4gICAgICApXG4gICAgICAucmV0dXJuKCdBTExfTkVXJylcbiAgICAgIC5leGVjKCk7XG5cbiAgICBhc3NlcnQuZGVlcEVxdWFsKHVwZGF0ZVJlcyBhcyBuZXZlciwge1xuICAgICAgVGFibGVOYW1lOiAnTWVzc2FnZXMnLFxuICAgICAgS2V5OiB7XG4gICAgICAgIHRocmVhZElkOiAnam9obkBnbWFpbC5jb20nLFxuICAgICAgICB0aW1lc3RhbXA6IDE1ODgxOTEyMjUzMjIsXG4gICAgICB9LFxuICAgICAgVXBkYXRlRXhwcmVzc2lvbjpcbiAgICAgICAgJ1NFVCAjbWVzc2FnZSA9IDptZXNzYWdlLCAjYXR0YWNobWVudHMgPSBsaXN0X2FwcGVuZCgjYXR0YWNobWVudHMsIDphdHRhY2htZW50cykgJyArXG4gICAgICAgICdBREQgI3RhZ3MgOnRhZ3MnLFxuICAgICAgRXhwcmVzc2lvbkF0dHJpYnV0ZU5hbWVzOiB7XG4gICAgICAgICcjYXR0YWNobWVudHMnOiAnYXR0YWNobWVudHMnLFxuICAgICAgICAnI21lc3NhZ2UnOiAnbWVzc2FnZScsXG4gICAgICAgICcjdGFncyc6ICd0YWdzJyxcbiAgICAgIH0sXG4gICAgICBFeHByZXNzaW9uQXR0cmlidXRlVmFsdWVzOiB7XG4gICAgICAgICc6YXR0YWNobWVudHMnOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgVVJMOiAnZGVtby5jb20nLFxuICAgICAgICAgICAgbmFtZTogJ1Rlc3QnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgICc6bWVzc2FnZSc6ICdIZWxsbyBXb3JsZCEnLFxuICAgICAgICAnOnRhZ3MnOiBuZXcgU2V0KFsndW5yZWFkJywgJ2ltcG9ydGFudCddKSxcbiAgICAgIH0sXG4gICAgICBSZXR1cm5WYWx1ZXM6ICdBTExfTkVXJyxcbiAgICB9KTtcblxuICAgIC8vIGNvbnNvbGUubG9nKHVwZGF0ZVJlcy5BdHRyaWJ1dGVzKTtcbiAgfSk7XG5cbiAgaXQoJ1VzYWdlIDInLCBhc3luYyAoKSA9PiB7XG4gICAgaW50ZXJmYWNlIE1lc3NhZ2VTY2hlbWEge1xuICAgICAgdGhyZWFkSWQ6IHN0cmluZztcbiAgICAgIHRpbWVzdGFtcDogbnVtYmVyO1xuICAgICAgc2VuZGVySWQ6IHN0cmluZztcbiAgICAgIG1lc3NhZ2U6IHN0cmluZztcbiAgICAgIHN0YXR1czogJ3NlbnQnIHwgJ3JlY2VpdmVkJztcbiAgICAgIHRhZ3M/OiBTZXQ8c3RyaW5nPjtcbiAgICAgIGF0dGFjaG1lbnRzOiB7XG4gICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgVVJMOiBzdHJpbmc7XG4gICAgICB9W107XG4gICAgfVxuXG4gICAgY29uc3QgbWVzc2FnZXMgPSBuZXcgVGFibGU8TWVzc2FnZVNjaGVtYSwgJ3RocmVhZElkJywgJ3RpbWVzdGFtcCc+KHtcbiAgICAgIHRhYmxlTmFtZTogJ01lc3NhZ2VzJyxcbiAgICAgIHByaW1hcnlLZXk6ICd0aHJlYWRJZCcsXG4gICAgICBzb3J0S2V5OiAndGltZXN0YW1wJyxcbiAgICAgIGRvY3VtZW50Q2xpZW50LFxuICAgIH0pO1xuXG4gICAgLy8gY3JlYXRlIGEgc2Vjb25kYXJ5IGluZGV4IGRlZmluaXRpb25cbiAgICB0eXBlIFNlbmRlclRpbWVzdGFtcEluZGV4ID0gUGljazxcbiAgICAgIE1lc3NhZ2VTY2hlbWEsXG4gICAgICAndGhyZWFkSWQnIHwgJ3RpbWVzdGFtcCcgfCAnc2VuZGVySWQnXG4gICAgPjtcblxuICAgIGNvbnN0IG91dGJveEluZGV4ID0gbWVzc2FnZXMuaW5kZXg8XG4gICAgICBTZW5kZXJUaW1lc3RhbXBJbmRleCxcbiAgICAgICdzZW5kZXJJZCcsXG4gICAgICAndGltZXN0YW1wJ1xuICAgID4oJ3NlbmRlcklkLXRpbWVzdGFtcC1pbmRleCcsICdzZW5kZXJJZCcsICd0aW1lc3RhbXAnKTtcblxuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgY29uc3QgaG91ckFnbyA9IG5vdyAtIDM2MDBlMztcblxuICAgIGNvbnN0IGl0ID0gb3V0Ym94SW5kZXhcbiAgICAgIC5xdWVyeSgpXG4gICAgICAua2V5Q29uZGl0aW9uKChjb25kKSA9PiBjb25kLmVxKCdzZW5kZXJJZCcsICdqb2huQGdtYWlsLmNvbScpKVxuICAgICAgLmtleUNvbmRpdGlvbigoY29uZCkgPT4gY29uZC5iZXR3ZWVuKCd0aW1lc3RhbXAnLCBob3VyQWdvLCBub3cpKVxuICAgICAgLnByb2plY3QoeyB0aHJlYWRJZDogMSwgbWVzc2FnZTogMSB9KVxuICAgICAgLnJldmVyc2VJbmRleCgpXG4gICAgICAuZW50cmllcygpO1xuXG4gICAgbGV0IGkgPSAwO1xuICAgIGZvciBhd2FpdCAoY29uc3QgaXRlbSBvZiBpdCkge1xuICAgICAgYXNzZXJ0LmRlZXBFcXVhbChpdGVtIGFzIG5ldmVyLCB7XG4gICAgICAgIGk6IGkgJSAyLFxuICAgICAgICBUYWJsZU5hbWU6ICdNZXNzYWdlcycsXG4gICAgICAgIEluZGV4TmFtZTogJ3NlbmRlcklkLXRpbWVzdGFtcC1pbmRleCcsXG4gICAgICAgIEtleUNvbmRpdGlvbkV4cHJlc3Npb246XG4gICAgICAgICAgJyNzZW5kZXJJZCA9IDpzZW5kZXJJZCcgK1xuICAgICAgICAgICcgQU5EICN0aW1lc3RhbXAgQkVUV0VFTiA6dGltZXN0YW1wIEFORCA6dGltZXN0YW1wMicsXG4gICAgICAgIFByb2plY3Rpb25FeHByZXNzaW9uOiAnI3RocmVhZElkLCAjbWVzc2FnZScsXG4gICAgICAgIEV4cHJlc3Npb25BdHRyaWJ1dGVOYW1lczoge1xuICAgICAgICAgICcjbWVzc2FnZSc6ICdtZXNzYWdlJyxcbiAgICAgICAgICAnI3NlbmRlcklkJzogJ3NlbmRlcklkJyxcbiAgICAgICAgICAnI3RocmVhZElkJzogJ3RocmVhZElkJyxcbiAgICAgICAgICAnI3RpbWVzdGFtcCc6ICd0aW1lc3RhbXAnLFxuICAgICAgICB9LFxuICAgICAgICBFeHByZXNzaW9uQXR0cmlidXRlVmFsdWVzOiB7XG4gICAgICAgICAgJzpzZW5kZXJJZCc6ICdqb2huQGdtYWlsLmNvbScsXG4gICAgICAgICAgJzp0aW1lc3RhbXAnOiBob3VyQWdvLFxuICAgICAgICAgICc6dGltZXN0YW1wMic6IG5vdyxcbiAgICAgICAgfSxcbiAgICAgICAgU2NhbkluZGV4Rm9yd2FyZDogZmFsc2UsXG4gICAgICAgIC4uLihpID49IDIgPyB7IEV4Y2x1c2l2ZVN0YXJ0S2V5OiB7IGtleTogMiB9IH0gOiBudWxsKSxcbiAgICAgIH0pO1xuXG4gICAgICBpICs9IDE7XG4gICAgfVxuICAgIGFzc2VydC5lcXVhbChpLCA0KTtcbiAgfSk7XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7QUFBQUEsT0FBQTtBQUNBLElBQUFDLEtBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLENBQUEsR0FBQUMsc0JBQUEsQ0FBQUgsT0FBQTtBQUF1QixTQUFBRyx1QkFBQUMsR0FBQSxXQUFBQSxHQUFBLElBQUFBLEdBQUEsQ0FBQUMsVUFBQSxHQUFBRCxHQUFBLEtBQUFFLE9BQUEsRUFBQUYsR0FBQTtBQUFBLFNBQUFHLFFBQUFDLE1BQUEsRUFBQUMsY0FBQSxRQUFBQyxJQUFBLEdBQUFDLE1BQUEsQ0FBQUQsSUFBQSxDQUFBRixNQUFBLE9BQUFHLE1BQUEsQ0FBQUMscUJBQUEsUUFBQUMsT0FBQSxHQUFBRixNQUFBLENBQUFDLHFCQUFBLENBQUFKLE1BQUEsR0FBQUMsY0FBQSxLQUFBSSxPQUFBLEdBQUFBLE9BQUEsQ0FBQUMsTUFBQSxXQUFBQyxHQUFBLFdBQUFKLE1BQUEsQ0FBQUssd0JBQUEsQ0FBQVIsTUFBQSxFQUFBTyxHQUFBLEVBQUFFLFVBQUEsT0FBQVAsSUFBQSxDQUFBUSxJQUFBLENBQUFDLEtBQUEsQ0FBQVQsSUFBQSxFQUFBRyxPQUFBLFlBQUFILElBQUE7QUFBQSxTQUFBVSxjQUFBQyxNQUFBLGFBQUFDLENBQUEsTUFBQUEsQ0FB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