@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.
Files changed (40) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +169 -1
  3. package/dist/cjs/__test__/client.test.js +85 -57
  4. package/dist/cjs/__test__/client.test.js.map +1 -1
  5. package/dist/cjs/client.js +2 -2
  6. package/dist/cjs/client.js.map +1 -1
  7. package/dist/cjs/dynamodb-model.d.ts +4 -0
  8. package/dist/cjs/operations.d.ts +4 -0
  9. package/dist/cjs/operations.js.map +1 -1
  10. package/dist/cjs/pagination.d.ts +10 -2
  11. package/dist/cjs/pagination.js +19 -4
  12. package/dist/cjs/pagination.js.map +1 -1
  13. package/dist/cjs/provider.d.ts +16 -0
  14. package/dist/cjs/provider.js +4 -0
  15. package/dist/cjs/provider.js.map +1 -1
  16. package/dist/cjs/sandbox.js +24 -0
  17. package/dist/cjs/sandbox.js.map +1 -1
  18. package/dist/esm/__test__/client.test.js +86 -58
  19. package/dist/esm/__test__/client.test.js.map +1 -1
  20. package/dist/esm/client.js +2 -2
  21. package/dist/esm/client.js.map +1 -1
  22. package/dist/esm/dynamodb-model.d.ts +4 -0
  23. package/dist/esm/operations.d.ts +4 -0
  24. package/dist/esm/operations.js.map +1 -1
  25. package/dist/esm/pagination.d.ts +10 -2
  26. package/dist/esm/pagination.js +19 -4
  27. package/dist/esm/pagination.js.map +1 -1
  28. package/dist/esm/provider.d.ts +16 -0
  29. package/dist/esm/provider.js +4 -0
  30. package/dist/esm/provider.js.map +1 -1
  31. package/dist/esm/sandbox.js +24 -0
  32. package/dist/esm/sandbox.js.map +1 -1
  33. package/package.json +1 -1
  34. package/src/__test__/client.test.ts +86 -58
  35. package/src/client.ts +13 -8
  36. package/src/dynamodb-model.ts +16 -14
  37. package/src/operations.ts +4 -0
  38. package/src/pagination.ts +42 -8
  39. package/src/provider.ts +5 -1
  40. package/src/sandbox.ts +24 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @model-ts/dynamodb
2
2
 
3
+ ## 0.2.0
4
+
5
+ ### Minor Changes
6
+
7
+ - e3c2d39: add GSI4, GSI5 indices
8
+
3
9
  ## 0.1.2
4
10
 
5
11
  ### Patch Changes
package/README.md CHANGED
@@ -1 +1,169 @@
1
- # model-ts-dynamodb
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