@kensio/yulin 0.2.0 → 0.3.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 (127) hide show
  1. package/README.md +76 -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 +7 -3
  71. package/dist/service/s3/bucket/s3-bucket.d.ts.map +1 -1
  72. package/dist/service/s3/bucket/s3-bucket.js +10 -10
  73. package/dist/service/s3/bucket/s3-bucket.js.map +1 -1
  74. package/dist/service/s3/command/create-bucket/create-bucket.handler.d.ts +5 -1
  75. package/dist/service/s3/command/create-bucket/create-bucket.handler.d.ts.map +1 -1
  76. package/dist/service/s3/command/create-bucket/create-bucket.handler.js +26 -5
  77. package/dist/service/s3/command/create-bucket/create-bucket.handler.js.map +1 -1
  78. package/dist/service/s3/command/get-object/get-object.handler.d.ts +2 -2
  79. package/dist/service/s3/command/get-object/get-object.handler.d.ts.map +1 -1
  80. package/dist/service/s3/command/get-object/get-object.handler.js.map +1 -1
  81. package/dist/service/s3/command/list-buckets/list-buckets.handler.d.ts +2 -2
  82. package/dist/service/s3/command/list-buckets/list-buckets.handler.d.ts.map +1 -1
  83. package/dist/service/s3/command/list-buckets/list-buckets.handler.js.map +1 -1
  84. package/dist/service/s3/command/list-objects/list-objects.handler.d.ts +2 -2
  85. package/dist/service/s3/command/list-objects/list-objects.handler.d.ts.map +1 -1
  86. package/dist/service/s3/command/list-objects/list-objects.handler.js.map +1 -1
  87. package/dist/service/s3/command/put-object/put-object.handler.d.ts +3 -2
  88. package/dist/service/s3/command/put-object/put-object.handler.d.ts.map +1 -1
  89. package/dist/service/s3/command/put-object/put-object.handler.js +9 -1
  90. package/dist/service/s3/command/put-object/put-object.handler.js.map +1 -1
  91. package/dist/service/s3/index.d.ts +1 -1
  92. package/dist/service/s3/index.d.ts.map +1 -1
  93. package/dist/service/s3/index.js +1 -1
  94. package/dist/service/s3/index.js.map +1 -1
  95. package/dist/service/s3/serve/sim-s3-controller.d.ts +15 -0
  96. package/dist/service/s3/serve/sim-s3-controller.d.ts.map +1 -0
  97. package/dist/service/s3/serve/sim-s3-controller.js +29 -0
  98. package/dist/service/s3/serve/sim-s3-controller.js.map +1 -0
  99. package/dist/service/s3/serve/sim-s3-get-obj-controller.d.ts +11 -0
  100. package/dist/service/s3/serve/sim-s3-get-obj-controller.d.ts.map +1 -0
  101. package/dist/service/s3/serve/sim-s3-get-obj-controller.js +35 -0
  102. package/dist/service/s3/serve/sim-s3-get-obj-controller.js.map +1 -0
  103. package/dist/service/s3/serve/sim-s3-req-router.d.ts +26 -0
  104. package/dist/service/s3/serve/sim-s3-req-router.d.ts.map +1 -0
  105. package/dist/service/s3/serve/sim-s3-req-router.js +79 -0
  106. package/dist/service/s3/serve/sim-s3-req-router.js.map +1 -0
  107. package/dist/service/s3/sim-s3-global-registry.d.ts +20 -0
  108. package/dist/service/s3/sim-s3-global-registry.d.ts.map +1 -0
  109. package/dist/service/s3/sim-s3-global-registry.js +22 -0
  110. package/dist/service/s3/sim-s3-global-registry.js.map +1 -0
  111. package/dist/service/s3/sim-s3.d.ts +38 -0
  112. package/dist/service/s3/sim-s3.d.ts.map +1 -0
  113. package/dist/service/s3/sim-s3.js +61 -0
  114. package/dist/service/s3/sim-s3.js.map +1 -0
  115. package/dist/service/s3/storage/s3-bucket-storage.d.ts +2 -16
  116. package/dist/service/s3/storage/s3-bucket-storage.d.ts.map +1 -1
  117. package/dist/service/s3/storage/s3-bucket-storage.js +1 -63
  118. package/dist/service/s3/storage/s3-bucket-storage.js.map +1 -1
  119. package/dist/service/s3/storage/s3-filesystem-storage.d.ts +59 -0
  120. package/dist/service/s3/storage/s3-filesystem-storage.d.ts.map +1 -0
  121. package/dist/service/s3/storage/s3-filesystem-storage.js +266 -0
  122. package/dist/service/s3/storage/s3-filesystem-storage.js.map +1 -0
  123. package/dist/service/s3/storage/s3-memory-storage.d.ts +27 -0
  124. package/dist/service/s3/storage/s3-memory-storage.d.ts.map +1 -0
  125. package/dist/service/s3/storage/s3-memory-storage.js +37 -0
  126. package/dist/service/s3/storage/s3-memory-storage.js.map +1 -0
  127. package/package.json +20 -8
@@ -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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kensio/yulin",
3
- "version": "0.2.0",
3
+ "version": "0.3.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",