@kensio/yulin 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/README.md +23 -10
  2. package/dist/service/s3/bucket/s3-bucket.d.ts +15 -5
  3. package/dist/service/s3/bucket/s3-bucket.d.ts.map +1 -1
  4. package/dist/service/s3/bucket/s3-bucket.js +25 -10
  5. package/dist/service/s3/bucket/s3-bucket.js.map +1 -1
  6. package/dist/service/s3/bucket/website/s3-bucket-website.d.ts +39 -0
  7. package/dist/service/s3/bucket/website/s3-bucket-website.d.ts.map +1 -0
  8. package/dist/service/s3/bucket/website/s3-bucket-website.js +123 -0
  9. package/dist/service/s3/bucket/website/s3-bucket-website.js.map +1 -0
  10. package/dist/service/s3/command/put-bucket-website/put-bucket-website.handler.d.ts +17 -0
  11. package/dist/service/s3/command/put-bucket-website/put-bucket-website.handler.d.ts.map +1 -0
  12. package/dist/service/s3/command/put-bucket-website/put-bucket-website.handler.js +37 -0
  13. package/dist/service/s3/command/put-bucket-website/put-bucket-website.handler.js.map +1 -0
  14. package/dist/service/s3/serve/sim-s3-get-obj-controller.d.ts +3 -0
  15. package/dist/service/s3/serve/sim-s3-get-obj-controller.d.ts.map +1 -1
  16. package/dist/service/s3/serve/sim-s3-get-obj-controller.js +37 -6
  17. package/dist/service/s3/serve/sim-s3-get-obj-controller.js.map +1 -1
  18. package/dist/service/s3/serve/sim-s3-req-router.d.ts.map +1 -1
  19. package/dist/service/s3/serve/sim-s3-req-router.js +0 -7
  20. package/dist/service/s3/serve/sim-s3-req-router.js.map +1 -1
  21. package/dist/service/s3/sim-s3.d.ts +5 -1
  22. package/dist/service/s3/sim-s3.d.ts.map +1 -1
  23. package/dist/service/s3/sim-s3.js +8 -0
  24. package/dist/service/s3/sim-s3.js.map +1 -1
  25. package/dist/util/filesystem/temp-dir.d.ts +5 -0
  26. package/dist/util/filesystem/temp-dir.d.ts.map +1 -0
  27. package/dist/util/filesystem/temp-dir.js +14 -0
  28. package/dist/util/filesystem/temp-dir.js.map +1 -0
  29. package/package.json +2 -2
package/README.md CHANGED
@@ -64,26 +64,39 @@ You can listen on a port to serve your simulated AWS on localhost:
64
64
  ```typescript
65
65
  import { SimAws } from "@kensio/yulin";
66
66
  import { serveSimAws } from "@kensio/yulin/serve";
67
+ import {
68
+ CreateBucketCommand,
69
+ PutBucketWebsiteCommand,
70
+ PutObjectCommand,
71
+ } from "@aws-sdk/client-s3";
67
72
 
68
73
  const simAws = new SimAws();
69
74
  const srv = await serveSimAws(simAws); // Chooses available port on localhost.
70
75
 
71
76
  const simS3 = srv.simAws.region("eu-west-2").s3();
72
77
  await simS3.createBucket(new CreateBucketCommand({ Bucket: "foo-site" }));
78
+ await simS3.putBucketWebsite(new PutBucketWebsiteCommand({
79
+ Bucket: "foo-site",
80
+ WebsiteConfiguration: {
81
+ IndexDocument: {
82
+ Suffix: "index.html",
83
+ },
84
+ },
85
+ }));
73
86
  await simS3.putObject(
74
- new PutObjectCommand({
75
- Bucket: "foo-site",
76
- Key: "index.html",
77
- Body: "<h1>Hello, world!</h1>",
78
- Metadata: {
79
- "content-type": "text/html; charset=utf-8",
80
- },
81
- }),
87
+ new PutObjectCommand({
88
+ Bucket: "foo-site",
89
+ Key: "foo/index.html",
90
+ Body: "<h1>Hello, world!</h1>",
91
+ Metadata: {
92
+ "content-type": "text/html; charset=utf-8",
93
+ },
94
+ }),
82
95
  );
83
96
 
84
- // Fetch from the simulated S3 bucket via port on localhost.
97
+ // Fetch from the simulated S3 bucket website via port on localhost.
85
98
  const res = await fetch(
86
- `http://foo-site.s3-website.eu-west-2.sim-aws.localhost:${srv.port}/index.html`,
99
+ `http://foo-site.s3-website.eu-west-2.sim-aws.localhost:${srv.port}/foo/`,
87
100
  );
