@kensio/yulin 0.2.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 (139) hide show
  1. package/README.md +89 -1
  2. package/dist/serve/controller/sim-aws-service-controller-container.d.ts +17 -0
  3. package/dist/serve/controller/sim-aws-service-controller-container.d.ts.map +1 -0
  4. package/dist/serve/controller/sim-aws-service-controller-container.js +29 -0
  5. package/dist/serve/controller/sim-aws-service-controller-container.js.map +1 -0
  6. package/dist/serve/controller/sim-service-controller.d.ts +22 -0
  7. package/dist/serve/controller/sim-service-controller.d.ts.map +1 -0
  8. package/dist/serve/controller/sim-service-controller.js +2 -0
  9. package/dist/serve/controller/sim-service-controller.js.map +1 -0
  10. package/dist/serve/http/sim-aws-http.d.ts +20 -0
  11. package/dist/serve/http/sim-aws-http.d.ts.map +1 -0
  12. package/dist/serve/http/sim-aws-http.js +57 -0
  13. package/dist/serve/http/sim-aws-http.js.map +1 -0
  14. package/dist/serve/http/sim-aws-local-server.d.ts +37 -0
  15. package/dist/serve/http/sim-aws-local-server.d.ts.map +1 -0
  16. package/dist/serve/http/sim-aws-local-server.js +132 -0
  17. package/dist/serve/http/sim-aws-local-server.js.map +1 -0
  18. package/dist/serve/http/sim-aws-local.conf.d.ts +8 -0
  19. package/dist/serve/http/sim-aws-local.conf.d.ts.map +1 -0
  20. package/dist/serve/http/sim-aws-local.conf.js +8 -0
  21. package/dist/serve/http/sim-aws-local.conf.js.map +1 -0
  22. package/dist/serve/index.d.ts +3 -0
  23. package/dist/serve/index.d.ts.map +1 -0
  24. package/dist/serve/index.js +3 -0
  25. package/dist/serve/index.js.map +1 -0
  26. package/dist/serve/resolve/sim-aws-local-service-resolver.d.ts +13 -0
  27. package/dist/serve/resolve/sim-aws-local-service-resolver.d.ts.map +1 -0
  28. package/dist/serve/resolve/sim-aws-local-service-resolver.js +38 -0
  29. package/dist/serve/resolve/sim-aws-local-service-resolver.js.map +1 -0
  30. package/dist/service/aws/arn.d.ts +17 -0
  31. package/dist/service/aws/arn.d.ts.map +1 -0
  32. package/dist/service/aws/arn.js +21 -0
  33. package/dist/service/aws/arn.js.map +1 -0
  34. package/dist/service/aws/sim-aws-account-region-scope.d.ts +38 -0
  35. package/dist/service/aws/sim-aws-account-region-scope.d.ts.map +1 -0
  36. package/dist/service/aws/sim-aws-account-region-scope.js +52 -0
  37. package/dist/service/aws/sim-aws-account-region-scope.js.map +1 -0
  38. package/dist/service/aws/sim-aws-account.d.ts +33 -0
  39. package/dist/service/aws/sim-aws-account.d.ts.map +1 -0
  40. package/dist/service/aws/sim-aws-account.js +38 -0
  41. package/dist/service/aws/sim-aws-account.js.map +1 -0
  42. package/dist/service/aws/sim-aws-region.d.ts +33 -0
  43. package/dist/service/aws/sim-aws-region.d.ts.map +1 -0
  44. package/dist/service/aws/sim-aws-region.js +74 -0
  45. package/dist/service/aws/sim-aws-region.js.map +1 -0
  46. package/dist/service/aws/sim-aws-services.d.ts +21 -0
  47. package/dist/service/aws/sim-aws-services.d.ts.map +1 -0
  48. package/dist/service/aws/sim-aws-services.js +2 -0
  49. package/dist/service/aws/sim-aws-services.js.map +1 -0
  50. package/dist/service/aws/sim-aws.d.ts +50 -0
  51. package/dist/service/aws/sim-aws.d.ts.map +1 -0
  52. package/dist/service/aws/sim-aws.js +82 -0
  53. package/dist/service/aws/sim-aws.js.map +1 -0
  54. package/dist/service/dynamodb/command/create-table/create-table.handler.d.ts +3 -1
  55. package/dist/service/dynamodb/command/create-table/create-table.handler.d.ts.map +1 -1
  56. package/dist/service/dynamodb/command/create-table/create-table.handler.js +7 -3
  57. package/dist/service/dynamodb/command/create-table/create-table.handler.js.map +1 -1
  58. package/dist/service/dynamodb/index.d.ts +1 -1
  59. package/dist/service/dynamodb/index.d.ts.map +1 -1
  60. package/dist/service/dynamodb/index.js +1 -1
  61. package/dist/service/dynamodb/index.js.map +1 -1
  62. package/dist/service/dynamodb/sim-dynamodb.d.ts +29 -0
  63. package/dist/service/dynamodb/sim-dynamodb.d.ts.map +1 -0
  64. package/dist/service/dynamodb/sim-dynamodb.js +47 -0
  65. package/dist/service/dynamodb/sim-dynamodb.js.map +1 -0
  66. package/dist/service/dynamodb/table/dynamodb-table.d.ts +7 -1
  67. package/dist/service/dynamodb/table/dynamodb-table.d.ts.map +1 -1
  68. package/dist/service/dynamodb/table/dynamodb-table.js +14 -1
  69. package/dist/service/dynamodb/table/dynamodb-table.js.map +1 -1
  70. package/dist/service/s3/bucket/s3-bucket.d.ts +18 -4
  71. package/dist/service/s3/bucket/s3-bucket.d.ts.map +1 -1
  72. package/dist/service/s3/bucket/s3-bucket.js +26 -11
  73. package/dist/service/s3/bucket/s3-bucket.js.map +1 -1
  74. package/dist/service/s3/bucket/website/s3-bucket-website.d.ts +39 -0
  75. package/dist/service/s3/bucket/website/s3-bucket-website.d.ts.map +1 -0
  76. package/dist/service/s3/bucket/website/s3-bucket-website.js +123 -0
  77. package/dist/service/s3/bucket/website/s3-bucket-website.js.map +1 -0
  78. package/dist/service/s3/command/create-bucket/create-bucket.handler.d.ts +5 -1
  79. package/dist/service/s3/command/create-bucket/create-bucket.handler.d.ts.map +1 -1
  80. package/dist/service/s3/command/create-bucket/create-bucket.handler.js +26 -5
  81. package/dist/service/s3/command/create-bucket/create-bucket.handler.js.map +1 -1
  82. package/dist/service/s3/command/get-object/get-object.handler.d.ts +2 -2
  83. package/dist/service/s3/command/get-object/get-object.handler.d.ts.map +1 -1
  84. package/dist/service/s3/command/get-object/get-object.handler.js.map +1 -1
  85. package/dist/service/s3/command/list-buckets/list-buckets.handler.d.ts +2 -2
  86. package/dist/service/s3/command/list-buckets/list-buckets.handler.d.ts.map +1 -1
  87. package/dist/service/s3/command/list-buckets/list-buckets.handler.js.map +1 -1
  88. package/dist/service/s3/command/list-objects/list-objects.handler.d.ts +2 -2
  89. package/dist/service/s3/command/list-objects/list-objects.handler.d.ts.map +1 -1
  90. package/dist/service/s3/command/list-objects/list-objects.handler.js.map +1 -1
  91. package/dist/service/s3/command/put-bucket-website/put-bucket-website.handler.d.ts +17 -0
  92. package/dist/service/s3/command/put-bucket-website/put-bucket-website.handler.d.ts.map +1 -0
  93. package/dist/service/s3/command/put-bucket-website/put-bucket-website.handler.js +37 -0
  94. package/dist/service/s3/command/put-bucket-website/put-bucket-website.handler.js.map +1 -0
  95. package/dist/service/s3/command/put-object/put-object.handler.d.ts +3 -2
  96. package/dist/service/s3/command/put-object/put-object.handler.d.ts.map +1 -1
  97. package/dist/service/s3/command/put-object/put-object.handler.js +9 -1
  98. package/dist/service/s3/command/put-object/put-object.handler.js.map +1 -1
  99. package/dist/service/s3/index.d.ts +1 -1
  100. package/dist/service/s3/index.d.ts.map +1 -1
  101. package/dist/service/s3/index.js +1 -1
  102. package/dist/service/s3/index.js.map +1 -1
  103. package/dist/service/s3/serve/sim-s3-controller.d.ts +15 -0
  104. package/dist/service/s3/serve/sim-s3-controller.d.ts.map +1 -0
  105. package/dist/service/s3/serve/sim-s3-controller.js +29 -0
  106. package/dist/service/s3/serve/sim-s3-controller.js.map +1 -0
  107. package/dist/service/s3/serve/sim-s3-get-obj-controller.d.ts +14 -0
  108. package/dist/service/s3/serve/sim-s3-get-obj-controller.d.ts.map +1 -0
  109. package/dist/service/s3/serve/sim-s3-get-obj-controller.js +66 -0
  110. package/dist/service/s3/serve/sim-s3-get-obj-controller.js.map +1 -0
  111. package/dist/service/s3/serve/sim-s3-req-router.d.ts +26 -0
  112. package/dist/service/s3/serve/sim-s3-req-router.d.ts.map +1 -0
  113. package/dist/service/s3/serve/sim-s3-req-router.js +72 -0
  114. package/dist/service/s3/serve/sim-s3-req-router.js.map +1 -0
  115. package/dist/service/s3/sim-s3-global-registry.d.ts +20 -0
  116. package/dist/service/s3/sim-s3-global-registry.d.ts.map +1 -0
  117. package/dist/service/s3/sim-s3-global-registry.js +22 -0
  118. package/dist/service/s3/sim-s3-global-registry.js.map +1 -0
  119. package/dist/service/s3/sim-s3.d.ts +42 -0
  120. package/dist/service/s3/sim-s3.d.ts.map +1 -0
  121. package/dist/service/s3/sim-s3.js +69 -0
  122. package/dist/service/s3/sim-s3.js.map +1 -0
  123. package/dist/service/s3/storage/s3-bucket-storage.d.ts +2 -16
  124. package/dist/service/s3/storage/s3-bucket-storage.d.ts.map +1 -1
  125. package/dist/service/s3/storage/s3-bucket-storage.js +1 -63
  126. package/dist/service/s3/storage/s3-bucket-storage.js.map +1 -1
  127. package/dist/service/s3/storage/s3-filesystem-storage.d.ts +59 -0
  128. package/dist/service/s3/storage/s3-filesystem-storage.d.ts.map +1 -0
  129. package/dist/service/s3/storage/s3-filesystem-storage.js +266 -0
  130. package/dist/service/s3/storage/s3-filesystem-storage.js.map +1 -0
  131. package/dist/service/s3/storage/s3-memory-storage.d.ts +27 -0
  132. package/dist/service/s3/storage/s3-memory-storage.d.ts.map +1 -0
  133. package/dist/service/s3/storage/s3-memory-storage.js +37 -0
  134. package/dist/service/s3/storage/s3-memory-storage.js.map +1 -0
  135. package/dist/util/filesystem/temp-dir.d.ts +5 -0
  136. package/dist/util/filesystem/temp-dir.d.ts.map +1 -0
  137. package/dist/util/filesystem/temp-dir.js +14 -0
  138. package/dist/util/filesystem/temp-dir.js.map +1 -0
  139. package/package.json +21 -9
