@model-ts/dynamodb 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/README.md +169 -1
- package/dist/cjs/__test__/client.test.js +85 -57
- package/dist/cjs/__test__/client.test.js.map +1 -1
- package/dist/cjs/client.js +2 -2
- package/dist/cjs/client.js.map +1 -1
- package/dist/cjs/dynamodb-model.d.ts +4 -0
- package/dist/cjs/operations.d.ts +4 -0
- package/dist/cjs/operations.js.map +1 -1
- package/dist/cjs/pagination.d.ts +10 -2
- package/dist/cjs/pagination.js +19 -4
- package/dist/cjs/pagination.js.map +1 -1
- package/dist/cjs/provider.d.ts +16 -0
- package/dist/cjs/provider.js +4 -0
- package/dist/cjs/provider.js.map +1 -1
- package/dist/cjs/sandbox.js +24 -0
- package/dist/cjs/sandbox.js.map +1 -1
- package/dist/esm/__test__/client.test.js +86 -58
- package/dist/esm/__test__/client.test.js.map +1 -1
- package/dist/esm/client.js +2 -2
- package/dist/esm/client.js.map +1 -1
- package/dist/esm/dynamodb-model.d.ts +4 -0
- package/dist/esm/operations.d.ts +4 -0
- package/dist/esm/operations.js.map +1 -1
- package/dist/esm/pagination.d.ts +10 -2
- package/dist/esm/pagination.js +19 -4
- package/dist/esm/pagination.js.map +1 -1
- package/dist/esm/provider.d.ts +16 -0
- package/dist/esm/provider.js +4 -0
- package/dist/esm/provider.js.map +1 -1
- package/dist/esm/sandbox.js +24 -0
- package/dist/esm/sandbox.js.map +1 -1
- package/package.json +1 -1
- package/src/__test__/client.test.ts +86 -58
- package/src/client.ts +13 -8
- package/src/dynamodb-model.ts +16 -14
- package/src/operations.ts +4 -0
- package/src/pagination.ts +42 -8
- package/src/provider.ts +5 -1
- package/src/sandbox.ts +24 -0
package/CHANGELOG.md
CHANGED
package/README.md
CHANGED
|
@@ -1 +1,169 @@
|
|
|
1
|
-
# model-ts
|
|
1
|
+
# @model-ts/dynamodb
|
|
2
|
+
|
|
3
|
+
> model-ts Provider for AWS DynamoDB.
|
|
4
|
+
|
|
5
|
+
- [Installation](#installation)
|
|
6
|
+
- [Usage](#usage)
|
|
7
|
+
- [API](#api)
|
|
8
|
+
- [load](#load)
|
|
9
|
+
- [get](#get)
|
|
10
|
+
- [put](#put)
|
|
11
|
+
- [update](#update)
|
|
12
|
+
- [updateRaw](#updateraw)
|
|
13
|
+
- [delete](#delete)
|
|
14
|
+
- [softDelete](#softdelete)
|
|
15
|
+
- [bulk](#bulk)
|
|
16
|
+
- [Testing](#testing)
|
|
17
|
+
- [License](#license)
|
|
18
|
+
|
|
19
|
+
## Installation
|
|
20
|
+
|
|
21
|
+
```sh
|
|
22
|
+
npm install io-ts fp-ts @model-ts/core @model-ts/dynamodb
|
|
23
|
+
# or
|
|
24
|
+
yarn add io-ts fp-ts @model-ts/core @model-ts/dynamodb
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Also make sure that you have `aws-sdk` installed.
|
|
28
|
+
|
|
29
|
+
## Usage
|
|
30
|
+
|
|
31
|
+
```ts
|
|
32
|
+
import { model } from "@model-ts/core"
|
|
33
|
+
import { Client, getProvider } from "@model-ts/dynamodb"
|
|
34
|
+
|
|
35
|
+
// Create a DynamoDB client
|
|
36
|
+
const client = new Client({ tableName: "my-table" })
|
|
37
|
+
|
|
38
|
+
// Create
|
|
39
|
+
const provider = getProvider(client)
|
|
40
|
+
|
|
41
|
+
class User extends model(
|
|
42
|
+
"User",
|
|
43
|
+
t.type({ id: t.string, firstName: t.string, lastName: t.string }),
|
|
44
|
+
// Pass in the provider
|
|
45
|
+
provider
|
|
46
|
+
) {
|
|
47
|
+
// Add a derived PK property
|
|
48
|
+
get PK() {
|
|
49
|
+
return `USER#${this.id}`
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Add a derived SK property
|
|
53
|
+
get SK() {
|
|
54
|
+
// Here, we're using the same value as PK and SK, so we can ensure uniqueness.
|
|
55
|
+
return `USER#${this.id}`
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Now we can use the User model with DynamoDB!
|
|
60
|
+
const user = new User({ id: "1", firstName: "John", lastName: "Doe" })
|
|
61
|
+
await user.put()
|
|
62
|
+
|
|
63
|
+
const anotherUser = await User.load({ PK: "USER#2", SK: "USER#2" }) // User {}
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### API
|
|
67
|
+
|
|
68
|
+
> ⚠️ WIP: This documentation is still a work in progress and will be improved soon.
|
|
69
|
+
|
|
70
|
+
#### load
|
|
71
|
+
|
|
72
|
+
Load a single item. Uses [data-loader] under the hood to batch `load` calls within the same frame. This is super handy for writing GraphQL APIs.
|
|
73
|
+
|
|
74
|
+
##### Example
|
|
75
|
+
|
|
76
|
+
```ts
|
|
77
|
+
// Throws if the item doesn't exist.
|
|
78
|
+
const item = await MyModel.load({ PK: "MYMODEL#123", SK: "SOMESK#ABC" }) // MyModel
|
|
79
|
+
|
|
80
|
+
// Returns `null` if the item doesn't exist.
|
|
81
|
+
const item = await MyModel.load(
|
|
82
|
+
{ PK: "MYMODEL#234", SK: "SOMESK#NOTEXISTING" },
|
|
83
|
+
{ null: true }
|
|
84
|
+
) // MyModel | null
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
#### get
|
|
88
|
+
|
|
89
|
+
Get a single item. Prefer `load`, since it comes with extra features and batches calls under the hood.
|
|
90
|
+
|
|
91
|
+
##### Example
|
|
92
|
+
|
|
93
|
+
```ts
|
|
94
|
+
// Throws if the item doesn't exist.
|
|
95
|
+
const item = await MyModel.get({ PK: "MYMODEL#123", SK: "SOMESK#ABC" })
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
#### put
|
|
99
|
+
|
|
100
|
+
Puts a single item.
|
|
101
|
+
|
|
102
|
+
##### Example
|
|
103
|
+
|
|
104
|
+
```ts
|
|
105
|
+
const item = new MyModel({ foo: "Hello World", bar: 42 })
|
|
106
|
+
await item.put()
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
#### update
|
|
110
|
+
|
|
111
|
+
Updates a single item. Under the `update` isses a DynamoDB `put` request, instead of `update`, but checks for a `docVersion` field on the item itself to guarantee additional updates aren't overwritten.
|
|
112
|
+
|
|
113
|
+
##### Example
|
|
114
|
+
|
|
115
|
+
```ts
|
|
116
|
+
const item = await MyModel.load({ PK: "MYMODEL#123", SK: "SOMESK#ABC" })
|
|
117
|
+
const updatedItem = await item.update({ foo: "new foo" })
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
#### updateRaw
|
|
121
|
+
|
|
122
|
+
Updates a single item using a DynamoDB `update` request, prefer to use `update` instead of `updateRaw`.
|
|
123
|
+
|
|
124
|
+
##### Example
|
|
125
|
+
|
|
126
|
+
```ts
|
|
127
|
+
const updated = await MyModel.updateRaw(
|
|
128
|
+
{ PK: "MYMODEL#123", SK: "SOMESK#ABC" },
|
|
129
|
+
{ foo: "new foo" },
|
|
130
|
+
{
|
|
131
|
+
UpdateExpression: "SET bar = :newnum",
|
|
132
|
+
ExpressionAttributeValues: { ":newnum": 123 },
|
|
133
|
+
}
|
|
134
|
+
)
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
#### delete
|
|
138
|
+
|
|
139
|
+
Deletes an item.
|
|
140
|
+
|
|
141
|
+
##### Example
|
|
142
|
+
|
|
143
|
+
```ts
|
|
144
|
+
const item = await MyModel.load({ PK: "MYMODEL#123", SK: "SOMESK#ABC" })
|
|
145
|
+
await item.delete()
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
#### softDelete
|
|
149
|
+
|
|
150
|
+
Deletes an item, but keeps a copy by prepending `$$DELETED$$` to both PK and SK.
|
|
151
|
+
|
|
152
|
+
##### Example
|
|
153
|
+
|
|
154
|
+
```ts
|
|
155
|
+
const item = await MyModel.load({ PK: "MYMODEL#123", SK: "SOMESK#ABC" })
|
|
156
|
+
await item.softDelete()
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
#### bulk
|
|
160
|
+
|
|
161
|
+
> TODO
|
|
162
|
+
|
|
163
|
+
## Testing
|
|
164
|
+
|
|
165
|
+
> TODO
|
|
166
|
+
|
|
167
|
+
## License
|
|
168
|
+
|
|
169
|
+
MIT
|