Skip to content

Commit 1731c98

Browse files
committed
add typescript examples
1 parent 10b6d3a commit 1731c98

File tree

8 files changed

+2491
-0
lines changed

8 files changed

+2491
-0
lines changed

examples/typescript/.gitattributes

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/sdk/** linguist-generated

examples/typescript/.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
/sdk
2+
/**/node_modules/**
3+
/**/.pnpm-store/**

examples/typescript/dagger.json

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"name": "example",
3+
"engineVersion": "v0.18.2",
4+
"sdk": {
5+
"source": "typescript"
6+
},
7+
"dependencies": [
8+
{
9+
"name": "localstack-dagger-module",
10+
"source": "../.."
11+
}
12+
]
13+
}

examples/typescript/jest.config.js

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
module.exports = {
2+
preset: 'ts-jest',
3+
testEnvironment: 'node',
4+
testMatch: ['**/*.test.ts'],
5+
moduleFileExtensions: ['ts', 'js'],
6+
transform: {
7+
'^.+\\.ts$': 'ts-jest',
8+
},
9+
};

examples/typescript/package.json

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{
2+
"name": "localstack-dagger-module-typescript-examples",
3+
"version": "1.0.0",
4+
"description": "TypeScript examples for LocalStack Dagger Module",
5+
"main": "dist/index.js",
6+
"scripts": {
7+
"build": "tsc",
8+
"start": "node dist/index.js"
9+
},
10+
"dependencies": {
11+
"@aws-sdk/client-ecr": "^3.0.0",
12+
"@aws-sdk/client-s3": "^3.0.0",
13+
"@dagger.io/dagger": "./sdk"
14+
},
15+
"devDependencies": {
16+
"@types/node": "^20.0.0",
17+
"typescript": "^5.0.0"
18+
},
19+
"type": "module",
20+
"packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e"
21+
}

examples/typescript/src/index.ts