@@ -1,64 +1,2 @@
1
- /**
2
- * Default in-memory simulated S3 Bucket storage.
3
- */
4
- export class MemoryS3BucketStorage {
5
- objects = new Map();
6
- /**
7
- * Get a simulated Object from in-memory storage.
8
- */
9
- getObject(key) {
10
- return Promise.resolve(this.objects.get(key));
11
- }
12
- /**
13
- * List simulated Objects in in-memory storage.
14
- */
15
- listObjects(prefix) {
16
- const objects = [...this.objects.entries()]
17
- .filter(([key]) => prefix === undefined || key.startsWith(prefix))
18
- .map(([, object]) => object);
19
- return Promise.resolve(objects);
20
- }
21
- /**
22
- * Put a simulated Object into in-memory storage.
23
- */
24
- putObject(object) {
25
- this.objects.set(object.key, object);
26
- return Promise.resolve();
27
- }
28
- }
29
- // /**
30
- // * Maps simulated S3 Objects to files under a directory.
31
- // */
32
- // export class FilesystemS3BucketStorage implements SimS3BucketStorage {
33
- // /**
34
- // * Get a simulated Object from a file in the directory.
35
- // */
36
- // getObject(key: string): Promise<SimS3Object | undefined> {
37
- // return Promise.resolve();
38
- // }
39
- //
40
- // /**
41
- // * List simulated Objects based on files in the directory.
42
- // */
43
- // listObjects(prefix?: string): Promise<SimS3Object[]> {
44
- // return Promise.resolve([]);
45
- // }
46
- //
47
- // /**
48
- // * Store a simulated Object as a file in the directory.
49
- // * TODO: Keep some kind of manifest for object metadata.
50
- // */
51
- // putObject(object: SimS3Object): Promise<void> {
52
- // return Promise.resolve();
53
- // }
54
- //
55
- // /**
56
- // * Is it OK to change to a different storage implementation?
57
- // * For now, we're assuming that a user should not need to change from a
58
- // * filesystem storage at runtime, so this is always false.
59
- // */
60
- // allowChangeStorage(): boolean {
61
- // return false;
62
- // }
63
- // }
1
+ export {};
64
2
  //# sourceMappingURL=s3-bucket-storage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"s3-bucket-storage.js","sourceRoot":"","sources":["../../../../src/service/s3/storage/s3-bucket-storage.ts"],"names":[],"mappings":"AAwBA;;GAEG;AACH,MAAM,OAAO,qBAAqB;IACf,OAAO,GAAG,IAAI,GAAG,EAAuB,CAAC;IAE1D;;OAEG;IACH,SAAS,CAAC,GAAW;QACnB,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAChD,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,MAAe;QACzB,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;aACxC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;aACjE,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;QAE/B,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,MAAmB;QAC3B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACrC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;CAUF;AAED,MAAM;AACN,2DAA2D;AAC3D,MAAM;AACN,yEAAyE;AACzE,QAAQ;AACR,4DAA4D;AAC5D,QAAQ;AACR,+DAA+D;AAC/D,gCAAgC;AAChC,MAAM;AACN,EAAE;AACF,QAAQ;AACR,+DAA+D;AAC/D,QAAQ;AACR,2DAA2D;AAC3D,kCAAkC;AAClC,MAAM;AACN,EAAE;AACF,QAAQ;AACR,4DAA4D;AAC5D,6DAA6D;AAC7D,QAAQ;AACR,oDAAoD;AACpD,gCAAgC;AAChC,MAAM;AACN,EAAE;AACF,QAAQ;AACR,iEAAiE;AACjE,4EAA4E;AAC5E,+DAA+D;AAC/D,QAAQ;AACR,oCAAoC;AACpC,oBAAoB;AACpB,MAAM;AACN,IAAI"}
