tinymo simplifies constructing DynamoDB's JSON-based command inputs.
const update = {
TableName: 'users',
Key: {
id: 'bob'
},
UpdateExpression: 'SET #orders :orders',
ConditionExpression: '#age >= :ageCondition',
ExpressionAttributeNames: {
'#age': 'age',
'#orders': 'orders'
},
ExpressionAttributeValues: {
':ageCondition': 18,
':orders': 5
}
}
tinymo.update('users', { id: 'bob' }).set('orders', 5).condition('age', '>=', 18)
npm i @parana-games/tinymo
- Import:
import { tinymo } from '@parana-games/tinymo';
- Create requests:
tinymo supports all of
DocumentClient
's requests:
const update = tinymo.update('table', { name: 'John' })
const put = tinymo.put('table', someItem)
const deleteRequest = tinymo.delete('table', { id: 1 })
const get = tinymo.get('table', { id: 'id' })
const batchGet = tinymo.batchGet()
const batchWrite = tinymo.batchWrite()
const query = tinymo.query('table')
const scan = tinymo.scan('table')
const transactGet = tinymo.transactGet()
const transaction = tinymo.transaction()
- Customize requests:
Request options are accessed through members of the class:
get.attributes('id', 'name')
query.key('sk', '>=', 'order#100').filter('type', '=', 'refund')
scan.consistentRead = true
update.returnValues = 'ALL_NEW'
- Execute with
.run()
:
Every request is executable with
run()
await transaction.run()
const queryResponse = await query.run()
const batchGetResponse = await batchGet.run()
Promise.all([put, update, deleteRequest].map(request => request.run()));
There are two ways of adding writes to a transaction:
- Using the
update
,put
anddelete
methods:
These methods add the corresponding write item to the list and return it, so you can manipulate and pass it around with ease.
const update = transaction.update('users', { id: 'dan' })
update.add('balance', 10);
transaction.put('users', { id: 'john', balance: 20 });
transaction.delete('orders', { id: '123' });
- Using the
push
method, which acceptsWrite
objects.
Write
is the base class ofUpdate
,Put
andDelete
.
const writes: Write[] = generateWrites();
// Sometimes you have just one update to make, so a transaction is overkill.
if (writes.length > 1) {
await transaction.push(...writes).run();
} else (writes.length === 0) {
await writes[0].run();
}
Generate pure DynamoDB JSON-based command inputs with build()
:
const put = tinymo.put('games', { name: 'pool-stars' });
put.build()
↓
{
'TableName': 'games',
'Item': {
'name': 'pool-stars'
}
}
Useful for tiny unit tests!
Send commands using your DynamoDBClient:
import { Delete } from '@parana-games/tinymo';
const tinymoDelete = new Delete('users', { name: 'john' });
const command = new DeleteCommand(tinymoDelete.build());
const dynamoDBClient = new DynamoDBClient({});
await dynamoDBClient.send(command);
️ Don't use run() when creating tinymo objects with new. They won't have an associated client.
import { Scan } from '@parana-games/tinymo';
const scan = new Scan('users');
await scan.run(); // error thrown as this instance is clientless
TinymoClient.setDocumentClient(myCustomDocumentClient); // Useful when using X-Ray!
tinymo aligns strictly with DynamoDB's API, so you can simply refer to its documentation.
If you think we've missed something or can do something better, feel free opening an issue or submitting a pull request.