88
101
  ```
89
102
 
@@ -2,18 +2,16 @@ import type { CreateBucketCommand } from "@aws-sdk/client-s3";
2
2
  import type { Brand } from "../../../util/brand.type.js";
3
3
  import type { SimS3BucketStorage } from "../storage/s3-bucket-storage.js";
4
4
  import type { SimS3Object } from "../object/s3-object.js";
5
+ import { S3BucketWebsite } from "./website/s3-bucket-website.js";
5
6
  export type SimS3BucketName = Brand<string, "SimS3BucketName">;
6
7
  /**
7
8
  * Simulated S3 Bucket.
8
9
  */
9
10
  export declare class SimS3Bucket {
10
11
  private storage;
12
+ private website;
11
13
  readonly bucketName: string;
12
- constructor(createCommand: CreateBucketCommand, storage?: SimS3BucketStorage);
13
- /**
14
- * Change the storage implementation for this simulated S3 Bucket.
15
- */
16
- configureSimStorage(storage: SimS3BucketStorage): void;
14
+ constructor(createCommand: CreateBucketCommand, storage?: SimS3BucketStorage, website?: S3BucketWebsite);
17
15
  /**
18
16
  * Put a simulated S3 Object into storage.
19
17
  */
@@ -26,5 +24,17 @@ export declare class SimS3Bucket {
26
24
  * List simulated S3 Objects from storage.
27
25
  */
28
26
  listObjects(prefix?: string): Promise<SimS3Object[]>;
27
+ /**
28
+ * Change the storage implementation for this simulated S3 Bucket.
29
+ */
30
+ configureSimStorage(storage: SimS3BucketStorage): void;
31
+ /**
32
+ * Configure static website hosting for this simulated S3 Bucket.
33
+ */
34
+ configureWebsite(website: S3BucketWebsite): void;
35
+ /**
36
+ * Get static website configuration for this simulated S3 Bucket.
37
+ */
38
+ getWebsite(): S3BucketWebsite;
29
39
  }
30
40
  //# sourceMappingURL=s3-bucket.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"s3-bucket.d.ts","sourceRoot":"","sources":["../../../../src/service/s3/bucket/s3-bucket.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAG1D,MAAM,MAAM,eAAe,GAAG,KAAK,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;AAE/D;;GAEG;AACH,qBAAa,WAAW;IAKpB,OAAO,CAAC,OAAO;IAJjB,SAAgB,UAAU,EAAE,MAAM,CAAC;gBAGjC,aAAa,EAAE,mBAAmB,EAC1B,OAAO,GAAE,kBAAgD;IAMnE;;OAEG;IACH,mBAAmB,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI;IAOtD;;OAEG;IACG,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAInD;;OAEG;IACG,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAI9D;;OAEG;IACG,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;CAG3D"}
1
+ {"version":3,"file":"s3-bucket.d.ts","sourceRoot":"","sources":["../../../../src/service/s3/bucket/s3-bucket.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEjE,MAAM,MAAM,eAAe,GAAG,KAAK,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;AAE/D;;GAEG;AACH,qBAAa,WAAW;IAKpB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,OAAO;IALjB,SAAgB,UAAU,EAAE,MAAM,CAAC;gBAGjC,aAAa,EAAE,mBAAmB,EAC1B,OAAO,GAAE,kBAAgD,EACzD,OAAO,GAAE,eAAuC;IAM1D;;OAEG;IACG,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAInD;;OAEG;IACG,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAI9D;;OAEG;IACG,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAI1D;;OAEG;IACH,mBAAmB,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI;IAOtD;;OAEG;IACH,gBAAgB,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI;IAIhD;;OAEG;IACH,UAAU,IAAI,eAAe;CAG9B"}
@@ -1,25 +1,19 @@
1
1
  import { assertDefined } from "../../../util/defined.js";
2
2
  import { MemoryS3BucketStorage } from "../storage/s3-memory-storage.js";
3
+ import { S3BucketWebsite } from "./website/s3-bucket-website.js";
3
4
  /**
4
5
  * Simulated S3 Bucket.
5
6
  */
6
7
  export class SimS3Bucket {
7
8
  storage;
9
+ website;
8
10
  bucketName;
9
- constructor(createCommand, storage = new MemoryS3BucketStorage()) {
11
+ constructor(createCommand, storage = new MemoryS3BucketStorage(), website = new S3BucketWebsite()) {
10
12
  this.storage = storage;
13
+ this.website = website;
11
14
  assertDefined(createCommand.input.Bucket, "createCommand.input.Bucket");
12
15
  this.bucketName = createCommand.input.Bucket;
13
16
  }
14
- /**
15
- * Change the storage implementation for this simulated S3 Bucket.
16
- */
17
- configureSimStorage(storage) {
18
- if (!this.storage.allowChangeStorage()) {
19
- throw new Error("Cannot change simulated S3 storage implementation");
20
- }
21
- this.storage = storage;
22
- }
23
17
  /**
24
18
  * Put a simulated S3 Object into storage.
25
19
  */
@@ -38,5 +32,26 @@ export class SimS3Bucket {
38
32
  async listObjects(prefix) {
39
33
  return await this.storage.listObjects(prefix);
40
34
  }
35
+ /**
36
+ * Change the storage implementation for this simulated S3 Bucket.
37
+ */
38
+ configureSimStorage(storage) {
39
+ if (!this.storage.allowChangeStorage()) {
40
+ throw new Error("Cannot change simulated S3 storage implementation");
41
+ }
42
+ this.storage = storage;
43
+ }
44
+ /**
45
+ * Configure static website hosting for this simulated S3 Bucket.
46
+ */
47
+ configureWebsite(website) {
48
+ this.website = website;
49
+ }
50
+ /**
51
+ * Get static website configuration for this simulated S3 Bucket.
52
+ */
53
+ getWebsite() {
54
+ return this.website;
55
+ }
41
56
  }
42
57
  //# sourceMappingURL=s3-bucket.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"s3-bucket.js","sourceRoot":"","sources":["../../../../src/service/s3/bucket/s3-bucket.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAIzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAIxE;;GAEG;AACH,MAAM,OAAO,WAAW;IAKZ;IAJM,UAAU,CAAS;IAEnC,YACE,aAAkC,EAC1B,UAA8B,IAAI,qBAAqB,EAAE;QAAzD,YAAO,GAAP,OAAO,CAAkD;QAEjE,aAAa,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,EAAE,4BAA4B,CAAC,CAAC;QACxE,IAAI,CAAC,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,mBAAmB,CAAC,OAA2B;QAC7C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACvE,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,MAAmB;QACjC,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,GAAW;QACzB,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,MAAe;QAC/B,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC;CACF"}
1
+ {"version":3,"file":"s3-bucket.js","sourceRoot":"","sources":["../../../../src/service/s3/bucket/s3-bucket.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAIzD,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAIjE;;GAEG;AACH,MAAM,OAAO,WAAW;IAKZ;IACA;IALM,UAAU,CAAS;IAEnC,YACE,aAAkC,EAC1B,UAA8B,IAAI,qBAAqB,EAAE,EACzD,UAA2B,IAAI,eAAe,EAAE;QADhD,YAAO,GAAP,OAAO,CAAkD;QACzD,YAAO,GAAP,OAAO,CAAyC;QAExD,aAAa,CAAC,aAAa,CAAC,KAAK,CAAC,MAAM,EAAE,4BAA4B,CAAC,CAAC;QACxE,IAAI,CAAC,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,MAAmB;QACjC,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,GAAW;QACzB,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC3C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,MAAe;QAC/B,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC;IAED;;OAEG;IACH,mBAAmB,CAAC,OAA2B;QAC7C,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;QACvE,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,gBAAgB,CAAC,OAAwB;QACvC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED;;OAEG;IACH,UAAU;QACR,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;CACF"}
@@ -0,0 +1,39 @@
1
+ import type { WebsiteConfiguration } from "@aws-sdk/client-s3";
2
+ /**
3
+ * Static website configuration for simulated S3 bucket.
4
+ *
5
+ * https://docs.aws.amazon.com/AmazonS3/latest/userguide/HostingWebsiteOnS3Setup.html
6
+ */
7
+ export declare class S3BucketWebsite {
8
+ private readonly websiteConfiguration;
9
+ constructor(websiteConfiguration?: WebsiteConfiguration);
10
+ /**
11
+ * Is static website hosting enabled for this simulated S3 bucket?
12
+ */
13
+ websiteEnabled(): boolean;
14
+ /**
15
+ * Does this website configuration redirect all requests?
16
+ */
17
+ redirectsAllRequests(): boolean;
18
+ /**
19
+ * Choose the S3 object key that should be served for a website request.
20
+ */
21
+ objectKeyForRequest(objectKey: string): string;
22
+ /**
23
+ * Get the S3 object key for this website's error document, if configured.
24
+ */
25
+ errorDocumentKey(): string | undefined;
26
+ /**
27
+ * Choose an appropriate response for a request response pair based on static
28
+ * website configuration for this simulated S3 bucket.
29
+ */
30
+ redirectForRequestResponse(req: Request, res: Response): Response;
31
+ private routingRuleMatches;
32
+ private redirectResponse;
33
+ private requestKey;
34
+ private matchingKeyPrefix;
35
+ private indexDocumentSpecified;
36
+ private errorDocumentSpecified;
37
+ private routingRulesSpecified;
38
+ }
39
+ //# sourceMappingURL=s3-bucket-website.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s3-bucket-website.d.ts","sourceRoot":"","sources":["../../../../../src/service/s3/bucket/website/s3-bucket-website.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAQ/D;;;;GAIG;AACH,qBAAa,eAAe;IAExB,OAAO,CAAC,QAAQ,CAAC,oBAAoB;gBAApB,oBAAoB,GAAE,oBAAyB;IAGlE;;OAEG;IACH,cAAc,IAAI,OAAO;IASzB;;OAEG;IACH,oBAAoB,IAAI,OAAO;IAM/B;;OAEG;IACH,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAkB9C;;OAEG;IACH,gBAAgB,IAAI,MAAM,GAAG,SAAS;IAItC;;;OAGG;IACH,0BAA0B,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,QAAQ;IA0BjE,OAAO,CAAC,kBAAkB;IAwB1B,OAAO,CAAC,gBAAgB;IA6BxB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,sBAAsB;IAI9B,OAAO,CAAC,sBAAsB;IAI9B,OAAO,CAAC,qBAAqB;CAO9B"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Static website configuration for simulated S3 bucket.
3
+ *
4
+ * https://docs.aws.amazon.com/AmazonS3/latest/userguide/HostingWebsiteOnS3Setup.html
5
+ */
6
+ export class S3BucketWebsite {
7
+ websiteConfiguration;
8
+ constructor(websiteConfiguration = {}) {
9
+ this.websiteConfiguration = websiteConfiguration;
10
+ }
11
+ /**
12
+ * Is static website hosting enabled for this simulated S3 bucket?
13
+ */
14
+ websiteEnabled() {
15
+ return (this.indexDocumentSpecified() ||
16
+ this.errorDocumentSpecified() ||
17
+ this.redirectsAllRequests() ||
18
+ this.routingRulesSpecified());
19
+ }
20
+ /**
21
+ * Does this website configuration redirect all requests?
22
+ */
23
+ redirectsAllRequests() {
24
+ return (this.websiteConfiguration.RedirectAllRequestsTo?.HostName !== undefined);
25
+ }
26
+ /**
27
+ * Choose the S3 object key that should be served for a website request.
28
+ */
29
+ objectKeyForRequest(objectKey) {
30
+ const indexSuffix = this.websiteConfiguration.IndexDocument?.Suffix;
31
+ if (indexSuffix === undefined) {
32
+ return objectKey;
33
+ }
34
+ if (objectKey === "") {
35
+ return indexSuffix;
36
+ }
37
+ if (objectKey.endsWith("/")) {
38
+ return `${objectKey}${indexSuffix}`;
39
+ }
40
+ return objectKey;
41
+ }
42
+ /**
43
+ * Get the S3 object key for this website's error document, if configured.
44
+ */
45
+ errorDocumentKey() {
46
+ return this.websiteConfiguration.ErrorDocument?.Key;
47
+ }
48
+ /**
49
+ * Choose an appropriate response for a request response pair based on static
50
+ * website configuration for this simulated S3 bucket.
51
+ */
52
+ redirectForRequestResponse(req, res) {
53
+ if (!this.websiteEnabled()) {
54
+ return res;
55
+ }
56
+ const redirectAllRequestsTo = this.websiteConfiguration.RedirectAllRequestsTo;
57
+ if (redirectAllRequestsTo !== undefined) {
58
+ return this.redirectResponse(req, {
59
+ HostName: redirectAllRequestsTo.HostName,
60
+ Protocol: redirectAllRequestsTo.Protocol,
61
+ });
62
+ }
63
+ const routingRule = this.websiteConfiguration.RoutingRules?.find((rule) => this.routingRuleMatches(rule, req, res));
64
+ if (routingRule?.Redirect !== undefined) {
65
+ return this.redirectResponse(req, routingRule.Redirect);
66
+ }
67
+ return res;
68
+ }
69
+ routingRuleMatches(rule, req, res) {
70
+ const condition = rule.Condition;
71
+ if (condition === undefined) {
72
+ return true;
73
+ }
74
+ if (condition.HttpErrorCodeReturnedEquals !== undefined &&
75
+ condition.HttpErrorCodeReturnedEquals !== String(res.status)) {
76
+ return false;
77
+ }
78
+ return !(condition.KeyPrefixEquals !== undefined &&
79
+ !this.requestKey(req).startsWith(condition.KeyPrefixEquals));
80
+ }
81
+ redirectResponse(req, redirect) {
82
+ const url = new URL(req.url);
83
+ if (redirect.Protocol !== undefined) {
84
+ url.protocol = `${redirect.Protocol}:`;
85
+ }
86
+ if (redirect.HostName !== undefined) {
87
+ url.hostname = redirect.HostName;
88
+ url.port = "";
89
+ }
90
+ if (redirect.ReplaceKeyWith !== undefined) {
91
+ url.pathname = `/${redirect.ReplaceKeyWith}`;
92
+ }
93
+ else if (redirect.ReplaceKeyPrefixWith !== undefined) {
94
+ url.pathname = `/${this.requestKey(req).replace(this.matchingKeyPrefix(req), redirect.ReplaceKeyPrefixWith)}`;
95
+ }
96
+ return new Response(undefined, {
97
+ status: Number(redirect.HttpRedirectCode ?? "301"),
98
+ headers: {
99
+ location: url.toString(),
100
+ },
101
+ });
102
+ }
103
+ requestKey(req) {
104
+ return new URL(req.url).pathname.replace(/^\/+/, "");
105
+ }
106
+ matchingKeyPrefix(req) {
107
+ const requestKey = this.requestKey(req);
108
+ return (this.websiteConfiguration.RoutingRules?.find((rule) => {
109
+ const keyPrefix = rule.Condition?.KeyPrefixEquals;
110
+ return keyPrefix !== undefined && requestKey.startsWith(keyPrefix);
111
+ })?.Condition?.KeyPrefixEquals ?? "");
112
+ }
113
+ indexDocumentSpecified() {
114
+ return this.websiteConfiguration.IndexDocument?.Suffix !== undefined;
115
+ }
116
+ errorDocumentSpecified() {
117
+ return this.errorDocumentKey() !== undefined;
118
+ }
119
+ routingRulesSpecified() {
120
+ return Boolean(this.websiteConfiguration.RoutingRules?.some((rule) => rule.Redirect !== undefined));
121
+ }
122
+ }
123
+ //# sourceMappingURL=s3-bucket-website.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s3-bucket-website.js","sourceRoot":"","sources":["../../../../../src/service/s3/bucket/website/s3-bucket-website.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { CommandHandler } from "../../../../command/command-handler.js";
2
+ import { type PutBucketWebsiteCommand, type PutBucketWebsiteCommandOutput } from "@aws-sdk/client-s3";
3
+ import type { SimS3Bucket, SimS3BucketName } from "../../bucket/s3-bucket.js";
4
+ /**
5
+ * Simulated S3 PutBucketWebsiteCommand handler.
6
+ *
7
+ * https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/s3/command/PutBucketWebsiteCommand/
8
+ */
9
+ export declare class PutBucketWebsiteCommandHandler implements CommandHandler<PutBucketWebsiteCommand, PutBucketWebsiteCommandOutput> {
10
+ private readonly buckets;
11
+ constructor(buckets: Map<SimS3BucketName, SimS3Bucket>);
12
+ /**
13
+ * Configure static website hosting for an S3 Bucket.
14
+ */
15
+ handle(cmd: PutBucketWebsiteCommand): Promise<PutBucketWebsiteCommandOutput>;
16
+ }
17
+ //# sourceMappingURL=put-bucket-website.handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"put-bucket-website.handler.d.ts","sourceRoot":"","sources":["../../../../../src/service/s3/command/put-bucket-website/put-bucket-website.handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AAC7E,OAAO,EAEL,KAAK,uBAAuB,EAC5B,KAAK,6BAA6B,EACnC,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAM9E;;;;GAIG;AACH,qBAAa,8BAA+B,YAAW,cAAc,CACnE,uBAAuB,EACvB,6BAA6B,CAC9B;IACa,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,GAAG,CAAC,eAAe,EAAE,WAAW,CAAC;IAEvE;;OAEG;IACG,MAAM,CACV,GAAG,EAAE,uBAAuB,GAC3B,OAAO,CAAC,6BAA6B,CAAC;CA2B1C"}
@@ -0,0 +1,37 @@
1
+ import { NoSuchBucket, } from "@aws-sdk/client-s3";
2
+ import { S3BucketWebsite } from "../../bucket/website/s3-bucket-website.js";
3
+ import { assertDefined } from "../../../../util/defined.js";
4
+ import { jitter } from "../../../../util/sleep.js";
5
+ // eslint-disable-next-line no-secrets/no-secrets -- false positive on URL
6
+ /**
7
+ * Simulated S3 PutBucketWebsiteCommand handler.
8
+ *
9
+ * https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/s3/command/PutBucketWebsiteCommand/
10
+ */
11
+ export class PutBucketWebsiteCommandHandler {
12
+ buckets;
13
+ constructor(buckets) {
14
+ this.buckets = buckets;
15
+ }
16
+ /**
17
+ * Configure static website hosting for an S3 Bucket.
18
+ */
19
+ async handle(cmd) {
20
+ assertDefined(cmd.input.Bucket, "PutBucketWebsiteCommand.input.Bucket");
21
+ assertDefined(cmd.input.WebsiteConfiguration, "PutBucketWebsiteCommand.input.WebsiteConfiguration");
22
+ const bucketName = cmd.input.Bucket;
23
+ const bucket = this.buckets.get(bucketName);
24
+ if (bucket === undefined) {
25
+ throw new NoSuchBucket({
26
+ message: `No S3 Bucket named ${bucketName}`,
27
+ $metadata: {},
28
+ });
29
+ }
30
+ await jitter();
31
+ bucket.configureWebsite(new S3BucketWebsite(cmd.input.WebsiteConfiguration));
32
+ return {
33
+ $metadata: {},
34
+ };
35
+ }
36
+ }
37
+ //# sourceMappingURL=put-bucket-website.handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"put-bucket-website.handler.js","sourceRoot":"","sources":["../../../../../src/service/s3/command/put-bucket-website/put-bucket-website.handler.ts"],"names":[],"mappings":"AACA,OAAO,EACL,YAAY,GAGb,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAAE,eAAe,EAAE,MAAM,2CAA2C,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AAEnD,0EAA0E;AAC1E;;;;GAIG;AACH,MAAM,OAAO,8BAA8B;IAIZ;IAA7B,YAA6B,OAA0C;QAA1C,YAAO,GAAP,OAAO,CAAmC;IAAG,CAAC;IAE3E;;OAEG;IACH,KAAK,CAAC,MAAM,CACV,GAA4B;QAE5B,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,sCAAsC,CAAC,CAAC;QACxE,aAAa,CACX,GAAG,CAAC,KAAK,CAAC,oBAAoB,EAC9B,oDAAoD,CACrD,CAAC;QAEF,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,MAAyB,CAAC;QACvD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAE5C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,IAAI,YAAY,CAAC;gBACrB,OAAO,EAAE,sBAAsB,UAAU,EAAE;gBAC3C,SAAS,EAAE,EAAE;aACd,CAAC,CAAC;QACL,CAAC;QAED,MAAM,MAAM,EAAE,CAAC;QAEf,MAAM,CAAC,gBAAgB,CACrB,IAAI,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,oBAAoB,CAAC,CACpD,CAAC;QAEF,OAAO;YACL,SAAS,EAAE,EAAE;SACd,CAAC;IACJ,CAAC;CACF"}
@@ -7,5 +7,8 @@ export declare class SimS3GetObjectController {
7
7
  * Handle a GET request for an S3 Object via simulated S3.
8
8
  */
9
9
  handleRequest(bucket: SimS3Bucket, objectKey: string, request: Request): Promise<Response>;
10
+ private websiteResponse;
11
+ private foundObjectResponse;
12
+ private notFoundResponse;
10
13
  }
11
14
  //# sourceMappingURL=sim-s3-get-obj-controller.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sim-s3-get-obj-controller.d.ts","sourceRoot":"","sources":["../../../../src/service/s3/serve/sim-s3-get-obj-controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1D;;GAEG;AACH,qBAAa,wBAAwB;IACnC;;OAEG;IACG,aAAa,CACjB,MAAM,EAAE,WAAW,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,QAAQ,CAAC;CA+BrB"}
1
+ {"version":3,"file":"sim-s3-get-obj-controller.d.ts","sourceRoot":"","sources":["../../../../src/service/s3/serve/sim-s3-get-obj-controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAG1D;;GAEG;AACH,qBAAa,wBAAwB;IACnC;;OAEG;IACG,aAAa,CACjB,MAAM,EAAE,WAAW,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,QAAQ,CAAC;YA2BN,eAAe;IA0B7B,OAAO,CAAC,mBAAmB;IAyB3B,OAAO,CAAC,gBAAgB;CAWzB"}
@@ -6,15 +6,38 @@ export class SimS3GetObjectController {
6
6
  * Handle a GET request for an S3 Object via simulated S3.
7
7
  */
8
8
  async handleRequest(bucket, objectKey, request) {
9
- const object = await bucket.getObject(objectKey);
10
- if (object === undefined) {
11
- return new Response("Object not found\n", {
12
- status: 404,
9
+ const website = bucket.getWebsite();
10
+ if (!website.websiteEnabled()) {
11
+ return new Response(`Static website hosting is not enabled for bucket ${bucket.bucketName}\n`, {
12
+ status: 403,
13
13
  headers: {
14
14
  "content-type": "text/plain; charset=utf-8",
15
15
  },
16
16
  });
17
17
  }
18
+ if (website.redirectsAllRequests()) {
19
+ return website.redirectForRequestResponse(request, new Response(undefined));
20
+ }
21
+ const response = await this.websiteResponse(bucket, objectKey, request);
22
+ return website.redirectForRequestResponse(request, response);
23
+ }
24
+ async websiteResponse(bucket, objectKey, request) {
25
+ const website = bucket.getWebsite();
26
+ const websiteObjectKey = website.objectKeyForRequest(objectKey);
27
+ const object = await bucket.getObject(websiteObjectKey);
28
+ if (object !== undefined) {
29
+ return this.foundObjectResponse(object, request);
30
+ }
31
+ const errorDocumentKey = website.errorDocumentKey();
32
+ if (errorDocumentKey !== undefined) {
33
+ const errorDocumentObject = await bucket.getObject(errorDocumentKey);
34
+ if (errorDocumentObject !== undefined) {
35
+ return this.foundObjectResponse(errorDocumentObject, request, 404);
36
+ }
37
+ }
38
+ return this.notFoundResponse(bucket, websiteObjectKey);
39
+ }
40
+ foundObjectResponse(object, request, status = 200) {
18
41
  const contentType = object.metadata.values["content-type"];
19
42
  const headers = {
20
43
  "content-length": String(object.body.length),
@@ -22,14 +45,22 @@ export class SimS3GetObjectController {
22
45
  };
23
46
  if (request.method === "HEAD") {
24
47
  return new Response(undefined, {
25
- status: 200,
48
+ status,
26
49
  headers,
27
50
  });
28
51
  }
29
52
  return new Response(object.body, {
30
- status: 200,
53
+ status,
31
54
  headers,
32
55
  });
33
56
  }
57
+ notFoundResponse(bucket, objectKey) {
58
+ return new Response(`Object ${objectKey} not found in bucket ${bucket.bucketName}`, {
59
+ status: 404,
60
+ headers: {
61
+ "content-type": "text/plain; charset=utf-8",
62
+ },
63
+ });
64
+ }
34
65
  }
35
66
  //# sourceMappingURL=sim-s3-get-obj-controller.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sim-s3-get-obj-controller.js","sourceRoot":"","sources":["../../../../src/service/s3/serve/sim-s3-get-obj-controller.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,OAAO,wBAAwB;IACnC;;OAEG;IACH,KAAK,CAAC,aAAa,CACjB,MAAmB,EACnB,SAAiB,EACjB,OAAgB;QAEhB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAEjD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO,IAAI,QAAQ,CAAC,oBAAoB,EAAE;gBACxC,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE;oBACP,cAAc,EAAE,2BAA2B;iBAC5C;aACF,CAAC,CAAC;QACL,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAE3D,MAAM,OAAO,GAAG;YACd,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;YAC5C,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC;SACtE,CAAC;QAEF,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC9B,OAAO,IAAI,QAAQ,CAAC,SAAS,EAAE;gBAC7B,MAAM,EAAE,GAAG;gBACX,OAAO;aACR,CAAC,CAAC;QACL,CAAC;QAED,OAAO,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE;YAC/B,MAAM,EAAE,GAAG;YACX,OAAO;SACR,CAAC,CAAC;IACL,CAAC;CACF"}
1
+ {"version":3,"file":"sim-s3-get-obj-controller.js","sourceRoot":"","sources":["../../../../src/service/s3/serve/sim-s3-get-obj-controller.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"sim-s3-req-router.d.ts","sourceRoot":"","sources":["../../../../src/service/s3/serve/sim-s3-req-router.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qDAAqD,CAAC;AAE/F,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,UAAU,GAAG,mBAAmB,GAAG,iBAAiB,CAAC;AAEjE;;GAEG;AACH,qBAAa,kBAAkB;IACjB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,MAAM;IAE3C;;OAEG;IACH,KAAK,CAAC,MAAM,EAAE,mBAAmB,EAAE,OAAO,EAAE,OAAO,GAAG,UAAU;CA4EjE"}
1
+ {"version":3,"file":"sim-s3-req-router.d.ts","sourceRoot":"","sources":["../../../../src/service/s3/serve/sim-s3-req-router.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qDAAqD,CAAC;AAE/F,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,MAAM,UAAU,GAAG,mBAAmB,GAAG,iBAAiB,CAAC;AAEjE;;GAEG;AACH,qBAAa,kBAAkB;IACjB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,MAAM;IAE3C;;OAEG;IACH,KAAK,CAAC,MAAM,EAAE,mBAAmB,EAAE,OAAO,EAAE,OAAO,GAAG,UAAU;CAoEjE"}
@@ -33,13 +33,6 @@ export class SimS3RequestRouter {
33
33
  }
34
34
  const url = new URL(request.url);
35
35
  const objectKey = decodeURIComponent(url.pathname.replace(/^\/+/u, ""));
36
- if (objectKey.length === 0) {
37
- return {
38
- action: "failure",
39
- statusCode: 501,
40
- message: "S3 Bucket indexes are not implemented\n",
41
- };
42
- }
43
36
  const bucketName = target.resourceName;
44
37
  const bucketScope = this.simAws
45
38
  .s3GlobalRegistry()
@@ -1 +1 @@
1
- {"version":3,"file":"sim-s3-req-router.js","sourceRoot":"","sources":["../../../../src/service/s3/serve/sim-s3-req-router.ts"],"names":[],"mappings":"AAmBA;;GAEG;AACH,MAAM,OAAO,kBAAkB;IACA;IAA7B,YAA6B,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;IAAG,CAAC;IAE/C;;OAEG;IACH,KAAK,CAAC,MAA2B,EAAE,OAAgB;QACjD,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC1D,OAAO;gBACL,MAAM,EAAE,SAAS;gBACjB,UAAU,EAAE,GAAG;gBACf,OAAO,EAAE,sBAAsB;aAChC,CAAC;QACJ,CAAC;QAED,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrC,OAAO;gBACL,MAAM,EAAE,SAAS;gBACjB,UAAU,EAAE,GAAG;gBACf,OAAO,EAAE,0BAA0B;aACpC,CAAC;QACJ,CAAC;QAED,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YACpC,OAAO;gBACL,MAAM,EAAE,SAAS;gBACjB,UAAU,EAAE,GAAG;gBACf,OAAO,EAAE,4BAA4B;aACtC,CAAC;QACJ,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,SAAS,GAAG,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;QAExE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO;gBACL,MAAM,EAAE,SAAS;gBACjB,UAAU,EAAE,GAAG;gBACf,OAAO,EAAE,yCAAyC;aACnD,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,CAAC,YAA+B,CAAC;QAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM;aAC5B,gBAAgB,EAAE;aAClB,eAAe,CAAC,UAAU,CAAC,CAAC;QAE/B,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,OAAO;gBACL,MAAM,EAAE,SAAS;gBACjB,UAAU,EAAE,GAAG;gBACf,OAAO,EAAE,mBAAmB,UAAU,YAAY;aACnD,CAAC;QACJ,CAAC;QAED,IAAI,WAAW,CAAC,UAAU,KAAK,MAAM,CAAC,UAAU,EAAE,CAAC;YACjD,OAAO;gBACL,MAAM,EAAE,SAAS;gBACjB,UAAU,EAAE,GAAG;gBACf,OAAO,EAAE,mBAAmB,UAAU,iBAAiB,WAAW,CAAC,UAAU,mBAAmB,MAAM,CAAC,UAAU,EAAE;aACpH,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM;aACvB,kBAAkB,CAAC,WAAW,CAAC,SAAS,EAAE,WAAW,CAAC,UAAU,CAAC;aACjE,EAAE,EAAE;aACJ,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAElC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO;gBACL,MAAM,EAAE,SAAS;gBACjB,UAAU,EAAE,GAAG;gBACf,OAAO,EAAE,mBAAmB,UAAU,YAAY;aACnD,CAAC;QACJ,CAAC;QAED,OAAO;YACL,MAAM,EAAE,WAAW;YACnB,MAAM;YACN,SAAS;SACV,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"sim-s3-req-router.js","sourceRoot":"","sources":["../../../../src/service/s3/serve/sim-s3-req-router.ts"],"names":[],"mappings":"AAmBA;;GAEG;AACH,MAAM,OAAO,kBAAkB;IACA;IAA7B,YAA6B,MAAc;QAAd,WAAM,GAAN,MAAM,CAAQ;IAAG,CAAC;IAE/C;;OAEG;IACH,KAAK,CAAC,MAA2B,EAAE,OAAgB;QACjD,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YAC1D,OAAO;gBACL,MAAM,EAAE,SAAS;gBACjB,UAAU,EAAE,GAAG;gBACf,OAAO,EAAE,sBAAsB;aAChC,CAAC;QACJ,CAAC;QAED,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrC,OAAO;gBACL,MAAM,EAAE,SAAS;gBACjB,UAAU,EAAE,GAAG;gBACf,OAAO,EAAE,0BAA0B;aACpC,CAAC;QACJ,CAAC;QAED,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;YACpC,OAAO;gBACL,MAAM,EAAE,SAAS;gBACjB,UAAU,EAAE,GAAG;gBACf,OAAO,EAAE,4BAA4B;aACtC,CAAC;QACJ,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,SAAS,GAAG,kBAAkB,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;QAExE,MAAM,UAAU,GAAG,MAAM,CAAC,YAA+B,CAAC;QAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM;aAC5B,gBAAgB,EAAE;aAClB,eAAe,CAAC,UAAU,CAAC,CAAC;QAE/B,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,OAAO;gBACL,MAAM,EAAE,SAAS;gBACjB,UAAU,EAAE,GAAG;gBACf,OAAO,EAAE,mBAAmB,UAAU,YAAY;aACnD,CAAC;QACJ,CAAC;QAED,IAAI,WAAW,CAAC,UAAU,KAAK,MAAM,CAAC,UAAU,EAAE,CAAC;YACjD,OAAO;gBACL,MAAM,EAAE,SAAS;gBACjB,UAAU,EAAE,GAAG;gBACf,OAAO,EAAE,mBAAmB,UAAU,iBAAiB,WAAW,CAAC,UAAU,mBAAmB,MAAM,CAAC,UAAU,EAAE;aACpH,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM;aACvB,kBAAkB,CAAC,WAAW,CAAC,SAAS,EAAE,WAAW,CAAC,UAAU,CAAC;aACjE,EAAE,EAAE;aACJ,kBAAkB,CAAC,UAAU,CAAC,CAAC;QAElC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,OAAO;gBACL,MAAM,EAAE,SAAS;gBACjB,UAAU,EAAE,GAAG;gBACf,OAAO,EAAE,mBAAmB,UAAU,YAAY;aACnD,CAAC;QACJ,CAAC;QAED,OAAO;YACL,MAAM,EAAE,WAAW;YACnB,MAAM;YACN,SAAS;SACV,CAAC;IACJ,CAAC;CACF"}
@@ -1,5 +1,5 @@
1
1
  import type { SimS3Bucket, SimS3BucketName } from "./bucket/s3-bucket.js";
2
- import type { CreateBucketCommand, CreateBucketCommandOutput, GetObjectCommand, GetObjectCommandOutput, ListBucketsCommand, ListBucketsCommandOutput, ListObjectsCommand, ListObjectsCommandOutput, PutObjectCommand, PutObjectCommandOutput } from "@aws-sdk/client-s3";
2
+ import type { CreateBucketCommand, CreateBucketCommandOutput, GetObjectCommand, GetObjectCommandOutput, ListBucketsCommand, ListBucketsCommandOutput, ListObjectsCommand, ListObjectsCommandOutput, PutBucketWebsiteCommand, PutBucketWebsiteCommandOutput, PutObjectCommand, PutObjectCommandOutput } from "@aws-sdk/client-s3";
3
3
  import { SimS3GlobalRegistry } from "./sim-s3-global-registry.js";
4
4
  import { type SimAwsAccountRegionScope } from "../aws/sim-aws-account-region-scope.js";
5
5
  /**
@@ -14,6 +14,10 @@ export declare class SimS3 {
14
14
  * Handle a Create Bucket Command from the SDK.
15
15
  */
16
16
  createBucket(cmd: CreateBucketCommand): Promise<CreateBucketCommandOutput>;
17
+ /**
18
+ * Handle a Put Bucket Website Command from the SDK.
19
+ */
20
+ putBucketWebsite(cmd: PutBucketWebsiteCommand): Promise<PutBucketWebsiteCommandOutput>;
17
21
  /**
18
22
  * Handle a List Buckets Command from the SDK.
19
23
  */
@@ -1 +1 @@
1
- {"version":3,"file":"sim-s3.d.ts","sourceRoot":"","sources":["../../../src/service/s3/sim-s3.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,KAAK,EACV,mBAAmB,EACnB,yBAAyB,EACzB,gBAAgB,EAChB,sBAAsB,EACtB,kBAAkB,EAClB,wBAAwB,EACxB,kBAAkB,EAClB,wBAAwB,EACxB,gBAAgB,EAChB,sBAAsB,EACvB,MAAM,oBAAoB,CAAC;AAM5B,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EACL,KAAK,wBAAwB,EAE9B,MAAM,wCAAwC,CAAC;AAEhD;;GAEG;AACH,qBAAa,KAAK;IAId,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IAJnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2C;gBAGhD,kBAAkB,GAAE,wBAAiE,EACrF,gBAAgB,GAAE,mBAA+C;IAGpF;;OAEG;IACG,YAAY,CAChB,GAAG,EAAE,mBAAmB,GACvB,OAAO,CAAC,yBAAyB,CAAC;IASrC;;OAEG;IACG,WAAW,CACf,GAAG,EAAE,kBAAkB,GACtB,OAAO,CAAC,wBAAwB,CAAC;IAKpC;;OAEG;IACG,SAAS,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAKvE;;OAEG;IACG,SAAS,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAKvE;;OAEG;IACG,WAAW,CACf,GAAG,EAAE,kBAAkB,GACtB,OAAO,CAAC,wBAAwB,CAAC;IAKpC;;OAEG;IACH,kBAAkB,CAAC,UAAU,EAAE,eAAe,GAAG,WAAW,GAAG,SAAS;CAGzE"}
1
+ {"version":3,"file":"sim-s3.d.ts","sourceRoot":"","sources":["../../../src/service/s3/sim-s3.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,KAAK,EACV,mBAAmB,EACnB,yBAAyB,EACzB,gBAAgB,EAChB,sBAAsB,EACtB,kBAAkB,EAClB,wBAAwB,EACxB,kBAAkB,EAClB,wBAAwB,EACxB,uBAAuB,EACvB,6BAA6B,EAC7B,gBAAgB,EAChB,sBAAsB,EACvB,MAAM,oBAAoB,CAAC;AAM5B,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EACL,KAAK,wBAAwB,EAE9B,MAAM,wCAAwC,CAAC;AAGhD;;GAEG;AACH,qBAAa,KAAK;IAId,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IACnC,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IAJnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2C;gBAGhD,kBAAkB,GAAE,wBAAiE,EACrF,gBAAgB,GAAE,mBAA+C;IAGpF;;OAEG;IACG,YAAY,CAChB,GAAG,EAAE,mBAAmB,GACvB,OAAO,CAAC,yBAAyB,CAAC;IASrC;;OAEG;IACG,gBAAgB,CACpB,GAAG,EAAE,uBAAuB,GAC3B,OAAO,CAAC,6BAA6B,CAAC;IAKzC;;OAEG;IACG,WAAW,CACf,GAAG,EAAE,kBAAkB,GACtB,OAAO,CAAC,wBAAwB,CAAC;IAKpC;;OAEG;IACG,SAAS,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAKvE;;OAEG;IACG,SAAS,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAKvE;;OAEG;IACG,WAAW,CACf,GAAG,EAAE,kBAAkB,GACtB,OAAO,CAAC,wBAAwB,CAAC;IAKpC;;OAEG;IACH,kBAAkB,CAAC,UAAU,EAAE,eAAe,GAAG,WAAW,GAAG,SAAS;CAGzE"}
@@ -5,6 +5,7 @@ import { GetObjectCommandHandler } from "./command/get-object/get-object.handler
5
5
  import { ListObjectsCommandHandler } from "./command/list-objects/list-objects.handler.js";
6
6
  import { SimS3GlobalRegistry } from "./sim-s3-global-registry.js";
7
7
  import { simAwsAccountRegionScopeFactory, } from "../aws/sim-aws-account-region-scope.js";
8
+ import { PutBucketWebsiteCommandHandler } from "./command/put-bucket-website/put-bucket-website.handler.js";
8
9
  /**
9
10
  * Simulated S3. Handles SDK commands. Emulates AWS behaviour and state.
10
11
  */
@@ -23,6 +24,13 @@ export class SimS3 {
23
24
  const handler = new CreateBucketCommandHandler(this.accountRegionScope, this.buckets, this.s3GlobalRegistry);
24
25
  return await handler.handle(cmd);
25
26
  }
27
+ /**
28
+ * Handle a Put Bucket Website Command from the SDK.
29
+ */
30
+ async putBucketWebsite(cmd) {
31
+ const handler = new PutBucketWebsiteCommandHandler(this.buckets);
32
+ return await handler.handle(cmd);
33
+ }
26
34
  /**
27
35
  * Handle a List Buckets Command from the SDK.
28
36
  */
@@ -1 +1 @@
1
- {"version":3,"file":"sim-s3.js","sourceRoot":"","sources":["../../../src/service/s3/sim-s3.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,0BAA0B,EAAE,MAAM,kDAAkD,CAAC;AAC9F,OAAO,EAAE,yBAAyB,EAAE,MAAM,gDAAgD,CAAC;AAC3F,OAAO,EAAE,uBAAuB,EAAE,MAAM,4CAA4C,CAAC;AACrF,OAAO,EAAE,uBAAuB,EAAE,MAAM,4CAA4C,CAAC;AACrF,OAAO,EAAE,yBAAyB,EAAE,MAAM,gDAAgD,CAAC;AAC3F,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAEL,+BAA+B,GAChC,MAAM,wCAAwC,CAAC;AAEhD;;GAEG;AACH,MAAM,OAAO,KAAK;IAIG;IACA;IAJF,OAAO,GAAG,IAAI,GAAG,EAAgC,CAAC;IAEnE,YACmB,qBAA+C,+BAA+B,CAAC,IAAI,EAAE,EACrF,mBAAwC,IAAI,mBAAmB,EAAE;QADjE,uBAAkB,GAAlB,kBAAkB,CAAmE;QACrF,qBAAgB,GAAhB,gBAAgB,CAAiD;IACjF,CAAC;IAEJ;;OAEG;IACH,KAAK,CAAC,YAAY,CAChB,GAAwB;QAExB,MAAM,OAAO,GAAG,IAAI,0BAA0B,CAC5C,IAAI,CAAC,kBAAkB,EACvB,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,gBAAgB,CACtB,CAAC;QACF,OAAO,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CACf,GAAuB;QAEvB,MAAM,OAAO,GAAG,IAAI,yBAAyB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5D,OAAO,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,GAAqB;QACnC,MAAM,OAAO,GAAG,IAAI,uBAAuB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1D,OAAO,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,GAAqB;QACnC,MAAM,OAAO,GAAG,IAAI,uBAAuB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1D,OAAO,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CACf,GAAuB;QAEvB,MAAM,OAAO,GAAG,IAAI,yBAAyB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5D,OAAO,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,UAA2B;QAC5C,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACtC,CAAC;CACF"}
1
+ {"version":3,"file":"sim-s3.js","sourceRoot":"","sources":["../../../src/service/s3/sim-s3.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,0BAA0B,EAAE,MAAM,kDAAkD,CAAC;AAC9F,OAAO,EAAE,yBAAyB,EAAE,MAAM,gDAAgD,CAAC;AAC3F,OAAO,EAAE,uBAAuB,EAAE,MAAM,4CAA4C,CAAC;AACrF,OAAO,EAAE,uBAAuB,EAAE,MAAM,4CAA4C,CAAC;AACrF,OAAO,EAAE,yBAAyB,EAAE,MAAM,gDAAgD,CAAC;AAC3F,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAEL,+BAA+B,GAChC,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,8BAA8B,EAAE,MAAM,4DAA4D,CAAC;AAE5G;;GAEG;AACH,MAAM,OAAO,KAAK;IAIG;IACA;IAJF,OAAO,GAAG,IAAI,GAAG,EAAgC,CAAC;IAEnE,YACmB,qBAA+C,+BAA+B,CAAC,IAAI,EAAE,EACrF,mBAAwC,IAAI,mBAAmB,EAAE;QADjE,uBAAkB,GAAlB,kBAAkB,CAAmE;QACrF,qBAAgB,GAAhB,gBAAgB,CAAiD;IACjF,CAAC;IAEJ;;OAEG;IACH,KAAK,CAAC,YAAY,CAChB,GAAwB;QAExB,MAAM,OAAO,GAAG,IAAI,0BAA0B,CAC5C,IAAI,CAAC,kBAAkB,EACvB,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,gBAAgB,CACtB,CAAC;QACF,OAAO,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CACpB,GAA4B;QAE5B,MAAM,OAAO,GAAG,IAAI,8BAA8B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjE,OAAO,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CACf,GAAuB;QAEvB,MAAM,OAAO,GAAG,IAAI,yBAAyB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5D,OAAO,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,GAAqB;QACnC,MAAM,OAAO,GAAG,IAAI,uBAAuB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1D,OAAO,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,GAAqB;QACnC,MAAM,OAAO,GAAG,IAAI,uBAAuB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1D,OAAO,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CACf,GAAuB;QAEvB,MAAM,OAAO,GAAG,IAAI,yBAAyB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5D,OAAO,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,UAA2B;QAC5C,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IACtC,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Create a temporary directory and return its path.
3
+ */
4
+ export declare function makeTempDir(): Promise<string>;
5
+ //# sourceMappingURL=temp-dir.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"temp-dir.d.ts","sourceRoot":"","sources":["../../../src/util/filesystem/temp-dir.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAQnD"}
@@ -0,0 +1,14 @@
1
+ import { mkdir, mkdtemp } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { tmpdir } from "node:os";
4
+ /**
5
+ * Create a temporary directory and return its path.
6
+ */
7
+ export async function makeTempDir() {
8
+ const tempRootPath = await mkdtemp(path.join(tmpdir(), "yulin-test-"));
9
+ const directoryPath = path.join(tempRootPath, "public");
10
+ // eslint-disable-next-line security/detect-non-literal-fs-filename
11
+ await mkdir(directoryPath);
12
+ return directoryPath;
13
+ }
14
+ //# sourceMappingURL=temp-dir.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"temp-dir.js","sourceRoot":"","sources":["../../../src/util/filesystem/temp-dir.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC;IACvE,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAExD,mEAAmE;IACnE,MAAM,KAAK,CAAC,aAAa,CAAC,CAAC;IAE3B,OAAO,aAAa,CAAC;AACvB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kensio/yulin",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "AWS system behaviour simulation for isolated unit testing",
5
5
  "repository": "https://github.com/KensioSoftware/yulin",
6
6
  "type": "module",
@@ -53,7 +53,7 @@
53
53
  "@aws-sdk/client-s3": "^3.1057.0",
54
54
  "@eslint/js": "^10.0.1",
55
55
  "@faker-js/faker": "^10.4.0",
56
- "@kensio/smartass": "^1.0.2",
56
+ "@kensio/smartass": "^1.1.0",
57
57
  "@smithy/smithy-client": "^4.13.5",
58
58
  "@smithy/types": "^4.14.2",
59
59
  "@types/eslint-plugin-security": "^3.0.1",