1
+ {"version":3,"file":"s3-bucket-storage.js","sourceRoot":"","sources":["../../../../src/service/s3/storage/s3-bucket-storage.ts"],"names":[],"mappings":""}
@@ -0,0 +1,59 @@
1
+ import type { SimS3BucketStorage } from "./s3-bucket-storage.js";
2
+ import { SimS3Object } from "../object/s3-object.js";
3
+ /**
4
+ * Maps simulated S3 Objects to files under a directory.
5
+ * This is useful for local development, such as serving a static website
6
+ * locally out of simulated S3.
7
+ * This class has some simple checks to reduce the risk of reading or writing
8
+ * files that might be unsafe, but it cannot completely protect against all
9
+ * potential safety issues.
10
+ */
11
+ export declare class FilesystemS3BucketStorage implements SimS3BucketStorage {
12
+ private readonly directoryPath;
13
+ private readonly allowedDirectoryNames;
14
+ constructor(directoryPath: string, options?: FilesystemS3BucketStorageOptions);
15
+ /**
16
+ * Get a simulated Object from a file in the directory.
17
+ */
18
+ getObject(key: string): Promise<SimS3Object | undefined>;
19
+ /**
20
+ * List simulated Objects based on files in the directory.
21
+ */
22
+ listObjects(prefix?: string): Promise<SimS3Object[]>;
23
+ /**
24
+ * Store a simulated Object as a file in the directory.
25
+ */
26
+ putObject(object: SimS3Object): Promise<void>;
27
+ /**
28
+ * Is it OK to change to a different storage implementation?
29
+ * For now, we're assuming that a user should not need to change from a
30
+ * filesystem storage at runtime, so this is always false.
31
+ */
32
+ allowChangeStorage(): boolean;
33
+ private filePathForObjectKey;
34
+ private listObjectKeys;
35
+ private listObjectKeysInDirectory;
36
+ /**
37
+ * Make up reasonable metadata for an Object based on the file on disk.
38
+ */
39
+ private metadataForObjectKey;
40
+ /**
41
+ * Guess a reasonable content type for an Object key based on its file
42
+ * extension on disk.
43
+ */
44
+ private contentTypeForObjectKey;
45
+ private assertSafeDirectoryPath;
46
+ private assertSafeObjectKey;
47
+ private pathContainsParentDirectorySegment;
48
+ private isAllowedObjectKeyExtension;
49
+ }
50
+ /**
51
+ * Options for filesystem-based simulated S3 Bucket storage.
52
+ */
53
+ export interface FilesystemS3BucketStorageOptions {
54
+ /**
55
+ * Directory names that are safe to use as filesystem storage roots.
56
+ */
57
+ readonly allowedDirectoryNames?: readonly string[];
58
+ }
59
+ //# sourceMappingURL=s3-filesystem-storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s3-filesystem-storage.d.ts","sourceRoot":"","sources":["../../../../src/service/s3/storage/s3-filesystem-storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,WAAW,EAAuB,MAAM,wBAAwB,CAAC;AAK1E;;;;;;;GAOG;AACH,qBAAa,yBAA0B,YAAW,kBAAkB;IAClE,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAoB;gBAGxD,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE,gCAAqC;IAQhD;;OAEG;IACG,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAqB9D;;OAEG;IACG,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAmB1D;;OAEG;IACG,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IASnD;;;;OAIG;IACH,kBAAkB,IAAI,OAAO;IAI7B,OAAO,CAAC,oBAAoB;YAkBd,cAAc;YAoBd,yBAAyB;IAiCvC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAa5B;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAqD/B,OAAO,CAAC,uBAAuB;IAuC/B,OAAO,CAAC,mBAAmB;IAc3B,OAAO,CAAC,kCAAkC;IAI1C,OAAO,CAAC,2BAA2B;CAGpC;AAED;;GAEG;AACH,MAAM,WAAW,gCAAgC;IAC/C;;OAEG;IACH,QAAQ,CAAC,qBAAqB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACpD"}
@@ -0,0 +1,266 @@
1
+ import { SimS3Object, SimS3ObjectMetadata } from "../object/s3-object.js";
2
+ import path from "node:path";
3
+ import { homedir } from "node:os";
4
+ import { mkdir, readdir, readFile, stat, writeFile } from "node:fs/promises";
5
+ /**
6
+ * Maps simulated S3 Objects to files under a directory.
7
+ * This is useful for local development, such as serving a static website
8
+ * locally out of simulated S3.
9
+ * This class has some simple checks to reduce the risk of reading or writing
10
+ * files that might be unsafe, but it cannot completely protect against all
11
+ * potential safety issues.
12
+ */
13
+ export class FilesystemS3BucketStorage {
14
+ directoryPath;
15
+ allowedDirectoryNames;
16
+ constructor(directoryPath, options = {}) {
17
+ this.allowedDirectoryNames =
18
+ options.allowedDirectoryNames ?? defaultAllowedDirectoryNames;
19
+ this.assertSafeDirectoryPath(directoryPath);
20
+ this.directoryPath = path.resolve(directoryPath);
21
+ }
22
+ /**
23
+ * Get a simulated Object from a file in the directory.
24
+ */
25
+ async getObject(key) {
26
+ const filePath = this.filePathForObjectKey(key);
27
+ try {
28
+ // eslint-disable-next-line security/detect-non-literal-fs-filename
29
+ const body = await readFile(filePath);
30
+ return new SimS3Object(key, body, this.metadataForObjectKey(key));
31
+ }
32
+ catch (error) {
33
+ if (error instanceof Error &&
34
+ "code" in error &&
35
+ error.code === "ENOENT") {
36
+ return undefined;
37
+ }
38
+ /* v8 ignore next */
39
+ throw error;
40
+ }
41
+ }
42
+ /**
43
+ * List simulated Objects based on files in the directory.
44
+ */
45
+ async listObjects(prefix) {
46
+ const objectKeys = await this.listObjectKeys();
47
+ return await Promise.all(objectKeys
48
+ .filter((key) => prefix === undefined || key.startsWith(prefix))
49
+ .map(async (key) => {
50
+ const object = await this.getObject(key);
51
+ /* v8 ignore next -- defensive guard for filesystem race */
52
+ if (object === undefined) {
53
+ throw new Error(`Object listed but not found: ${key}`);
54
+ }
55
+ return object;
56
+ }));
57
+ }
58
+ /**
59
+ * Store a simulated Object as a file in the directory.
60
+ */
61
+ async putObject(object) {
62
+ const filePath = this.filePathForObjectKey(object.key);
63
+ // eslint-disable-next-line security/detect-non-literal-fs-filename
64
+ await mkdir(path.dirname(filePath), { recursive: true });
65
+ // eslint-disable-next-line security/detect-non-literal-fs-filename
66
+ await writeFile(filePath, object.body);
67
+ }
68
+ /**
69
+ * Is it OK to change to a different storage implementation?
70
+ * For now, we're assuming that a user should not need to change from a
71
+ * filesystem storage at runtime, so this is always false.
72
+ */
73
+ allowChangeStorage() {
74
+ return false;
75
+ }
76
+ filePathForObjectKey(key) {
77
+ this.assertSafeObjectKey(key);
78
+ const filePath = path.resolve(this.directoryPath, key);
79
+ /* v8 ignore if -- defensive guard after object key validation */
80
+ if (filePath !== this.directoryPath &&
81
+ !filePath.startsWith(`${this.directoryPath}${path.sep}`)) {
82
+ throw new Error(`Invalid S3 Object key outside storage directory: ${key}`);
83
+ }
84
+ return filePath;
85
+ }
86
+ async listObjectKeys() {
87
+ try {
88
+ // eslint-disable-next-line security/detect-non-literal-fs-filename
89
+ await stat(this.directoryPath);
90
+ }
91
+ catch (error) {
92
+ if (error instanceof Error &&
93
+ "code" in error &&
94
+ error.code === "ENOENT") {
95
+ return [];
96
+ }
97
+ /* v8 ignore next */
98
+ throw error;
99
+ }
100
+ return await this.listObjectKeysInDirectory(this.directoryPath);
101
+ }
102
+ async listObjectKeysInDirectory(directoryPath) {
103
+ // eslint-disable-next-line security/detect-non-literal-fs-filename
104
+ const entries = await readdir(directoryPath, { withFileTypes: true });
105
+ const keys = [];
106
+ const nestedKeyPromises = [];
107
+ for (const entry of entries) {
108
+ const entryPath = path.join(directoryPath, entry.name);
109
+ if (entry.isDirectory()) {
110
+ nestedKeyPromises.push(this.listObjectKeysInDirectory(entryPath));
111
+ continue;
112
+ }
113
+ if (entry.isFile()) {
114
+ const key = path
115
+ .relative(this.directoryPath, entryPath)
116
+ .split(path.sep)
117
+ .join("/");
118
+ if (this.isAllowedObjectKeyExtension(key)) {
119
+ keys.push(key);
120
+ }
121
+ }
122
+ }
123
+ const nestedKeys = await Promise.all(nestedKeyPromises);
124
+ return [...keys, ...nestedKeys.flat()];
125
+ }
126
+ /**
127
+ * Make up reasonable metadata for an Object based on the file on disk.
128
+ */
129
+ metadataForObjectKey(key) {
130
+ const contentType = this.contentTypeForObjectKey(key);
131
+ /* v8 ignore if -- defensive fallback */
132
+ if (contentType === undefined) {
133
+ return new SimS3ObjectMetadata();
134
+ }
135
+ return new SimS3ObjectMetadata({
136
+ "content-type": contentType,
137
+ });
138
+ }
139
+ /**
140
+ * Guess a reasonable content type for an Object key based on its file
141
+ * extension on disk.
142
+ */
143
+ contentTypeForObjectKey(key) {
144
+ const extension = path.extname(key).toLowerCase();
145
+ switch (extension) {
146
+ case ".css": {
147
+ return "text/css";
148
+ }
149
+ case ".gif": {
150
+ return "image/gif";
151
+ }
152
+ case ".html":
153
+ case ".htm": {
154
+ return "text/html";
155
+ }
156
+ case ".ico": {
157
+ return "image/x-icon";
158
+ }
159
+ case ".jpeg":
160
+ case ".jpg": {
161
+ return "image/jpeg";
162
+ }
163
+ case ".js":
164
+ case ".mjs": {
165
+ return "text/javascript";
166
+ }
167
+ case ".json": {
168
+ return "application/json";
169
+ }
170
+ case ".map": {
171
+ return "application/json";
172
+ }
173
+ case ".png": {
174
+ return "image/png";
175
+ }
176
+ case ".svg": {
177
+ return "image/svg+xml";
178
+ }
179
+ case ".txt": {
180
+ return "text/plain";
181
+ }
182
+ case ".webp": {
183
+ return "image/webp";
184
+ }
185
+ case ".xml": {
186
+ return "application/xml";
187
+ }
188
+ default: {
189
+ /* v8 ignore next */
190
+ return undefined;
191
+ }
192
+ }
193
+ }
194
+ assertSafeDirectoryPath(directoryPath) {
195
+ if (!path.isAbsolute(directoryPath)) {
196
+ throw new Error(`Filesystem S3 storage directory path must be absolute: ${directoryPath}`);
197
+ }
198
+ if (this.pathContainsParentDirectorySegment(directoryPath)) {
199
+ throw new Error(`Filesystem S3 storage directory path must not contain '..': ${directoryPath}`);
200
+ }
201
+ const resolvedDirectoryPath = path.resolve(directoryPath);
202
+ const parsedDirectoryPath = path.parse(resolvedDirectoryPath);
203
+ if (resolvedDirectoryPath === parsedDirectoryPath.root) {
204
+ throw new Error(`Filesystem S3 storage directory path must not be a filesystem root: ${directoryPath}`);
205
+ }
206
+ if (resolvedDirectoryPath === path.resolve(homedir())) {
207
+ throw new Error(`Filesystem S3 storage directory path must not be the user home directory: ${directoryPath}`);
208
+ }
209
+ const directoryName = path.basename(resolvedDirectoryPath);
210
+ if (!this.allowedDirectoryNames.includes(directoryName)) {
211
+ throw new Error(`Filesystem S3 storage directory name must be one of: ${this.allowedDirectoryNames.join(", ")}. Got: ${directoryName}`);
212
+ }
213
+ }
214
+ assertSafeObjectKey(key) {
215
+ if (path.isAbsolute(key)) {
216
+ throw new Error(`S3 Object key must not be an absolute path: ${key}`);
217
+ }
218
+ if (this.pathContainsParentDirectorySegment(key)) {
219
+ throw new Error(`S3 Object key must not contain '..': ${key}`);
220
+ }
221
+ if (!this.isAllowedObjectKeyExtension(key)) {
222
+ throw new Error(`S3 Object key has unsupported file extension: ${key}`);
223
+ }
224
+ }
225
+ pathContainsParentDirectorySegment(value) {
226
+ return value.split(/[\\/]/u).includes("..");
227
+ }
228
+ isAllowedObjectKeyExtension(key) {
229
+ return allowedObjectFileExtensions.has(path.extname(key).toLowerCase());
230
+ }
231
+ }
232
+ /**
233
+ * Default directory names that are safe to use as filesystem storage roots.
234
+ */
235
+ const defaultAllowedDirectoryNames = [
236
+ "assets",
237
+ "build",
238
+ "dist",
239
+ "out",
240
+ "public",
241
+ "static",
242
+ "www",
243
+ ];
244
+ /**
245
+ * Cautious list of allowed file extensions for simulated S3 objects. This is to
246
+ * try and avoid reading or writing other files that might be unsafe.
247
+ */
248
+ const allowedObjectFileExtensions = new Set([
249
+ ".css",
250
+ ".gif",
251
+ ".htm",
252
+ ".html",
253
+ ".ico",
254
+ ".jpeg",
255
+ ".jpg",
256
+ ".js",
257
+ ".json",
258
+ ".map",
259
+ ".mjs",
260
+ ".png",
261
+ ".svg",
262
+ ".txt",
263
+ ".webp",
264
+ ".xml",
265
+ ]);
266
+ //# sourceMappingURL=s3-filesystem-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s3-filesystem-storage.js","sourceRoot":"","sources":["../../../../src/service/s3/storage/s3-filesystem-storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import type { SimS3Object } from "../object/s3-object.js";
2
+ import type { SimS3BucketStorage } from "./s3-bucket-storage.js";
3
+ /**
4
+ * Default in-memory simulated S3 Bucket storage.
5
+ */
6
+ export declare class MemoryS3BucketStorage implements SimS3BucketStorage {
7
+ private readonly objects;
8
+ /**
9
+ * Get a simulated Object from in-memory storage.
10
+ */
11
+ getObject(key: string): Promise<SimS3Object | undefined>;
12
+ /**
13
+ * List simulated Objects in in-memory storage.
14
+ */
15
+ listObjects(prefix?: string): Promise<SimS3Object[]>;
16
+ /**
17
+ * Put a simulated Object into in-memory storage.
18
+ */
19
+ putObject(object: SimS3Object): Promise<void>;
20
+ /**
21
+ * Is it OK to change to a different storage implementation?
22
+ * To reduce unexpected behaviours, we disallow changing from in-memory
23
+ * storage if it currently contains any objects.
24
+ */
25
+ allowChangeStorage(): boolean;
26
+ }
27
+ //# sourceMappingURL=s3-memory-storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s3-memory-storage.d.ts","sourceRoot":"","sources":["../../../../src/service/s3/storage/s3-memory-storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAEjE;;GAEG;AACH,qBAAa,qBAAsB,YAAW,kBAAkB;IAC9D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkC;IAE1D;;OAEG;IACH,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;IAIxD;;OAEG;IACH,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAQpD;;OAEG;IACH,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAK7C;;;;OAIG;IACH,kBAAkB,IAAI,OAAO;CAG9B"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Default in-memory simulated S3 Bucket storage.
3
+ */
4
+ export class MemoryS3BucketStorage {
5
+ objects = new Map();
6
+ /**
7
+ * Get a simulated Object from in-memory storage.
8
+ */
9
+ getObject(key) {
10
+ return Promise.resolve(this.objects.get(key));
11
+ }
12
+ /**
13
+ * List simulated Objects in in-memory storage.
14
+ */
15
+ listObjects(prefix) {
16
+ const objects = [...this.objects.entries()]
17
+ .filter(([key]) => prefix === undefined || key.startsWith(prefix))
18
+ .map(([, object]) => object);
19
+ return Promise.resolve(objects);
20
+ }
21
+ /**
22
+ * Put a simulated Object into in-memory storage.
23
+ */
24
+ putObject(object) {
25
+ this.objects.set(object.key, object);
26
+ return Promise.resolve();
27
+ }
28
+ /**
29
+ * Is it OK to change to a different storage implementation?
30
+ * To reduce unexpected behaviours, we disallow changing from in-memory
31
+ * storage if it currently contains any objects.
32
+ */
33
+ allowChangeStorage() {
34
+ return this.objects.size === 0;
35
+ }
36
+ }
37
+ //# sourceMappingURL=s3-memory-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s3-memory-storage.js","sourceRoot":"","sources":["../../../../src/service/s3/storage/s3-memory-storage.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,MAAM,OAAO,qBAAqB;IACf,OAAO,GAAG,IAAI,GAAG,EAAuB,CAAC;IAE1D;;OAEG;IACH,SAAS,CAAC,GAAW;QACnB,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAChD,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,MAAe;QACzB,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;aACxC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,MAAM,KAAK,SAAS,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;aACjE,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;QAE/B,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,MAAmB;QAC3B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACrC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;IAED;;;;OAIG;IACH,kBAAkB;QAChB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC;IACjC,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.2.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",
@@ -15,19 +15,31 @@
15
15
  "isolated"
