@stacksjs/ts-cloud 0.1.8 → 0.1.9
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/dist/bin/cli.js +1 -1
- package/package.json +18 -16
- package/src/aws/acm.ts +768 -0
- package/src/aws/application-autoscaling.ts +845 -0
- package/src/aws/bedrock.ts +4074 -0
- package/src/aws/client.ts +891 -0
- package/src/aws/cloudformation.ts +896 -0
- package/src/aws/cloudfront.ts +1531 -0
- package/src/aws/cloudwatch-logs.ts +154 -0
- package/src/aws/comprehend.ts +839 -0
- package/src/aws/connect.ts +1056 -0
- package/src/aws/deploy-imap.ts +384 -0
- package/src/aws/dynamodb.ts +340 -0
- package/src/aws/ec2.ts +1385 -0
- package/src/aws/ecr.ts +621 -0
- package/src/aws/ecs.ts +615 -0
- package/src/aws/elasticache.ts +301 -0
- package/src/aws/elbv2.ts +942 -0
- package/src/aws/email.ts +928 -0
- package/src/aws/eventbridge.ts +248 -0
- package/src/aws/iam.ts +1689 -0
- package/src/aws/imap-server.ts +2100 -0
- package/src/aws/index.ts +213 -0
- package/src/aws/kendra.ts +1097 -0
- package/src/aws/lambda.ts +786 -0
- package/src/aws/opensearch.ts +158 -0
- package/src/aws/personalize.ts +977 -0
- package/src/aws/polly.ts +559 -0
- package/src/aws/rds.ts +888 -0
- package/src/aws/rekognition.ts +846 -0
- package/src/aws/route53-domains.ts +359 -0
- package/src/aws/route53.ts +1046 -0
- package/src/aws/s3.ts +2334 -0
- package/src/aws/scheduler.ts +571 -0
- package/src/aws/secrets-manager.ts +769 -0
- package/src/aws/ses.ts +1081 -0
- package/src/aws/setup-phone.ts +104 -0
- package/src/aws/setup-sms.ts +580 -0
- package/src/aws/sms.ts +1735 -0
- package/src/aws/smtp-server.ts +531 -0
- package/src/aws/sns.ts +758 -0
- package/src/aws/sqs.ts +382 -0
- package/src/aws/ssm.ts +807 -0
- package/src/aws/sts.ts +92 -0
- package/src/aws/support.ts +391 -0
- package/src/aws/test-imap.ts +86 -0
- package/src/aws/textract.ts +780 -0
- package/src/aws/transcribe.ts +108 -0
- package/src/aws/translate.ts +641 -0
- package/src/aws/voice.ts +1379 -0
- package/src/config.ts +35 -0
- package/src/deploy/index.ts +7 -0
- package/src/deploy/static-site-external-dns.ts +945 -0
- package/src/deploy/static-site.ts +1175 -0
- package/src/dns/cloudflare.ts +548 -0
- package/src/dns/godaddy.ts +412 -0
- package/src/dns/index.ts +205 -0
- package/src/dns/porkbun.ts +362 -0
- package/src/dns/route53-adapter.ts +414 -0
- package/src/dns/types.ts +119 -0
- package/src/dns/validator.ts +369 -0
- package/src/generators/index.ts +5 -0
- package/src/generators/infrastructure.ts +1660 -0
- package/src/index.ts +163 -0
- package/src/push/apns.ts +452 -0
- package/src/push/fcm.ts +506 -0
- package/src/push/index.ts +58 -0
- package/src/security/pre-deploy-scanner.ts +655 -0
- package/src/ssl/acme-client.ts +478 -0
- package/src/ssl/index.ts +7 -0
- package/src/ssl/letsencrypt.ts +747 -0
- package/src/types.ts +2 -0
- package/src/utils/cli.ts +398 -0
- package/src/validation/index.ts +5 -0
- package/src/validation/template.ts +405 -0
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AWS DynamoDB Client
|
|
3
|
+
* Direct API calls for DynamoDB operations
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { AWSClient } from './client'
|
|
7
|
+
|
|
8
|
+
export interface AttributeValue {
|
|
9
|
+
S?: string
|
|
10
|
+
N?: string
|
|
11
|
+
B?: string
|
|
12
|
+
SS?: string[]
|
|
13
|
+
NS?: string[]
|
|
14
|
+
BS?: string[]
|
|
15
|
+
M?: Record<string, AttributeValue>
|
|
16
|
+
L?: AttributeValue[]
|
|
17
|
+
NULL?: boolean
|
|
18
|
+
BOOL?: boolean
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export interface KeySchemaElement {
|
|
22
|
+
AttributeName: string
|
|
23
|
+
KeyType: 'HASH' | 'RANGE'
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export interface AttributeDefinition {
|
|
27
|
+
AttributeName: string
|
|
28
|
+
AttributeType: 'S' | 'N' | 'B'
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface GlobalSecondaryIndex {
|
|
32
|
+
IndexName: string
|
|
33
|
+
KeySchema: KeySchemaElement[]
|
|
34
|
+
Projection: {
|
|
35
|
+
ProjectionType: 'ALL' | 'KEYS_ONLY' | 'INCLUDE'
|
|
36
|
+
NonKeyAttributes?: string[]
|
|
37
|
+
}
|
|
38
|
+
ProvisionedThroughput?: {
|
|
39
|
+
ReadCapacityUnits: number
|
|
40
|
+
WriteCapacityUnits: number
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export interface TableDescription {
|
|
45
|
+
TableName: string
|
|
46
|
+
TableStatus: 'CREATING' | 'UPDATING' | 'DELETING' | 'ACTIVE' | 'INACCESSIBLE_ENCRYPTION_CREDENTIALS' | 'ARCHIVING' | 'ARCHIVED'
|
|
47
|
+
TableArn: string
|
|
48
|
+
ItemCount: number
|
|
49
|
+
TableSizeBytes: number
|
|
50
|
+
CreationDateTime: string
|
|
51
|
+
KeySchema: KeySchemaElement[]
|
|
52
|
+
AttributeDefinitions: AttributeDefinition[]
|
|
53
|
+
GlobalSecondaryIndexes?: GlobalSecondaryIndex[]
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* DynamoDB client for direct API calls
|
|
58
|
+
*/
|
|
59
|
+
export class DynamoDBClient {
|
|
60
|
+
private client: AWSClient
|
|
61
|
+
private region: string
|
|
62
|
+
|
|
63
|
+
constructor(region: string = 'us-east-1') {
|
|
64
|
+
this.region = region
|
|
65
|
+
this.client = new AWSClient()
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
private async request<T>(action: string, params: Record<string, any>): Promise<T> {
|
|
69
|
+
return this.client.request({
|
|
70
|
+
service: 'dynamodb',
|
|
71
|
+
region: this.region,
|
|
72
|
+
method: 'POST',
|
|
73
|
+
path: '/',
|
|
74
|
+
headers: {
|
|
75
|
+
'Content-Type': 'application/x-amz-json-1.0',
|
|
76
|
+
'X-Amz-Target': `DynamoDB_20120810.${action}`,
|
|
77
|
+
},
|
|
78
|
+
body: JSON.stringify(params),
|
|
79
|
+
})
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Create a new DynamoDB table
|
|
84
|
+
*/
|
|
85
|
+
async createTable(params: {
|
|
86
|
+
TableName: string
|
|
87
|
+
KeySchema: KeySchemaElement[]
|
|
88
|
+
AttributeDefinitions: AttributeDefinition[]
|
|
89
|
+
BillingMode?: 'PROVISIONED' | 'PAY_PER_REQUEST'
|
|
90
|
+
ProvisionedThroughput?: {
|
|
91
|
+
ReadCapacityUnits: number
|
|
92
|
+
WriteCapacityUnits: number
|
|
93
|
+
}
|
|
94
|
+
GlobalSecondaryIndexes?: GlobalSecondaryIndex[]
|
|
95
|
+
Tags?: Array<{ Key: string; Value: string }>
|
|
96
|
+
TimeToLiveSpecification?: {
|
|
97
|
+
AttributeName: string
|
|
98
|
+
Enabled: boolean
|
|
99
|
+
}
|
|
100
|
+
}): Promise<{ TableDescription: TableDescription }> {
|
|
101
|
+
return this.request('CreateTable', params)
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Delete a DynamoDB table
|
|
106
|
+
*/
|
|
107
|
+
async deleteTable(params: { TableName: string }): Promise<{ TableDescription: TableDescription }> {
|
|
108
|
+
return this.request('DeleteTable', params)
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Describe a DynamoDB table
|
|
113
|
+
*/
|
|
114
|
+
async describeTable(params: { TableName: string }): Promise<{ Table: TableDescription }> {
|
|
115
|
+
return this.request('DescribeTable', params)
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* List all DynamoDB tables
|
|
120
|
+
*/
|
|
121
|
+
async listTables(params?: {
|
|
122
|
+
ExclusiveStartTableName?: string
|
|
123
|
+
Limit?: number
|
|
124
|
+
}): Promise<{ TableNames: string[]; LastEvaluatedTableName?: string }> {
|
|
125
|
+
return this.request('ListTables', params || {})
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Put an item into a table
|
|
130
|
+
*/
|
|
131
|
+
async putItem(params: {
|
|
132
|
+
TableName: string
|
|
133
|
+
Item: Record<string, AttributeValue>
|
|
134
|
+
ConditionExpression?: string
|
|
135
|
+
ExpressionAttributeNames?: Record<string, string>
|
|
136
|
+
ExpressionAttributeValues?: Record<string, AttributeValue>
|
|
137
|
+
ReturnValues?: 'NONE' | 'ALL_OLD'
|
|
138
|
+
}): Promise<{ Attributes?: Record<string, AttributeValue> }> {
|
|
139
|
+
return this.request('PutItem', params)
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Get an item from a table
|
|
144
|
+
*/
|
|
145
|
+
async getItem(params: {
|
|
146
|
+
TableName: string
|
|
147
|
+
Key: Record<string, AttributeValue>
|
|
148
|
+
ProjectionExpression?: string
|
|
149
|
+
ExpressionAttributeNames?: Record<string, string>
|
|
150
|
+
ConsistentRead?: boolean
|
|
151
|
+
}): Promise<{ Item?: Record<string, AttributeValue> }> {
|
|
152
|
+
return this.request('GetItem', params)
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Update an item in a table
|
|
157
|
+
*/
|
|
158
|
+
async updateItem(params: {
|
|
159
|
+
TableName: string
|
|
160
|
+
Key: Record<string, AttributeValue>
|
|
161
|
+
UpdateExpression: string
|
|
162
|
+
ConditionExpression?: string
|
|
163
|
+
ExpressionAttributeNames?: Record<string, string>
|
|
164
|
+
ExpressionAttributeValues?: Record<string, AttributeValue>
|
|
165
|
+
ReturnValues?: 'NONE' | 'ALL_OLD' | 'UPDATED_OLD' | 'ALL_NEW' | 'UPDATED_NEW'
|
|
166
|
+
}): Promise<{ Attributes?: Record<string, AttributeValue> }> {
|
|
167
|
+
return this.request('UpdateItem', params)
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* Delete an item from a table
|
|
172
|
+
*/
|
|
173
|
+
async deleteItem(params: {
|
|
174
|
+
TableName: string
|
|
175
|
+
Key: Record<string, AttributeValue>
|
|
176
|
+
ConditionExpression?: string
|
|
177
|
+
ExpressionAttributeNames?: Record<string, string>
|
|
178
|
+
ExpressionAttributeValues?: Record<string, AttributeValue>
|
|
179
|
+
ReturnValues?: 'NONE' | 'ALL_OLD'
|
|
180
|
+
}): Promise<{ Attributes?: Record<string, AttributeValue> }> {
|
|
181
|
+
return this.request('DeleteItem', params)
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Query items from a table
|
|
186
|
+
*/
|
|
187
|
+
async query(params: {
|
|
188
|
+
TableName: string
|
|
189
|
+
IndexName?: string
|
|
190
|
+
KeyConditionExpression: string
|
|
191
|
+
FilterExpression?: string
|
|
192
|
+
ProjectionExpression?: string
|
|
193
|
+
ExpressionAttributeNames?: Record<string, string>
|
|
194
|
+
ExpressionAttributeValues?: Record<string, AttributeValue>
|
|
195
|
+
Limit?: number
|
|
196
|
+
ExclusiveStartKey?: Record<string, AttributeValue>
|
|
197
|
+
ScanIndexForward?: boolean
|
|
198
|
+
ConsistentRead?: boolean
|
|
199
|
+
}): Promise<{
|
|
200
|
+
Items: Array<Record<string, AttributeValue>>
|
|
201
|
+
Count: number
|
|
202
|
+
ScannedCount: number
|
|
203
|
+
LastEvaluatedKey?: Record<string, AttributeValue>
|
|
204
|
+
}> {
|
|
205
|
+
return this.request('Query', params)
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Scan items from a table
|
|
210
|
+
*/
|
|
211
|
+
async scan(params: {
|
|
212
|
+
TableName: string
|
|
213
|
+
IndexName?: string
|
|
214
|
+
FilterExpression?: string
|
|
215
|
+
ProjectionExpression?: string
|
|
216
|
+
ExpressionAttributeNames?: Record<string, string>
|
|
217
|
+
ExpressionAttributeValues?: Record<string, AttributeValue>
|
|
218
|
+
Limit?: number
|
|
219
|
+
ExclusiveStartKey?: Record<string, AttributeValue>
|
|
220
|
+
ConsistentRead?: boolean
|
|
221
|
+
}): Promise<{
|
|
222
|
+
Items: Array<Record<string, AttributeValue>>
|
|
223
|
+
Count: number
|
|
224
|
+
ScannedCount: number
|
|
225
|
+
LastEvaluatedKey?: Record<string, AttributeValue>
|
|
226
|
+
}> {
|
|
227
|
+
return this.request('Scan', params)
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Batch write items
|
|
232
|
+
*/
|
|
233
|
+
async batchWriteItem(params: {
|
|
234
|
+
RequestItems: Record<string, Array<{
|
|
235
|
+
PutRequest?: { Item: Record<string, AttributeValue> }
|
|
236
|
+
DeleteRequest?: { Key: Record<string, AttributeValue> }
|
|
237
|
+
}>>
|
|
238
|
+
}): Promise<{
|
|
239
|
+
UnprocessedItems: Record<string, Array<{
|
|
240
|
+
PutRequest?: { Item: Record<string, AttributeValue> }
|
|
241
|
+
DeleteRequest?: { Key: Record<string, AttributeValue> }
|
|
242
|
+
}>>
|
|
243
|
+
}> {
|
|
244
|
+
return this.request('BatchWriteItem', params)
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* Batch get items
|
|
249
|
+
*/
|
|
250
|
+
async batchGetItem(params: {
|
|
251
|
+
RequestItems: Record<string, {
|
|
252
|
+
Keys: Array<Record<string, AttributeValue>>
|
|
253
|
+
ProjectionExpression?: string
|
|
254
|
+
ExpressionAttributeNames?: Record<string, string>
|
|
255
|
+
ConsistentRead?: boolean
|
|
256
|
+
}>
|
|
257
|
+
}): Promise<{
|
|
258
|
+
Responses: Record<string, Array<Record<string, AttributeValue>>>
|
|
259
|
+
UnprocessedKeys: Record<string, {
|
|
260
|
+
Keys: Array<Record<string, AttributeValue>>
|
|
261
|
+
}>
|
|
262
|
+
}> {
|
|
263
|
+
return this.request('BatchGetItem', params)
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* Update time to live settings
|
|
268
|
+
*/
|
|
269
|
+
async updateTimeToLive(params: {
|
|
270
|
+
TableName: string
|
|
271
|
+
TimeToLiveSpecification: {
|
|
272
|
+
AttributeName: string
|
|
273
|
+
Enabled: boolean
|
|
274
|
+
}
|
|
275
|
+
}): Promise<{ TimeToLiveSpecification: { AttributeName: string; Enabled: boolean } }> {
|
|
276
|
+
return this.request('UpdateTimeToLive', params)
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* Helper: Marshal a JavaScript object to DynamoDB format
|
|
281
|
+
*/
|
|
282
|
+
static marshal(obj: Record<string, any>): Record<string, AttributeValue> {
|
|
283
|
+
const result: Record<string, AttributeValue> = {}
|
|
284
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
285
|
+
result[key] = DynamoDBClient.marshalValue(value)
|
|
286
|
+
}
|
|
287
|
+
return result
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/**
|
|
291
|
+
* Helper: Marshal a single value to DynamoDB format
|
|
292
|
+
*/
|
|
293
|
+
static marshalValue(value: any): AttributeValue {
|
|
294
|
+
if (value === null || value === undefined) {
|
|
295
|
+
return { NULL: true }
|
|
296
|
+
}
|
|
297
|
+
if (typeof value === 'string') {
|
|
298
|
+
return { S: value }
|
|
299
|
+
}
|
|
300
|
+
if (typeof value === 'number') {
|
|
301
|
+
return { N: String(value) }
|
|
302
|
+
}
|
|
303
|
+
if (typeof value === 'boolean') {
|
|
304
|
+
return { BOOL: value }
|
|
305
|
+
}
|
|
306
|
+
if (Array.isArray(value)) {
|
|
307
|
+
return { L: value.map(v => DynamoDBClient.marshalValue(v)) }
|
|
308
|
+
}
|
|
309
|
+
if (typeof value === 'object') {
|
|
310
|
+
return { M: DynamoDBClient.marshal(value) }
|
|
311
|
+
}
|
|
312
|
+
return { S: String(value) }
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* Helper: Unmarshal DynamoDB format to JavaScript object
|
|
317
|
+
*/
|
|
318
|
+
static unmarshal(item: Record<string, AttributeValue>): Record<string, any> {
|
|
319
|
+
const result: Record<string, any> = {}
|
|
320
|
+
for (const [key, value] of Object.entries(item)) {
|
|
321
|
+
result[key] = DynamoDBClient.unmarshalValue(value)
|
|
322
|
+
}
|
|
323
|
+
return result
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* Helper: Unmarshal a single DynamoDB value
|
|
328
|
+
*/
|
|
329
|
+
static unmarshalValue(value: AttributeValue): any {
|
|
330
|
+
if (value.S !== undefined) return value.S
|
|
331
|
+
if (value.N !== undefined) return Number(value.N)
|
|
332
|
+
if (value.BOOL !== undefined) return value.BOOL
|
|
333
|
+
if (value.NULL !== undefined) return null
|
|
334
|
+
if (value.L !== undefined) return value.L.map(v => DynamoDBClient.unmarshalValue(v))
|
|
335
|
+
if (value.M !== undefined) return DynamoDBClient.unmarshal(value.M)
|
|
336
|
+
if (value.SS !== undefined) return value.SS
|
|
337
|
+
if (value.NS !== undefined) return value.NS.map(Number)
|
|
338
|
+
return null
|
|
339
|
+
}
|
|
340
|
+
}
|