From 3528054600a971e73665a32e2d7f2cb644c5e7f3 Mon Sep 17 00:00:00 2001 From: Chris Rybicki Date: Wed, 11 Sep 2024 01:25:38 -0400 Subject: [PATCH] feat(sdk)!: `cloud.Bucket` supports CORS by default (#7104) Closes #7058 Closes #7048 Currently, signed URLs created with `cloud.Bucket` can't be used by web applications in Wing since CORS options aren't configurable. CORS (Cross-Origin Resource Sharing) affects how the browser can access other domains. To solve this, we add two new fields, `cors` and `corsOptions` to the props of `cloud.Bucket`. We've configured `cors: true` as the default so that these kinds of use cases for using signed URLs will work out of the box. If the bucket is private, CORS settings still apply, but they only come into effect when the bucket's objects are accessed through a signed URL or by authenticated users. BREAKING CHANGE: `cloud.Bucket` now is synthesized with CORS configuration by default (currently only supported on AWS). If your bucket is public or you are using signed URLs extensively, you may want to consider configuring the `corsOptions` on the bucket or disabling CORS based on your application's needs. ## Checklist - [x] Title matches [Winglang's style guide](https://www.winglang.io/contributing/start-here/pull_requests#how-are-pull-request-titles-formatted) - [x] Description explains motivation and solution - [x] Tests added (always) - [x] Docs updated (only required for features) - [ ] Added `pr/e2e-full` label if this feature requires end-to-end testing *By submitting this pull request, I confirm that my contribution is made under the terms of the [Wing Cloud Contribution License](https://github.com/winglang/wing/blob/main/CONTRIBUTION_LICENSE.md)*. --- docs/api/04-standard-library/cloud/bucket.md | 217 +++++ .../@winglang/platform-awscdk/src/bucket.ts | 16 + .../test/__snapshots__/bucket.test.ts.snap | 168 ++++ .../test/__snapshots__/on-deploy.test.ts.snap | 42 + .../platform-awscdk/test/platform.test.ts | 21 + packages/@winglang/sdk/src/cloud/bucket.md | 37 + packages/@winglang/sdk/src/cloud/bucket.ts | 100 ++- packages/@winglang/sdk/src/http/http.ts | 4 +- packages/@winglang/sdk/src/std/duration.ts | 2 +- .../@winglang/sdk/src/target-sim/bucket.ts | 5 + .../@winglang/sdk/src/target-tf-aws/bucket.ts | 38 +- .../sdk/src/target-tf-azure/bucket.ts | 10 + .../@winglang/sdk/src/target-tf-gcp/bucket.ts | 10 + .../__snapshots__/bucket.test.ts.snap | 825 +++++++++++++++++- .../__snapshots__/captures.test.ts.snap | 24 + .../__snapshots__/on-deploy.test.ts.snap | 70 ++ .../sdk/test/target-tf-aws/bucket.test.ts | 74 +- .../sdk/test/target-tf-aws/captures.test.ts | 1 + .../incomplete_inflight_namespace.snap | 12 +- .../completions/namespace_middle_dot.snap | 12 +- .../completions/new_expression_nested.snap | 4 +- .../partial_type_reference_annotation.snap | 12 +- .../variable_type_annotation_namespace.snap | 12 +- .../lsp/snapshots/hovers/class_symbol.snap | 4 +- .../snapshots/hovers/inside_class_field.snap | 4 +- .../snapshots/signature/constructor_arg.snap | 4 +- .../test/fixtures/main.w.tf-aws.snap.md | 31 + .../valid/bucket.md_example_5/main.w | 17 + .../valid/bucket.md_example_6/main.w | 13 + tests/sdk_tests/bucket/cors.test.w | 52 ++ tests/valid/external_ts.extern.d.ts | 55 ++ tests/valid/struct_from_json.test.w | 10 +- tools/hangar/__snapshots__/platform.ts.snap | 150 ++++ .../bucket/add_file.test.w_compile_tf-aws.md | 30 + .../add_object.test.w_compile_tf-aws.md | 30 + .../aws-bucket.test.w_compile_tf-aws.md | 30 + .../bucket-ref.test.w_compile_tf-aws.md | 30 + .../bucket_list.test.w_compile_tf-aws.md | 30 + .../bucket/copy.test.w_compile_tf-aws.md | 30 + .../bucket/cors.test.w_compile_tf-aws.md | 272 ++++++ .../sdk_tests/bucket/cors.test.w_test_sim.md | 13 + .../bucket/delete.test.w_compile_tf-aws.md | 30 + .../bucket/events.test.w_compile_tf-aws.md | 58 ++ .../bucket/exists.test.w_compile_tf-aws.md | 30 + .../bucket/get.test.w_compile_tf-aws.md | 30 + .../bucket/load_test.test.w_compile_tf-aws.md | 30 + .../bucket/metadata.test.w_compile_tf-aws.md | 30 + .../public_url.test.w_compile_tf-aws.md | 58 ++ .../bucket/put.test.w_compile_tf-aws.md | 30 + .../bucket/put_json.test.w_compile_tf-aws.md | 30 + .../bucket/rename.test.w_compile_tf-aws.md | 30 + .../signed_url.test.w_compile_tf-aws.md | 30 + .../try_delete.test.w_compile_tf-aws.md | 30 + .../bucket/try_get.test.w_compile_tf-aws.md | 30 + .../try_get_json.test.w_compile_tf-aws.md | 30 + .../memory_and_env.test.w_compile_tf-aws.md | 30 + .../http/fetch.test.w_compile_tf-aws.md | 30 + .../empty-actions.test.w_compile_tf-aws.md | 30 + .../std/array.test.w_compile_tf-aws.md | 86 ++ .../std/node.test.w_compile_tf-aws.md | 58 ++ .../ui/section.test.w_compile_tf-aws.md | 30 + .../bring_local.test.w_compile_tf-aws.md | 30 + ...ring_wing_library.test.w_compile_tf-aws.md | 30 + .../bucket_keys.test.w_compile_tf-aws.md | 30 + ...capture_in_binary.test.w_compile_tf-aws.md | 30 + ...gable_class_field.test.w_compile_tf-aws.md | 30 + ...resource_and_data.test.w_compile_tf-aws.md | 30 + .../valid/captures.test.w_compile_tf-aws.md | 86 ++ .../valid/casting.test.w_compile_tf-aws.md | 30 + .../container_types.test.w_compile_tf-aws.md | 86 ++ ...ift_qualification.test.w_compile_tf-aws.md | 86 ++ ...rn_implementation.test.w_compile_tf-aws.md | 30 + .../valid/factory.test.w_compile_tf-aws.md | 30 + .../file_counter.test.w_compile_tf-aws.md | 30 + ...ariadic_arguments.test.w_compile_tf-aws.md | 86 ++ .../valid/hello.test.w_compile_tf-aws.md | 30 + ..._preflight_object.test.w_compile_tf-aws.md | 30 + ..._inflight_closure.test.w_compile_tf-aws.md | 30 + ...calling_inflights.test.w_compile_tf-aws.md | 30 + .../valid/json.test.w_compile_tf-aws.md | 58 ++ .../json_bucket.test.w_compile_tf-aws.md | 30 + ...losure_collection.test.w_compile_tf-aws.md | 58 ++ ..._object_issue6501.test.w_compile_tf-aws.md | 30 + ...t_shared_resource.test.w_compile_tf-aws.md | 30 + .../lift_via_closure.test.w_compile_tf-aws.md | 58 ++ ...t_container_types.test.w_compile_tf-aws.md | 86 ++ ..._after_class_init.test.w_compile_tf-aws.md | 30 + .../new_in_static.test.w_compile_tf-aws.md | 142 +++ .../valid/new_jsii.test.w_compile_tf-aws.md | 30 + .../valid/optionals.test.w_compile_tf-aws.md | 30 + .../valid/resource.test.w_compile_tf-aws.md | 86 ++ ...resource_captures.test.w_compile_tf-aws.md | 86 ++ ..._captures_globals.test.w_compile_tf-aws.md | 58 ++ .../struct_from_json.test.w_compile_tf-aws.md | 20 +- .../valid/super_call.test.w_compile_tf-aws.md | 30 + .../test_bucket.test.w_compile_tf-aws.md | 30 + .../to_inflight.test.w_compile_tf-aws.md | 30 + .../unused_lift.test.w_compile_tf-aws.md | 30 + .../website_with_api.test.w_compile_tf-aws.md | 30 + tools/hangar/__snapshots__/tree_json.ts.snap | 27 + 100 files changed, 4967 insertions(+), 67 deletions(-) create mode 100644 tests/doc_examples/valid/bucket.md_example_5/main.w create mode 100644 tests/doc_examples/valid/bucket.md_example_6/main.w create mode 100644 tests/sdk_tests/bucket/cors.test.w create mode 100644 tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/cors.test.w_compile_tf-aws.md create mode 100644 tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/cors.test.w_test_sim.md diff --git a/docs/api/04-standard-library/cloud/bucket.md b/docs/api/04-standard-library/cloud/bucket.md index 8844346e31e..329cb52cfc0 100644 --- a/docs/api/04-standard-library/cloud/bucket.md +++ b/docs/api/04-standard-library/cloud/bucket.md @@ -99,6 +99,41 @@ store.onDelete(inflight (key: str) => { }); ``` +### Configuring CORS + +By default, buckets are configured with CORS for any origin. When a bucket is private (the default), CORS options only come into play when the bucket's objects are accessed through a signed URL. + +```js playground example +bring cloud; + +let uploads = new cloud.Bucket( + // these are the default values + public: false, + cors: true, + corsOptions: { + allowedMethods: [http.HttpMethod.GET, http.HttpMethod.POST, http.HttpMethod.PUT, http.HttpMethod.DELETE, http.HttpMethod.HEAD] + allowedOrigins: ["*"], + allowedHeaders: ["*"], + exposeHeaders: [], + maxAge: 0s + }, +) +``` + +The CORS configuration can be disabled by passing `cors: false` to the constructor. CORS rules can also be configured after the bucket is created by calling the `addCorsRule` method: + +```js playground example +bring cloud; + +let bucket = new cloud.Bucket( + cors: false, // disable any default CORS rules +); + +bucket.addCorsRule({ + allowedOrigins: ["https://example.com"], +}); +``` + ## Target-specific details ### Simulator (`sim`) @@ -150,6 +185,7 @@ new cloud.Bucket(props?: BucketProps); | **Name** | **Description** | | --- | --- | +| addCorsRule | Add cors configuration to the bucket. | | addFile | Add a file to the bucket from system folder. | | addObject | Add a file to the bucket that is uploaded when the app is deployed. | | onCreate | Run an inflight whenever a file is uploaded to the bucket. | @@ -179,6 +215,22 @@ new cloud.Bucket(props?: BucketProps); --- +##### `addCorsRule` + +```wing +addCorsRule(value: BucketCorsOptions): void +``` + +Add cors configuration to the bucket. + +###### `value`Required + +- *Type:* BucketCorsOptions + +The cors configuration. + +--- + ##### `addFile` ```wing @@ -713,6 +765,123 @@ The tree node. ## Structs +### BucketCorsOptions + +Cors Options for `Bucket`. + +#### Initializer + +```wing +bring cloud; + +let BucketCorsOptions = cloud.BucketCorsOptions{ ... }; +``` + +#### Properties + +| **Name** | **Type** | **Description** | +| --- | --- | --- | +| allowedMethods | MutArray<HttpMethod> | The list of allowed methods. | +| allowedOrigins | MutArray<str> | The allowed origin. | +| allowedHeaders | MutArray<str> | The list of allowed headers. | +| exposeHeaders | MutArray<str> | The list of exposed headers. | +| maxAge | duration | How long the browser should cache preflight request results. | + +--- + +##### `allowedMethods`Required + +```wing +allowedMethods: MutArray; +``` + +- *Type:* MutArray<HttpMethod> +- *Default:* [HttpMethod.GET, HttpMethod.POST, HttpMethod.PUT, HttpMethod.PATCH, HttpMethod.DELETE, HttpMethod.HEAD, HttpMethod.OPTIONS] + +The list of allowed methods. + +--- + +*Example* + +```wing +[HttpMethod.GET, HttpMethod.POST] +``` + + +##### `allowedOrigins`Required + +```wing +allowedOrigins: MutArray; +``` + +- *Type:* MutArray<str> +- *Default:* ["*"] + +The allowed origin. + +--- + +*Example* + +```wing +"https://example.com" +``` + + +##### `allowedHeaders`Optional + +```wing +allowedHeaders: MutArray; +``` + +- *Type:* MutArray<str> +- *Default:* ["Content-Type", "Authorization"] + +The list of allowed headers. + +--- + +*Example* + +```wing +["Content-Type"] +``` + + +##### `exposeHeaders`Optional + +```wing +exposeHeaders: MutArray; +``` + +- *Type:* MutArray<str> +- *Default:* [] + +The list of exposed headers. + +--- + +*Example* + +```wing +["Content-Type"] +``` + + +##### `maxAge`Optional + +```wing +maxAge: duration; +``` + +- *Type:* duration +- *Default:* 300 seconds + +How long the browser should cache preflight request results. + +--- + ### BucketDeleteOptions Options for `Bucket.delete()`. @@ -906,10 +1075,58 @@ let BucketProps = cloud.BucketProps{ ... }; | **Name** | **Type** | **Description** | | --- | --- | --- | +| cors | bool | Whether to add default cors configuration. | +| corsOptions | BucketCorsOptions | Custom cors configuration for the bucket. | | public | bool | Whether the bucket's objects should be publicly accessible. | --- +##### `cors`Optional + +```wing +cors: bool; +``` + +- *Type:* bool +- *Default:* true + +Whether to add default cors configuration. + +The default cors configuration is equivalent to calling `addCorsRule` +with the following options: +{ + allowHeaders: ["*"], + allowOrigins: ["*"], + allowMethods: ["DELETE", "GET", "HEAD", "POST", "PUT"], + exposeHeaders: [], + maxAge: 0s +} + +--- + +##### `corsOptions`Optional + +```wing +corsOptions: BucketCorsOptions; +``` + +- *Type:* BucketCorsOptions +- *Default:* All origins, methods, headers are allowed. + +Custom cors configuration for the bucket. + +The default cors configuration is equivalent to calling `addCorsRule` +with the following options: +{ + allowHeaders: ["*"], + allowOrigins: ["*"], + allowMethods: ["DELETE", "GET", "HEAD", "POST", "PUT"], + exposeHeaders: [], + maxAge: 0s +} + +--- + ##### `public`Optional ```wing diff --git a/packages/@winglang/platform-awscdk/src/bucket.ts b/packages/@winglang/platform-awscdk/src/bucket.ts index 5266e15faa9..dac156b8e5f 100644 --- a/packages/@winglang/platform-awscdk/src/bucket.ts +++ b/packages/@winglang/platform-awscdk/src/bucket.ts @@ -49,6 +49,22 @@ export class Bucket extends cloud.Bucket implements IAwsBucket { this.public = props.public ?? false; this.bucket = createEncryptedBucket(this, this.public); + + if (props.cors ?? true) { + this.addCorsRule( + props.corsOptions ?? cloud.DEFAULT_BUCKET_CORS_CONFIGURATION + ); + } + } + + public addCorsRule(value: cloud.BucketCorsOptions): void { + this.bucket.addCorsRule({ + allowedHeaders: value.allowedHeaders, + allowedMethods: value.allowedMethods as any, + allowedOrigins: value.allowedOrigins, + maxAge: value.maxAge?.seconds, + exposedHeaders: value.exposeHeaders, + }); } public addObject(key: string, body: string): void { diff --git a/packages/@winglang/platform-awscdk/test/__snapshots__/bucket.test.ts.snap b/packages/@winglang/platform-awscdk/test/__snapshots__/bucket.test.ts.snap index ebb720ed616..5c69c2a0798 100644 --- a/packages/@winglang/platform-awscdk/test/__snapshots__/bucket.test.ts.snap +++ b/packages/@winglang/platform-awscdk/test/__snapshots__/bucket.test.ts.snap @@ -22,6 +22,27 @@ exports[`bucket is public 1`] = ` }, ], }, + "CorsConfiguration": { + "CorsRules": [ + { + "AllowedHeaders": [ + "*", + ], + "AllowedMethods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD", + ], + "AllowedOrigins": [ + "*", + ], + "ExposedHeaders": [], + "MaxAge": 0, + }, + ], + }, "PublicAccessBlockConfiguration": { "BlockPublicAcls": false, "BlockPublicPolicy": false, @@ -306,6 +327,27 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, ], }, + "CorsConfiguration": { + "CorsRules": [ + { + "AllowedHeaders": [ + "*", + ], + "AllowedMethods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD", + ], + "AllowedOrigins": [ + "*", + ], + "ExposedHeaders": [], + "MaxAge": 0, + }, + ], + }, "PublicAccessBlockConfiguration": { "BlockPublicAcls": true, "BlockPublicPolicy": true, @@ -666,6 +708,27 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, ], }, + "CorsConfiguration": { + "CorsRules": [ + { + "AllowedHeaders": [ + "*", + ], + "AllowedMethods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD", + ], + "AllowedOrigins": [ + "*", + ], + "ExposedHeaders": [], + "MaxAge": 0, + }, + ], + }, "PublicAccessBlockConfiguration": { "BlockPublicAcls": true, "BlockPublicPolicy": true, @@ -1070,6 +1133,27 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, ], }, + "CorsConfiguration": { + "CorsRules": [ + { + "AllowedHeaders": [ + "*", + ], + "AllowedMethods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD", + ], + "AllowedOrigins": [ + "*", + ], + "ExposedHeaders": [], + "MaxAge": 0, + }, + ], + }, "PublicAccessBlockConfiguration": { "BlockPublicAcls": true, "BlockPublicPolicy": true, @@ -1608,6 +1692,27 @@ def submit_response(event: dict, context, response_status: str, error_message: s }, ], }, + "CorsConfiguration": { + "CorsRules": [ + { + "AllowedHeaders": [ + "*", + ], + "AllowedMethods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD", + ], + "AllowedOrigins": [ + "*", + ], + "ExposedHeaders": [], + "MaxAge": 0, + }, + ], + }, "PublicAccessBlockConfiguration": { "BlockPublicAcls": true, "BlockPublicPolicy": true, @@ -1940,6 +2045,27 @@ exports[`bucket with two preflight files 1`] = ` }, ], }, + "CorsConfiguration": { + "CorsRules": [ + { + "AllowedHeaders": [ + "*", + ], + "AllowedMethods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD", + ], + "AllowedOrigins": [ + "*", + ], + "ExposedHeaders": [], + "MaxAge": 0, + }, + ], + }, "PublicAccessBlockConfiguration": { "BlockPublicAcls": false, "BlockPublicPolicy": false, @@ -2247,6 +2373,27 @@ exports[`bucket with two preflight objects 1`] = ` }, ], }, + "CorsConfiguration": { + "CorsRules": [ + { + "AllowedHeaders": [ + "*", + ], + "AllowedMethods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD", + ], + "AllowedOrigins": [ + "*", + ], + "ExposedHeaders": [], + "MaxAge": 0, + }, + ], + }, "PublicAccessBlockConfiguration": { "BlockPublicAcls": false, "BlockPublicPolicy": false, @@ -2395,6 +2542,27 @@ exports[`create a bucket 1`] = ` }, ], }, + "CorsConfiguration": { + "CorsRules": [ + { + "AllowedHeaders": [ + "*", + ], + "AllowedMethods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD", + ], + "AllowedOrigins": [ + "*", + ], + "ExposedHeaders": [], + "MaxAge": 0, + }, + ], + }, "PublicAccessBlockConfiguration": { "BlockPublicAcls": true, "BlockPublicPolicy": true, diff --git a/packages/@winglang/platform-awscdk/test/__snapshots__/on-deploy.test.ts.snap b/packages/@winglang/platform-awscdk/test/__snapshots__/on-deploy.test.ts.snap index dc56331a012..34b1104b16c 100644 --- a/packages/@winglang/platform-awscdk/test/__snapshots__/on-deploy.test.ts.snap +++ b/packages/@winglang/platform-awscdk/test/__snapshots__/on-deploy.test.ts.snap @@ -557,6 +557,27 @@ exports[`execute OnDeploy after other resources 1`] = ` }, ], }, + "CorsConfiguration": { + "CorsRules": [ + { + "AllowedHeaders": [ + "*", + ], + "AllowedMethods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD", + ], + "AllowedOrigins": [ + "*", + ], + "ExposedHeaders": [], + "MaxAge": 0, + }, + ], + }, "PublicAccessBlockConfiguration": { "BlockPublicAcls": true, "BlockPublicPolicy": true, @@ -925,6 +946,27 @@ exports[`execute OnDeploy before other resources 1`] = ` }, ], }, + "CorsConfiguration": { + "CorsRules": [ + { + "AllowedHeaders": [ + "*", + ], + "AllowedMethods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD", + ], + "AllowedOrigins": [ + "*", + ], + "ExposedHeaders": [], + "MaxAge": 0, + }, + ], + }, "PublicAccessBlockConfiguration": { "BlockPublicAcls": true, "BlockPublicPolicy": true, diff --git a/packages/@winglang/platform-awscdk/test/platform.test.ts b/packages/@winglang/platform-awscdk/test/platform.test.ts index 8c0a1e4943e..b653158f889 100644 --- a/packages/@winglang/platform-awscdk/test/platform.test.ts +++ b/packages/@winglang/platform-awscdk/test/platform.test.ts @@ -42,6 +42,27 @@ test("wing platform", async () => { IgnorePublicAcls: true, RestrictPublicBuckets: true, }, + CorsConfiguration: { + CorsRules: [ + { + AllowedHeaders: [ + "*", + ], + AllowedMethods: [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD", + ], + AllowedOrigins: [ + "*", + ], + ExposedHeaders: [], + MaxAge: 0, + }, + ], + }, }, Type: "AWS::S3::Bucket", UpdateReplacePolicy: "Delete", diff --git a/packages/@winglang/sdk/src/cloud/bucket.md b/packages/@winglang/sdk/src/cloud/bucket.md index 1384616d717..aea715d7193 100644 --- a/packages/@winglang/sdk/src/cloud/bucket.md +++ b/packages/@winglang/sdk/src/cloud/bucket.md @@ -99,6 +99,43 @@ store.onDelete(inflight (key: str) => { }); ``` +### Configuring CORS + +By default, buckets are configured with CORS for any origin. When a bucket is private (the default), CORS options only come into play when the bucket's objects are accessed through a signed URL. + +```js playground example +bring cloud; + +let uploads = new cloud.Bucket( + // these are the default values + public: false, + cors: true, + corsOptions: { + allowedMethods: [http.HttpMethod.GET, http.HttpMethod.POST, http.HttpMethod.PUT, http.HttpMethod.DELETE, http.HttpMethod.HEAD], + allowedOrigins: ["*"], + allowedHeaders: ["*"], + exposeHeaders: [], + maxAge: 0s + }, +); +``` + +The CORS configuration can be disabled by passing `cors: false` to the constructor. CORS rules can also be configured after the bucket is created by calling the `addCorsRule` method: + +```js playground example +bring cloud; +bring http; + +let bucket = new cloud.Bucket( + cors: false, // disable any default CORS rules +); + +bucket.addCorsRule({ + allowedOrigins: ["https://example.com"], + allowedMethods: [http.HttpMethod.GET], +}); +``` + ## Target-specific details ### Simulator (`sim`) diff --git a/packages/@winglang/sdk/src/cloud/bucket.ts b/packages/@winglang/sdk/src/cloud/bucket.ts index 6bc646c77c6..21f071719fb 100644 --- a/packages/@winglang/sdk/src/cloud/bucket.ts +++ b/packages/@winglang/sdk/src/cloud/bucket.ts @@ -6,7 +6,9 @@ import { fqnForType } from "../constants"; import { App } from "../core"; import { AbstractMemberError } from "../core/errors"; import { INFLIGHT_SYMBOL } from "../core/types"; -import { Json, Node, Resource, Datetime, Duration, IInflight } from "../std"; +import { HttpMethod } from "../http"; +import { Json, Node, Resource, Datetime, IInflight } from "../std"; +import { Duration } from "../std/duration"; /** * Global identifier for `Bucket`. @@ -35,6 +37,20 @@ export enum BucketInflightMethods { RENAME = "rename", } +export const DEFAULT_BUCKET_CORS_CONFIGURATION: BucketCorsOptions = { + allowedHeaders: ["*"], + allowedOrigins: ["*"], + allowedMethods: [ + HttpMethod.GET, + HttpMethod.POST, + HttpMethod.PUT, + HttpMethod.DELETE, + HttpMethod.HEAD, + ], + exposeHeaders: [], + maxAge: Duration.fromSeconds(0), +}; + /** * Options for `Bucket`. */ @@ -44,6 +60,76 @@ export interface BucketProps { * @default false */ readonly public?: boolean; + + /** + * Whether to add default cors configuration. + * + * The default cors configuration is equivalent to calling `addCorsRule` + * with the following options: + * { + * allowHeaders: ["*"], + * allowOrigins: ["*"], + * allowMethods: ["DELETE", "GET", "HEAD", "POST", "PUT"], + * exposeHeaders: [], + * maxAge: 0s + * } + * @default true + */ + readonly cors?: boolean; + + /** + * Custom cors configuration for the bucket. + * The default cors configuration is equivalent to calling `addCorsRule` + * with the following options: + * { + * allowHeaders: ["*"], + * allowOrigins: ["*"], + * allowMethods: ["DELETE", "GET", "HEAD", "POST", "PUT"], + * exposeHeaders: [], + * maxAge: 0s + * } + * @default - All origins, methods, headers are allowed. + */ + readonly corsOptions?: BucketCorsOptions; +} + +/** + * Cors Options for `Bucket`. + */ +export interface BucketCorsOptions { + /** + * The allowed origin. + * @example "https://example.com" + * @default - ["*"] + */ + readonly allowedOrigins: string[]; + + /** + * The list of allowed methods. + * @example [HttpMethod.GET, HttpMethod.POST] + * @default - [HttpMethod.GET, HttpMethod.POST, HttpMethod.PUT, HttpMethod.PATCH, HttpMethod.DELETE, HttpMethod.HEAD, HttpMethod.OPTIONS] + */ + readonly allowedMethods: Array; + + /** + * The list of allowed headers. + * @example ["Content-Type"] + * @default - ["Content-Type", "Authorization"] + */ + readonly allowedHeaders?: Array; + + /** + * The list of exposed headers. + * @example ["Content-Type"] + * @default - [] + */ + readonly exposeHeaders?: Array; + + /** + * How long the browser should cache preflight request results. + * @default - 300 seconds + */ + readonly maxAge?: Duration; } /** @@ -100,6 +186,18 @@ export class Bucket extends Resource { throw new AbstractMemberError(); } + /** + * Add cors configuration to the bucket + * + * @param {BucketCorsOptions} value - The cors configuration + * @abstract + */ + + public addCorsRule(value: BucketCorsOptions): void { + value; + throw new AbstractMemberError(); + } + /** * Add a file to the bucket from system folder * diff --git a/packages/@winglang/sdk/src/http/http.ts b/packages/@winglang/sdk/src/http/http.ts index 816bcc39063..de86b2f4764 100644 --- a/packages/@winglang/sdk/src/http/http.ts +++ b/packages/@winglang/sdk/src/http/http.ts @@ -1,6 +1,6 @@ import { URL as NodeUrl, format } from "url"; -import { InflightClient } from "../core"; -import { Duration } from "../std"; +import { InflightClient } from "../core/inflight"; +import { Duration } from "../std/duration"; /** * The cache mode of the request. diff --git a/packages/@winglang/sdk/src/std/duration.ts b/packages/@winglang/sdk/src/std/duration.ts index dbf6e32ece4..61b801d9498 100644 --- a/packages/@winglang/sdk/src/std/duration.ts +++ b/packages/@winglang/sdk/src/std/duration.ts @@ -1,5 +1,5 @@ import { ILiftable } from "./resource"; -import { InflightClient } from "../core"; +import { InflightClient } from "../core/inflight"; import { normalPath } from "../shared/misc"; /** diff --git a/packages/@winglang/sdk/src/target-sim/bucket.ts b/packages/@winglang/sdk/src/target-sim/bucket.ts index 5964f97b839..d782e2f561a 100644 --- a/packages/@winglang/sdk/src/target-sim/bucket.ts +++ b/packages/@winglang/sdk/src/target-sim/bucket.ts @@ -55,6 +55,11 @@ export class Bucket extends cloud.Bucket implements ISimulatorResource { }; } + public addCorsRule(value: cloud.BucketCorsOptions): void { + // currently no-op + value; + } + /** * Iterates over the topics and supply their sim handler * @returns an object of Bucket event types (keys) and their topic handlers (values) diff --git a/packages/@winglang/sdk/src/target-tf-aws/bucket.ts b/packages/@winglang/sdk/src/target-tf-aws/bucket.ts index 23ae4097140..3b7acdac6d4 100644 --- a/packages/@winglang/sdk/src/target-tf-aws/bucket.ts +++ b/packages/@winglang/sdk/src/target-tf-aws/bucket.ts @@ -1,8 +1,10 @@ -import { ITerraformDependable } from "cdktf"; +import { ITerraformDependable, Lazy } from "cdktf"; import { Construct } from "constructs"; import { App } from "./app"; import { Topic as AWSTopic } from "./topic"; import { S3Bucket } from "../.gen/providers/aws/s3-bucket"; +import { S3BucketCorsConfiguration } from "../.gen/providers/aws/s3-bucket-cors-configuration"; + import { S3BucketNotification, S3BucketNotificationTopic, @@ -65,6 +67,8 @@ export class Bucket extends cloud.Bucket implements IAwsBucket { private readonly public: boolean; private readonly notificationTopics: S3BucketNotificationTopic[] = []; private readonly notificationDependencies: ITerraformDependable[] = []; + private readonly corsRules: cloud.BucketCorsOptions[] = []; + private corsConfiguration?: S3BucketCorsConfiguration; constructor(scope: Construct, id: string, props: cloud.BucketProps = {}) { super(scope, id, props); @@ -72,6 +76,38 @@ export class Bucket extends cloud.Bucket implements IAwsBucket { this.public = props.public ?? false; this.bucket = createEncryptedBucket(this, this.public); + + if (props.cors ?? true) { + this.addCorsRule( + props.corsOptions ?? cloud.DEFAULT_BUCKET_CORS_CONFIGURATION + ); + } + } + + public addCorsRule(value: cloud.BucketCorsOptions): void { + this.corsRules.push(value); + + if (!this.corsConfiguration) { + this.corsConfiguration = new S3BucketCorsConfiguration( + this, + `CorsConfiguration-${this.node.addr.slice(-8)}`, + { + bucket: this.bucket.id, + corsRule: Lazy.anyValue({ + produce: () => + this.corsRules.map((rule) => { + return { + allowed_headers: rule.allowedHeaders, + allowed_methods: rule.allowedMethods, + allowed_origins: rule.allowedOrigins, + max_age_seconds: rule.maxAge?.seconds, + expose_headers: rule.exposeHeaders, + }; + }), + }), + } + ); + } } public addObject(key: string, body: string): void { diff --git a/packages/@winglang/sdk/src/target-tf-azure/bucket.ts b/packages/@winglang/sdk/src/target-tf-azure/bucket.ts index e01b70da238..2943dd41f13 100644 --- a/packages/@winglang/sdk/src/target-tf-azure/bucket.ts +++ b/packages/@winglang/sdk/src/target-tf-azure/bucket.ts @@ -96,6 +96,16 @@ export class Bucket extends cloud.Bucket { }); } + public addCorsRule(value: cloud.BucketCorsOptions): void { + value; + throw new NotImplementedError( + "addCorsRule method isn't implemented yet on the current target.", + { + resource: this.constructor.name, + } + ); + } + public addObject(key: string, body: string): void { // Blob naming conventions: // https://learn.microsoft.com/en-us/rest/api/storageservices/naming-and-referencing-containers--blobs--and-metadata#blob-names diff --git a/packages/@winglang/sdk/src/target-tf-gcp/bucket.ts b/packages/@winglang/sdk/src/target-tf-gcp/bucket.ts index 179631d3f01..015db2cff15 100644 --- a/packages/@winglang/sdk/src/target-tf-gcp/bucket.ts +++ b/packages/@winglang/sdk/src/target-tf-gcp/bucket.ts @@ -126,6 +126,16 @@ export class Bucket extends cloud.Bucket { }; } + public addCorsRule(value: cloud.BucketCorsOptions): void { + value; + throw new NotImplementedError( + "addCorsRule method isn't implemented yet on the current target.", + { + resource: this.constructor.name, + } + ); + } + public addObject(key: string, body: string): void { new StorageBucketObject(this, `Object-${key}`, { bucket: this.bucket.id, diff --git a/packages/@winglang/sdk/test/target-tf-aws/__snapshots__/bucket.test.ts.snap b/packages/@winglang/sdk/test/target-tf-aws/__snapshots__/bucket.test.ts.snap index 9c8e388b04b..48ebf869bb9 100644 --- a/packages/@winglang/sdk/test/target-tf-aws/__snapshots__/bucket.test.ts.snap +++ b/packages/@winglang/sdk/test/target-tf-aws/__snapshots__/bucket.test.ts.snap @@ -1,6 +1,420 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html exports[`bucket is public 1`] = ` +{ + "resource": { + "aws_s3_bucket": { + "my_bucket": { + "bucket_prefix": "my-bucket-c8045fcc-", + "force_destroy": false, + }, + }, + "aws_s3_bucket_cors_configuration": { + "my_bucket_CorsConfiguration-c53a401a_67598037": { + "bucket": "\${aws_s3_bucket.my_bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*", + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD", + ], + "allowed_origins": [ + "*", + ], + "expose_headers": [], + "max_age_seconds": 0, + }, + ], + }, + }, + "aws_s3_bucket_policy": { + "my_bucket_PublicPolicy_AF351571": { + "bucket": "\${aws_s3_bucket.my_bucket.bucket}", + "depends_on": [ + "aws_s3_bucket_public_access_block.my_bucket_PublicAccessBlock_538547C0", + ], + "policy": "{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":"*","Action":["s3:GetObject"],"Resource":["\${aws_s3_bucket.my_bucket.arn}/*"]}]}", + }, + }, + "aws_s3_bucket_public_access_block": { + "my_bucket_PublicAccessBlock_538547C0": { + "block_public_acls": false, + "block_public_policy": false, + "bucket": "\${aws_s3_bucket.my_bucket.bucket}", + "ignore_public_acls": false, + "restrict_public_buckets": false, + }, + }, + }, +} +`; + +exports[`bucket is public 2`] = ` +{ + "tree": { + "children": { + "root": { + "children": { + "Default": { + "children": { + "aws": { + "constructInfo": { + "fqn": "cdktf.TerraformProvider", + "version": "0.20.7", + }, + "display": {}, + "id": "aws", + "path": "root/Default/aws", + }, + "my_bucket": { + "children": { + "CorsConfiguration-c53a401a": { + "constructInfo": { + "fqn": "cdktf.TerraformResource", + "version": "0.20.7", + }, + "display": {}, + "id": "CorsConfiguration-c53a401a", + "path": "root/Default/my_bucket/CorsConfiguration-c53a401a", + }, + "Default": { + "constructInfo": { + "fqn": "cdktf.TerraformResource", + "version": "0.20.7", + }, + "display": {}, + "id": "Default", + "path": "root/Default/my_bucket/Default", + }, + "PublicAccessBlock": { + "constructInfo": { + "fqn": "cdktf.TerraformResource", + "version": "0.20.7", + }, + "display": {}, + "id": "PublicAccessBlock", + "path": "root/Default/my_bucket/PublicAccessBlock", + }, + "PublicPolicy": { + "constructInfo": { + "fqn": "cdktf.TerraformResource", + "version": "0.20.7", + }, + "display": {}, + "id": "PublicPolicy", + "path": "root/Default/my_bucket/PublicPolicy", + }, + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.3.0", + }, + "display": { + "description": "A cloud object store", + "title": "Bucket", + }, + "id": "my_bucket", + "path": "root/Default/my_bucket", + }, + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.3.0", + }, + "display": {}, + "id": "Default", + "path": "root/Default", + }, + "backend": { + "constructInfo": { + "fqn": "cdktf.LocalBackend", + "version": "0.20.7", + }, + "display": {}, + "id": "backend", + "path": "root/backend", + }, + }, + "constructInfo": { + "fqn": "cdktf.TerraformStack", + "version": "0.20.7", + }, + "display": {}, + "id": "root", + "path": "root", + }, + }, + "constructInfo": { + "fqn": "cdktf.App", + "version": "0.20.7", + }, + "display": {}, + "id": "App", + "path": "", + }, + "version": "tree-0.1", +} +`; + +exports[`bucket prefix must be lowercase 1`] = ` +{ + "resource": { + "aws_s3_bucket": { + "The-UncannyBucket": { + "bucket_prefix": "the-uncanny-bucket-c88a0953-", + "force_destroy": false, + }, + }, + "aws_s3_bucket_cors_configuration": { + "The-UncannyBucket_CorsConfiguration-2ae75afe_2E99AE47": { + "bucket": "\${aws_s3_bucket.The-UncannyBucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*", + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD", + ], + "allowed_origins": [ + "*", + ], + "expose_headers": [], + "max_age_seconds": 0, + }, + ], + }, + }, + }, +} +`; + +exports[`bucket prefix must be lowercase 2`] = ` +{ + "tree": { + "children": { + "root": { + "children": { + "Default": { + "children": { + "The-Uncanny.Bucket": { + "children": { + "CorsConfiguration-2ae75afe": { + "constructInfo": { + "fqn": "cdktf.TerraformResource", + "version": "0.20.7", + }, + "display": {}, + "id": "CorsConfiguration-2ae75afe", + "path": "root/Default/The-Uncanny.Bucket/CorsConfiguration-2ae75afe", + }, + "Default": { + "constructInfo": { + "fqn": "cdktf.TerraformResource", + "version": "0.20.7", + }, + "display": {}, + "id": "Default", + "path": "root/Default/The-Uncanny.Bucket/Default", + }, + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.3.0", + }, + "display": { + "description": "A cloud object store", + "title": "Bucket", + }, + "id": "The-Uncanny.Bucket", + "path": "root/Default/The-Uncanny.Bucket", + }, + "aws": { + "constructInfo": { + "fqn": "cdktf.TerraformProvider", + "version": "0.20.7", + }, + "display": {}, + "id": "aws", + "path": "root/Default/aws", + }, + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.3.0", + }, + "display": {}, + "id": "Default", + "path": "root/Default", + }, + "backend": { + "constructInfo": { + "fqn": "cdktf.LocalBackend", + "version": "0.20.7", + }, + "display": {}, + "id": "backend", + "path": "root/backend", + }, + }, + "constructInfo": { + "fqn": "cdktf.TerraformStack", + "version": "0.20.7", + }, + "display": {}, + "id": "root", + "path": "root", + }, + }, + "constructInfo": { + "fqn": "cdktf.App", + "version": "0.20.7", + }, + "display": {}, + "id": "App", + "path": "", + }, + "version": "tree-0.1", +} +`; + +exports[`bucket prefix valid 1`] = ` +{ + "resource": { + "aws_s3_bucket": { + "the-uncannybucket": { + "bucket_prefix": "the-uncanny-bucket-c8e2755c-", + "force_destroy": false, + }, + }, + "aws_s3_bucket_cors_configuration": { + "the-uncannybucket_CorsConfiguration-8129595d_396ADC5D": { + "bucket": "\${aws_s3_bucket.the-uncannybucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*", + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD", + ], + "allowed_origins": [ + "*", + ], + "expose_headers": [], + "max_age_seconds": 0, + }, + ], + }, + }, + }, +} +`; + +exports[`bucket prefix valid 2`] = ` +{ + "tree": { + "children": { + "root": { + "children": { + "Default": { + "children": { + "aws": { + "constructInfo": { + "fqn": "cdktf.TerraformProvider", + "version": "0.20.7", + }, + "display": {}, + "id": "aws", + "path": "root/Default/aws", + }, + "the-uncanny.bucket": { + "children": { + "CorsConfiguration-8129595d": { + "constructInfo": { + "fqn": "cdktf.TerraformResource", + "version": "0.20.7", + }, + "display": {}, + "id": "CorsConfiguration-8129595d", + "path": "root/Default/the-uncanny.bucket/CorsConfiguration-8129595d", + }, + "Default": { + "constructInfo": { + "fqn": "cdktf.TerraformResource", + "version": "0.20.7", + }, + "display": {}, + "id": "Default", + "path": "root/Default/the-uncanny.bucket/Default", + }, + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.3.0", + }, + "display": { + "description": "A cloud object store", + "title": "Bucket", + }, + "id": "the-uncanny.bucket", + "path": "root/Default/the-uncanny.bucket", + }, + }, + "constructInfo": { + "fqn": "constructs.Construct", + "version": "10.3.0", + }, + "display": {}, + "id": "Default", + "path": "root/Default", + }, + "backend": { + "constructInfo": { + "fqn": "cdktf.LocalBackend", + "version": "0.20.7", + }, + "display": {}, + "id": "backend", + "path": "root/backend", + }, + }, + "constructInfo": { + "fqn": "cdktf.TerraformStack", + "version": "0.20.7", + }, + "display": {}, + "id": "root", + "path": "root", + }, + }, + "constructInfo": { + "fqn": "cdktf.App", + "version": "0.20.7", + }, + "display": {}, + "id": "App", + "path": "", + }, + "version": "tree-0.1", +} +`; + +exports[`bucket with cors disabled 1`] = ` { "resource": { "aws_s3_bucket": { @@ -31,7 +445,7 @@ exports[`bucket is public 1`] = ` } `; -exports[`bucket is public 2`] = ` +exports[`bucket with cors disabled 2`] = ` { "tree": { "children": { @@ -129,20 +543,57 @@ exports[`bucket is public 2`] = ` } `; -exports[`bucket prefix must be lowercase 1`] = ` +exports[`bucket with custom cors in constructor 1`] = ` { "resource": { "aws_s3_bucket": { - "The-UncannyBucket": { - "bucket_prefix": "the-uncanny-bucket-c88a0953-", + "my_bucket": { + "bucket_prefix": "my-bucket-c8045fcc-", "force_destroy": false, }, }, + "aws_s3_bucket_cors_configuration": { + "my_bucket_CorsConfiguration-c53a401a_67598037": { + "bucket": "\${aws_s3_bucket.my_bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*", + ], + "allowed_methods": [ + "GET", + ], + "allowed_origins": [ + "https://example.com", + ], + "max_age_seconds": 3600, + }, + ], + }, + }, + "aws_s3_bucket_policy": { + "my_bucket_PublicPolicy_AF351571": { + "bucket": "\${aws_s3_bucket.my_bucket.bucket}", + "depends_on": [ + "aws_s3_bucket_public_access_block.my_bucket_PublicAccessBlock_538547C0", + ], + "policy": "{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":"*","Action":["s3:GetObject"],"Resource":["\${aws_s3_bucket.my_bucket.arn}/*"]}]}", + }, + }, + "aws_s3_bucket_public_access_block": { + "my_bucket_PublicAccessBlock_538547C0": { + "block_public_acls": false, + "block_public_policy": false, + "bucket": "\${aws_s3_bucket.my_bucket.bucket}", + "ignore_public_acls": false, + "restrict_public_buckets": false, + }, + }, }, } `; -exports[`bucket prefix must be lowercase 2`] = ` +exports[`bucket with custom cors in constructor 2`] = ` { "tree": { "children": { @@ -150,8 +601,26 @@ exports[`bucket prefix must be lowercase 2`] = ` "children": { "Default": { "children": { - "The-Uncanny.Bucket": { + "aws": { + "constructInfo": { + "fqn": "cdktf.TerraformProvider", + "version": "0.20.7", + }, + "display": {}, + "id": "aws", + "path": "root/Default/aws", + }, + "my_bucket": { "children": { + "CorsConfiguration-c53a401a": { + "constructInfo": { + "fqn": "cdktf.TerraformResource", + "version": "0.20.7", + }, + "display": {}, + "id": "CorsConfiguration-c53a401a", + "path": "root/Default/my_bucket/CorsConfiguration-c53a401a", + }, "Default": { "constructInfo": { "fqn": "cdktf.TerraformResource", @@ -159,7 +628,25 @@ exports[`bucket prefix must be lowercase 2`] = ` }, "display": {}, "id": "Default", - "path": "root/Default/The-Uncanny.Bucket/Default", + "path": "root/Default/my_bucket/Default", + }, + "PublicAccessBlock": { + "constructInfo": { + "fqn": "cdktf.TerraformResource", + "version": "0.20.7", + }, + "display": {}, + "id": "PublicAccessBlock", + "path": "root/Default/my_bucket/PublicAccessBlock", + }, + "PublicPolicy": { + "constructInfo": { + "fqn": "cdktf.TerraformResource", + "version": "0.20.7", + }, + "display": {}, + "id": "PublicPolicy", + "path": "root/Default/my_bucket/PublicPolicy", }, }, "constructInfo": { @@ -170,17 +657,8 @@ exports[`bucket prefix must be lowercase 2`] = ` "description": "A cloud object store", "title": "Bucket", }, - "id": "The-Uncanny.Bucket", - "path": "root/Default/The-Uncanny.Bucket", - }, - "aws": { - "constructInfo": { - "fqn": "cdktf.TerraformProvider", - "version": "0.20.7", - }, - "display": {}, - "id": "aws", - "path": "root/Default/aws", + "id": "my_bucket", + "path": "root/Default/my_bucket", }, }, "constructInfo": { @@ -222,20 +700,57 @@ exports[`bucket prefix must be lowercase 2`] = ` } `; -exports[`bucket prefix valid 1`] = ` +exports[`bucket with custom cors via addCorsRule 1`] = ` { "resource": { "aws_s3_bucket": { - "the-uncannybucket": { - "bucket_prefix": "the-uncanny-bucket-c8e2755c-", + "my_bucket": { + "bucket_prefix": "my-bucket-c8045fcc-", "force_destroy": false, }, }, + "aws_s3_bucket_cors_configuration": { + "my_bucket_CorsConfiguration-c53a401a_67598037": { + "bucket": "\${aws_s3_bucket.my_bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*", + ], + "allowed_methods": [ + "GET", + ], + "allowed_origins": [ + "https://example.com", + ], + "max_age_seconds": 3600, + }, + ], + }, + }, + "aws_s3_bucket_policy": { + "my_bucket_PublicPolicy_AF351571": { + "bucket": "\${aws_s3_bucket.my_bucket.bucket}", + "depends_on": [ + "aws_s3_bucket_public_access_block.my_bucket_PublicAccessBlock_538547C0", + ], + "policy": "{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Principal":"*","Action":["s3:GetObject"],"Resource":["\${aws_s3_bucket.my_bucket.arn}/*"]}]}", + }, + }, + "aws_s3_bucket_public_access_block": { + "my_bucket_PublicAccessBlock_538547C0": { + "block_public_acls": false, + "block_public_policy": false, + "bucket": "\${aws_s3_bucket.my_bucket.bucket}", + "ignore_public_acls": false, + "restrict_public_buckets": false, + }, + }, }, } `; -exports[`bucket prefix valid 2`] = ` +exports[`bucket with custom cors via addCorsRule 2`] = ` { "tree": { "children": { @@ -252,8 +767,17 @@ exports[`bucket prefix valid 2`] = ` "id": "aws", "path": "root/Default/aws", }, - "the-uncanny.bucket": { + "my_bucket": { "children": { + "CorsConfiguration-c53a401a": { + "constructInfo": { + "fqn": "cdktf.TerraformResource", + "version": "0.20.7", + }, + "display": {}, + "id": "CorsConfiguration-c53a401a", + "path": "root/Default/my_bucket/CorsConfiguration-c53a401a", + }, "Default": { "constructInfo": { "fqn": "cdktf.TerraformResource", @@ -261,7 +785,25 @@ exports[`bucket prefix valid 2`] = ` }, "display": {}, "id": "Default", - "path": "root/Default/the-uncanny.bucket/Default", + "path": "root/Default/my_bucket/Default", + }, + "PublicAccessBlock": { + "constructInfo": { + "fqn": "cdktf.TerraformResource", + "version": "0.20.7", + }, + "display": {}, + "id": "PublicAccessBlock", + "path": "root/Default/my_bucket/PublicAccessBlock", + }, + "PublicPolicy": { + "constructInfo": { + "fqn": "cdktf.TerraformResource", + "version": "0.20.7", + }, + "display": {}, + "id": "PublicPolicy", + "path": "root/Default/my_bucket/PublicPolicy", }, }, "constructInfo": { @@ -272,8 +814,8 @@ exports[`bucket prefix valid 2`] = ` "description": "A cloud object store", "title": "Bucket", }, - "id": "the-uncanny.bucket", - "path": "root/Default/the-uncanny.bucket", + "id": "my_bucket", + "path": "root/Default/my_bucket", }, }, "constructInfo": { @@ -387,6 +929,30 @@ exports[`bucket with onCreate method 1`] = ` "force_destroy": false, }, }, + "aws_s3_bucket_cors_configuration": { + "my_bucket_CorsConfiguration-c53a401a_67598037": { + "bucket": "\${aws_s3_bucket.my_bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*", + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD", + ], + "allowed_origins": [ + "*", + ], + "expose_headers": [], + "max_age_seconds": 0, + }, + ], + }, + }, "aws_s3_bucket_notification": { "my_bucket_S3BucketNotification_DDA29E8F": { "bucket": "\${aws_s3_bucket.my_bucket.id}", @@ -490,6 +1056,15 @@ exports[`bucket with onCreate method 2`] = ` }, "my_bucket": { "children": { + "CorsConfiguration-c53a401a": { + "constructInfo": { + "fqn": "cdktf.TerraformResource", + "version": "0.20.7", + }, + "display": {}, + "id": "CorsConfiguration-c53a401a", + "path": "root/Default/my_bucket/CorsConfiguration-c53a401a", + }, "Default": { "constructInfo": { "fqn": "cdktf.TerraformResource", @@ -777,6 +1352,30 @@ exports[`bucket with onDelete method 1`] = ` "force_destroy": false, }, }, + "aws_s3_bucket_cors_configuration": { + "my_bucket_CorsConfiguration-c53a401a_67598037": { + "bucket": "\${aws_s3_bucket.my_bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*", + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD", + ], + "allowed_origins": [ + "*", + ], + "expose_headers": [], + "max_age_seconds": 0, + }, + ], + }, + }, "aws_s3_bucket_notification": { "my_bucket_S3BucketNotification_DDA29E8F": { "bucket": "\${aws_s3_bucket.my_bucket.id}", @@ -880,6 +1479,15 @@ exports[`bucket with onDelete method 2`] = ` }, "my_bucket": { "children": { + "CorsConfiguration-c53a401a": { + "constructInfo": { + "fqn": "cdktf.TerraformResource", + "version": "0.20.7", + }, + "display": {}, + "id": "CorsConfiguration-c53a401a", + "path": "root/Default/my_bucket/CorsConfiguration-c53a401a", + }, "Default": { "constructInfo": { "fqn": "cdktf.TerraformResource", @@ -1263,6 +1871,30 @@ exports[`bucket with onEvent method 1`] = ` "force_destroy": false, }, }, + "aws_s3_bucket_cors_configuration": { + "my_bucket_CorsConfiguration-c53a401a_67598037": { + "bucket": "\${aws_s3_bucket.my_bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*", + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD", + ], + "allowed_origins": [ + "*", + ], + "expose_headers": [], + "max_age_seconds": 0, + }, + ], + }, + }, "aws_s3_bucket_notification": { "my_bucket_S3BucketNotification_DDA29E8F": { "bucket": "\${aws_s3_bucket.my_bucket.id}", @@ -1416,6 +2048,15 @@ exports[`bucket with onEvent method 2`] = ` }, "my_bucket": { "children": { + "CorsConfiguration-c53a401a": { + "constructInfo": { + "fqn": "cdktf.TerraformResource", + "version": "0.20.7", + }, + "display": {}, + "id": "CorsConfiguration-c53a401a", + "path": "root/Default/my_bucket/CorsConfiguration-c53a401a", + }, "Default": { "constructInfo": { "fqn": "cdktf.TerraformResource", @@ -1957,6 +2598,30 @@ exports[`bucket with onUpdate method 1`] = ` "force_destroy": false, }, }, + "aws_s3_bucket_cors_configuration": { + "my_bucket_CorsConfiguration-c53a401a_67598037": { + "bucket": "\${aws_s3_bucket.my_bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*", + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD", + ], + "allowed_origins": [ + "*", + ], + "expose_headers": [], + "max_age_seconds": 0, + }, + ], + }, + }, "aws_s3_bucket_notification": { "my_bucket_S3BucketNotification_DDA29E8F": { "bucket": "\${aws_s3_bucket.my_bucket.id}", @@ -2060,6 +2725,15 @@ exports[`bucket with onUpdate method 2`] = ` }, "my_bucket": { "children": { + "CorsConfiguration-c53a401a": { + "constructInfo": { + "fqn": "cdktf.TerraformResource", + "version": "0.20.7", + }, + "display": {}, + "id": "CorsConfiguration-c53a401a", + "path": "root/Default/my_bucket/CorsConfiguration-c53a401a", + }, "Default": { "constructInfo": { "fqn": "cdktf.TerraformResource", @@ -2284,6 +2958,30 @@ exports[`bucket with two preflight files 1`] = ` "force_destroy": false, }, }, + "aws_s3_bucket_cors_configuration": { + "my_bucket_CorsConfiguration-c53a401a_67598037": { + "bucket": "\${aws_s3_bucket.my_bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*", + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD", + ], + "allowed_origins": [ + "*", + ], + "expose_headers": [], + "max_age_seconds": 0, + }, + ], + }, + }, "aws_s3_bucket_policy": { "my_bucket_PublicPolicy_AF351571": { "bucket": "\${aws_s3_bucket.my_bucket.bucket}", @@ -2337,6 +3035,15 @@ exports[`bucket with two preflight files 2`] = ` }, "my_bucket": { "children": { + "CorsConfiguration-c53a401a": { + "constructInfo": { + "fqn": "cdktf.TerraformResource", + "version": "0.20.7", + }, + "display": {}, + "id": "CorsConfiguration-c53a401a", + "path": "root/Default/my_bucket/CorsConfiguration-c53a401a", + }, "Default": { "constructInfo": { "fqn": "cdktf.TerraformResource", @@ -2443,6 +3150,30 @@ exports[`bucket with two preflight objects 1`] = ` "force_destroy": false, }, }, + "aws_s3_bucket_cors_configuration": { + "my_bucket_CorsConfiguration-c53a401a_67598037": { + "bucket": "\${aws_s3_bucket.my_bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*", + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD", + ], + "allowed_origins": [ + "*", + ], + "expose_headers": [], + "max_age_seconds": 0, + }, + ], + }, + }, "aws_s3_bucket_policy": { "my_bucket_PublicPolicy_AF351571": { "bucket": "\${aws_s3_bucket.my_bucket.bucket}", @@ -2496,6 +3227,15 @@ exports[`bucket with two preflight objects 2`] = ` }, "my_bucket": { "children": { + "CorsConfiguration-c53a401a": { + "constructInfo": { + "fqn": "cdktf.TerraformResource", + "version": "0.20.7", + }, + "display": {}, + "id": "CorsConfiguration-c53a401a", + "path": "root/Default/my_bucket/CorsConfiguration-c53a401a", + }, "Default": { "constructInfo": { "fqn": "cdktf.TerraformResource", @@ -2602,6 +3342,30 @@ exports[`create a bucket 1`] = ` "force_destroy": false, }, }, + "aws_s3_bucket_cors_configuration": { + "my_bucket_CorsConfiguration-c53a401a_67598037": { + "bucket": "\${aws_s3_bucket.my_bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*", + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD", + ], + "allowed_origins": [ + "*", + ], + "expose_headers": [], + "max_age_seconds": 0, + }, + ], + }, + }, }, } `; @@ -2625,6 +3389,15 @@ exports[`create a bucket 2`] = ` }, "my_bucket": { "children": { + "CorsConfiguration-c53a401a": { + "constructInfo": { + "fqn": "cdktf.TerraformResource", + "version": "0.20.7", + }, + "display": {}, + "id": "CorsConfiguration-c53a401a", + "path": "root/Default/my_bucket/CorsConfiguration-c53a401a", + }, "Default": { "constructInfo": { "fqn": "cdktf.TerraformResource", diff --git a/packages/@winglang/sdk/test/target-tf-aws/__snapshots__/captures.test.ts.snap b/packages/@winglang/sdk/test/target-tf-aws/__snapshots__/captures.test.ts.snap index 53c77ada2c7..54b5882abbe 100644 --- a/packages/@winglang/sdk/test/target-tf-aws/__snapshots__/captures.test.ts.snap +++ b/packages/@winglang/sdk/test/target-tf-aws/__snapshots__/captures.test.ts.snap @@ -403,6 +403,30 @@ exports[`function with bucket binding > put operation 1`] = ` "bucket_prefix": "code-c84a50b1-", }, }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "bucket": "\${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*", + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD", + ], + "allowed_origins": [ + "*", + ], + "expose_headers": [], + "max_age_seconds": 0, + }, + ], + }, + }, "aws_s3_object": { "Function_S3Object_C62A0C2D": { "bucket": "\${aws_s3_bucket.Code.bucket}", diff --git a/packages/@winglang/sdk/test/target-tf-aws/__snapshots__/on-deploy.test.ts.snap b/packages/@winglang/sdk/test/target-tf-aws/__snapshots__/on-deploy.test.ts.snap index 471a83c0958..f84c1f0de63 100644 --- a/packages/@winglang/sdk/test/target-tf-aws/__snapshots__/on-deploy.test.ts.snap +++ b/packages/@winglang/sdk/test/target-tf-aws/__snapshots__/on-deploy.test.ts.snap @@ -264,6 +264,7 @@ exports[`execute OnDeploy after other resources 1`] = ` "my_on_deploy_Invocation_1A26E3B9": { "depends_on": [ "aws_s3_bucket.my_bucket", + "aws_s3_bucket_cors_configuration.my_bucket_CorsConfiguration-c53a401a_67598037", ], "function_name": "\${aws_lambda_function.my_on_deploy_Function_59669FC0.function_name}", "input": "{}", @@ -332,6 +333,30 @@ exports[`execute OnDeploy after other resources 1`] = ` "force_destroy": false, }, }, + "aws_s3_bucket_cors_configuration": { + "my_bucket_CorsConfiguration-c53a401a_67598037": { + "bucket": "\${aws_s3_bucket.my_bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*", + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD", + ], + "allowed_origins": [ + "*", + ], + "expose_headers": [], + "max_age_seconds": 0, + }, + ], + }, + }, "aws_s3_object": { "my_on_deploy_Function_S3Object_69D52AC4": { "bucket": "\${aws_s3_bucket.Code.bucket}", @@ -382,6 +407,15 @@ exports[`execute OnDeploy after other resources 2`] = ` }, "my_bucket": { "children": { + "CorsConfiguration-c53a401a": { + "constructInfo": { + "fqn": "cdktf.TerraformResource", + "version": "0.20.7", + }, + "display": {}, + "id": "CorsConfiguration-c53a401a", + "path": "root/Default/my_bucket/CorsConfiguration-c53a401a", + }, "Default": { "constructInfo": { "fqn": "cdktf.TerraformResource", @@ -619,6 +653,33 @@ exports[`execute OnDeploy before other resources 1`] = ` "force_destroy": false, }, }, + "aws_s3_bucket_cors_configuration": { + "my_bucket_CorsConfiguration-c53a401a_67598037": { + "bucket": "\${aws_s3_bucket.my_bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*", + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD", + ], + "allowed_origins": [ + "*", + ], + "expose_headers": [], + "max_age_seconds": 0, + }, + ], + "depends_on": [ + "\${data.aws_lambda_invocation.my_on_deploy_Invocation_1A26E3B9}", + ], + }, + }, "aws_s3_object": { "my_on_deploy_Function_S3Object_69D52AC4": { "bucket": "\${aws_s3_bucket.Code.bucket}", @@ -669,6 +730,15 @@ exports[`execute OnDeploy before other resources 2`] = ` }, "my_bucket": { "children": { + "CorsConfiguration-c53a401a": { + "constructInfo": { + "fqn": "cdktf.TerraformResource", + "version": "0.20.7", + }, + "display": {}, + "id": "CorsConfiguration-c53a401a", + "path": "root/Default/my_bucket/CorsConfiguration-c53a401a", + }, "Default": { "constructInfo": { "fqn": "cdktf.TerraformResource", diff --git a/packages/@winglang/sdk/test/target-tf-aws/bucket.test.ts b/packages/@winglang/sdk/test/target-tf-aws/bucket.test.ts index 231f1a954cb..e175f01ef04 100644 --- a/packages/@winglang/sdk/test/target-tf-aws/bucket.test.ts +++ b/packages/@winglang/sdk/test/target-tf-aws/bucket.test.ts @@ -1,8 +1,9 @@ import * as cdktf from "cdktf"; import { test, expect } from "vitest"; import { AwsApp } from "./aws-util"; -import { Bucket } from "../../src/cloud"; +import { Bucket, HttpMethod } from "../../src/cloud"; import { inflight } from "../../src/core"; +import { Duration } from "../../src/std"; import { tfResourcesOf, tfResourcesOfCount, @@ -20,6 +21,7 @@ test("create a bucket", () => { // THEN expect(tfResourcesOf(output)).toEqual([ "aws_s3_bucket", // main bucket + "aws_s3_bucket_cors_configuration", // cors configuration ]); expect(tfSanitize(output)).toMatchSnapshot(); expect(treeJsonOf(app.outdir)).toMatchSnapshot(); @@ -46,6 +48,70 @@ test("bucket is public", () => { // THEN expect(tfResourcesOf(output)).toEqual([ "aws_s3_bucket", // main bucket + "aws_s3_bucket_cors_configuration", // cors configuration + "aws_s3_bucket_policy", // resource policy to grant read access to anyone + "aws_s3_bucket_public_access_block", // allow public access to an s3 bucket + ]); + expect(tfSanitize(output)).toMatchSnapshot(); + expect(treeJsonOf(app.outdir)).toMatchSnapshot(); +}); + +test("bucket with cors disabled", () => { + // GIVEN + const app = new AwsApp(); + new Bucket(app, "my_bucket", { public: true, cors: false }); + const output = app.synth(); + + // THEN + expect(tfResourcesOf(output)).not.toContain( + "aws_s3_bucket_cors_configuration" + ); + expect(tfSanitize(output)).toMatchSnapshot(); + expect(treeJsonOf(app.outdir)).toMatchSnapshot(); +}); + +test("bucket with custom cors in constructor", () => { + // GIVEN + const app = new AwsApp(); + new Bucket(app, "my_bucket", { + public: true, + cors: true, + corsOptions: { + allowedHeaders: ["*"], + allowedMethods: [HttpMethod.GET], + allowedOrigins: ["https://example.com"], + maxAge: Duration.fromSeconds(3600), + }, + }); + const output = app.synth(); + + // THEN + expect(tfResourcesOf(output)).toEqual([ + "aws_s3_bucket", // main bucket + "aws_s3_bucket_cors_configuration", // cors configuration + "aws_s3_bucket_policy", // resource policy to grant read access to anyone + "aws_s3_bucket_public_access_block", // allow public access to an s3 bucket + ]); + expect(tfSanitize(output)).toMatchSnapshot(); + expect(treeJsonOf(app.outdir)).toMatchSnapshot(); +}); + +test("bucket with custom cors via addCorsRule", () => { + // GIVEN + const app = new AwsApp(); + const bucket = new Bucket(app, "my_bucket", { public: true, cors: false }); + bucket.addCorsRule({ + allowedHeaders: ["*"], + allowedMethods: [HttpMethod.GET], + allowedOrigins: ["https://example.com"], + maxAge: Duration.fromSeconds(3600), + }); + const output = app.synth(); + + // THEN + expect(tfResourcesOf(output)).toEqual([ + "aws_s3_bucket", // main bucket + "aws_s3_bucket_cors_configuration", // cors configuration "aws_s3_bucket_policy", // resource policy to grant read access to anyone "aws_s3_bucket_public_access_block", // allow public access to an s3 bucket ]); @@ -64,6 +130,7 @@ test("bucket with two preflight objects", () => { // THEN expect(tfResourcesOf(output)).toEqual([ "aws_s3_bucket", // main bucket + "aws_s3_bucket_cors_configuration", // cors configuration "aws_s3_bucket_policy", // resource policy to grant read access to anyone "aws_s3_bucket_public_access_block", // allow public access to an s3 bucket "aws_s3_object", // file1.txt @@ -84,6 +151,7 @@ test("bucket with two preflight files", () => { // THEN expect(tfResourcesOf(output)).toEqual([ "aws_s3_bucket", // main bucket + "aws_s3_bucket_cors_configuration", // cors configuration "aws_s3_bucket_policy", // resource policy to grant read access to anyone "aws_s3_bucket_public_access_block", // allow public access to an s3 bucket "aws_s3_object", // file1.txt @@ -161,6 +229,7 @@ test("bucket with onCreate method", () => { "aws_lambda_function", // inflight subscriber "aws_lambda_permission", // permission of the topic to invoke lambda "aws_s3_bucket", // main bucket + "aws_s3_bucket_cors_configuration", // cors configuration "aws_s3_bucket_notification", "aws_s3_bucket_policy", // resource policy to grant read access to anyone "aws_s3_bucket_public_access_block", // allow public access to an s3 bucket @@ -199,6 +268,7 @@ test("bucket with onDelete method", () => { "aws_lambda_function", // inflight subscriber "aws_lambda_permission", // permission of the topic to invoke lambda "aws_s3_bucket", // main bucket + "aws_s3_bucket_cors_configuration", // cors configuration "aws_s3_bucket_notification", "aws_s3_bucket_policy", // resource policy to grant read access to anyone "aws_s3_bucket_public_access_block", // allow public access to an s3 bucket @@ -237,6 +307,7 @@ test("bucket with onUpdate method", () => { "aws_lambda_function", // inflight subscriber "aws_lambda_permission", // permission of the topic to invoke lambda "aws_s3_bucket", // main bucket + "aws_s3_bucket_cors_configuration", // cors configuration "aws_s3_bucket_notification", "aws_s3_bucket_policy", // resource policy to grant read access to anyone "aws_s3_bucket_public_access_block", // allow public access to an s3 bucket @@ -275,6 +346,7 @@ test("bucket with onEvent method", () => { "aws_lambda_function", // inflight subscriber "aws_lambda_permission", // permission of the topic to invoke lambda "aws_s3_bucket", // main bucket + "aws_s3_bucket_cors_configuration", // cors configuration "aws_s3_bucket_notification", "aws_s3_bucket_policy", // resource policy to grant read access to anyone "aws_s3_bucket_public_access_block", // allow public access to an s3 bucket diff --git a/packages/@winglang/sdk/test/target-tf-aws/captures.test.ts b/packages/@winglang/sdk/test/target-tf-aws/captures.test.ts index bffc0eb788d..e0616e192d9 100644 --- a/packages/@winglang/sdk/test/target-tf-aws/captures.test.ts +++ b/packages/@winglang/sdk/test/target-tf-aws/captures.test.ts @@ -52,6 +52,7 @@ describe("function with bucket binding", () => { "aws_iam_role_policy_attachment", "aws_lambda_function", "aws_s3_bucket", + "aws_s3_bucket_cors_configuration", "aws_s3_object", ]); expect(tfSanitize(output)).toMatchSnapshot(); diff --git a/packages/@winglang/wingc/src/lsp/snapshots/completions/incomplete_inflight_namespace.snap b/packages/@winglang/wingc/src/lsp/snapshots/completions/incomplete_inflight_namespace.snap index a8b7305f4ea..a4db5a431fe 100644 --- a/packages/@winglang/wingc/src/lsp/snapshots/completions/incomplete_inflight_namespace.snap +++ b/packages/@winglang/wingc/src/lsp/snapshots/completions/incomplete_inflight_namespace.snap @@ -1,5 +1,5 @@ --- -source: libs/wingc/src/lsp/completions.rs +source: packages/@winglang/wingc/src/lsp/completions.rs --- - label: Api kind: 7 @@ -11,7 +11,7 @@ source: libs/wingc/src/lsp/completions.rs kind: 7 documentation: kind: markdown - value: "```wing\nclass Bucket {\n addFile(...): void;\n addObject(...): void;\n onCreate(...): void;\n onDelete(...): void;\n onEvent(...): void;\n onUpdate(...): void;\n /* ... */\n}\n```\n---\nA cloud object store." + value: "```wing\nclass Bucket {\n addCorsRule(...): void;\n addFile(...): void;\n addObject(...): void;\n onCreate(...): void;\n onDelete(...): void;\n onEvent(...): void;\n /* ... */\n}\n```\n---\nA cloud object store." sortText: gg|Bucket - label: Counter kind: 7 @@ -163,6 +163,12 @@ source: libs/wingc/src/lsp/completions.rs kind: markdown value: "```wing\nstruct ApiResponse {\n body?: str;\n headers?: Map;\n status?: num;\n}\n```\n---\nShape of a response from a inflight handler." sortText: hh|ApiResponse +- label: BucketCorsOptions + kind: 22 + documentation: + kind: markdown + value: "```wing\nstruct BucketCorsOptions {\n allowedHeaders?: Array;\n exposeHeaders?: Array;\n maxAge?: duration;\n allowedMethods: Array;\n allowedOrigins: Array;\n}\n```\n---\nCors Options for `Bucket`." + sortText: hh|BucketCorsOptions - label: BucketDeleteOptions kind: 22 documentation: @@ -209,7 +215,7 @@ source: libs/wingc/src/lsp/completions.rs kind: 22 documentation: kind: markdown - value: "```wing\nstruct BucketProps {\n public?: bool;\n}\n```\n---\nOptions for `Bucket`." + value: "```wing\nstruct BucketProps {\n cors?: bool;\n corsOptions?: BucketCorsOptions;\n public?: bool;\n}\n```\n---\nOptions for `Bucket`." sortText: hh|BucketProps - label: BucketPutOptions kind: 22 diff --git a/packages/@winglang/wingc/src/lsp/snapshots/completions/namespace_middle_dot.snap b/packages/@winglang/wingc/src/lsp/snapshots/completions/namespace_middle_dot.snap index a8b7305f4ea..a4db5a431fe 100644 --- a/packages/@winglang/wingc/src/lsp/snapshots/completions/namespace_middle_dot.snap +++ b/packages/@winglang/wingc/src/lsp/snapshots/completions/namespace_middle_dot.snap @@ -1,5 +1,5 @@ --- -source: libs/wingc/src/lsp/completions.rs +source: packages/@winglang/wingc/src/lsp/completions.rs --- - label: Api kind: 7 @@ -11,7 +11,7 @@ source: libs/wingc/src/lsp/completions.rs kind: 7 documentation: kind: markdown - value: "```wing\nclass Bucket {\n addFile(...): void;\n addObject(...): void;\n onCreate(...): void;\n onDelete(...): void;\n onEvent(...): void;\n onUpdate(...): void;\n /* ... */\n}\n```\n---\nA cloud object store." + value: "```wing\nclass Bucket {\n addCorsRule(...): void;\n addFile(...): void;\n addObject(...): void;\n onCreate(...): void;\n onDelete(...): void;\n onEvent(...): void;\n /* ... */\n}\n```\n---\nA cloud object store." sortText: gg|Bucket - label: Counter kind: 7 @@ -163,6 +163,12 @@ source: libs/wingc/src/lsp/completions.rs kind: markdown value: "```wing\nstruct ApiResponse {\n body?: str;\n headers?: Map;\n status?: num;\n}\n```\n---\nShape of a response from a inflight handler." sortText: hh|ApiResponse +- label: BucketCorsOptions + kind: 22 + documentation: + kind: markdown + value: "```wing\nstruct BucketCorsOptions {\n allowedHeaders?: Array;\n exposeHeaders?: Array;\n maxAge?: duration;\n allowedMethods: Array;\n allowedOrigins: Array;\n}\n```\n---\nCors Options for `Bucket`." + sortText: hh|BucketCorsOptions - label: BucketDeleteOptions kind: 22 documentation: @@ -209,7 +215,7 @@ source: libs/wingc/src/lsp/completions.rs kind: 22 documentation: kind: markdown - value: "```wing\nstruct BucketProps {\n public?: bool;\n}\n```\n---\nOptions for `Bucket`." + value: "```wing\nstruct BucketProps {\n cors?: bool;\n corsOptions?: BucketCorsOptions;\n public?: bool;\n}\n```\n---\nOptions for `Bucket`." sortText: hh|BucketProps - label: BucketPutOptions kind: 22 diff --git a/packages/@winglang/wingc/src/lsp/snapshots/completions/new_expression_nested.snap b/packages/@winglang/wingc/src/lsp/snapshots/completions/new_expression_nested.snap index 9d7e8248c2e..d3bd4d98479 100644 --- a/packages/@winglang/wingc/src/lsp/snapshots/completions/new_expression_nested.snap +++ b/packages/@winglang/wingc/src/lsp/snapshots/completions/new_expression_nested.snap @@ -1,5 +1,5 @@ --- -source: libs/wingc/src/lsp/completions.rs +source: packages/@winglang/wingc/src/lsp/completions.rs --- - label: Api kind: 7 @@ -16,7 +16,7 @@ source: libs/wingc/src/lsp/completions.rs kind: 7 documentation: kind: markdown - value: "```wing\nclass Bucket {\n addFile(...): void;\n addObject(...): void;\n onCreate(...): void;\n onDelete(...): void;\n onEvent(...): void;\n onUpdate(...): void;\n /* ... */\n}\n```\n---\nA cloud object store." + value: "```wing\nclass Bucket {\n addCorsRule(...): void;\n addFile(...): void;\n addObject(...): void;\n onCreate(...): void;\n onDelete(...): void;\n onEvent(...): void;\n /* ... */\n}\n```\n---\nA cloud object store." sortText: gg|Bucket insertText: Bucket($1) insertTextFormat: 2 diff --git a/packages/@winglang/wingc/src/lsp/snapshots/completions/partial_type_reference_annotation.snap b/packages/@winglang/wingc/src/lsp/snapshots/completions/partial_type_reference_annotation.snap index a8b7305f4ea..a4db5a431fe 100644 --- a/packages/@winglang/wingc/src/lsp/snapshots/completions/partial_type_reference_annotation.snap +++ b/packages/@winglang/wingc/src/lsp/snapshots/completions/partial_type_reference_annotation.snap @@ -1,5 +1,5 @@ --- -source: libs/wingc/src/lsp/completions.rs +source: packages/@winglang/wingc/src/lsp/completions.rs --- - label: Api kind: 7 @@ -11,7 +11,7 @@ source: libs/wingc/src/lsp/completions.rs kind: 7 documentation: kind: markdown - value: "```wing\nclass Bucket {\n addFile(...): void;\n addObject(...): void;\n onCreate(...): void;\n onDelete(...): void;\n onEvent(...): void;\n onUpdate(...): void;\n /* ... */\n}\n```\n---\nA cloud object store." + value: "```wing\nclass Bucket {\n addCorsRule(...): void;\n addFile(...): void;\n addObject(...): void;\n onCreate(...): void;\n onDelete(...): void;\n onEvent(...): void;\n /* ... */\n}\n```\n---\nA cloud object store." sortText: gg|Bucket - label: Counter kind: 7 @@ -163,6 +163,12 @@ source: libs/wingc/src/lsp/completions.rs kind: markdown value: "```wing\nstruct ApiResponse {\n body?: str;\n headers?: Map;\n status?: num;\n}\n```\n---\nShape of a response from a inflight handler." sortText: hh|ApiResponse +- label: BucketCorsOptions + kind: 22 + documentation: + kind: markdown + value: "```wing\nstruct BucketCorsOptions {\n allowedHeaders?: Array;\n exposeHeaders?: Array;\n maxAge?: duration;\n allowedMethods: Array;\n allowedOrigins: Array;\n}\n```\n---\nCors Options for `Bucket`." + sortText: hh|BucketCorsOptions - label: BucketDeleteOptions kind: 22 documentation: @@ -209,7 +215,7 @@ source: libs/wingc/src/lsp/completions.rs kind: 22 documentation: kind: markdown - value: "```wing\nstruct BucketProps {\n public?: bool;\n}\n```\n---\nOptions for `Bucket`." + value: "```wing\nstruct BucketProps {\n cors?: bool;\n corsOptions?: BucketCorsOptions;\n public?: bool;\n}\n```\n---\nOptions for `Bucket`." sortText: hh|BucketProps - label: BucketPutOptions kind: 22 diff --git a/packages/@winglang/wingc/src/lsp/snapshots/completions/variable_type_annotation_namespace.snap b/packages/@winglang/wingc/src/lsp/snapshots/completions/variable_type_annotation_namespace.snap index a8b7305f4ea..a4db5a431fe 100644 --- a/packages/@winglang/wingc/src/lsp/snapshots/completions/variable_type_annotation_namespace.snap +++ b/packages/@winglang/wingc/src/lsp/snapshots/completions/variable_type_annotation_namespace.snap @@ -1,5 +1,5 @@ --- -source: libs/wingc/src/lsp/completions.rs +source: packages/@winglang/wingc/src/lsp/completions.rs --- - label: Api kind: 7 @@ -11,7 +11,7 @@ source: libs/wingc/src/lsp/completions.rs kind: 7 documentation: kind: markdown - value: "```wing\nclass Bucket {\n addFile(...): void;\n addObject(...): void;\n onCreate(...): void;\n onDelete(...): void;\n onEvent(...): void;\n onUpdate(...): void;\n /* ... */\n}\n```\n---\nA cloud object store." + value: "```wing\nclass Bucket {\n addCorsRule(...): void;\n addFile(...): void;\n addObject(...): void;\n onCreate(...): void;\n onDelete(...): void;\n onEvent(...): void;\n /* ... */\n}\n```\n---\nA cloud object store." sortText: gg|Bucket - label: Counter kind: 7 @@ -163,6 +163,12 @@ source: libs/wingc/src/lsp/completions.rs kind: markdown value: "```wing\nstruct ApiResponse {\n body?: str;\n headers?: Map;\n status?: num;\n}\n```\n---\nShape of a response from a inflight handler." sortText: hh|ApiResponse +- label: BucketCorsOptions + kind: 22 + documentation: + kind: markdown + value: "```wing\nstruct BucketCorsOptions {\n allowedHeaders?: Array;\n exposeHeaders?: Array;\n maxAge?: duration;\n allowedMethods: Array;\n allowedOrigins: Array;\n}\n```\n---\nCors Options for `Bucket`." + sortText: hh|BucketCorsOptions - label: BucketDeleteOptions kind: 22 documentation: @@ -209,7 +215,7 @@ source: libs/wingc/src/lsp/completions.rs kind: 22 documentation: kind: markdown - value: "```wing\nstruct BucketProps {\n public?: bool;\n}\n```\n---\nOptions for `Bucket`." + value: "```wing\nstruct BucketProps {\n cors?: bool;\n corsOptions?: BucketCorsOptions;\n public?: bool;\n}\n```\n---\nOptions for `Bucket`." sortText: hh|BucketProps - label: BucketPutOptions kind: 22 diff --git a/packages/@winglang/wingc/src/lsp/snapshots/hovers/class_symbol.snap b/packages/@winglang/wingc/src/lsp/snapshots/hovers/class_symbol.snap index 49b31947c6d..8f993382057 100644 --- a/packages/@winglang/wingc/src/lsp/snapshots/hovers/class_symbol.snap +++ b/packages/@winglang/wingc/src/lsp/snapshots/hovers/class_symbol.snap @@ -1,9 +1,9 @@ --- -source: libs/wingc/src/lsp/hover.rs +source: packages/@winglang/wingc/src/lsp/hover.rs --- contents: kind: markdown - value: "```wing\npreflight bucket: class Bucket {\n addFile(...): void;\n addObject(...): void;\n onCreate(...): void;\n onDelete(...): void;\n onEvent(...): void;\n onUpdate(...): void;\n /* ... */\n}\n```\n---\nA cloud object store." + value: "```wing\npreflight bucket: class Bucket {\n addCorsRule(...): void;\n addFile(...): void;\n addObject(...): void;\n onCreate(...): void;\n onDelete(...): void;\n onEvent(...): void;\n /* ... */\n}\n```\n---\nA cloud object store." range: start: line: 3 diff --git a/packages/@winglang/wingc/src/lsp/snapshots/hovers/inside_class_field.snap b/packages/@winglang/wingc/src/lsp/snapshots/hovers/inside_class_field.snap index 4f48ffcdd89..0ee1843fe10 100644 --- a/packages/@winglang/wingc/src/lsp/snapshots/hovers/inside_class_field.snap +++ b/packages/@winglang/wingc/src/lsp/snapshots/hovers/inside_class_field.snap @@ -1,9 +1,9 @@ --- -source: libs/wingc/src/lsp/hover.rs +source: packages/@winglang/wingc/src/lsp/hover.rs --- contents: kind: markdown - value: "```wing\npreflight my_bucket: class Bucket {\n addFile(...): void;\n addObject(...): void;\n onCreate(...): void;\n onDelete(...): void;\n onEvent(...): void;\n onUpdate(...): void;\n /* ... */\n}\n```\n---\nA cloud object store." + value: "```wing\npreflight my_bucket: class Bucket {\n addCorsRule(...): void;\n addFile(...): void;\n addObject(...): void;\n onCreate(...): void;\n onDelete(...): void;\n onEvent(...): void;\n /* ... */\n}\n```\n---\nA cloud object store." range: start: line: 3 diff --git a/packages/@winglang/wingc/src/lsp/snapshots/signature/constructor_arg.snap b/packages/@winglang/wingc/src/lsp/snapshots/signature/constructor_arg.snap index 6b86677c6f7..4aaec270b7f 100644 --- a/packages/@winglang/wingc/src/lsp/snapshots/signature/constructor_arg.snap +++ b/packages/@winglang/wingc/src/lsp/snapshots/signature/constructor_arg.snap @@ -1,5 +1,5 @@ --- -source: libs/wingc/src/lsp/signature.rs +source: packages/@winglang/wingc/src/lsp/signature.rs --- signatures: - label: "(...props): Bucket" @@ -10,6 +10,6 @@ signatures: - label: "...props" documentation: kind: markdown - value: "```wing\nstruct BucketProps {\n public?: bool;\n}\n```\n" + value: "```wing\nstruct BucketProps {\n cors?: bool;\n corsOptions?: BucketCorsOptions;\n public?: bool;\n}\n```\n" activeParameter: 0 diff --git a/packages/winglang/src/commands/test/fixtures/main.w.tf-aws.snap.md b/packages/winglang/src/commands/test/fixtures/main.w.tf-aws.snap.md index a5473d2e4c3..ff7fdd03130 100644 --- a/packages/winglang/src/commands/test/fixtures/main.w.tf-aws.snap.md +++ b/packages/winglang/src/commands/test/fixtures/main.w.tf-aws.snap.md @@ -31,6 +31,37 @@ "bucket_prefix": "bucket-c88fdc5f-", "force_destroy": false } + }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A" + } + }, + "bucket": "${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [ + ], + "max_age_seconds": 0 + } + ] + } } }, "terraform": { diff --git a/tests/doc_examples/valid/bucket.md_example_5/main.w b/tests/doc_examples/valid/bucket.md_example_5/main.w new file mode 100644 index 00000000000..aa6fd9c76f9 --- /dev/null +++ b/tests/doc_examples/valid/bucket.md_example_5/main.w @@ -0,0 +1,17 @@ +// This file was auto generated from an example found in: bucket.md_example_5 +// Example metadata: {"valid":true} +bring cloud; +bring http; + +let uploads = new cloud.Bucket( + // these are the default values + public: false, + cors: true, + corsOptions: { + allowedMethods: [http.HttpMethod.GET, http.HttpMethod.POST, http.HttpMethod.PUT, http.HttpMethod.DELETE, http.HttpMethod.HEAD], + allowedOrigins: ["*"], + allowedHeaders: ["*"], + exposeHeaders: [], + maxAge: 0s + }, +); diff --git a/tests/doc_examples/valid/bucket.md_example_6/main.w b/tests/doc_examples/valid/bucket.md_example_6/main.w new file mode 100644 index 00000000000..17be79dfc92 --- /dev/null +++ b/tests/doc_examples/valid/bucket.md_example_6/main.w @@ -0,0 +1,13 @@ +// This file was auto generated from an example found in: bucket.md_example_6 +// Example metadata: {"valid":true} +bring cloud; +bring http; + +let bucket = new cloud.Bucket( + cors: false, // disable any default CORS rules +); + +bucket.addCorsRule({ + allowedOrigins: ["https://example.com"], + allowedMethods: [http.HttpMethod.GET], +}); diff --git a/tests/sdk_tests/bucket/cors.test.w b/tests/sdk_tests/bucket/cors.test.w new file mode 100644 index 00000000000..69893fd776e --- /dev/null +++ b/tests/sdk_tests/bucket/cors.test.w @@ -0,0 +1,52 @@ +bring cloud; +bring http; +bring util; +bring expect; + + +let api = new cloud.Api(); + +let bucket = new cloud.Bucket( + public: false, + cors: true, + corsOptions: { + allowedMethods: [http.HttpMethod.GET], + allowedOrigins: [api.url] + }, +); + +bucket.addObject("hello", "hello"); + + +api.get("/test-bucket-cors", inflight (req) => { + let response = http.fetch( + bucket.signedUrl("hello"), + method: http.HttpMethod.OPTIONS, + headers: { + Origin: api.url, + "Access-Control-Request-Method": "GET", + }, + ); + return { + body: response.body + }; +}); + +if util.tryEnv("WING_TARGET") == "tf-aws" { + test "bucket CORS configuration works" { + let requestFromTest = http.fetch( + bucket.signedUrl("hello"), + method: http.HttpMethod.OPTIONS, + headers: { + Origin: "not-api-url.com", + "Access-Control-Request-Method": "GET", + }, + ); + expect.match(requestFromTest.body, "AccessForbidden"); + + let requestFromApi = http.get(api.url + "/test-bucket-cors").body; + expect.equal(requestFromApi, ""); + } +} + + \ No newline at end of file diff --git a/tests/valid/external_ts.extern.d.ts b/tests/valid/external_ts.extern.d.ts index 08567bed862..238877f6f4b 100644 --- a/tests/valid/external_ts.extern.d.ts +++ b/tests/valid/external_ts.extern.d.ts @@ -67,6 +67,59 @@ export class Resource extends Construct implements IResource { actually bound. */ readonly onLift: (host: IInflightHost, ops: (readonly (string)[])) => void; } +/** The request's method. */ +export enum HttpMethod { + GET = 0, + PUT = 1, + DELETE = 2, + PATCH = 3, + POST = 4, + OPTIONS = 5, + HEAD = 6, + CONNECT = 7, + TRACE = 8, +} +/** Represents a length of time. */ +export class Duration implements ILiftable { + /** Return the total number of days in this Duration. + @returns the value of this `Duration` expressed in Days. */ + readonly days: number; + /** Return the total number of hours in this Duration. + @returns the value of this `Duration` expressed in Hours. */ + readonly hours: number; + /** Return the total number of milliseconds in this Duration. + @returns the value of this `Duration` expressed in Milliseconds. */ + readonly milliseconds: number; + /** Return the total number of minutes in this Duration. + @returns the value of this `Duration` expressed in Minutes. */ + readonly minutes: number; + /** Return the total number of months in this Duration. + @returns the value of this `Duration` expressed in Months. */ + readonly months: number; + /** Return the total number of seconds in this Duration. + @returns the value of this `Duration` expressed in Seconds. */ + readonly seconds: number; + /** Return the total number of years in this Duration. + @returns the value of this `Duration` expressed in Years. */ + readonly years: number; +} +/** Cors Options for `Bucket`. */ +export interface BucketCorsOptions { + /** The list of allowed headers. + ["Content-Type"] */ + readonly allowedHeaders?: ((readonly (string)[])) | undefined; + /** The list of allowed methods. + [HttpMethod.GET, HttpMethod.POST] */ + readonly allowedMethods: (readonly (HttpMethod)[]); + /** The allowed origin. + "https://example.com" */ + readonly allowedOrigins: (readonly (string)[]); + /** The list of exposed headers. + ["Content-Type"] */ + readonly exposeHeaders?: ((readonly (string)[])) | undefined; + /** How long the browser should cache preflight request results. */ + readonly maxAge?: (Duration) | undefined; +} /** Code that runs at runtime and implements your application's behavior. For example, handling API requests, processing queue messages, etc. Inflight code can be executed on various compute platforms in the cloud, @@ -109,6 +162,8 @@ export interface BucketOnUpdateOptions { } /** A cloud object store. */ export class Bucket extends Resource { + /** Add cors configuration to the bucket. */ + readonly addCorsRule: (value: BucketCorsOptions) => void; /** Add a file to the bucket from system folder. */ readonly addFile: (key: string, path: string, encoding?: (string) | undefined) => void; /** Add a file to the bucket that is uploaded when the app is deployed. diff --git a/tests/valid/struct_from_json.test.w b/tests/valid/struct_from_json.test.w index ca6ad917f3a..d342e1e015e 100644 --- a/tests/valid/struct_from_json.test.w +++ b/tests/valid/struct_from_json.test.w @@ -2,13 +2,13 @@ bring cloud; bring expect; // JSII structs -let j = { public: false }; -let x = cloud.BucketProps.fromJson(j); -assert(x.public == false); +let j = { initial: 3 }; +let x = cloud.CounterProps.fromJson(j); +assert(x.initial == 3); test "inflight jsii struct conversion" { - let x = cloud.BucketProps.fromJson(j); - assert(x.public == false); + let x = cloud.CounterProps.fromJson(j); + assert(x.initial == 3); } // simple case diff --git a/tools/hangar/__snapshots__/platform.ts.snap b/tools/hangar/__snapshots__/platform.ts.snap index a5f1c09e7c1..bc2ac9a072c 100644 --- a/tools/hangar/__snapshots__/platform.ts.snap +++ b/tools/hangar/__snapshots__/platform.ts.snap @@ -304,6 +304,36 @@ exports[`Platform examples > AWS target platform > permission-boundary.js 1`] = "bucket_prefix": "code-c84a50b1-", }, }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A", + }, + }, + "bucket": "\${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*", + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD", + ], + "allowed_origins": [ + "*", + ], + "expose_headers": [], + "max_age_seconds": 0, + }, + ], + }, + }, "aws_s3_object": { "Queue-SetConsumer0_S3Object_2AD0A795": { "//": { @@ -558,6 +588,36 @@ exports[`Platform examples > AWS target platform > replicate-s3.js 1`] = ` "bucket": "some-prefix\${aws_s3_bucket.Code.bucket}", }, }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A", + }, + }, + "bucket": "\${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*", + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD", + ], + "allowed_origins": [ + "*", + ], + "expose_headers": [], + "max_age_seconds": 0, + }, + ], + }, + }, "aws_s3_bucket_replication_configuration": { "Bucket_ReplicaDefaultConfig_A63C952B": { "//": { @@ -824,6 +884,36 @@ exports[`Platform examples > AWS target platform > tf-backend.js > azurerm backe "bucket_prefix": "code-c84a50b1-", }, }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A", + }, + }, + "bucket": "\${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*", + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD", + ], + "allowed_origins": [ + "*", + ], + "expose_headers": [], + "max_age_seconds": 0, + }, + ], + }, + }, "aws_s3_object": { "Queue-SetConsumer0_S3Object_2AD0A795": { "//": { @@ -990,6 +1080,36 @@ exports[`Platform examples > AWS target platform > tf-backend.js > gcp backend 1 "bucket_prefix": "code-c84a50b1-", }, }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A", + }, + }, + "bucket": "\${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*", + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD", + ], + "allowed_origins": [ + "*", + ], + "expose_headers": [], + "max_age_seconds": 0, + }, + ], + }, + }, "aws_s3_object": { "Queue-SetConsumer0_S3Object_2AD0A795": { "//": { @@ -1156,6 +1276,36 @@ exports[`Platform examples > AWS target platform > tf-backend.js > s3 backend 1` "bucket_prefix": "code-c84a50b1-", }, }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A", + }, + }, + "bucket": "\${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*", + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD", + ], + "allowed_origins": [ + "*", + ], + "expose_headers": [], + "max_age_seconds": 0, + }, + ], + }, + }, "aws_s3_object": { "Queue-SetConsumer0_S3Object_2AD0A795": { "//": { diff --git a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/add_file.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/add_file.test.w_compile_tf-aws.md index c6c7bdac4c4..a96415dc945 100644 --- a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/add_file.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/add_file.test.w_compile_tf-aws.md @@ -28,6 +28,36 @@ "force_destroy": false } }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A" + } + }, + "bucket": "${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } + }, "aws_s3_object": { "Bucket_S3Object-file1txt_A14F86D6": { "//": { diff --git a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/add_object.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/add_object.test.w_compile_tf-aws.md index cf246c04a66..44df9be8e35 100644 --- a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/add_object.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/add_object.test.w_compile_tf-aws.md @@ -28,6 +28,36 @@ "force_destroy": false } }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A" + } + }, + "bucket": "${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } + }, "aws_s3_object": { "Bucket_S3Object-file1json_6A4AD365": { "//": { diff --git a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/aws-bucket.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/aws-bucket.test.w_compile_tf-aws.md index 20b062b31b1..4afb4b3e9bf 100644 --- a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/aws-bucket.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/aws-bucket.test.w_compile_tf-aws.md @@ -27,6 +27,36 @@ "bucket_prefix": "aws-wing-bucket-c8f5eeeb-", "force_destroy": false } + }, + "aws_s3_bucket_cors_configuration": { + "aws-wing-bucket_CorsConfiguration-1619e757_B022291C": { + "//": { + "metadata": { + "path": "root/Default/Default/aws-wing-bucket/CorsConfiguration-1619e757", + "uniqueId": "aws-wing-bucket_CorsConfiguration-1619e757_B022291C" + } + }, + "bucket": "${aws_s3_bucket.aws-wing-bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } } } } diff --git a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/bucket-ref.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/bucket-ref.test.w_compile_tf-aws.md index 793ca36954a..a70c9862798 100644 --- a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/bucket-ref.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/bucket-ref.test.w_compile_tf-aws.md @@ -27,6 +27,36 @@ "bucket_prefix": "bucket-c88fdc5f-", "force_destroy": false } + }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A" + } + }, + "bucket": "${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } } } } diff --git a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/bucket_list.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/bucket_list.test.w_compile_tf-aws.md index 78c0fc7d87a..ff659514508 100644 --- a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/bucket_list.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/bucket_list.test.w_compile_tf-aws.md @@ -28,6 +28,36 @@ "force_destroy": false } }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A" + } + }, + "bucket": "${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } + }, "aws_s3_object": { "Bucket_S3Object-file3txt_6AB69768": { "//": { diff --git a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/copy.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/copy.test.w_compile_tf-aws.md index d6949a77e42..34ca17b3f88 100644 --- a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/copy.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/copy.test.w_compile_tf-aws.md @@ -27,6 +27,36 @@ "bucket_prefix": "bucket-c88fdc5f-", "force_destroy": false } + }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A" + } + }, + "bucket": "${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } } } } diff --git a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/cors.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/cors.test.w_compile_tf-aws.md new file mode 100644 index 00000000000..685e3c896c7 --- /dev/null +++ b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/cors.test.w_compile_tf-aws.md @@ -0,0 +1,272 @@ +# [cors.test.w](../../../../../../tests/sdk_tests/bucket/cors.test.w) | compile | tf-aws + +## main.tf.json +```json +{ + "//": { + "metadata": { + "backend": "local", + "stackName": "root" + }, + "outputs": { + "root": { + "Default": { + "Default": { + "Api": { + "Endpoint": { + "Url": "Api_Endpoint_Url_473FEE9F" + } + } + } + } + } + } + }, + "data": { + "aws_caller_identity": { + "account": { + "//": { + "metadata": { + "path": "root/Default/account", + "uniqueId": "account" + } + } + } + }, + "aws_region": { + "Region": { + "//": { + "metadata": { + "path": "root/Default/Region", + "uniqueId": "Region" + } + } + } + } + }, + "output": { + "Api_Endpoint_Url_473FEE9F": { + "value": "https://${aws_api_gateway_rest_api.Api_api_91C07D84.id}.execute-api.${data.aws_region.Region.name}.amazonaws.com/${aws_api_gateway_stage.Api_api_stage_E0FA39D6.stage_name}" + } + }, + "provider": { + "aws": [ + {} + ] + }, + "resource": { + "aws_api_gateway_deployment": { + "Api_api_deployment_7FB64CC4": { + "//": { + "metadata": { + "path": "root/Default/Default/Api/api/deployment", + "uniqueId": "Api_api_deployment_7FB64CC4" + } + }, + "lifecycle": { + "create_before_destroy": true + }, + "rest_api_id": "${aws_api_gateway_rest_api.Api_api_91C07D84.id}", + "triggers": { + "redeployment": "${sha256(aws_api_gateway_rest_api.Api_api_91C07D84.body)}" + } + } + }, + "aws_api_gateway_rest_api": { + "Api_api_91C07D84": { + "//": { + "metadata": { + "path": "root/Default/Default/Api/api/api", + "uniqueId": "Api_api_91C07D84" + } + }, + "body": "{\"paths\":{\"/test-bucket-cors\":{\"get\":{\"operationId\":\"get-test-bucket-cors\",\"responses\":{\"200\":{\"description\":\"200 response\",\"content\":{}}},\"parameters\":[],\"x-amazon-apigateway-integration\":{\"uri\":\"arn:aws:apigateway:${data.aws_region.Region.name}:lambda:path/2015-03-31/functions/arn:aws:lambda:${data.aws_region.Region.name}:${data.aws_caller_identity.account.account_id}:function:get_test-bucket-cors0-c83b3a95/invocations\",\"type\":\"aws_proxy\",\"httpMethod\":\"POST\",\"responses\":{\"default\":{\"statusCode\":\"200\"}},\"passthroughBehavior\":\"when_no_match\",\"contentHandling\":\"CONVERT_TO_TEXT\"}}},\"/{proxy+}\":{\"x-amazon-apigateway-any-method\":{\"produces\":[\"application/json\"],\"x-amazon-apigateway-integration\":{\"type\":\"mock\",\"requestTemplates\":{\"application/json\":\"\\n {\\\"statusCode\\\": 404}\\n \"},\"passthroughBehavior\":\"never\",\"responses\":{\"404\":{\"statusCode\":\"404\",\"responseParameters\":{\"method.response.header.Content-Type\":\"'application/json'\"},\"responseTemplates\":{\"application/json\":\"{\\\"statusCode\\\": 404, \\\"message\\\": \\\"Error: Resource not found\\\"}\"}},\"default\":{\"statusCode\":\"404\",\"responseParameters\":{\"method.response.header.Content-Type\":\"'application/json'\"},\"responseTemplates\":{\"application/json\":\"{\\\"statusCode\\\": 404, \\\"message\\\": \\\"Error: Resource not found\\\"}\"}}}},\"responses\":{\"404\":{\"description\":\"404 response\",\"headers\":{\"Content-Type\":{\"type\":\"string\"}}}}}}},\"openapi\":\"3.0.3\"}", + "lifecycle": { + "create_before_destroy": true + }, + "name": "api-c8f613f0" + } + }, + "aws_api_gateway_stage": { + "Api_api_stage_E0FA39D6": { + "//": { + "metadata": { + "path": "root/Default/Default/Api/api/stage", + "uniqueId": "Api_api_stage_E0FA39D6" + } + }, + "deployment_id": "${aws_api_gateway_deployment.Api_api_deployment_7FB64CC4.id}", + "rest_api_id": "${aws_api_gateway_rest_api.Api_api_91C07D84.id}", + "stage_name": "prod" + } + }, + "aws_cloudwatch_log_group": { + "Api_get_test-bucket-cors0_CloudwatchLogGroup_41A49F43": { + "//": { + "metadata": { + "path": "root/Default/Default/Api/get_test-bucket-cors0/CloudwatchLogGroup", + "uniqueId": "Api_get_test-bucket-cors0_CloudwatchLogGroup_41A49F43" + } + }, + "name": "/aws/lambda/get_test-bucket-cors0-c83b3a95", + "retention_in_days": 30 + } + }, + "aws_iam_role": { + "Api_get_test-bucket-cors0_IamRole_2CE005D6": { + "//": { + "metadata": { + "path": "root/Default/Default/Api/get_test-bucket-cors0/IamRole", + "uniqueId": "Api_get_test-bucket-cors0_IamRole_2CE005D6" + } + }, + "assume_role_policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Action\":\"sts:AssumeRole\",\"Principal\":{\"Service\":\"lambda.amazonaws.com\"},\"Effect\":\"Allow\"}]}" + } + }, + "aws_iam_role_policy": { + "Api_get_test-bucket-cors0_IamRolePolicy_2EB2B5F8": { + "//": { + "metadata": { + "path": "root/Default/Default/Api/get_test-bucket-cors0/IamRolePolicy", + "uniqueId": "Api_get_test-bucket-cors0_IamRolePolicy_2EB2B5F8" + } + }, + "policy": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Action\":[\"s3:List*\",\"s3:PutObject*\",\"s3:Abort*\",\"s3:GetObject*\",\"s3:GetBucket*\"],\"Resource\":[\"${aws_s3_bucket.Bucket.arn}\",\"${aws_s3_bucket.Bucket.arn}/*\"],\"Effect\":\"Allow\"}]}", + "role": "${aws_iam_role.Api_get_test-bucket-cors0_IamRole_2CE005D6.name}" + } + }, + "aws_iam_role_policy_attachment": { + "Api_get_test-bucket-cors0_IamRolePolicyAttachment_6877756E": { + "//": { + "metadata": { + "path": "root/Default/Default/Api/get_test-bucket-cors0/IamRolePolicyAttachment", + "uniqueId": "Api_get_test-bucket-cors0_IamRolePolicyAttachment_6877756E" + } + }, + "policy_arn": "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", + "role": "${aws_iam_role.Api_get_test-bucket-cors0_IamRole_2CE005D6.name}" + } + }, + "aws_lambda_function": { + "Api_get_test-bucket-cors0_737E7042": { + "//": { + "metadata": { + "path": "root/Default/Default/Api/get_test-bucket-cors0/Default", + "uniqueId": "Api_get_test-bucket-cors0_737E7042" + } + }, + "architectures": [ + "arm64" + ], + "environment": { + "variables": { + "BUCKET_NAME_1357ca3a": "${aws_s3_bucket.Bucket.bucket}", + "NODE_OPTIONS": "--enable-source-maps", + "WING_FUNCTION_NAME": "get_test-bucket-cors0-c83b3a95", + "WING_TARGET": "tf-aws", + "WING_TOKEN_HTTPS_TFTOKEN_TOKEN_8_EXECUTE_API_TFTOKEN_TOKEN_0_AMAZONAWS_COM_TFTOKEN_TOKEN_9": "${jsonencode(\"https://${aws_api_gateway_rest_api.Api_api_91C07D84.id}.execute-api.${data.aws_region.Region.name}.amazonaws.com/${aws_api_gateway_stage.Api_api_stage_E0FA39D6.stage_name}\")}" + } + }, + "function_name": "get_test-bucket-cors0-c83b3a95", + "handler": "index.handler", + "logging_config": { + "log_format": "JSON" + }, + "memory_size": 1024, + "publish": true, + "role": "${aws_iam_role.Api_get_test-bucket-cors0_IamRole_2CE005D6.arn}", + "runtime": "nodejs20.x", + "s3_bucket": "${aws_s3_bucket.Code.bucket}", + "s3_key": "${aws_s3_object.Api_get_test-bucket-cors0_S3Object_B3687A16.key}", + "timeout": 60, + "vpc_config": { + "security_group_ids": [], + "subnet_ids": [] + } + } + }, + "aws_lambda_permission": { + "Api_api_permission-GET-1b275be3_9CFD2BC3": { + "//": { + "metadata": { + "path": "root/Default/Default/Api/api/permission-GET-1b275be3", + "uniqueId": "Api_api_permission-GET-1b275be3_9CFD2BC3" + } + }, + "action": "lambda:InvokeFunction", + "function_name": "${aws_lambda_function.Api_get_test-bucket-cors0_737E7042.function_name}", + "principal": "apigateway.amazonaws.com", + "source_arn": "${aws_api_gateway_rest_api.Api_api_91C07D84.execution_arn}/*/GET/test-bucket-cors", + "statement_id": "AllowExecutionFromAPIGateway-GET-1b275be3" + } + }, + "aws_s3_bucket": { + "Bucket": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/Default", + "uniqueId": "Bucket" + } + }, + "bucket_prefix": "bucket-c88fdc5f-", + "force_destroy": false + }, + "Code": { + "//": { + "metadata": { + "path": "root/Default/Code", + "uniqueId": "Code" + } + }, + "bucket_prefix": "code-c84a50b1-" + } + }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A" + } + }, + "bucket": "${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_methods": [ + "GET" + ], + "allowed_origins": [ + "https://${aws_api_gateway_rest_api.Api_api_91C07D84.id}.execute-api.${data.aws_region.Region.name}.amazonaws.com/${aws_api_gateway_stage.Api_api_stage_E0FA39D6.stage_name}" + ] + } + ] + } + }, + "aws_s3_object": { + "Api_get_test-bucket-cors0_S3Object_B3687A16": { + "//": { + "metadata": { + "path": "root/Default/Default/Api/get_test-bucket-cors0/S3Object", + "uniqueId": "Api_get_test-bucket-cors0_S3Object_B3687A16" + } + }, + "bucket": "${aws_s3_bucket.Code.bucket}", + "key": "", + "source": "" + }, + "Bucket_S3Object-hello_B7726FAE": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/S3Object-hello", + "uniqueId": "Bucket_S3Object-hello_B7726FAE" + } + }, + "bucket": "${aws_s3_bucket.Bucket.bucket}", + "content": "hello", + "key": "hello" + } + } + } +} +``` + diff --git a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/cors.test.w_test_sim.md b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/cors.test.w_test_sim.md new file mode 100644 index 00000000000..8bf2edb8a4b --- /dev/null +++ b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/cors.test.w_test_sim.md @@ -0,0 +1,13 @@ +# [cors.test.w](../../../../../../tests/sdk_tests/bucket/cors.test.w) | test | sim + +## stdout.log +```log +Error: Resource root/Default/Bucket does not support inflight operation signedUrl. +It might not be implemented yet. + +Tests 1 unsupported (1) +Snapshots 1 skipped +Test Files 1 unsupported (1) +Duration +``` + diff --git a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/delete.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/delete.test.w_compile_tf-aws.md index 8ec7c3b13f5..8ef1805c8a5 100644 --- a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/delete.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/delete.test.w_compile_tf-aws.md @@ -28,6 +28,36 @@ "force_destroy": false } }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A" + } + }, + "bucket": "${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } + }, "aws_s3_object": { "Bucket_S3Object-file2txt_2016A6BF": { "//": { diff --git a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/events.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/events.test.w_compile_tf-aws.md index 84b69a70e58..9108c5523b0 100644 --- a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/events.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/events.test.w_compile_tf-aws.md @@ -600,6 +600,64 @@ "force_destroy": false } }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A" + } + }, + "bucket": "${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + }, + "LogHistory_CorsConfiguration-76338bfb_AD56A3CD": { + "//": { + "metadata": { + "path": "root/Default/Default/LogHistory/CorsConfiguration-76338bfb", + "uniqueId": "LogHistory_CorsConfiguration-76338bfb_AD56A3CD" + } + }, + "bucket": "${aws_s3_bucket.LogHistory.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } + }, "aws_s3_bucket_notification": { "Bucket_S3BucketNotification_D5E2F72C": { "//": { diff --git a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/exists.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/exists.test.w_compile_tf-aws.md index dcc2d83e15b..b45515ab481 100644 --- a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/exists.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/exists.test.w_compile_tf-aws.md @@ -27,6 +27,36 @@ "bucket_prefix": "bucket-c88fdc5f-", "force_destroy": false } + }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A" + } + }, + "bucket": "${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } } } } diff --git a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/get.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/get.test.w_compile_tf-aws.md index efd36ecec84..176aec679ee 100644 --- a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/get.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/get.test.w_compile_tf-aws.md @@ -27,6 +27,36 @@ "bucket_prefix": "bucket-c88fdc5f-", "force_destroy": false } + }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A" + } + }, + "bucket": "${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } } } } diff --git a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/load_test.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/load_test.test.w_compile_tf-aws.md index 664308e197b..5b61bbabd04 100644 --- a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/load_test.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/load_test.test.w_compile_tf-aws.md @@ -27,6 +27,36 @@ "bucket_prefix": "bucket-c88fdc5f-", "force_destroy": false } + }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A" + } + }, + "bucket": "${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } } } } diff --git a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/metadata.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/metadata.test.w_compile_tf-aws.md index b514a3a0216..cb6dd0441f6 100644 --- a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/metadata.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/metadata.test.w_compile_tf-aws.md @@ -27,6 +27,36 @@ "bucket_prefix": "bucket-c88fdc5f-", "force_destroy": false } + }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A" + } + }, + "bucket": "${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } } } } diff --git a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/public_url.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/public_url.test.w_compile_tf-aws.md index a5d0f939dfe..82e74e4dd57 100644 --- a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/public_url.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/public_url.test.w_compile_tf-aws.md @@ -38,6 +38,64 @@ "force_destroy": false } }, + "aws_s3_bucket_cors_configuration": { + "privateBucket_CorsConfiguration-e82f6088_B53F96C4": { + "//": { + "metadata": { + "path": "root/Default/Default/privateBucket/CorsConfiguration-e82f6088", + "uniqueId": "privateBucket_CorsConfiguration-e82f6088_B53F96C4" + } + }, + "bucket": "${aws_s3_bucket.privateBucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + }, + "publicBucket_CorsConfiguration-7c320eda_33D3FB14": { + "//": { + "metadata": { + "path": "root/Default/Default/publicBucket/CorsConfiguration-7c320eda", + "uniqueId": "publicBucket_CorsConfiguration-7c320eda_33D3FB14" + } + }, + "bucket": "${aws_s3_bucket.publicBucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } + }, "aws_s3_bucket_policy": { "publicBucket_PublicPolicy_F7753EC4": { "//": { diff --git a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/put.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/put.test.w_compile_tf-aws.md index 4ad5215f4df..b554e71d998 100644 --- a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/put.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/put.test.w_compile_tf-aws.md @@ -27,6 +27,36 @@ "bucket_prefix": "bucket-c88fdc5f-", "force_destroy": false } + }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A" + } + }, + "bucket": "${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } } } } diff --git a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/put_json.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/put_json.test.w_compile_tf-aws.md index 33f203e3e06..0e36db0d9c0 100644 --- a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/put_json.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/put_json.test.w_compile_tf-aws.md @@ -27,6 +27,36 @@ "bucket_prefix": "bucket-c88fdc5f-", "force_destroy": false } + }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A" + } + }, + "bucket": "${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } } } } diff --git a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/rename.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/rename.test.w_compile_tf-aws.md index 77c1dbacaf6..d02b5676973 100644 --- a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/rename.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/rename.test.w_compile_tf-aws.md @@ -27,6 +27,36 @@ "bucket_prefix": "bucket-c88fdc5f-", "force_destroy": false } + }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A" + } + }, + "bucket": "${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } } } } diff --git a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/signed_url.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/signed_url.test.w_compile_tf-aws.md index e4701d3d6d7..7bcee2905cd 100644 --- a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/signed_url.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/signed_url.test.w_compile_tf-aws.md @@ -27,6 +27,36 @@ "bucket_prefix": "bucket-c88fdc5f-", "force_destroy": false } + }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A" + } + }, + "bucket": "${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } } } } diff --git a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/try_delete.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/try_delete.test.w_compile_tf-aws.md index aa9ab3cf638..bfa3f629ccc 100644 --- a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/try_delete.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/try_delete.test.w_compile_tf-aws.md @@ -27,6 +27,36 @@ "bucket_prefix": "bucket-c88fdc5f-", "force_destroy": false } + }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A" + } + }, + "bucket": "${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } } } } diff --git a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/try_get.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/try_get.test.w_compile_tf-aws.md index 0ae9ba7f2a3..0b9a331525b 100644 --- a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/try_get.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/try_get.test.w_compile_tf-aws.md @@ -27,6 +27,36 @@ "bucket_prefix": "bucket-c88fdc5f-", "force_destroy": false } + }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A" + } + }, + "bucket": "${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } } } } diff --git a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/try_get_json.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/try_get_json.test.w_compile_tf-aws.md index b773e7a2e00..fa608392b60 100644 --- a/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/try_get_json.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/sdk_tests/bucket/try_get_json.test.w_compile_tf-aws.md @@ -27,6 +27,36 @@ "bucket_prefix": "bucket-c88fdc5f-", "force_destroy": false } + }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A" + } + }, + "bucket": "${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } } } } diff --git a/tools/hangar/__snapshots__/test_corpus/sdk_tests/function/memory_and_env.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/sdk_tests/function/memory_and_env.test.w_compile_tf-aws.md index 61094e0a762..6a310f15d76 100644 --- a/tools/hangar/__snapshots__/test_corpus/sdk_tests/function/memory_and_env.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/sdk_tests/function/memory_and_env.test.w_compile_tf-aws.md @@ -216,6 +216,36 @@ "bucket_prefix": "code-c84a50b1-" } }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A" + } + }, + "bucket": "${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } + }, "aws_s3_object": { "envfn_S3Object_0080F00E": { "//": { diff --git a/tools/hangar/__snapshots__/test_corpus/sdk_tests/http/fetch.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/sdk_tests/http/fetch.test.w_compile_tf-aws.md index 47db11053ff..1ec6550a5a7 100644 --- a/tools/hangar/__snapshots__/test_corpus/sdk_tests/http/fetch.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/sdk_tests/http/fetch.test.w_compile_tf-aws.md @@ -392,6 +392,36 @@ "bucket_prefix": "code-c84a50b1-" } }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A" + } + }, + "bucket": "${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } + }, "aws_s3_object": { "Api_get_delayed0_S3Object_C817D653": { "//": { diff --git a/tools/hangar/__snapshots__/test_corpus/sdk_tests/misc/empty-actions.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/sdk_tests/misc/empty-actions.test.w_compile_tf-aws.md index f752ca1d577..71ea8577554 100644 --- a/tools/hangar/__snapshots__/test_corpus/sdk_tests/misc/empty-actions.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/sdk_tests/misc/empty-actions.test.w_compile_tf-aws.md @@ -307,6 +307,36 @@ "bucket_prefix": "code-c84a50b1-" } }, + "aws_s3_bucket_cors_configuration": { + "A_Bucket_CorsConfiguration-8cb07fb3_BD6030DE": { + "//": { + "metadata": { + "path": "root/Default/Default/A/Bucket/CorsConfiguration-8cb07fb3", + "uniqueId": "A_Bucket_CorsConfiguration-8cb07fb3_BD6030DE" + } + }, + "bucket": "${aws_s3_bucket.A_Bucket_EB05527C.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } + }, "aws_s3_object": { "Api_get_bar0_S3Object_CBF78AB9": { "//": { diff --git a/tools/hangar/__snapshots__/test_corpus/sdk_tests/std/array.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/sdk_tests/std/array.test.w_compile_tf-aws.md index 78182c4412f..94cde4d2ade 100644 --- a/tools/hangar/__snapshots__/test_corpus/sdk_tests/std/array.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/sdk_tests/std/array.test.w_compile_tf-aws.md @@ -47,6 +47,92 @@ "bucket_prefix": "mysecondbucket-c8d5dc33-", "force_destroy": false } + }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A" + } + }, + "bucket": "${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + }, + "myBucket_CorsConfiguration-bd2dc39e_5BA04287": { + "//": { + "metadata": { + "path": "root/Default/Default/myBucket/CorsConfiguration-bd2dc39e", + "uniqueId": "myBucket_CorsConfiguration-bd2dc39e_5BA04287" + } + }, + "bucket": "${aws_s3_bucket.myBucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + }, + "mySecondBucket_CorsConfiguration-972a7c07_70FA1AE2": { + "//": { + "metadata": { + "path": "root/Default/Default/mySecondBucket/CorsConfiguration-972a7c07", + "uniqueId": "mySecondBucket_CorsConfiguration-972a7c07_70FA1AE2" + } + }, + "bucket": "${aws_s3_bucket.mySecondBucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } } } } diff --git a/tools/hangar/__snapshots__/test_corpus/sdk_tests/std/node.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/sdk_tests/std/node.test.w_compile_tf-aws.md index c3d945ea6b8..ce7f243dc92 100644 --- a/tools/hangar/__snapshots__/test_corpus/sdk_tests/std/node.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/sdk_tests/std/node.test.w_compile_tf-aws.md @@ -38,6 +38,64 @@ "force_destroy": false } }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A" + } + }, + "bucket": "${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + }, + "SingletonBucket_CorsConfiguration-4dd8138d_2CDD3371": { + "//": { + "metadata": { + "path": "root/Default/Default/SingletonBucket/CorsConfiguration-4dd8138d", + "uniqueId": "SingletonBucket_CorsConfiguration-4dd8138d_2CDD3371" + } + }, + "bucket": "${aws_s3_bucket.SingletonBucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } + }, "aws_sqs_queue": { "q1": { "//": { diff --git a/tools/hangar/__snapshots__/test_corpus/sdk_tests/ui/section.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/sdk_tests/ui/section.test.w_compile_tf-aws.md index 91b161f7d54..1f213ceaacc 100644 --- a/tools/hangar/__snapshots__/test_corpus/sdk_tests/ui/section.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/sdk_tests/ui/section.test.w_compile_tf-aws.md @@ -216,6 +216,36 @@ "force_destroy": false } }, + "aws_s3_bucket_cors_configuration": { + "WidgetService_Bucket_CorsConfiguration-d47f60fd_4DF43029": { + "//": { + "metadata": { + "path": "root/Default/Default/WidgetService/Bucket/CorsConfiguration-d47f60fd", + "uniqueId": "WidgetService_Bucket_CorsConfiguration-d47f60fd_4DF43029" + } + }, + "bucket": "${aws_s3_bucket.WidgetService_Bucket_125C963C.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } + }, "aws_s3_object": { "WidgetService_Button_Handler_S3Object_277180FD": { "//": { diff --git a/tools/hangar/__snapshots__/test_corpus/valid/bring_local.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/bring_local.test.w_compile_tf-aws.md index bd394b45400..7d577c51d74 100644 --- a/tools/hangar/__snapshots__/test_corpus/valid/bring_local.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/valid/bring_local.test.w_compile_tf-aws.md @@ -277,6 +277,36 @@ module.exports = function({ }) { "force_destroy": false } }, + "aws_s3_bucket_cors_configuration": { + "Store_Bucket_CorsConfiguration-af11ee62_37AA6011": { + "//": { + "metadata": { + "path": "root/Default/Default/Store/Bucket/CorsConfiguration-af11ee62", + "uniqueId": "Store_Bucket_CorsConfiguration-af11ee62_37AA6011" + } + }, + "bucket": "${aws_s3_bucket.Store_Bucket_42A4CEFB.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } + }, "aws_s3_object": { "Store_OnDeploy_Function_S3Object_95484A56": { "//": { diff --git a/tools/hangar/__snapshots__/test_corpus/valid/bring_wing_library.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/bring_wing_library.test.w_compile_tf-aws.md index 4acb72c5430..633e5ed597b 100644 --- a/tools/hangar/__snapshots__/test_corpus/valid/bring_wing_library.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/valid/bring_wing_library.test.w_compile_tf-aws.md @@ -121,6 +121,36 @@ module.exports = function({ }) { "bucket_prefix": "bucket-c843dbb0-", "force_destroy": false } + }, + "aws_s3_bucket_cors_configuration": { + "Store_Bucket_CorsConfiguration-af11ee62_37AA6011": { + "//": { + "metadata": { + "path": "root/Default/Default/Store/Bucket/CorsConfiguration-af11ee62", + "uniqueId": "Store_Bucket_CorsConfiguration-af11ee62_37AA6011" + } + }, + "bucket": "${aws_s3_bucket.Store_Bucket_42A4CEFB.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } } } } diff --git a/tools/hangar/__snapshots__/test_corpus/valid/bucket_keys.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/bucket_keys.test.w_compile_tf-aws.md index 82dd57a83f6..27f6ecf74e4 100644 --- a/tools/hangar/__snapshots__/test_corpus/valid/bucket_keys.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/valid/bucket_keys.test.w_compile_tf-aws.md @@ -59,6 +59,36 @@ module.exports = function({ $b }) { "bucket_prefix": "bucket-c88fdc5f-", "force_destroy": false } + }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A" + } + }, + "bucket": "${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } } } } diff --git a/tools/hangar/__snapshots__/test_corpus/valid/capture_in_binary.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/capture_in_binary.test.w_compile_tf-aws.md index 70b36de4af9..363a88713d7 100644 --- a/tools/hangar/__snapshots__/test_corpus/valid/capture_in_binary.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/valid/capture_in_binary.test.w_compile_tf-aws.md @@ -51,6 +51,36 @@ module.exports = function({ $b, $x }) { "bucket_prefix": "bucket-c88fdc5f-", "force_destroy": false } + }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A" + } + }, + "bucket": "${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } } } } diff --git a/tools/hangar/__snapshots__/test_corpus/valid/capture_reassigable_class_field.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/capture_reassigable_class_field.test.w_compile_tf-aws.md index 306b12584dc..274dd9d40da 100644 --- a/tools/hangar/__snapshots__/test_corpus/valid/capture_reassigable_class_field.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/valid/capture_reassigable_class_field.test.w_compile_tf-aws.md @@ -146,6 +146,36 @@ module.exports = function({ }) { "bucket_prefix": "bucket-c8da6031-", "force_destroy": false } + }, + "aws_s3_bucket_cors_configuration": { + "KeyValueStore_Bucket_CorsConfiguration-4c1190f0_4EF0AF4C": { + "//": { + "metadata": { + "path": "root/Default/Default/KeyValueStore/Bucket/CorsConfiguration-4c1190f0", + "uniqueId": "KeyValueStore_Bucket_CorsConfiguration-4c1190f0_4EF0AF4C" + } + }, + "bucket": "${aws_s3_bucket.KeyValueStore_Bucket_EBBCDEA3.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } } } } diff --git a/tools/hangar/__snapshots__/test_corpus/valid/capture_resource_and_data.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/capture_resource_and_data.test.w_compile_tf-aws.md index bc5b20e4791..48be3a9f449 100644 --- a/tools/hangar/__snapshots__/test_corpus/valid/capture_resource_and_data.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/valid/capture_resource_and_data.test.w_compile_tf-aws.md @@ -53,6 +53,36 @@ module.exports = function({ $data, $queue, $res }) { "force_destroy": false } }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A" + } + }, + "bucket": "${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } + }, "aws_sqs_queue": { "Queue": { "//": { diff --git a/tools/hangar/__snapshots__/test_corpus/valid/captures.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/captures.test.w_compile_tf-aws.md index 75da8cbce13..019ccd430b9 100644 --- a/tools/hangar/__snapshots__/test_corpus/valid/captures.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/valid/captures.test.w_compile_tf-aws.md @@ -563,6 +563,92 @@ module.exports = function({ $headers }) { "force_destroy": false } }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A" + } + }, + "bucket": "${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + }, + "PrivateBucket_CorsConfiguration-0c557d45_BC34782D": { + "//": { + "metadata": { + "path": "root/Default/Default/PrivateBucket/CorsConfiguration-0c557d45", + "uniqueId": "PrivateBucket_CorsConfiguration-0c557d45_BC34782D" + } + }, + "bucket": "${aws_s3_bucket.PrivateBucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + }, + "PublicBucket_CorsConfiguration-21bd2572_E4EABB10": { + "//": { + "metadata": { + "path": "root/Default/Default/PublicBucket/CorsConfiguration-21bd2572", + "uniqueId": "PublicBucket_CorsConfiguration-21bd2572_E4EABB10" + } + }, + "bucket": "${aws_s3_bucket.PublicBucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } + }, "aws_s3_bucket_policy": { "PublicBucket_PublicPolicy_771B9F9A": { "//": { diff --git a/tools/hangar/__snapshots__/test_corpus/valid/casting.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/casting.test.w_compile_tf-aws.md index e6364af815b..47b9f5b4e68 100644 --- a/tools/hangar/__snapshots__/test_corpus/valid/casting.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/valid/casting.test.w_compile_tf-aws.md @@ -32,6 +32,36 @@ "bucket_prefix": "my-prefix-", "force_destroy": false } + }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A" + } + }, + "bucket": "${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } } } } diff --git a/tools/hangar/__snapshots__/test_corpus/valid/container_types.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/container_types.test.w_compile_tf-aws.md index 81d7f683545..a0b7c479352 100644 --- a/tools/hangar/__snapshots__/test_corpus/valid/container_types.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/valid/container_types.test.w_compile_tf-aws.md @@ -47,6 +47,92 @@ "bucket_prefix": "bucket3-c8b6c706-", "force_destroy": false } + }, + "aws_s3_bucket_cors_configuration": { + "bucket1_CorsConfiguration-a9c2ec90_08E843C8": { + "//": { + "metadata": { + "path": "root/Default/Default/bucket1/CorsConfiguration-a9c2ec90", + "uniqueId": "bucket1_CorsConfiguration-a9c2ec90_08E843C8" + } + }, + "bucket": "${aws_s3_bucket.bucket1.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + }, + "bucket2_CorsConfiguration-b3773efe_D25B3C71": { + "//": { + "metadata": { + "path": "root/Default/Default/bucket2/CorsConfiguration-b3773efe", + "uniqueId": "bucket2_CorsConfiguration-b3773efe_D25B3C71" + } + }, + "bucket": "${aws_s3_bucket.bucket2.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + }, + "bucket3_CorsConfiguration-1bc1fdd4_03D9D2C6": { + "//": { + "metadata": { + "path": "root/Default/Default/bucket3/CorsConfiguration-1bc1fdd4", + "uniqueId": "bucket3_CorsConfiguration-1bc1fdd4_03D9D2C6" + } + }, + "bucket": "${aws_s3_bucket.bucket3.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } } } } diff --git a/tools/hangar/__snapshots__/test_corpus/valid/explicit_lift_qualification.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/explicit_lift_qualification.test.w_compile_tf-aws.md index a8b544cb2a7..a4e52bbf0cb 100644 --- a/tools/hangar/__snapshots__/test_corpus/valid/explicit_lift_qualification.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/valid/explicit_lift_qualification.test.w_compile_tf-aws.md @@ -192,6 +192,92 @@ module.exports = function({ }) { "force_destroy": false } }, + "aws_s3_bucket_cors_configuration": { + "b1_CorsConfiguration-12a95bb8_084FCCA5": { + "//": { + "metadata": { + "path": "root/Default/Default/b1/CorsConfiguration-12a95bb8", + "uniqueId": "b1_CorsConfiguration-12a95bb8_084FCCA5" + } + }, + "bucket": "${aws_s3_bucket.b1.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + }, + "b2_CorsConfiguration-fa6445bb_E69581A6": { + "//": { + "metadata": { + "path": "root/Default/Default/b2/CorsConfiguration-fa6445bb", + "uniqueId": "b2_CorsConfiguration-fa6445bb_E69581A6" + } + }, + "bucket": "${aws_s3_bucket.b2.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + }, + "b3_CorsConfiguration-c50b642d_34B3271D": { + "//": { + "metadata": { + "path": "root/Default/Default/b3/CorsConfiguration-c50b642d", + "uniqueId": "b3_CorsConfiguration-c50b642d_34B3271D" + } + }, + "bucket": "${aws_s3_bucket.b3.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } + }, "aws_s3_object": { "b1_S3Object-k_80FB6BEF": { "//": { diff --git a/tools/hangar/__snapshots__/test_corpus/valid/extern_implementation.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/extern_implementation.test.w_compile_tf-aws.md index f0c45a2ac7d..ae1e028c6e7 100644 --- a/tools/hangar/__snapshots__/test_corpus/valid/extern_implementation.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/valid/extern_implementation.test.w_compile_tf-aws.md @@ -217,6 +217,36 @@ module.exports = function({ }) { "force_destroy": false } }, + "aws_s3_bucket_cors_configuration": { + "my-bucket_CorsConfiguration-5ae844f7_F1FB0032": { + "//": { + "metadata": { + "path": "root/Default/Default/my-bucket/CorsConfiguration-5ae844f7", + "uniqueId": "my-bucket_CorsConfiguration-5ae844f7_F1FB0032" + } + }, + "bucket": "${aws_s3_bucket.my-bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } + }, "aws_s3_object": { "Function_S3Object_C62A0C2D": { "//": { diff --git a/tools/hangar/__snapshots__/test_corpus/valid/factory.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/factory.test.w_compile_tf-aws.md index fa1a4a6b587..0b7bd2c2337 100644 --- a/tools/hangar/__snapshots__/test_corpus/valid/factory.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/valid/factory.test.w_compile_tf-aws.md @@ -86,6 +86,36 @@ module.exports = function({ }) { "bucket_prefix": "bucket-c88fdc5f-", "force_destroy": false } + }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A" + } + }, + "bucket": "${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } } } } diff --git a/tools/hangar/__snapshots__/test_corpus/valid/file_counter.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/file_counter.test.w_compile_tf-aws.md index 1c1a7c574a8..f5ee95fd300 100644 --- a/tools/hangar/__snapshots__/test_corpus/valid/file_counter.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/valid/file_counter.test.w_compile_tf-aws.md @@ -181,6 +181,36 @@ module.exports = function({ $bucket, $counter }) { "bucket_prefix": "code-c84a50b1-" } }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A" + } + }, + "bucket": "${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } + }, "aws_s3_object": { "Queue-SetConsumer0_S3Object_2AD0A795": { "//": { diff --git a/tools/hangar/__snapshots__/test_corpus/valid/function_variadic_arguments.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/function_variadic_arguments.test.w_compile_tf-aws.md index 52a92c8e19c..7f15636961a 100644 --- a/tools/hangar/__snapshots__/test_corpus/valid/function_variadic_arguments.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/valid/function_variadic_arguments.test.w_compile_tf-aws.md @@ -73,6 +73,92 @@ module.exports = function({ $A }) { "bucket_prefix": "bucket3-c8b6c706-", "force_destroy": false } + }, + "aws_s3_bucket_cors_configuration": { + "bucket1_CorsConfiguration-a9c2ec90_08E843C8": { + "//": { + "metadata": { + "path": "root/Default/Default/bucket1/CorsConfiguration-a9c2ec90", + "uniqueId": "bucket1_CorsConfiguration-a9c2ec90_08E843C8" + } + }, + "bucket": "${aws_s3_bucket.bucket1.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + }, + "bucket2_CorsConfiguration-b3773efe_D25B3C71": { + "//": { + "metadata": { + "path": "root/Default/Default/bucket2/CorsConfiguration-b3773efe", + "uniqueId": "bucket2_CorsConfiguration-b3773efe_D25B3C71" + } + }, + "bucket": "${aws_s3_bucket.bucket2.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + }, + "bucket3_CorsConfiguration-1bc1fdd4_03D9D2C6": { + "//": { + "metadata": { + "path": "root/Default/Default/bucket3/CorsConfiguration-1bc1fdd4", + "uniqueId": "bucket3_CorsConfiguration-1bc1fdd4_03D9D2C6" + } + }, + "bucket": "${aws_s3_bucket.bucket3.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } } } } diff --git a/tools/hangar/__snapshots__/test_corpus/valid/hello.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/hello.test.w_compile_tf-aws.md index b88b2052d90..b77e2f556bb 100644 --- a/tools/hangar/__snapshots__/test_corpus/valid/hello.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/valid/hello.test.w_compile_tf-aws.md @@ -159,6 +159,36 @@ module.exports = function({ $bucket }) { "bucket_prefix": "code-c84a50b1-" } }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A" + } + }, + "bucket": "${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } + }, "aws_s3_object": { "Queue-SetConsumer0_S3Object_2AD0A795": { "//": { diff --git a/tools/hangar/__snapshots__/test_corpus/valid/inflight_class_capture_preflight_object.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/inflight_class_capture_preflight_object.test.w_compile_tf-aws.md index 6fd97f2f4ad..ba454b2989f 100644 --- a/tools/hangar/__snapshots__/test_corpus/valid/inflight_class_capture_preflight_object.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/valid/inflight_class_capture_preflight_object.test.w_compile_tf-aws.md @@ -258,6 +258,36 @@ module.exports = function({ }) { "bucket_prefix": "bucket-c88fdc5f-", "force_destroy": false } + }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A" + } + }, + "bucket": "${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } } } } diff --git a/tools/hangar/__snapshots__/test_corpus/valid/inflight_class_inside_inflight_closure.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/inflight_class_inside_inflight_closure.test.w_compile_tf-aws.md index 3953ac0f1cd..e76b2ce4661 100644 --- a/tools/hangar/__snapshots__/test_corpus/valid/inflight_class_inside_inflight_closure.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/valid/inflight_class_inside_inflight_closure.test.w_compile_tf-aws.md @@ -220,6 +220,36 @@ module.exports = function({ }) { "force_destroy": false } }, + "aws_s3_bucket_cors_configuration": { + "PreflightClass_Bucket_CorsConfiguration-5318ec22_09CBB181": { + "//": { + "metadata": { + "path": "root/Default/Default/PreflightClass/Bucket/CorsConfiguration-5318ec22", + "uniqueId": "PreflightClass_Bucket_CorsConfiguration-5318ec22_09CBB181" + } + }, + "bucket": "${aws_s3_bucket.PreflightClass_Bucket_93EC74D7.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } + }, "aws_s3_object": { "PreflightClass_Function_S3Object_84DFAC83": { "//": { diff --git a/tools/hangar/__snapshots__/test_corpus/valid/inflights_calling_inflights.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/inflights_calling_inflights.test.w_compile_tf-aws.md index a692ea1748a..90273bf03f9 100644 --- a/tools/hangar/__snapshots__/test_corpus/valid/inflights_calling_inflights.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/valid/inflights_calling_inflights.test.w_compile_tf-aws.md @@ -260,6 +260,36 @@ module.exports = function({ }) { "bucket_prefix": "code-c84a50b1-" } }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A" + } + }, + "bucket": "${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } + }, "aws_s3_object": { "func1_S3Object_33D0CBF3": { "//": { diff --git a/tools/hangar/__snapshots__/test_corpus/valid/json.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/json.test.w_compile_tf-aws.md index b42b998af6e..c19559ad465 100644 --- a/tools/hangar/__snapshots__/test_corpus/valid/json.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/valid/json.test.w_compile_tf-aws.md @@ -50,6 +50,64 @@ module.exports = function({ }) { "bucket_prefix": "bucket-c88fdc5f-", "force_destroy": false } + }, + "aws_s3_bucket_cors_configuration": { + "B1InList_CorsConfiguration-89da8ce1_69FE383C": { + "//": { + "metadata": { + "path": "root/Default/Default/B1InList/CorsConfiguration-89da8ce1", + "uniqueId": "B1InList_CorsConfiguration-89da8ce1_69FE383C" + } + }, + "bucket": "${aws_s3_bucket.B1InList.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + }, + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A" + } + }, + "bucket": "${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } } } } diff --git a/tools/hangar/__snapshots__/test_corpus/valid/json_bucket.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/json_bucket.test.w_compile_tf-aws.md index 263d925189e..0dcb058808c 100644 --- a/tools/hangar/__snapshots__/test_corpus/valid/json_bucket.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/valid/json_bucket.test.w_compile_tf-aws.md @@ -167,6 +167,36 @@ module.exports = function({ $b, $fileName, $getJson, $j }) { "bucket_prefix": "code-c84a50b1-" } }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A" + } + }, + "bucket": "${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } + }, "aws_s3_object": { "Function_S3Object_C62A0C2D": { "//": { diff --git a/tools/hangar/__snapshots__/test_corpus/valid/lift_inflight_closure_collection.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/lift_inflight_closure_collection.test.w_compile_tf-aws.md index 3a0bbe73231..8f44fdccea8 100644 --- a/tools/hangar/__snapshots__/test_corpus/valid/lift_inflight_closure_collection.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/valid/lift_inflight_closure_collection.test.w_compile_tf-aws.md @@ -587,6 +587,64 @@ module.exports = function({ $complex }) { "force_destroy": false } }, + "aws_s3_bucket_cors_configuration": { + "b1_CorsConfiguration-12a95bb8_084FCCA5": { + "//": { + "metadata": { + "path": "root/Default/Default/b1/CorsConfiguration-12a95bb8", + "uniqueId": "b1_CorsConfiguration-12a95bb8_084FCCA5" + } + }, + "bucket": "${aws_s3_bucket.b1.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + }, + "b2_CorsConfiguration-fa6445bb_E69581A6": { + "//": { + "metadata": { + "path": "root/Default/Default/b2/CorsConfiguration-fa6445bb", + "uniqueId": "b2_CorsConfiguration-fa6445bb_E69581A6" + } + }, + "bucket": "${aws_s3_bucket.b2.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } + }, "aws_s3_object": { "b1_S3Object-k_80FB6BEF": { "//": { diff --git a/tools/hangar/__snapshots__/test_corpus/valid/lift_inflight_closure_returning_object_issue6501.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/lift_inflight_closure_returning_object_issue6501.test.w_compile_tf-aws.md index cd37666600b..90cf6eb4a58 100644 --- a/tools/hangar/__snapshots__/test_corpus/valid/lift_inflight_closure_returning_object_issue6501.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/valid/lift_inflight_closure_returning_object_issue6501.test.w_compile_tf-aws.md @@ -134,6 +134,36 @@ module.exports = function({ }) { "bucket_prefix": "bucket-c88fdc5f-", "force_destroy": false } + }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A" + } + }, + "bucket": "${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } } } } diff --git a/tools/hangar/__snapshots__/test_corpus/valid/lift_shared_resource.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/lift_shared_resource.test.w_compile_tf-aws.md index bda7ad45304..6c64e7aa3f4 100644 --- a/tools/hangar/__snapshots__/test_corpus/valid/lift_shared_resource.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/valid/lift_shared_resource.test.w_compile_tf-aws.md @@ -287,6 +287,36 @@ module.exports = function({ }) { "bucket_prefix": "code-c84a50b1-" } }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A" + } + }, + "bucket": "${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } + }, "aws_s3_object": { "Api_get_0_S3Object_D1844823": { "//": { diff --git a/tools/hangar/__snapshots__/test_corpus/valid/lift_via_closure.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/lift_via_closure.test.w_compile_tf-aws.md index f9ffb82baaa..4fff33d716a 100644 --- a/tools/hangar/__snapshots__/test_corpus/valid/lift_via_closure.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/valid/lift_via_closure.test.w_compile_tf-aws.md @@ -138,6 +138,64 @@ module.exports = function({ $bucket2 }) { "bucket_prefix": "bucket-c8fe564c-", "force_destroy": false } + }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A" + } + }, + "bucket": "${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + }, + "MyClosure_Bucket_CorsConfiguration-e8fb640c_DE3E7CF4": { + "//": { + "metadata": { + "path": "root/Default/Default/MyClosure/Bucket/CorsConfiguration-e8fb640c", + "uniqueId": "MyClosure_Bucket_CorsConfiguration-e8fb640c_DE3E7CF4" + } + }, + "bucket": "${aws_s3_bucket.MyClosure_Bucket_874B5056.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } } } } diff --git a/tools/hangar/__snapshots__/test_corpus/valid/mut_container_types.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/mut_container_types.test.w_compile_tf-aws.md index 4d4f1f4e7bd..8fa99708e89 100644 --- a/tools/hangar/__snapshots__/test_corpus/valid/mut_container_types.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/valid/mut_container_types.test.w_compile_tf-aws.md @@ -47,6 +47,92 @@ "bucket_prefix": "bucket3-c8b6c706-", "force_destroy": false } + }, + "aws_s3_bucket_cors_configuration": { + "bucket1_CorsConfiguration-a9c2ec90_08E843C8": { + "//": { + "metadata": { + "path": "root/Default/Default/bucket1/CorsConfiguration-a9c2ec90", + "uniqueId": "bucket1_CorsConfiguration-a9c2ec90_08E843C8" + } + }, + "bucket": "${aws_s3_bucket.bucket1.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + }, + "bucket2_CorsConfiguration-b3773efe_D25B3C71": { + "//": { + "metadata": { + "path": "root/Default/Default/bucket2/CorsConfiguration-b3773efe", + "uniqueId": "bucket2_CorsConfiguration-b3773efe_D25B3C71" + } + }, + "bucket": "${aws_s3_bucket.bucket2.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + }, + "bucket3_CorsConfiguration-1bc1fdd4_03D9D2C6": { + "//": { + "metadata": { + "path": "root/Default/Default/bucket3/CorsConfiguration-1bc1fdd4", + "uniqueId": "bucket3_CorsConfiguration-1bc1fdd4_03D9D2C6" + } + }, + "bucket": "${aws_s3_bucket.bucket3.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } } } } diff --git a/tools/hangar/__snapshots__/test_corpus/valid/mutation_after_class_init.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/mutation_after_class_init.test.w_compile_tf-aws.md index ea9b8f581ea..20061a32d0d 100644 --- a/tools/hangar/__snapshots__/test_corpus/valid/mutation_after_class_init.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/valid/mutation_after_class_init.test.w_compile_tf-aws.md @@ -266,6 +266,36 @@ module.exports = function({ }) { "force_destroy": false } }, + "aws_s3_bucket_cors_configuration": { + "Queue_Bucket_CorsConfiguration-6c443489_4F9F18F5": { + "//": { + "metadata": { + "path": "root/Default/Default/Queue/Bucket/CorsConfiguration-6c443489", + "uniqueId": "Queue_Bucket_CorsConfiguration-6c443489_4F9F18F5" + } + }, + "bucket": "${aws_s3_bucket.Queue_Bucket_A87615FF.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } + }, "aws_s3_bucket_notification": { "Queue_Bucket_S3BucketNotification_B826201B": { "//": { diff --git a/tools/hangar/__snapshots__/test_corpus/valid/new_in_static.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/new_in_static.test.w_compile_tf-aws.md index 2d4ffa2bc35..47f890b3224 100644 --- a/tools/hangar/__snapshots__/test_corpus/valid/new_in_static.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/valid/new_in_static.test.w_compile_tf-aws.md @@ -155,6 +155,148 @@ module.exports = function({ }) { "bucket_prefix": "implicit-scope-bucket-c811b94a-", "force_destroy": false } + }, + "aws_s3_bucket_cors_configuration": { + "Construct_Bucket_CorsConfiguration-5f65e65b_CF886C7D": { + "//": { + "metadata": { + "path": "root/Default/Default/Construct/Bucket/CorsConfiguration-5f65e65b", + "uniqueId": "Construct_Bucket_CorsConfiguration-5f65e65b_CF886C7D" + } + }, + "bucket": "${aws_s3_bucket.Construct_Bucket_2C7B19D9.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + }, + "Construct_MyClass_implicit-scope-bucket_CorsConfiguration-cb540331_1C8206C8": { + "//": { + "metadata": { + "path": "root/Default/Default/Construct/MyClass/implicit-scope-bucket/CorsConfiguration-cb540331", + "uniqueId": "Construct_MyClass_implicit-scope-bucket_CorsConfiguration-cb540331_1C8206C8" + } + }, + "bucket": "${aws_s3_bucket.Construct_MyClass_implicit-scope-bucket_177A1CDF.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + }, + "b1_CorsConfiguration-12a95bb8_084FCCA5": { + "//": { + "metadata": { + "path": "root/Default/Default/b1/CorsConfiguration-12a95bb8", + "uniqueId": "b1_CorsConfiguration-12a95bb8_084FCCA5" + } + }, + "bucket": "${aws_s3_bucket.b1.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + }, + "b2_CorsConfiguration-fa6445bb_E69581A6": { + "//": { + "metadata": { + "path": "root/Default/Default/b2/CorsConfiguration-fa6445bb", + "uniqueId": "b2_CorsConfiguration-fa6445bb_E69581A6" + } + }, + "bucket": "${aws_s3_bucket.b2.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + }, + "implicit-scope-bucket_CorsConfiguration-71756df9_DC767D65": { + "//": { + "metadata": { + "path": "root/Default/Default/implicit-scope-bucket/CorsConfiguration-71756df9", + "uniqueId": "implicit-scope-bucket_CorsConfiguration-71756df9_DC767D65" + } + }, + "bucket": "${aws_s3_bucket.implicit-scope-bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } } } } diff --git a/tools/hangar/__snapshots__/test_corpus/valid/new_jsii.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/new_jsii.test.w_compile_tf-aws.md index cb5337b9483..f11628b5cfd 100644 --- a/tools/hangar/__snapshots__/test_corpus/valid/new_jsii.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/valid/new_jsii.test.w_compile_tf-aws.md @@ -40,6 +40,36 @@ module.exports = function({ }) { "bucket_prefix": "bucket-c830af09-", "force_destroy": false } + }, + "aws_s3_bucket_cors_configuration": { + "CustomScope_Bucket_CorsConfiguration-15fff327_4DEB8580": { + "//": { + "metadata": { + "path": "root/Default/Default/CustomScope/Bucket/CorsConfiguration-15fff327", + "uniqueId": "CustomScope_Bucket_CorsConfiguration-15fff327_4DEB8580" + } + }, + "bucket": "${aws_s3_bucket.CustomScope_Bucket_8BBB89A4.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } } } } diff --git a/tools/hangar/__snapshots__/test_corpus/valid/optionals.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/optionals.test.w_compile_tf-aws.md index 6dab1cc0c8a..26a1f124613 100644 --- a/tools/hangar/__snapshots__/test_corpus/valid/optionals.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/valid/optionals.test.w_compile_tf-aws.md @@ -104,6 +104,36 @@ module.exports = function({ }) { "bucket_prefix": "orange-bucket-c8ecc927-", "force_destroy": false } + }, + "aws_s3_bucket_cors_configuration": { + "orangebucket_CorsConfiguration-c1491ba5_D38FC519": { + "//": { + "metadata": { + "path": "root/Default/Default/orange bucket/CorsConfiguration-c1491ba5", + "uniqueId": "orangebucket_CorsConfiguration-c1491ba5_D38FC519" + } + }, + "bucket": "${aws_s3_bucket.orangebucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } } } } diff --git a/tools/hangar/__snapshots__/test_corpus/valid/resource.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/resource.test.w_compile_tf-aws.md index 75ad6941efe..01013f40124 100644 --- a/tools/hangar/__snapshots__/test_corpus/valid/resource.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/valid/resource.test.w_compile_tf-aws.md @@ -590,6 +590,92 @@ module.exports = function({ }) { "bucket_prefix": "code-c84a50b1-" } }, + "aws_s3_bucket_cors_configuration": { + "BigPublisher_Bucket_CorsConfiguration-82fe1f9e_A1667736": { + "//": { + "metadata": { + "path": "root/Default/Default/BigPublisher/Bucket/CorsConfiguration-82fe1f9e", + "uniqueId": "BigPublisher_Bucket_CorsConfiguration-82fe1f9e_A1667736" + } + }, + "bucket": "${aws_s3_bucket.BigPublisher_Bucket_F4CC95F6.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + }, + "BigPublisher_b2_CorsConfiguration-584271ad_E76AB82E": { + "//": { + "metadata": { + "path": "root/Default/Default/BigPublisher/b2/CorsConfiguration-584271ad", + "uniqueId": "BigPublisher_b2_CorsConfiguration-584271ad_E76AB82E" + } + }, + "bucket": "${aws_s3_bucket.BigPublisher_b2_702AC841.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + }, + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A" + } + }, + "bucket": "${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } + }, "aws_s3_bucket_notification": { "BigPublisher_b2_S3BucketNotification_26500622": { "//": { diff --git a/tools/hangar/__snapshots__/test_corpus/valid/resource_captures.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/resource_captures.test.w_compile_tf-aws.md index 9a1496bacad..239d7f5578d 100644 --- a/tools/hangar/__snapshots__/test_corpus/valid/resource_captures.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/valid/resource_captures.test.w_compile_tf-aws.md @@ -215,6 +215,92 @@ module.exports = function({ }) { "force_destroy": false } }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A" + } + }, + "bucket": "${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + }, + "MyResource_Another_First_Bucket_CorsConfiguration-88655007_8FA34C17": { + "//": { + "metadata": { + "path": "root/Default/Default/MyResource/Another/First/Bucket/CorsConfiguration-88655007", + "uniqueId": "MyResource_Another_First_Bucket_CorsConfiguration-88655007_8FA34C17" + } + }, + "bucket": "${aws_s3_bucket.MyResource_Another_First_Bucket_1DA21BC0.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + }, + "MyResource_Bucket_CorsConfiguration-1edd0595_9DA2A2CE": { + "//": { + "metadata": { + "path": "root/Default/Default/MyResource/Bucket/CorsConfiguration-1edd0595", + "uniqueId": "MyResource_Bucket_CorsConfiguration-1edd0595_9DA2A2CE" + } + }, + "bucket": "${aws_s3_bucket.MyResource_Bucket_0DE6FCB5.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } + }, "aws_sqs_queue": { "MyResource_Queue_C2F2FBE5": { "//": { diff --git a/tools/hangar/__snapshots__/test_corpus/valid/resource_captures_globals.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/resource_captures_globals.test.w_compile_tf-aws.md index 449699ab0f2..f2629494306 100644 --- a/tools/hangar/__snapshots__/test_corpus/valid/resource_captures_globals.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/valid/resource_captures_globals.test.w_compile_tf-aws.md @@ -320,6 +320,64 @@ module.exports = function({ $_parentThis_localCounter, $globalCounter }) { "bucket_prefix": "code-c84a50b1-" } }, + "aws_s3_bucket_cors_configuration": { + "Another_First_Bucket_CorsConfiguration-571245df_2D6D34C5": { + "//": { + "metadata": { + "path": "root/Default/Default/Another/First/Bucket/CorsConfiguration-571245df", + "uniqueId": "Another_First_Bucket_CorsConfiguration-571245df_2D6D34C5" + } + }, + "bucket": "${aws_s3_bucket.Another_First_Bucket_490007B4.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + }, + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A" + } + }, + "bucket": "${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } + }, "aws_s3_object": { "MyResource_Topic-OnMessage0_S3Object_80106925": { "//": { diff --git a/tools/hangar/__snapshots__/test_corpus/valid/struct_from_json.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/struct_from_json.test.w_compile_tf-aws.md index 5f3ec210b48..52efefdb3e4 100644 --- a/tools/hangar/__snapshots__/test_corpus/valid/struct_from_json.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/valid/struct_from_json.test.w_compile_tf-aws.md @@ -5,7 +5,7 @@ "use strict"; const $helpers = require("@winglang/sdk/lib/helpers"); const $macros = require("@winglang/sdk/lib/macros"); -module.exports = function({ $cloud_BucketProps, $j }) { +module.exports = function({ $cloud_CounterProps, $j }) { class $Closure1 { constructor($args) { const { } = $args; @@ -14,8 +14,8 @@ module.exports = function({ $cloud_BucketProps, $j }) { return $obj; } async handle() { - const x = $macros.__Struct_fromJson(false, $cloud_BucketProps, $j); - $helpers.assert($helpers.eq(x.public, false), "x.public == false"); + const x = $macros.__Struct_fromJson(false, $cloud_CounterProps, $j); + $helpers.assert($helpers.eq(x.initial, 3), "x.initial == 3"); } } return $Closure1; @@ -201,7 +201,7 @@ class $Root extends $stdlib.std.Resource { const Foosible = $stdlib.std.Struct._createJsonSchema({$id:"/Foosible",type:"object",properties:{f:{type:"string"},},required:[]}); const MyStruct = $stdlib.std.Struct._createJsonSchema({$id:"/MyStruct",type:"object",properties:{color:{type:"string",enum:["red","green","blue"]},m1:{type:"object",properties:{val:{type:"number"},},required:["val",]},m2:{type:"object",properties:{val:{type:"string"},},required:["val",]},},required:["color","m1","m2",]}); const Student = $stdlib.std.Struct._createJsonSchema({$id:"/Student",type:"object",properties:{additionalData:{type:["object","string","boolean","number","array"]},advisor:{type:"object",properties:{dob:{type:"object",properties:{day:{type:"number"},month:{type:"number"},year:{type:"number"},},required:["day","month","year",]},employeeID:{type:"string"},firstName:{type:"string"},lastName:{type:"string"},},required:["dob","employeeID","firstName","lastName",]},coursesTaken:{type:"array",items:{type:"object",properties:{course:{type:"object",properties:{credits:{type:"number"},name:{type:"string"},},required:["credits","name",]},dateTaken:{type:"object",properties:{day:{type:"number"},month:{type:"number"},year:{type:"number"},},required:["day","month","year",]},grade:{type:"string"},},required:["course","dateTaken","grade",]}},dob:{type:"object",properties:{day:{type:"number"},month:{type:"number"},year:{type:"number"},},required:["day","month","year",]},enrolled:{type:"boolean"},enrolledCourses:{type:"array",uniqueItems:true,items:{type:"object",properties:{credits:{type:"number"},name:{type:"string"},},required:["credits","name",]}},firstName:{type:"string"},lastName:{type:"string"},schoolId:{type:"string"},},required:["dob","enrolled","firstName","lastName","schoolId",]}); - const cloud_BucketProps = $stdlib.std.Struct._createJsonSchema({$id:"/BucketProps",type:"object",properties:{public:{type:"boolean"},},required:[]}); + const cloud_CounterProps = $stdlib.std.Struct._createJsonSchema({$id:"/CounterProps",type:"object",properties:{initial:{type:"number"},},required:[]}); const externalStructs_MyOtherStruct = $stdlib.std.Struct._createJsonSchema({$id:"/MyOtherStruct",type:"object",properties:{data:{type:"object",properties:{val:{type:"number"},},required:["val",]},},required:["data",]}); $helpers.nodeof(this).root.$preflightTypesMap = $preflightTypesMap; const Color = @@ -221,7 +221,7 @@ class $Root extends $stdlib.std.Resource { static _toInflightType() { return ` require("${$helpers.normalPath(__dirname)}/inflight.$Closure1-2.cjs")({ - $cloud_BucketProps: ${$stdlib.core.liftObject($stdlib.core.toLiftableModuleType(cloud_BucketProps, "@winglang/sdk/cloud", "BucketProps"))}, + $cloud_CounterProps: ${$stdlib.core.liftObject($stdlib.core.toLiftableModuleType(cloud_CounterProps, "@winglang/sdk/cloud", "CounterProps"))}, $j: ${$stdlib.core.liftObject(j)}, }) `; @@ -229,11 +229,11 @@ class $Root extends $stdlib.std.Resource { get _liftMap() { return ({ "handle": [ - [$stdlib.core.toLiftableModuleType(cloud_BucketProps, "@winglang/sdk/cloud", "BucketProps"), ["fromJson"]], + [$stdlib.core.toLiftableModuleType(cloud_CounterProps, "@winglang/sdk/cloud", "CounterProps"), ["fromJson"]], [j, []], ], "$inflight_init": [ - [$stdlib.core.toLiftableModuleType(cloud_BucketProps, "@winglang/sdk/cloud", "BucketProps"), []], + [$stdlib.core.toLiftableModuleType(cloud_CounterProps, "@winglang/sdk/cloud", "CounterProps"), []], [j, []], ], }); @@ -362,9 +362,9 @@ class $Root extends $stdlib.std.Resource { }); } } - const j = ({"public": false}); - const x = $macros.__Struct_fromJson(false, cloud_BucketProps, j); - $helpers.assert($helpers.eq(x.public, false), "x.public == false"); + const j = ({"initial": 3}); + const x = $macros.__Struct_fromJson(false, cloud_CounterProps, j); + $helpers.assert($helpers.eq(x.initial, 3), "x.initial == 3"); globalThis.$ClassFactory.new("@winglang/sdk.std.Test", std.Test, this, "test:inflight jsii struct conversion", new $Closure1(this, "$Closure1")); const jFoo = ({"f": "bar"}); $helpers.assert($helpers.eq($macros.__Struct_fromJson(false, Foo, jFoo).f, "bar"), "Foo.fromJson(jFoo).f == \"bar\""); diff --git a/tools/hangar/__snapshots__/test_corpus/valid/super_call.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/super_call.test.w_compile_tf-aws.md index f0962f36949..cf091ad0b35 100644 --- a/tools/hangar/__snapshots__/test_corpus/valid/super_call.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/valid/super_call.test.w_compile_tf-aws.md @@ -202,6 +202,36 @@ module.exports = function({ $InflightA }) { "bucket_prefix": "bucket-c88fdc5f-", "force_destroy": false } + }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A" + } + }, + "bucket": "${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } } } } diff --git a/tools/hangar/__snapshots__/test_corpus/valid/test_bucket.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/test_bucket.test.w_compile_tf-aws.md index fdb66e39d06..d82b123452d 100644 --- a/tools/hangar/__snapshots__/test_corpus/valid/test_bucket.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/valid/test_bucket.test.w_compile_tf-aws.md @@ -74,6 +74,36 @@ module.exports = function({ $b }) { "bucket_prefix": "bucket-c88fdc5f-", "force_destroy": false } + }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A" + } + }, + "bucket": "${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } } } } diff --git a/tools/hangar/__snapshots__/test_corpus/valid/to_inflight.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/to_inflight.test.w_compile_tf-aws.md index 2f45b457bb3..f06ebb34e95 100644 --- a/tools/hangar/__snapshots__/test_corpus/valid/to_inflight.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/valid/to_inflight.test.w_compile_tf-aws.md @@ -49,6 +49,36 @@ module.exports = function({ $b }) { "bucket_prefix": "bucket-c88fdc5f-", "force_destroy": false } + }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A" + } + }, + "bucket": "${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } } } } diff --git a/tools/hangar/__snapshots__/test_corpus/valid/unused_lift.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/unused_lift.test.w_compile_tf-aws.md index 2a444f53382..c14a5324a53 100644 --- a/tools/hangar/__snapshots__/test_corpus/valid/unused_lift.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/valid/unused_lift.test.w_compile_tf-aws.md @@ -107,6 +107,36 @@ module.exports = function({ $b }) { "bucket_prefix": "bucket-c88fdc5f-", "force_destroy": false } + }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A" + } + }, + "bucket": "${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } } } } diff --git a/tools/hangar/__snapshots__/test_corpus/valid/website_with_api.test.w_compile_tf-aws.md b/tools/hangar/__snapshots__/test_corpus/valid/website_with_api.test.w_compile_tf-aws.md index 9d7eb5cffcb..20fd38bf0fc 100644 --- a/tools/hangar/__snapshots__/test_corpus/valid/website_with_api.test.w_compile_tf-aws.md +++ b/tools/hangar/__snapshots__/test_corpus/valid/website_with_api.test.w_compile_tf-aws.md @@ -531,6 +531,36 @@ module.exports = function({ $api_url, $expect_Util, $http_HttpMethod, $http_Util "force_destroy": false } }, + "aws_s3_bucket_cors_configuration": { + "Bucket_CorsConfiguration-1357ca3a_A4CCA40A": { + "//": { + "metadata": { + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + "uniqueId": "Bucket_CorsConfiguration-1357ca3a_A4CCA40A" + } + }, + "bucket": "${aws_s3_bucket.Bucket.id}", + "cors_rule": [ + { + "allowed_headers": [ + "*" + ], + "allowed_methods": [ + "GET", + "POST", + "PUT", + "DELETE", + "HEAD" + ], + "allowed_origins": [ + "*" + ], + "expose_headers": [], + "max_age_seconds": 0 + } + ] + } + }, "aws_s3_bucket_policy": { "Website_DistributionS3BucketPolicy_09AE0BCA": { "//": { diff --git a/tools/hangar/__snapshots__/tree_json.ts.snap b/tools/hangar/__snapshots__/tree_json.ts.snap index b04ea26dd55..3b89f9c0121 100644 --- a/tools/hangar/__snapshots__/tree_json.ts.snap +++ b/tools/hangar/__snapshots__/tree_json.ts.snap @@ -123,6 +123,15 @@ exports[`tree.json for an app with many resources 1`] = ` }, "Bucket": { "children": { + "CorsConfiguration-82fe1f9e": { + "constructInfo": { + "fqn": "cdktf.TerraformResource", + "version": "0.0.0", + }, + "display": {}, + "id": "CorsConfiguration-82fe1f9e", + "path": "root/Default/Default/BigPublisher/Bucket/CorsConfiguration-82fe1f9e", + }, "Default": { "constructInfo": { "fqn": "cdktf.TerraformResource", @@ -373,6 +382,15 @@ exports[`tree.json for an app with many resources 1`] = ` }, "b2": { "children": { + "CorsConfiguration-584271ad": { + "constructInfo": { + "fqn": "cdktf.TerraformResource", + "version": "0.0.0", + }, + "display": {}, + "id": "CorsConfiguration-584271ad", + "path": "root/Default/Default/BigPublisher/b2/CorsConfiguration-584271ad", + }, "Default": { "constructInfo": { "fqn": "cdktf.TerraformResource", @@ -541,6 +559,15 @@ exports[`tree.json for an app with many resources 1`] = ` }, "Bucket": { "children": { + "CorsConfiguration-1357ca3a": { + "constructInfo": { + "fqn": "cdktf.TerraformResource", + "version": "0.0.0", + }, + "display": {}, + "id": "CorsConfiguration-1357ca3a", + "path": "root/Default/Default/Bucket/CorsConfiguration-1357ca3a", + }, "Default": { "constructInfo": { "fqn": "cdktf.TerraformResource",