@floci/testcontainers 0.1.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/README.md ADDED
@@ -0,0 +1,260 @@
1
+ # @floci/testcontainers
2
+
3
+ [![npm version](https://img.shields.io/npm/v/%40floci%2Ftestcontainers.svg)](https://www.npmjs.com/package/@floci/testcontainers)
4
+ [![Node versions](https://img.shields.io/node/v/%40floci%2Ftestcontainers.svg)](https://www.npmjs.com/package/@floci/testcontainers)
5
+ [![CI](https://github.com/floci-io/testcontainers-floci-node/actions/workflows/ci.yml/badge.svg)](https://github.com/floci-io/testcontainers-floci-node/actions/workflows/ci.yml)
6
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
7
+
8
+ Node.js [Testcontainers](https://testcontainers.com) module for [Floci](https://github.com/floci-io/floci) — the open-source, drop-in replacement for LocalStack Community Edition.
9
+
10
+ Floci emulates **41 AWS services** in a single container with:
11
+ - **~24 ms** startup time (native image)
12
+ - **~13 MiB** idle memory
13
+ - **~90 MB** Docker image
14
+ - No auth tokens, no feature gates, MIT license
15
+
16
+ ## Installation
17
+
18
+ ```bash
19
+ # npm
20
+ npm install --save-dev @floci/testcontainers
21
+
22
+ # yarn
23
+ yarn add --dev @floci/testcontainers
24
+
25
+ # pnpm
26
+ pnpm add --save-dev @floci/testcontainers
27
+ ```
28
+
29
+ ## Quick start
30
+
31
+ ```ts
32
+ import { S3Client, CreateBucketCommand, ListBucketsCommand } from '@aws-sdk/client-s3';
33
+ import { FlociContainer } from '@floci/testcontainers';
34
+
35
+ describe('S3', () => {
36
+ let floci: Awaited<ReturnType<FlociContainer['start']>>;
37
+
38
+ beforeAll(async () => {
39
+ floci = await new FlociContainer().start();
40
+ });
41
+
42
+ afterAll(async () => {
43
+ await floci.stop();
44
+ });
45
+
46
+ it('creates and lists a bucket', async () => {
47
+ const s3 = new S3Client({
48
+ endpoint: floci.getEndpoint(),
49
+ region: floci.getRegion(),
50
+ credentials: {
51
+ accessKeyId: floci.getAccessKey(),
52
+ secretAccessKey: floci.getSecretKey(),
53
+ },
54
+ forcePathStyle: true,
55
+ });
56
+
57
+ await s3.send(new CreateBucketCommand({ Bucket: 'my-bucket' }));
58
+ const { Buckets } = await s3.send(new ListBucketsCommand({}));
59
+ expect(Buckets?.map((b) => b.Name)).toContain('my-bucket');
60
+ });
61
+ });
62
+ ```
63
+
64
+ ## Sharing a container across tests
65
+
66
+ ```ts
67
+ import { FlociContainer, StartedFlociContainer } from '@floci/testcontainers';
68
+
69
+ let floci: StartedFlociContainer;
70
+
71
+ beforeAll(async () => {
72
+ floci = await new FlociContainer().start();
73
+ });
74
+
75
+ afterAll(async () => {
76
+ await floci.stop();
77
+ });
78
+ ```
79
+
80
+ ## Service configuration
81
+
82
+ Each of Floci's 41 services can be configured individually using typed config classes.
83
+
84
+ ### S3
85
+
86
+ ```ts
87
+ import { FlociContainer, S3Config } from '@floci/testcontainers';
88
+
89
+ const floci = await new FlociContainer()
90
+ .withS3Config(new S3Config(true, 7200))
91
+ .start();
92
+ ```
93
+
94
+ ### SQS
95
+
96
+ ```ts
97
+ import { SqsConfig } from '@floci/testcontainers';
98
+
99
+ const floci = await new FlociContainer()
100
+ .withSqsConfig(new SqsConfig(true, 60, 262144))
101
+ .start();
102
+ ```
103
+
104
+ ### DynamoDB
105
+
106
+ ```ts
107
+ import { DynamoDbConfig } from '@floci/testcontainers';
108
+
109
+ const floci = await new FlociContainer()
110
+ .withDynamoDbConfig(new DynamoDbConfig(true))
111
+ .start();
112
+ ```
113
+
114
+ ### Lambda
115
+
116
+ ```ts
117
+ import { LambdaConfig } from '@floci/testcontainers';
118
+
119
+ const floci = await new FlociContainer()
120
+ .withLambdaConfig(new LambdaConfig(
121
+ true, // enabled
122
+ 256, // defaultMemoryMb
123
+ 30, // defaultTimeoutSeconds
124
+ false, // ephemeral
125
+ true, // hotReloadEnabled
126
+ ))
127
+ .start();
128
+ ```
129
+
130
+ ### RDS (PostgreSQL / MySQL / MariaDB)
131
+
132
+ ```ts
133
+ import { RdsConfig } from '@floci/testcontainers';
134
+
135
+ const floci = await new FlociContainer()
136
+ .withRdsConfig(new RdsConfig(true, 7001, 99, 'postgres:16-alpine'))
137
+ .start();
138
+ ```
139
+
140
+ ### ElastiCache (Redis / Valkey)
141
+
142
+ ```ts
143
+ import { ElastiCacheConfig } from '@floci/testcontainers';
144
+
145
+ const floci = await new FlociContainer()
146
+ .withElastiCacheConfig(new ElastiCacheConfig(true, 'valkey/valkey:8'))
147
+ .start();
148
+ ```
149
+
150
+ ### OpenSearch
151
+
152
+ ```ts
153
+ import { OpenSearchConfig } from '@floci/testcontainers';
154
+
155
+ const floci = await new FlociContainer()
156
+ .withOpenSearchConfig(new OpenSearchConfig(true, false))
157
+ .start();
158
+ ```
159
+
160
+ ### MSK (Kafka via Redpanda)
161
+
162
+ ```ts
163
+ import { MskConfig } from '@floci/testcontainers';
164
+
165
+ const floci = await new FlociContainer()
166
+ .withMskConfig(new MskConfig(true, false, 'redpandadata/redpanda:latest'))
167
+ .start();
168
+ ```
169
+
170
+ ### All available config classes
171
+
172
+ | Config class | AWS service |
173
+ |---|---|
174
+ | `AcmConfig` | AWS Certificate Manager |
175
+ | `ApiGatewayConfig` | API Gateway (v1) |
176
+ | `ApiGatewayV2Config` | API Gateway (v2) |
177
+ | `AppConfigConfig` | AppConfig |
178
+ | `AppConfigDataConfig` | AppConfig Data |
179
+ | `AthenaConfig` | Athena |
180
+ | `BedrockRuntimeConfig` | Bedrock Runtime |
181
+ | `CloudFormationConfig` | CloudFormation |
182
+ | `CloudWatchLogsConfig` | CloudWatch Logs |
183
+ | `CloudWatchMetricsConfig` | CloudWatch Metrics |
184
+ | `CodeBuildConfig` | CodeBuild |
185
+ | `CodeDeployConfig` | CodeDeploy |
186
+ | `CognitoConfig` | Cognito |
187
+ | `DynamoDbConfig` | DynamoDB |
188
+ | `Ec2Config` | EC2 |
189
+ | `EcrConfig` | ECR |
190
+ | `EcsConfig` | ECS |
191
+ | `EksConfig` | EKS |
192
+ | `ElastiCacheConfig` | ElastiCache |
193
+ | `ElbV2Config` | ELB v2 |
194
+ | `EventBridgeConfig` | EventBridge |
195
+ | `FirehoseConfig` | Kinesis Firehose |
196
+ | `GlueConfig` | Glue |
197
+ | `IamConfig` | IAM |
198
+ | `KinesisConfig` | Kinesis |
199
+ | `KmsConfig` | KMS |
200
+ | `LambdaConfig` | Lambda |
201
+ | `MskConfig` | MSK (Kafka) |
202
+ | `OpenSearchConfig` | OpenSearch |
203
+ | `PipesConfig` | EventBridge Pipes |
204
+ | `RdsConfig` | RDS |
205
+ | `ResourceGroupsTaggingConfig` | Resource Groups Tagging |
206
+ | `S3Config` | S3 |
207
+ | `SchedulerConfig` | EventBridge Scheduler |
208
+ | `SecretsManagerConfig` | Secrets Manager |
209
+ | `SesConfig` | SES |
210
+ | `SesV2Config` | SES v2 |
211
+ | `SnsConfig` | SNS |
212
+ | `SqsConfig` | SQS |
213
+ | `SsmConfig` | SSM Parameter Store |
214
+ | `StepFunctionsConfig` | Step Functions |
215
+
216
+ ## Container options
217
+
218
+ ```ts
219
+ const floci = await new FlociContainer('floci/floci:latest') // pin a specific tag
220
+ .withRegion('eu-west-1')
221
+ .withAccountId('111122223333')
222
+ .withAvailabilityZone('eu-west-1a')
223
+ .withDedicatedNetwork() // isolated Docker network for stateful services
224
+ .start();
225
+ ```
226
+
227
+ ### Connection details
228
+
229
+ | Method | Returns |
230
+ |---|---|
231
+ | `getEndpoint()` | `http://host:port` — pass as `endpoint` to AWS SDK clients |
232
+ | `getRegion()` | AWS region string |
233
+ | `getAccessKey()` | Access key (`"test"` by default) |
234
+ | `getSecretKey()` | Secret key (`"test"` by default) |
235
+ | `getAccountId()` | AWS account ID |
236
+ | `getMappedPort(port)` | Host port mapped from the given container port |
237
+
238
+ ## Docker image variants
239
+
240
+ | Tag | Description |
241
+ |---|---|
242
+ | `floci/floci:latest` | Native image — sub-second startup (recommended) |
243
+ | `floci/floci:x.y.z` | Pinned release (native) |
244
+
245
+ ## Requirements
246
+
247
+ - Node.js 18+
248
+ - Docker (running locally or in CI)
249
+ - `testcontainers >= 10.0.0`
250
+
251
+ ## Related projects
252
+
253
+ - [Floci](https://github.com/floci-io/floci) — the emulator itself
254
+ - [testcontainers-floci](https://github.com/floci-io/testcontainers-floci) — Java / Spring Boot module
255
+ - [testcontainers-floci-python](https://github.com/floci-io/testcontainers-floci-python) — Python module
256
+ - [Testcontainers for Node.js](https://node.testcontainers.org)
257
+
258
+ ## License
259
+
260
+ MIT
@@ -0,0 +1,190 @@
1
+ import { StartedTestContainer } from 'testcontainers';
2
+ import type { StartedNetwork } from 'testcontainers';
3
+ import { AcmConfig, ApiGatewayConfig, ApiGatewayV2Config, AppConfigConfig, AppConfigDataConfig, AthenaConfig, BedrockRuntimeConfig, CloudFormationConfig, CloudWatchLogsConfig, CloudWatchMetricsConfig, CodeBuildConfig, CodeDeployConfig, CognitoConfig, DynamoDbConfig, Ec2Config, EcrConfig, EcsConfig, EksConfig, ElastiCacheConfig, ElbV2Config, EventBridgeConfig, FirehoseConfig, GlueConfig, IamConfig, KinesisConfig, KmsConfig, LambdaConfig, MskConfig, OpenSearchConfig, PipesConfig, RdsConfig, ResourceGroupsTaggingConfig, S3Config, SchedulerConfig, SecretsManagerConfig, SesConfig, SesV2Config, SnsConfig, SqsConfig, SsmConfig, StepFunctionsConfig } from './config/services';
4
+ /**
5
+ * Testcontainers module for Floci — a free, open-source local AWS emulator.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * const floci = await new FlociContainer().start();
10
+ * const s3 = new S3Client({
11
+ * endpoint: floci.getEndpoint(),
12
+ * region: floci.getRegion(),
13
+ * credentials: { accessKeyId: floci.getAccessKey(), secretAccessKey: floci.getSecretKey() },
14
+ * forcePathStyle: true,
15
+ * });
16
+ * await floci.stop();
17
+ * ```
18
+ */
19
+ export declare class FlociContainer {
20
+ static readonly PORT = 4566;
21
+ static readonly DEFAULT_REGION = "us-east-1";
22
+ static readonly DEFAULT_AVAILABILITY_ZONE = "us-east-1a";
23
+ static readonly DEFAULT_ACCOUNT_ID = "000000000000";
24
+ static readonly DEFAULT_ACCESS_KEY = "test";
25
+ static readonly DEFAULT_SECRET_KEY = "test";
26
+ static readonly STARTUP_TIMEOUT_MS = 30000;
27
+ private readonly image;
28
+ private readonly envVars;
29
+ private readonly exposedPorts;
30
+ private dedicatedNetworkName?;
31
+ private acmConfig;
32
+ private apiGatewayConfig;
33
+ private apiGatewayV2Config;
34
+ private appConfigConfig;
35
+ private appConfigDataConfig;
36
+ private athenaConfig;
37
+ private bedrockRuntimeConfig;
38
+ private cloudFormationConfig;
39
+ private cloudWatchLogsConfig;
40
+ private cloudWatchMetricsConfig;
41
+ private codeBuildConfig;
42
+ private codeDeployConfig;
43
+ private cognitoConfig;
44
+ private dynamoDbConfig;
45
+ private ec2Config;
46
+ private ecrConfig;
47
+ private ecsConfig;
48
+ private eksConfig;
49
+ private elastiCacheConfig;
50
+ private elbV2Config;
51
+ private eventBridgeConfig;
52
+ private firehoseConfig;
53
+ private glueConfig;
54
+ private iamConfig;
55
+ private kinesisConfig;
56
+ private kmsConfig;
57
+ private lambdaConfig;
58
+ private mskConfig;
59
+ private openSearchConfig;
60
+ private pipesConfig;
61
+ private rdsConfig;
62
+ private resourceGroupsTaggingConfig;
63
+ private s3Config;
64
+ private schedulerConfig;
65
+ private secretsManagerConfig;
66
+ private sesConfig;
67
+ private sesV2Config;
68
+ private snsConfig;
69
+ private sqsConfig;
70
+ private ssmConfig;
71
+ private stepFunctionsConfig;
72
+ constructor(image?: string);
73
+ withEnv(key: string, value: string): this;
74
+ withExposedPort(port: number): this;
75
+ withRegion(region: string): this;
76
+ withAccountId(accountId: string): this;
77
+ withAvailabilityZone(zone: string): this;
78
+ withDedicatedNetwork(): this;
79
+ withAcmConfig(config: AcmConfig): this;
80
+ getAcmConfig(): AcmConfig;
81
+ withApiGatewayConfig(config: ApiGatewayConfig): this;
82
+ getApiGatewayConfig(): ApiGatewayConfig;
83
+ withApiGatewayV2Config(config: ApiGatewayV2Config): this;
84
+ getApiGatewayV2Config(): ApiGatewayV2Config;
85
+ withAppConfigConfig(config: AppConfigConfig): this;
86
+ getAppConfigConfig(): AppConfigConfig;
87
+ withAppConfigDataConfig(config: AppConfigDataConfig): this;
88
+ getAppConfigDataConfig(): AppConfigDataConfig;
89
+ withAthenaConfig(config: AthenaConfig): this;
90
+ getAthenaConfig(): AthenaConfig;
91
+ withBedrockRuntimeConfig(config: BedrockRuntimeConfig): this;
92
+ getBedrockRuntimeConfig(): BedrockRuntimeConfig;
93
+ withCloudFormationConfig(config: CloudFormationConfig): this;
94
+ getCloudFormationConfig(): CloudFormationConfig;
95
+ withCloudWatchLogsConfig(config: CloudWatchLogsConfig): this;
96
+ getCloudWatchLogsConfig(): CloudWatchLogsConfig;
97
+ withCloudWatchMetricsConfig(config: CloudWatchMetricsConfig): this;
98
+ getCloudWatchMetricsConfig(): CloudWatchMetricsConfig;
99
+ withCodeBuildConfig(config: CodeBuildConfig): this;
100
+ getCodeBuildConfig(): CodeBuildConfig;
101
+ withCodeDeployConfig(config: CodeDeployConfig): this;
102
+ getCodeDeployConfig(): CodeDeployConfig;
103
+ withCognitoConfig(config: CognitoConfig): this;
104
+ getCognitoConfig(): CognitoConfig;
105
+ withDynamoDbConfig(config: DynamoDbConfig): this;
106
+ getDynamoDbConfig(): DynamoDbConfig;
107
+ withEc2Config(config: Ec2Config): this;
108
+ getEc2Config(): Ec2Config;
109
+ withEcrConfig(config: EcrConfig): this;
110
+ getEcrConfig(): EcrConfig;
111
+ withEcsConfig(config: EcsConfig): this;
112
+ getEcsConfig(): EcsConfig;
113
+ withEksConfig(config: EksConfig): this;
114
+ getEksConfig(): EksConfig;
115
+ withElastiCacheConfig(config: ElastiCacheConfig): this;
116
+ getElastiCacheConfig(): ElastiCacheConfig;
117
+ withElbV2Config(config: ElbV2Config): this;
118
+ getElbV2Config(): ElbV2Config;
119
+ withEventBridgeConfig(config: EventBridgeConfig): this;
120
+ getEventBridgeConfig(): EventBridgeConfig;
121
+ withFirehoseConfig(config: FirehoseConfig): this;
122
+ getFirehoseConfig(): FirehoseConfig;
123
+ withGlueConfig(config: GlueConfig): this;
124
+ getGlueConfig(): GlueConfig;
125
+ withIamConfig(config: IamConfig): this;
126
+ getIamConfig(): IamConfig;
127
+ withKinesisConfig(config: KinesisConfig): this;
128
+ getKinesisConfig(): KinesisConfig;
129
+ withKmsConfig(config: KmsConfig): this;
130
+ getKmsConfig(): KmsConfig;
131
+ withLambdaConfig(config: LambdaConfig): this;
132
+ getLambdaConfig(): LambdaConfig;
133
+ withMskConfig(config: MskConfig): this;
134
+ getMskConfig(): MskConfig;
135
+ withOpenSearchConfig(config: OpenSearchConfig): this;
136
+ getOpenSearchConfig(): OpenSearchConfig;
137
+ withPipesConfig(config: PipesConfig): this;
138
+ getPipesConfig(): PipesConfig;
139
+ withRdsConfig(config: RdsConfig): this;
140
+ getRdsConfig(): RdsConfig;
141
+ withResourceGroupsTaggingConfig(config: ResourceGroupsTaggingConfig): this;
142
+ getResourceGroupsTaggingConfig(): ResourceGroupsTaggingConfig;
143
+ withS3Config(config: S3Config): this;
144
+ getS3Config(): S3Config;
145
+ withSchedulerConfig(config: SchedulerConfig): this;
146
+ getSchedulerConfig(): SchedulerConfig;
147
+ withSecretsManagerConfig(config: SecretsManagerConfig): this;
148
+ getSecretsManagerConfig(): SecretsManagerConfig;
149
+ withSesConfig(config: SesConfig): this;
150
+ getSesConfig(): SesConfig;
151
+ withSesV2Config(config: SesV2Config): this;
152
+ getSesV2Config(): SesV2Config;
153
+ withSnsConfig(config: SnsConfig): this;
154
+ getSnsConfig(): SnsConfig;
155
+ withSqsConfig(config: SqsConfig): this;
156
+ getSqsConfig(): SqsConfig;
157
+ withSsmConfig(config: SsmConfig): this;
158
+ getSsmConfig(): SsmConfig;
159
+ withStepFunctionsConfig(config: StepFunctionsConfig): this;
160
+ getStepFunctionsConfig(): StepFunctionsConfig;
161
+ getDedicatedNetworkName(): string | undefined;
162
+ start(): Promise<StartedFlociContainer>;
163
+ private applyAllConfigs;
164
+ private refreshExposedPorts;
165
+ }
166
+ export declare class StartedFlociContainer {
167
+ private readonly container;
168
+ private readonly region;
169
+ private readonly availabilityZone;
170
+ private readonly accountId;
171
+ private readonly _dedicatedNetworkName?;
172
+ private readonly network?;
173
+ constructor(container: StartedTestContainer, opts: {
174
+ region: string;
175
+ availabilityZone: string;
176
+ accountId: string;
177
+ dedicatedNetworkName?: string;
178
+ network?: StartedNetwork;
179
+ });
180
+ getEndpoint(): string;
181
+ getRegion(): string;
182
+ getAccessKey(): string;
183
+ getSecretKey(): string;
184
+ getAccountId(): string;
185
+ getAvailabilityZone(): string;
186
+ getDedicatedNetworkName(): string | undefined;
187
+ getMappedPort(port: number): number;
188
+ stop(): Promise<void>;
189
+ }
190
+ //# sourceMappingURL=FlociContainer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FlociContainer.d.ts","sourceRoot":"","sources":["../src/FlociContainer.ts"],"names":[],"mappings":"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"}