UNPKG

ddb-table

Version:

Strongly typed library for querying and modeling DynamoDB documents.

117 lines (111 loc) 18.6 kB
"use strict"; 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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