16
16
  ],
17
17
  "exports": {
18
+ "./package.json": "./package.json",
18
19
  ".": {
19
- "types": "./dist/index.d.ts",
20
- "import": "./dist/index.js"
20
+ "import": "./dist/index.js",
21
+ "types": "./dist/index.d.ts"
21
22
  },
22
23
  "./cloudfront": {
23
- "types": "./dist/service/cloudfront/index.d.ts",
24
- "import": "./dist/service/cloudfront/index.js"
24
+ "import": "./dist/service/cloudfront/index.js",
25
+ "types": "./dist/service/cloudfront/index.d.ts"
25
26
  },
26
27
  "./cloudfront/globals": {
27
- "types": "./dist/service/cloudfront/globals.d.ts",
28
- "import": "./dist/service/cloudfront/globals.js"
28
+ "import": "./dist/service/cloudfront/globals.js",
29
+ "types": "./dist/service/cloudfront/globals.d.ts"
29
30
  },
30
- "./package.json": "./package.json"
31
+ "./dynamodb": {
32
+ "import": "./dist/service/dynamodb/index.js",
33
+ "types": "./dist/service/dynamodb/index.d.ts"
34
+ },
35
+ "./s3": {
36
+ "import": "./dist/service/s3/index.js",
37
+ "types": "./dist/service/s3/index.d.ts"
38
+ },
39
+ "./serve": {
40
+ "import": "./dist/serve/index.js",
41
+ "types": "./dist/serve/index.d.ts"
42
+ }
31
43
  },
32
44
  "files": [
33
45
  "dist",
@@ -41,7 +53,7 @@
41
53
  "@aws-sdk/client-s3": "^3.1057.0",
42
54
  "@eslint/js": "^10.0.1",
43
55
  "@faker-js/faker": "^10.4.0",
44
- "@kensio/smartass": "^1.0.2",
56
+ "@kensio/smartass": "^1.1.0",
45
57
  "@smithy/smithy-client": "^4.13.5",
46
58
  "@smithy/types": "^4.14.2",
47
59
  "@types/eslint-plugin-security": "^3.0.1",