Lines changed: 230 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,230 @@
1+
import { dag, Container, Directory, object, func, Secret } from "@dagger.io/dagger"
2+
import { connect } from "@dagger.io/dagger"
3+
import { S3Client, CreateBucketCommand, PutObjectCommand, GetObjectCommand } from "@aws-sdk/client-s3"
4+
import { ECRClient, CreateRepositoryCommand } from "@aws-sdk/client-ecr"
5+
import { Readable } from "stream"
6+
7+
/**
8+
* Example class demonstrating LocalStack Dagger module functionality
9+
*/
10+
@object()
11+
export class Example {
12+
/**
13+
* Demonstrates basic LocalStack functionality using the community edition.
14+
* Creates an S3 bucket and object to verify the setup is working correctly.
15+
*
16+
* @returns Promise<void>
17+
*/
18+
@func()
19+
async localstack_dagger_module__quickstart() {
20+
await connect(async (client) => {
21+
// Start LocalStack using the module
22+
const service = client.localstackDaggerModule().start()
23+
24+
await service.start()
25+
const endpoint = await service.endpoint()
26+
console.log(`LocalStack is running at ${endpoint}`)
27+
28+
// Create S3 client
29+
const s3 = new S3Client({
30+
endpoint: `http://${endpoint}`,
31+
credentials: {
32+
accessKeyId: "test",
33+
secretAccessKey: "test"
34+
},
35+
region: "us-east-1",
36+
forcePathStyle: true
37+
})
38+
39+
// Create a test bucket
40+
await s3.send(new CreateBucketCommand({
41+
Bucket: "test-bucket"
42+
}))
43+
console.log("S3 bucket created")
44+
45+
// Create a test object
46+
await s3.send(new PutObjectCommand({
47+
Bucket: "test-bucket",
48+
Key: "test-object",
49+
Body: "Hello, LocalStack!"
50+
}))
51+
console.log("S3 object created")
52+
53+
// Verify the object was created
54+
const response = await s3.send(new GetObjectCommand({
55+
Bucket: "test-bucket",
56+
Key: "test-object"
57+
}))
58+
59+
const content = await streamToString(response.Body as Readable)
60+
console.log(`S3 object content: ${content}`)
61+
})
62+
}
63+
64+
/**
65+
* Demonstrates LocalStack Pro functionality by starting a Pro instance
66+
* and creating an ECR repository.
67+
*
68+
* @param authToken - LocalStack Pro authentication token
69+
* @returns Promise<void>
70+
*/
71+
@func()
72+
async localstack_dagger_module__pro(authToken: Secret) {
73+
await connect(async (client) => {
74+
const service = client.localstackDaggerModule().start({
75+
authToken,
76+
configuration: "DEBUG=1,SERVICES=ecr",
77+
})
78+
79+
await service.start()
80+
const endpoint = await service.endpoint()
81+
console.log(`LocalStack Pro is running at ${endpoint}`)
82+
83+
// Create ECR client
84+
const ecr = new ECRClient({
85+
endpoint: `http://${endpoint}`,
86+
credentials: {
87+
accessKeyId: "test",
88+
secretAccessKey: "test"
89+
},
90+
region: "us-east-1"
91+
})
92+
93+
// Create a test repository
94+
const repositoryName = "test-ecr-repo"
95+
await ecr.send(new CreateRepositoryCommand({
96+
repositoryName
97+
}))
98+
console.log(`ECR repository '${repositoryName}' created`)
99+
})
100+
}
101+
102+
/**
103+
* Demonstrates LocalStack state management functionality using Cloud Pods.
104+
* Creates a test bucket, saves state to a pod, resets state, and loads it back.
105+
*
106+
* @param authToken - LocalStack Pro authentication token
107+
* @returns Promise<void>
108+
*/
109+
@func()
110+
async localstack_dagger_module__state(authToken: Secret) {
111+
await connect(async (client) => {
112+
const service = client.localstackDaggerModule().start({
113+
authToken
114+
})
115+
116+
await service.start()
117+
const endpoint = await service.endpoint()
118+
119+
// Create S3 client and test bucket
120+
const s3 = new S3Client({
121+
endpoint: `http://${endpoint}`,
122+
credentials: {
123+
accessKeyId: "test",
124+
secretAccessKey: "test"
125+
},
126+
region: "us-east-1",
127+
forcePathStyle: true
128+
})
129+
130+
await s3.send(new CreateBucketCommand({
131+
Bucket: "test-bucket"
132+
}))
133+
console.log("Test bucket created")
134+
135+
// Save state to Cloud Pod
136+
await client.localstackDaggerModule().state({
137+
authToken,
138+
save: "test-dagger-example-pod",
139+
endpoint: `http://${endpoint}`
140+
})
141+
142+
console.log("State saved to Cloud Pod")
143+
144+
// Reset state
145+
await client.localstackDaggerModule().state({
146+
reset: true,
147+
endpoint: `http://${endpoint}`
148+
})
149+
console.log("State reset")
150+
151+
// Load state back
152+
await client.localstackDaggerModule().state({
153+
authToken,
154+
load: "test-dagger-example-pod",
155+
endpoint: `http://${endpoint}`
156+
})
157+
158+
console.log("State loaded from Cloud Pod")
159+
})
160+
}
161+
162+
/**
163+
* Demonstrates LocalStack ephemeral instance management.
164+
* Creates an ephemeral instance, lists instances, retrieves logs,
165+
* and cleans up by deleting the instance.
166+
*
167+
* @param authToken - LocalStack Pro authentication token
168+
* @returns Promise<void>
169+
*/
170+
@func()
171+
async localstack_dagger_module__ephemeral(authToken: Secret) {
172+
await connect(async (client) => {
173+
// Create a new ephemeral instance
174+
await client.localstackDaggerModule().ephemeral(
175+
authToken,
176+
"create",
177+
{
178+
name: "test-dagger-example-instance",
179+
lifetime: 60
180+
}
181+
)
182+
console.log("Instance created")
183+
184+
// Wait for instance to be ready
185+
await new Promise(resolve => setTimeout(resolve, 15000))
186+
187+
// List instances
188+
const listResponse = await client.localstackDaggerModule().ephemeral(
189+
authToken,
190+
"list"
191+
)
192+
console.log(`Ephemeral instances: ${listResponse}`)
193+
194+
// Get instance logs
195+
const instanceLogs = await client.localstackDaggerModule().ephemeral(
196+
authToken,
197+
"logs",
198+
{
199+
name: "test-dagger-example-instance"
200+
}
201+
)
202+
console.log(`Instance logs: ${instanceLogs}`)
203+
204+
// Delete instance
205+
await client.localstackDaggerModule().ephemeral(
206+
authToken,
207+
"delete",
208+
{
209+
name: "test-dagger-example-instance"
210+
}
211+
)
212+
console.log("Instance deleted")
213+
})
214+
}
215+
}
216+
217+
/**
218+
* Helper function to convert a readable stream to a string.
219+
* Used for processing responses from AWS SDK operations.
220+
*
221+
* @param stream - Readable stream to convert
222+
* @returns Promise<string> The stream contents as a string
223+
*/
224+
async function streamToString(stream: Readable): Promise<string> {
225+
const chunks: Buffer[] = []
226+
for await (const chunk of stream) {
227+
chunks.push(Buffer.from(chunk))
228+
}
229+
return Buffer.concat(chunks).toString("utf-8")
230+
}

examples/typescript/tsconfig.json

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
{
2+
"compilerOptions": {
3+
"target": "ES2020",
4+
"module": "commonjs",
5+
"lib": [
6+
"ES2020"
7+
],
8+
"declaration": true,
9+
"strict": true,
10+
"esModuleInterop": true,
11+
"skipLibCheck": true,
12+
"forceConsistentCasingInFileNames": true,
13+
"moduleResolution": "node",
14+
"outDir": "./dist",
15+
"rootDir": "./src",
16+
"paths": {
17+
"@dagger.io/dagger": [
18+
"./sdk/src"
19+
],
20+
"@dagger.io/dagger/telemetry": [
21+
"./sdk/src/telemetry"
22+
]
23+
}
24+
},
25+
"exclude": [
26+
"node_modules",
27+
"dist"
28+
]
29+
}

0 commit comments

Comments
 (0)