@wener/common 2.0.3 → 2.0.6

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 (312) hide show
  1. package/lib/ai/qwen3vl/index.js +1 -1
  2. package/lib/ai/qwen3vl/utils.js +15 -15
  3. package/lib/ai/qwen3vl/utils.js.map +1 -1
  4. package/lib/ai/vision/DocLayoutElementTypeSchema.js +22 -22
  5. package/lib/ai/vision/ImageAnnotationSchema.js +63 -47
  6. package/lib/ai/vision/index.js +2 -2
  7. package/lib/ai/vision/resolveImageAnnotation.js +81 -95
  8. package/lib/cn/ChineseResidentIdNo.js +55 -41
  9. package/lib/cn/ChineseResidentIdNo.js.map +1 -1
  10. package/lib/cn/ChineseResidentIdNo.mod.js +6 -1
  11. package/lib/cn/ChineseResidentIdNo.test.js +22 -21
  12. package/lib/cn/DivisionCode.js +220 -235
  13. package/lib/cn/DivisionCode.mod.js +6 -1
  14. package/lib/cn/DivisionCode.test.js +92 -121
  15. package/lib/cn/Mod11.js +18 -37
  16. package/lib/cn/Mod11.js.map +1 -1
  17. package/lib/cn/Mod31.js +23 -41
  18. package/lib/cn/UnifiedSocialCreditCode.js +143 -137
  19. package/lib/cn/UnifiedSocialCreditCode.mod.js +6 -1
  20. package/lib/cn/UnifiedSocialCreditCode.test.js +21 -15
  21. package/lib/cn/formatChineseAmount.js +46 -71
  22. package/lib/cn/index.js +6 -6
  23. package/lib/cn/mod.js +5 -3
  24. package/lib/cn/parseChineseNumber.js +81 -85
  25. package/lib/cn/parseChineseNumber.test.js +183 -261
  26. package/lib/cn/pinyin/cartesianProduct.js +19 -19
  27. package/lib/cn/pinyin/cartesianProduct.test.js +78 -178
  28. package/lib/cn/pinyin/loader.js +13 -11
  29. package/lib/cn/pinyin/preload.js +2 -1
  30. package/lib/cn/pinyin/toPinyin.test.js +149 -161
  31. package/lib/cn/pinyin/toPinyinPure.js +28 -23
  32. package/lib/cn/pinyin/transform.js +11 -11
  33. package/lib/cn/types.d.js +2 -2
  34. package/lib/consola/createStandardConsolaReporter.js +14 -15
  35. package/lib/consola/formatLogObject.js +149 -133
  36. package/lib/consola/formatLogObject.js.map +1 -1
  37. package/lib/consola/formatLogObject.test.js +167 -178
  38. package/lib/consola/index.js +2 -2
  39. package/lib/data/formatSort.js +14 -12
  40. package/lib/data/formatSort.test.js +33 -33
  41. package/lib/data/index.js +3 -3
  42. package/lib/data/maybeNumber.js +23 -23
  43. package/lib/data/maybeNumber.js.map +1 -1
  44. package/lib/data/parseSort.js +75 -68
  45. package/lib/data/parseSort.test.js +196 -187
  46. package/lib/data/resolvePagination.js +38 -39
  47. package/lib/data/resolvePagination.test.js +228 -218
  48. package/lib/data/types.d.js +2 -2
  49. package/lib/data/types.d.js.map +1 -1
  50. package/lib/dayjs/dayjs.js +20 -20
  51. package/lib/dayjs/formatDuration.js +56 -56
  52. package/lib/dayjs/formatDuration.js.map +1 -1
  53. package/lib/dayjs/formatDuration.test.js +63 -77
  54. package/lib/dayjs/index.js +4 -4
  55. package/lib/dayjs/parseDuration.js +21 -26
  56. package/lib/dayjs/parseRelativeTime.js +65 -66
  57. package/lib/dayjs/parseRelativeTime.test.js +227 -243
  58. package/lib/dayjs/resolveRelativeTime.js +74 -144
  59. package/lib/dayjs/resolveRelativeTime.js.map +1 -1
  60. package/lib/dayjs/resolveRelativeTime.test.js +296 -307
  61. package/lib/decimal/index.js +1 -1
  62. package/lib/decimal/parseDecimal.js +12 -12
  63. package/lib/drain3/Drain.js +321 -0
  64. package/lib/drain3/Drain.js.map +1 -0
  65. package/lib/drain3/LogCluster.js +38 -0
  66. package/lib/drain3/LogCluster.js.map +1 -0
  67. package/lib/drain3/Node.js +39 -0
  68. package/lib/drain3/Node.js.map +1 -0
  69. package/lib/drain3/TemplateMiner.js +205 -0
  70. package/lib/drain3/TemplateMiner.js.map +1 -0
  71. package/lib/drain3/index.js +31 -0
  72. package/lib/drain3/index.js.map +1 -0
  73. package/lib/drain3/persistence/FilePersistence.js +24 -0
  74. package/lib/drain3/persistence/FilePersistence.js.map +1 -0
  75. package/lib/drain3/persistence/MemoryPersistence.js +18 -0
  76. package/lib/drain3/persistence/MemoryPersistence.js.map +1 -0
  77. package/lib/drain3/persistence/PersistenceHandler.js +5 -0
  78. package/lib/drain3/persistence/PersistenceHandler.js.map +1 -0
  79. package/lib/drain3/types.js +7 -0
  80. package/lib/drain3/types.js.map +1 -0
  81. package/lib/emittery/emitter.js +7 -7
  82. package/lib/emittery/index.js +1 -1
  83. package/lib/foundation/schema/SexType.js +15 -12
  84. package/lib/foundation/schema/index.js +1 -1
  85. package/lib/foundation/schema/parseSexType.js +15 -16
  86. package/lib/foundation/schema/types.js +8 -6
  87. package/lib/fs/FileSystemError.js +18 -18
  88. package/lib/fs/IFileSystem.d.js +2 -2
  89. package/lib/fs/IFileSystem.d.js.map +1 -1
  90. package/lib/fs/MemoryFileSystem.test.js +172 -181
  91. package/lib/fs/createBrowserFileSystem.js +222 -233
  92. package/lib/fs/createBrowserFileSystem.js.map +1 -1
  93. package/lib/fs/createMemoryFileSystem.js +473 -510
  94. package/lib/fs/createMemoryFileSystem.js.map +1 -1
  95. package/lib/fs/createSandboxFileSystem.js +102 -101
  96. package/lib/fs/createSandboxFileSystem.js.map +1 -1
  97. package/lib/fs/createWebDavFileSystem.js +162 -132
  98. package/lib/fs/createWebDavFileSystem.js.map +1 -1
  99. package/lib/fs/createWebFileSystem.js +202 -0
  100. package/lib/fs/createWebFileSystem.js.map +1 -0
  101. package/lib/fs/findMimeType.js +14 -14
  102. package/lib/fs/findMimeType.js.map +1 -1
  103. package/lib/fs/index.js +7 -7
  104. package/lib/fs/index.js.map +1 -1
  105. package/lib/fs/minio/createMinioFileSystem.js +977 -0
  106. package/lib/fs/minio/createMinioFileSystem.js.map +1 -0
  107. package/lib/fs/minio/index.js +2 -0
  108. package/lib/fs/minio/index.js.map +1 -0
  109. package/lib/fs/orpc/FileSystemContract.js +57 -57
  110. package/lib/fs/orpc/createContractClientFileSystem.js +88 -88
  111. package/lib/fs/orpc/createContractClientFileSystem.js.map +1 -1
  112. package/lib/fs/orpc/index.js +2 -2
  113. package/lib/fs/orpc/server/createFileSystemContractImpl.js +62 -60
  114. package/lib/fs/orpc/server/createFileSystemContractImpl.js.map +1 -1
  115. package/lib/fs/orpc/server/index.js +1 -1
  116. package/lib/fs/s3/createS3MiniFileSystem.js +756 -689
  117. package/lib/fs/s3/createS3MiniFileSystem.js.map +1 -1
  118. package/lib/fs/s3/index.js +1 -1
  119. package/lib/fs/s3/s3mini.test.js +524 -553
  120. package/lib/fs/scandir.js +56 -56
  121. package/lib/fs/server/createDatabaseFileSystem.js +834 -741
  122. package/lib/fs/server/createDatabaseFileSystem.js.map +1 -1
  123. package/lib/fs/server/createNodeFileSystem.js +407 -380
  124. package/lib/fs/server/createNodeFileSystem.js.map +1 -1
  125. package/lib/fs/server/dbfs.test.js +201 -214
  126. package/lib/fs/server/index.js +1 -1
  127. package/lib/fs/server/loadTestDatabase.js +40 -43
  128. package/lib/fs/tests/runFileSystemTest.js +352 -315
  129. package/lib/fs/tests/runFileSystemTest.js.map +1 -1
  130. package/lib/fs/types.js +17 -20
  131. package/lib/fs/utils/getFileUrl.js +24 -30
  132. package/lib/fs/utils.js +17 -17
  133. package/lib/fs/utils.js.map +1 -1
  134. package/lib/fs/webdav/index.js +2 -0
  135. package/lib/fs/webdav/index.js.map +1 -0
  136. package/lib/index.js +2 -2
  137. package/lib/jsonschema/JsonSchema.js +216 -155
  138. package/lib/jsonschema/JsonSchema.js.map +1 -1
  139. package/lib/jsonschema/JsonSchema.test.js +123 -124
  140. package/lib/jsonschema/forEachJsonSchema.js +41 -41
  141. package/lib/jsonschema/forEachJsonSchema.js.map +1 -1
  142. package/lib/jsonschema/index.js +2 -2
  143. package/lib/jsonschema/types.d.js +2 -2
  144. package/lib/jsonschema/types.d.js.map +1 -1
  145. package/lib/meta/defineFileType.js +32 -38
  146. package/lib/meta/defineInit.js +39 -35
  147. package/lib/meta/defineMetadata.js +37 -34
  148. package/lib/meta/defineMetadata.js.map +1 -1
  149. package/lib/meta/defineMetadata.test.js +13 -12
  150. package/lib/meta/index.js +3 -3
  151. package/lib/orpc/createOpenApiContractClient.js +26 -24
  152. package/lib/orpc/createOpenApiContractClient.js.map +1 -1
  153. package/lib/orpc/createRpcContractClient.js +37 -31
  154. package/lib/orpc/index.js +2 -2
  155. package/lib/orpc/resolveLinkPlugins.js +25 -25
  156. package/lib/password/PHC.js +187 -189
  157. package/lib/password/PHC.js.map +1 -1
  158. package/lib/password/PHC.test.js +517 -535
  159. package/lib/password/Password.js +85 -80
  160. package/lib/password/Password.test.js +330 -364
  161. package/lib/password/createArgon2PasswordAlgorithm.js +50 -51
  162. package/lib/password/createArgon2PasswordAlgorithm.js.map +1 -1
  163. package/lib/password/createBase64PasswordAlgorithm.js +11 -11
  164. package/lib/password/createBase64PasswordAlgorithm.js.map +1 -1
  165. package/lib/password/createBcryptPasswordAlgorithm.js +20 -18
  166. package/lib/password/createBcryptPasswordAlgorithm.js.map +1 -1
  167. package/lib/password/createPBKDF2PasswordAlgorithm.js +65 -52
  168. package/lib/password/createPBKDF2PasswordAlgorithm.js.map +1 -1
  169. package/lib/password/createScryptPasswordAlgorithm.js +74 -63
  170. package/lib/password/createScryptPasswordAlgorithm.js.map +1 -1
  171. package/lib/password/index.js +5 -5
  172. package/lib/password/server/index.js +1 -1
  173. package/lib/resource/Identifiable.js +2 -2
  174. package/lib/resource/ListQuery.js +42 -42
  175. package/lib/resource/ListQuery.js.map +1 -1
  176. package/lib/resource/getTitleOfResource.js +5 -5
  177. package/lib/resource/index.js +2 -2
  178. package/lib/resource/index.js.map +1 -1
  179. package/lib/resource/schema/AnyResourceSchema.js +91 -89
  180. package/lib/resource/schema/BaseResourceSchema.js +26 -26
  181. package/lib/resource/schema/ResourceActionType.js +117 -115
  182. package/lib/resource/schema/ResourceStatus.js +94 -92
  183. package/lib/resource/schema/ResourceType.js +25 -23
  184. package/lib/resource/schema/index.js +5 -5
  185. package/lib/resource/schema/types.js +86 -55
  186. package/lib/resource/schema/types.test.js +16 -13
  187. package/lib/s3/formatS3Url.js +60 -60
  188. package/lib/s3/formatS3Url.js.map +1 -1
  189. package/lib/s3/formatS3Url.test.js +238 -261
  190. package/lib/s3/index.js +2 -2
  191. package/lib/s3/parseS3Url.js +61 -60
  192. package/lib/s3/parseS3Url.js.map +1 -1
  193. package/lib/s3/parseS3Url.test.js +270 -269
  194. package/lib/schema/SchemaRegistry.js +41 -42
  195. package/lib/schema/SchemaRegistry.js.map +1 -1
  196. package/lib/schema/SchemaRegistry.mod.js +1 -1
  197. package/lib/schema/TypeSchema.d.js +2 -2
  198. package/lib/schema/TypeSchema.d.js.map +1 -1
  199. package/lib/schema/createSchemaData.js +113 -67
  200. package/lib/schema/createSchemaData.js.map +1 -1
  201. package/lib/schema/findJsonSchemaByPath.js +28 -23
  202. package/lib/schema/findJsonSchemaByPath.js.map +1 -1
  203. package/lib/schema/formatZodError.js +113 -134
  204. package/lib/schema/formatZodError.js.map +1 -1
  205. package/lib/schema/formatZodError.test.js +192 -195
  206. package/lib/schema/getSchemaCache.js +7 -7
  207. package/lib/schema/getSchemaOptions.js +17 -16
  208. package/lib/schema/index.js +6 -6
  209. package/lib/schema/toJsonSchema.js +196 -190
  210. package/lib/schema/toJsonSchema.js.map +1 -1
  211. package/lib/schema/toJsonSchema.test.js +34 -26
  212. package/lib/schema/validate.js +106 -97
  213. package/lib/schema/validate.js.map +1 -1
  214. package/lib/tools/generateSchema.js +40 -40
  215. package/lib/tools/renderJsonSchemaToMarkdownDoc.js +74 -74
  216. package/lib/utils/buildBaseUrl.js +8 -8
  217. package/lib/utils/buildRedactorFormSchema.js +55 -54
  218. package/lib/utils/buildRedactorFormSchema.js.map +1 -1
  219. package/lib/utils/getEstimateProcessTime.js +24 -19
  220. package/lib/utils/index.js +3 -3
  221. package/lib/utils/resolveFeatureOptions.js +9 -9
  222. package/package.json +37 -18
  223. package/src/ai/qwen3vl/utils.ts +1 -1
  224. package/src/ai/vision/index.ts +2 -2
  225. package/src/cn/ChineseResidentIdNo.ts +1 -1
  226. package/src/cn/Mod11.ts +1 -1
  227. package/src/cn/__snapshots__/ChineseResidentIdNo.test.ts.snap +1 -1
  228. package/src/cn/__snapshots__/UnifiedSocialCreditCode.test.ts.snap +0 -23
  229. package/src/cn/index.ts +1 -2
  230. package/src/cn/parseChineseNumber.test.ts +4 -4
  231. package/src/consola/formatLogObject.ts +6 -6
  232. package/src/consola/index.ts +1 -1
  233. package/src/data/index.ts +3 -4
  234. package/src/data/maybeNumber.ts +1 -1
  235. package/src/data/parseSort.test.ts +0 -1
  236. package/src/data/resolvePagination.ts +2 -2
  237. package/src/data/types.d.ts +2 -2
  238. package/src/dayjs/formatDuration.ts +10 -11
  239. package/src/dayjs/index.ts +1 -1
  240. package/src/dayjs/parseRelativeTime.ts +1 -1
  241. package/src/dayjs/resolveRelativeTime.ts +11 -14
  242. package/src/drain3/Drain.test.ts +378 -0
  243. package/src/drain3/Drain.ts +394 -0
  244. package/src/drain3/LogCluster.ts +46 -0
  245. package/src/drain3/Node.ts +53 -0
  246. package/src/drain3/TemplateMiner.ts +246 -0
  247. package/src/drain3/index.ts +34 -0
  248. package/src/drain3/persistence/FilePersistence.ts +24 -0
  249. package/src/drain3/persistence/MemoryPersistence.ts +23 -0
  250. package/src/drain3/persistence/PersistenceHandler.ts +19 -0
  251. package/src/drain3/types.ts +75 -0
  252. package/src/fs/IFileSystem.d.ts +1 -2
  253. package/src/fs/createBrowserFileSystem.ts +7 -5
  254. package/src/fs/createMemoryFileSystem.ts +9 -13
  255. package/src/fs/createSandboxFileSystem.ts +1 -1
  256. package/src/fs/createWebDavFileSystem.ts +30 -17
  257. package/src/fs/createWebFileSystem.ts +242 -0
  258. package/src/fs/findMimeType.ts +1 -4
  259. package/src/fs/index.ts +5 -5
  260. package/src/fs/minio/createMinioFileSystem.ts +1148 -0
  261. package/src/fs/minio/index.ts +1 -0
  262. package/src/fs/orpc/createContractClientFileSystem.ts +5 -5
  263. package/src/fs/orpc/server/createFileSystemContractImpl.ts +1 -1
  264. package/src/fs/s3/createS3MiniFileSystem.ts +120 -79
  265. package/src/fs/s3/s3fs.test.ts +441 -0
  266. package/src/fs/s3/s3mini.test.ts +2 -2
  267. package/src/fs/server/createDatabaseFileSystem.ts +78 -114
  268. package/src/fs/server/createNodeFileSystem.ts +32 -13
  269. package/src/fs/server/dbfs.test.ts +13 -8
  270. package/src/fs/server/index.ts +1 -0
  271. package/src/fs/server/loadTestDatabase.ts +8 -119
  272. package/src/fs/tests/runFileSystemTest.ts +29 -28
  273. package/src/fs/utils.ts +1 -1
  274. package/src/fs/webdav/index.ts +1 -0
  275. package/src/jsonschema/JsonSchema.ts +5 -5
  276. package/src/jsonschema/forEachJsonSchema.ts +1 -1
  277. package/src/jsonschema/index.ts +1 -1
  278. package/src/jsonschema/types.d.ts +1 -1
  279. package/src/meta/defineMetadata.ts +1 -1
  280. package/src/meta/index.ts +2 -3
  281. package/src/orm/createSqliteDialect.ts +17 -0
  282. package/src/orm/index.ts +1 -0
  283. package/src/orpc/createOpenApiContractClient.ts +3 -3
  284. package/src/orpc/index.ts +1 -1
  285. package/src/password/PHC.ts +3 -3
  286. package/src/password/createArgon2PasswordAlgorithm.ts +2 -2
  287. package/src/password/createBase64PasswordAlgorithm.ts +2 -2
  288. package/src/password/createBcryptPasswordAlgorithm.ts +4 -2
  289. package/src/password/createPBKDF2PasswordAlgorithm.ts +2 -2
  290. package/src/password/createScryptPasswordAlgorithm.ts +4 -4
  291. package/src/password/index.ts +2 -2
  292. package/src/resource/ListQuery.ts +4 -1
  293. package/src/resource/index.ts +3 -3
  294. package/src/resource/schema/index.ts +4 -4
  295. package/src/s3/formatS3Url.test.ts +1 -1
  296. package/src/s3/formatS3Url.ts +2 -2
  297. package/src/s3/index.ts +1 -1
  298. package/src/s3/parseS3Url.ts +1 -1
  299. package/src/schema/SchemaRegistry.ts +2 -2
  300. package/src/schema/TypeSchema.d.ts +6 -6
  301. package/src/schema/createSchemaData.ts +5 -5
  302. package/src/schema/findJsonSchemaByPath.ts +5 -5
  303. package/src/schema/formatZodError.test.ts +2 -1
  304. package/src/schema/formatZodError.ts +50 -62
  305. package/src/schema/index.ts +5 -5
  306. package/src/schema/toJsonSchema.ts +6 -6
  307. package/src/schema/validate.ts +2 -2
  308. package/src/utils/buildRedactorFormSchema.ts +4 -4
  309. package/src/utils/formatNumber.ts +18 -0
  310. package/src/utils/formatPercent.ts +17 -0
  311. package/src/utils/index.ts +3 -3
  312. package/src/utils/resolveFeatureOptions.ts +1 -1
@@ -1,133 +1,141 @@
1
1
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
2
- try {
3
- var info = gen[key](arg);
4
- var value = info.value;
5
- } catch (error) {
6
- reject(error);
7
- return;
8
- }
9
- if (info.done) {
10
- resolve(value);
11
- } else {
12
- Promise.resolve(value).then(_next, _throw);
13
- }
2
+ try {
3
+ var info = gen[key](arg);
4
+ var value = info.value;
5
+ } catch (error) {
6
+ reject(error);
7
+ return;
8
+ }
9
+ if (info.done) {
10
+ resolve(value);
11
+ } else {
12
+ Promise.resolve(value).then(_next, _throw);
13
+ }
14
14
  }
15
15
  function _async_to_generator(fn) {
16
- return function() {
17
- var self = this, args = arguments;
18
- return new Promise(function(resolve, reject) {
19
- var gen = fn.apply(self, args);
20
- function _next(value) {
21
- asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
22
- }
23
- function _throw(err) {
24
- asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
25
- }
26
- _next(undefined);
27
- });
28
- };
16
+ return function () {
17
+ var args = arguments;
18
+ return new Promise((resolve, reject) => {
19
+ var gen = fn.apply(this, args);
20
+ function _next(value) {
21
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, 'next', value);
22
+ }
23
+ function _throw(err) {
24
+ asyncGeneratorStep(gen, resolve, reject, _next, _throw, 'throw', err);
25
+ }
26
+ _next(undefined);
27
+ });
28
+ };
29
29
  }
30
30
  function _ts_generator(thisArg, body) {
31
- var f, y, t, _ = {
32
- label: 0,
33
- sent: function() {
34
- if (t[0] & 1) throw t[1];
35
- return t[1];
36
- },
37
- trys: [],
38
- ops: []
39
- }, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype), d = Object.defineProperty;
40
- return d(g, "next", {
41
- value: verb(0)
42
- }), d(g, "throw", {
43
- value: verb(1)
44
- }), d(g, "return", {
45
- value: verb(2)
46
- }), typeof Symbol === "function" && d(g, Symbol.iterator, {
47
- value: function() {
48
- return this;
49
- }
50
- }), g;
51
- function verb(n) {
52
- return function(v) {
53
- return step([
54
- n,
55
- v
56
- ]);
57
- };
58
- }
59
- function step(op) {
60
- if (f) throw new TypeError("Generator is already executing.");
61
- while(g && (g = 0, op[0] && (_ = 0)), _)try {
62
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
63
- if (y = 0, t) op = [
64
- op[0] & 2,
65
- t.value
66
- ];
67
- switch(op[0]){
68
- case 0:
69
- case 1:
70
- t = op;
71
- break;
72
- case 4:
73
- _.label++;
74
- return {
75
- value: op[1],
76
- done: false
77
- };
78
- case 5:
79
- _.label++;
80
- y = op[1];
81
- op = [
82
- 0
83
- ];
84
- continue;
85
- case 7:
86
- op = _.ops.pop();
87
- _.trys.pop();
88
- continue;
89
- default:
90
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
91
- _ = 0;
92
- continue;
93
- }
94
- if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
95
- _.label = op[1];
96
- break;
97
- }
98
- if (op[0] === 6 && _.label < t[1]) {
99
- _.label = t[1];
100
- t = op;
101
- break;
102
- }
103
- if (t && _.label < t[2]) {
104
- _.label = t[2];
105
- _.ops.push(op);
106
- break;
107
- }
108
- if (t[2]) _.ops.pop();
109
- _.trys.pop();
110
- continue;
111
- }
112
- op = body.call(thisArg, _);
113
- } catch (e) {
114
- op = [
115
- 6,
116
- e
117
- ];
118
- y = 0;
119
- } finally{
120
- f = t = 0;
121
- }
122
- if (op[0] & 5) throw op[1];
123
- return {
124
- value: op[0] ? op[1] : void 0,
125
- done: true
126
- };
127
- }
31
+ var f,
32
+ y,
33
+ t,
34
+ _ = {
35
+ label: 0,
36
+ sent: () => {
37
+ if (t[0] & 1) throw t[1];
38
+ return t[1];
39
+ },
40
+ trys: [],
41
+ ops: [],
42
+ },
43
+ g = Object.create((typeof Iterator === 'function' ? Iterator : Object).prototype),
44
+ d = Object.defineProperty;
45
+ return (
46
+ d(g, 'next', {
47
+ value: verb(0),
48
+ }),
49
+ d(g, 'throw', {
50
+ value: verb(1),
51
+ }),
52
+ d(g, 'return', {
53
+ value: verb(2),
54
+ }),
55
+ typeof Symbol === 'function' &&
56
+ d(g, Symbol.iterator, {
57
+ value: function () {
58
+ return this;
59
+ },
60
+ }),
61
+ g
62
+ );
63
+ function verb(n) {
64
+ return (v) => step([n, v]);
65
+ }
66
+ function step(op) {
67
+ if (f) throw new TypeError('Generator is already executing.');
68
+ while ((g && ((g = 0), op[0] && (_ = 0)), _))
69
+ try {
70
+ if (
71
+ ((f = 1),
72
+ y &&
73
+ (t = op[0] & 2 ? y['return'] : op[0] ? y['throw'] || ((t = y['return']) && t.call(y), 0) : y.next) &&
74
+ !(t = t.call(y, op[1])).done)
75
+ )
76
+ return t;
77
+ if (((y = 0), t)) op = [op[0] & 2, t.value];
78
+ switch (op[0]) {
79
+ case 0:
80
+ case 1:
81
+ t = op;
82
+ break;
83
+ case 4:
84
+ _.label++;
85
+ return {
86
+ value: op[1],
87
+ done: false,
88
+ };
89
+ case 5:
90
+ _.label++;
91
+ y = op[1];
92
+ op = [0];
93
+ continue;
94
+ case 7:
95
+ op = _.ops.pop();
96
+ _.trys.pop();
97
+ continue;
98
+ default:
99
+ if (!((t = _.trys), (t = t.length > 0 && t[t.length - 1])) && (op[0] === 6 || op[0] === 2)) {
100
+ _ = 0;
101
+ continue;
102
+ }
103
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) {
104
+ _.label = op[1];
105
+ break;
106
+ }
107
+ if (op[0] === 6 && _.label < t[1]) {
108
+ _.label = t[1];
109
+ t = op;
110
+ break;
111
+ }
112
+ if (t && _.label < t[2]) {
113
+ _.label = t[2];
114
+ _.ops.push(op);
115
+ break;
116
+ }
117
+ if (t[2]) _.ops.pop();
118
+ _.trys.pop();
119
+ continue;
120
+ }
121
+ op = body.call(thisArg, _);
122
+ } catch (e) {
123
+ op = [6, e];
124
+ y = 0;
125
+ } finally {
126
+ f = t = 0;
127
+ }
128
+ if (op[0] & 5) throw op[1];
129
+ return {
130
+ value: op[0] ? op[1] : void 0,
131
+ done: true,
132
+ };
133
+ }
128
134
  }
135
+
129
136
  import { S3mini } from 's3mini';
130
137
  import { afterAll, beforeAll, describe, expect, test } from 'vitest';
138
+
131
139
  /**
132
140
  * Tests for s3mini and S3 filesystem behavior
133
141
  *
@@ -143,272 +151,233 @@ import { afterAll, beforeAll, describe, expect, test } from 'vitest';
143
151
  */ // Set to true to run network tests
144
152
  var RUN_NETWORK_TESTS = process.env.RUN_S3_NETWORK_TESTS === 'true';
145
153
  // Generate unique bucket name for this test run
146
- var TEST_BUCKET = "s3mini-test-".concat(Date.now());
147
- describe('s3mini with MinIO Play', function() {
148
- var client;
149
- beforeAll(function() {
150
- return _async_to_generator(function() {
151
- var e;
152
- return _ts_generator(this, function(_state) {
153
- switch(_state.label){
154
- case 0:
155
- if (!RUN_NETWORK_TESTS) return [
156
- 2
157
- ];
158
- // s3mini expects bucket name in the endpoint URL
159
- client = new S3mini({
160
- endpoint: "https://play.min.io/".concat(TEST_BUCKET),
161
- accessKeyId: 'Q3AM3UQ867SPQQA43P2F',
162
- secretAccessKey: 'zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG',
163
- region: 'us-east-1'
164
- });
165
- _state.label = 1;
166
- case 1:
167
- _state.trys.push([
168
- 1,
169
- 3,
170
- ,
171
- 4
172
- ]);
173
- return [
174
- 4,
175
- client.createBucket()
176
- ];
177
- case 2:
178
- _state.sent();
179
- console.log("Created bucket: ".concat(TEST_BUCKET));
180
- return [
181
- 3,
182
- 4
183
- ];
184
- case 3:
185
- e = _state.sent();
186
- console.log('Bucket creation error:', e);
187
- return [
188
- 3,
189
- 4
190
- ];
191
- case 4:
192
- return [
193
- 2
194
- ];
195
- }
196
- });
197
- })();
198
- });
199
- afterAll(function() {
200
- return _async_to_generator(function() {
201
- var objects, keys, e;
202
- return _ts_generator(this, function(_state) {
203
- switch(_state.label){
204
- case 0:
205
- if (!RUN_NETWORK_TESTS || !client) return [
206
- 2
207
- ];
208
- _state.label = 1;
209
- case 1:
210
- _state.trys.push([
211
- 1,
212
- 5,
213
- ,
214
- 6
215
- ]);
216
- return [
217
- 4,
218
- client.listObjects('/', '', 1000)
219
- ];
220
- case 2:
221
- objects = _state.sent();
222
- if (!(objects && objects.length > 0)) return [
223
- 3,
224
- 4
225
- ];
226
- keys = objects.map(function(o) {
227
- return o.Key;
228
- }).filter(Boolean);
229
- if (!(keys.length > 0)) return [
230
- 3,
231
- 4
232
- ];
233
- return [
234
- 4,
235
- client.deleteObjects(keys)
236
- ];
237
- case 3:
238
- _state.sent();
239
- _state.label = 4;
240
- case 4:
241
- return [
242
- 3,
243
- 6
244
- ];
245
- case 5:
246
- e = _state.sent();
247
- console.log('Cleanup error:', e);
248
- return [
249
- 3,
250
- 6
251
- ];
252
- case 6:
253
- return [
254
- 2
255
- ];
256
- }
257
- });
258
- })();
259
- });
260
- describe.skipIf(!RUN_NETWORK_TESTS)('listObjects with delimiter', function() {
261
- test('should list objects and detect directories', function() {
262
- return _async_to_generator(function() {
263
- var objects, dirs, files, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, dir, _iteratorNormalCompletion1, _didIteratorError1, _iteratorError1, _iterator1, _step1, file;
264
- return _ts_generator(this, function(_state) {
265
- switch(_state.label){
266
- case 0:
267
- // Create test structure
268
- return [
269
- 4,
270
- client.putObject('file1.txt', 'content1')
271
- ];
272
- case 1:
273
- _state.sent();
274
- return [
275
- 4,
276
- client.putObject('file2.txt', 'content2')
277
- ];
278
- case 2:
279
- _state.sent();
280
- return [
281
- 4,
282
- client.putObject('dir1/', '')
283
- ];
284
- case 3:
285
- _state.sent(); // Directory marker
286
- return [
287
- 4,
288
- client.putObject('dir1/nested.txt', 'nested content')
289
- ];
290
- case 4:
291
- _state.sent();
292
- return [
293
- 4,
294
- client.putObject('dir2/', '')
295
- ];
296
- case 5:
297
- _state.sent(); // Another directory marker
298
- return [
299
- 4,
300
- client.listObjects('/', '', 100, {
301
- delimiter: '/'
302
- })
303
- ];
304
- case 6:
305
- objects = _state.sent();
306
- console.log('MinIO Play listing with delimiter:', JSON.stringify(objects, null, 2));
307
- expect(objects).toBeDefined();
308
- expect(Array.isArray(objects)).toBe(true);
309
- if (objects && objects.length > 0) {
310
- // Check for files and directories
311
- dirs = objects.filter(function(o) {
312
- var _o_Key;
313
- return (_o_Key = o.Key) === null || _o_Key === void 0 ? void 0 : _o_Key.endsWith('/');
314
- });
315
- files = objects.filter(function(o) {
316
- var _o_Key;
317
- return !((_o_Key = o.Key) === null || _o_Key === void 0 ? void 0 : _o_Key.endsWith('/'));
318
- });
319
- console.log("Found ".concat(dirs.length, " directories and ").concat(files.length, " files"));
320
- console.log('Directories:', dirs.map(function(d) {
321
- return d.Key;
322
- }));
323
- console.log('Files:', files.map(function(f) {
324
- return f.Key;
325
- }));
326
- _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
327
- try {
328
- // Directories should have Size: 0
329
- for(_iterator = dirs[Symbol.iterator](); !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
330
- dir = _step.value;
331
- expect(Number(dir.Size)).toBe(0);
332
- expect(dir.Key).toMatch(/\/$/);
333
- }
334
- } catch (err) {
335
- _didIteratorError = true;
336
- _iteratorError = err;
337
- } finally{
338
- try {
339
- if (!_iteratorNormalCompletion && _iterator.return != null) {
340
- _iterator.return();
341
- }
342
- } finally{
343
- if (_didIteratorError) {
344
- throw _iteratorError;
345
- }
346
- }
347
- }
348
- _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
349
- try {
350
- // Files should have Size > 0
351
- for(_iterator1 = files[Symbol.iterator](); !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
352
- file = _step1.value;
353
- expect(Number(file.Size)).toBeGreaterThan(0);
354
- expect(file.Key).not.toMatch(/\/$/);
355
- }
356
- } catch (err) {
357
- _didIteratorError1 = true;
358
- _iteratorError1 = err;
359
- } finally{
360
- try {
361
- if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
362
- _iterator1.return();
363
- }
364
- } finally{
365
- if (_didIteratorError1) {
366
- throw _iteratorError1;
367
- }
368
- }
369
- }
370
- }
371
- return [
372
- 2
373
- ];
374
- }
375
- });
376
- })();
377
- });
378
- test('should list nested directory contents', function() {
379
- return _async_to_generator(function() {
380
- var objects, files;
381
- return _ts_generator(this, function(_state) {
382
- switch(_state.label){
383
- case 0:
384
- return [
385
- 4,
386
- client.listObjects('/', 'dir1/', 100, {
387
- delimiter: '/'
388
- })
389
- ];
390
- case 1:
391
- objects = _state.sent();
392
- console.log('MinIO Play dir1/ listing:', JSON.stringify(objects, null, 2));
393
- expect(objects).toBeDefined();
394
- expect(Array.isArray(objects)).toBe(true);
395
- // Should find nested.txt
396
- files = (objects === null || objects === void 0 ? void 0 : objects.filter(function(o) {
397
- var _o_Key;
398
- return !((_o_Key = o.Key) === null || _o_Key === void 0 ? void 0 : _o_Key.endsWith('/'));
399
- })) || [];
400
- expect(files.some(function(f) {
401
- var _f_Key;
402
- return (_f_Key = f.Key) === null || _f_Key === void 0 ? void 0 : _f_Key.includes('nested.txt');
403
- })).toBe(true);
404
- return [
405
- 2
406
- ];
407
- }
408
- });
409
- })();
410
- });
411
- });
154
+ var TEST_BUCKET = 's3mini-test-'.concat(Date.now());
155
+ describe('s3mini with MinIO Play', () => {
156
+ var client;
157
+ beforeAll(() =>
158
+ _async_to_generator(function () {
159
+ var e;
160
+ return _ts_generator(this, (_state) => {
161
+ switch (_state.label) {
162
+ case 0:
163
+ if (!RUN_NETWORK_TESTS) return [2];
164
+ // s3mini expects bucket name in the endpoint URL
165
+ client = new S3mini({
166
+ endpoint: 'https://play.min.io/'.concat(TEST_BUCKET),
167
+ accessKeyId: 'Q3AM3UQ867SPQQA43P2F',
168
+ secretAccessKey: 'zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG',
169
+ region: 'us-east-1',
170
+ });
171
+ _state.label = 1;
172
+ case 1:
173
+ _state.trys.push([1, 3, , 4]);
174
+ return [4, client.createBucket()];
175
+ case 2:
176
+ _state.sent();
177
+ console.log('Created bucket: '.concat(TEST_BUCKET));
178
+ return [3, 4];
179
+ case 3:
180
+ e = _state.sent();
181
+ console.log('Bucket creation error:', e);
182
+ return [3, 4];
183
+ case 4:
184
+ return [2];
185
+ }
186
+ });
187
+ })(),
188
+ );
189
+ afterAll(() =>
190
+ _async_to_generator(function () {
191
+ var objects, keys, e;
192
+ return _ts_generator(this, (_state) => {
193
+ switch (_state.label) {
194
+ case 0:
195
+ if (!RUN_NETWORK_TESTS || !client) return [2];
196
+ _state.label = 1;
197
+ case 1:
198
+ _state.trys.push([1, 5, , 6]);
199
+ return [4, client.listObjects('/', '', 1000)];
200
+ case 2:
201
+ objects = _state.sent();
202
+ if (!(objects && objects.length > 0)) return [3, 4];
203
+ keys = objects.map((o) => o.Key).filter(Boolean);
204
+ if (!(keys.length > 0)) return [3, 4];
205
+ return [4, client.deleteObjects(keys)];
206
+ case 3:
207
+ _state.sent();
208
+ _state.label = 4;
209
+ case 4:
210
+ return [3, 6];
211
+ case 5:
212
+ e = _state.sent();
213
+ console.log('Cleanup error:', e);
214
+ return [3, 6];
215
+ case 6:
216
+ return [2];
217
+ }
218
+ });
219
+ })(),
220
+ );
221
+ describe.skipIf(!RUN_NETWORK_TESTS)('listObjects with delimiter', () => {
222
+ test('should list objects and detect directories', () =>
223
+ _async_to_generator(function () {
224
+ var objects,
225
+ dirs,
226
+ files,
227
+ _iteratorNormalCompletion,
228
+ _didIteratorError,
229
+ _iteratorError,
230
+ _iterator,
231
+ _step,
232
+ dir,
233
+ _iteratorNormalCompletion1,
234
+ _didIteratorError1,
235
+ _iteratorError1,
236
+ _iterator1,
237
+ _step1,
238
+ file;
239
+ return _ts_generator(this, (_state) => {
240
+ switch (_state.label) {
241
+ case 0:
242
+ // Create test structure
243
+ return [4, client.putObject('file1.txt', 'content1')];
244
+ case 1:
245
+ _state.sent();
246
+ return [4, client.putObject('file2.txt', 'content2')];
247
+ case 2:
248
+ _state.sent();
249
+ return [4, client.putObject('dir1/', '')];
250
+ case 3:
251
+ _state.sent(); // Directory marker
252
+ return [4, client.putObject('dir1/nested.txt', 'nested content')];
253
+ case 4:
254
+ _state.sent();
255
+ return [4, client.putObject('dir2/', '')];
256
+ case 5:
257
+ _state.sent(); // Another directory marker
258
+ return [
259
+ 4,
260
+ client.listObjects('/', '', 100, {
261
+ delimiter: '/',
262
+ }),
263
+ ];
264
+ case 6:
265
+ objects = _state.sent();
266
+ console.log('MinIO Play listing with delimiter:', JSON.stringify(objects, null, 2));
267
+ expect(objects).toBeDefined();
268
+ expect(Array.isArray(objects)).toBe(true);
269
+ if (objects && objects.length > 0) {
270
+ // Check for files and directories
271
+ dirs = objects.filter((o) => {
272
+ var _o_Key;
273
+ return (_o_Key = o.Key) === null || _o_Key === void 0 ? void 0 : _o_Key.endsWith('/');
274
+ });
275
+ files = objects.filter((o) => {
276
+ var _o_Key;
277
+ return !((_o_Key = o.Key) === null || _o_Key === void 0 ? void 0 : _o_Key.endsWith('/'));
278
+ });
279
+ console.log('Found '.concat(dirs.length, ' directories and ').concat(files.length, ' files'));
280
+ console.log(
281
+ 'Directories:',
282
+ dirs.map((d) => d.Key),
283
+ );
284
+ console.log(
285
+ 'Files:',
286
+ files.map((f) => f.Key),
287
+ );
288
+ (_iteratorNormalCompletion = true), (_didIteratorError = false), (_iteratorError = undefined);
289
+ try {
290
+ // Directories should have Size: 0
291
+ for (
292
+ _iterator = dirs[Symbol.iterator]();
293
+ !(_iteratorNormalCompletion = (_step = _iterator.next()).done);
294
+ _iteratorNormalCompletion = true
295
+ ) {
296
+ dir = _step.value;
297
+ expect(Number(dir.Size)).toBe(0);
298
+ expect(dir.Key).toMatch(/\/$/);
299
+ }
300
+ } catch (err) {
301
+ _didIteratorError = true;
302
+ _iteratorError = err;
303
+ } finally {
304
+ try {
305
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
306
+ _iterator.return();
307
+ }
308
+ } finally {
309
+ if (_didIteratorError) {
310
+ throw _iteratorError;
311
+ }
312
+ }
313
+ }
314
+ (_iteratorNormalCompletion1 = true), (_didIteratorError1 = false), (_iteratorError1 = undefined);
315
+ try {
316
+ // Files should have Size > 0
317
+ for (
318
+ _iterator1 = files[Symbol.iterator]();
319
+ !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done);
320
+ _iteratorNormalCompletion1 = true
321
+ ) {
322
+ file = _step1.value;
323
+ expect(Number(file.Size)).toBeGreaterThan(0);
324
+ expect(file.Key).not.toMatch(/\/$/);
325
+ }
326
+ } catch (err) {
327
+ _didIteratorError1 = true;
328
+ _iteratorError1 = err;
329
+ } finally {
330
+ try {
331
+ if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
332
+ _iterator1.return();
333
+ }
334
+ } finally {
335
+ if (_didIteratorError1) {
336
+ throw _iteratorError1;
337
+ }
338
+ }
339
+ }
340
+ }
341
+ return [2];
342
+ }
343
+ });
344
+ })());
345
+ test('should list nested directory contents', () =>
346
+ _async_to_generator(function () {
347
+ var objects, files;
348
+ return _ts_generator(this, (_state) => {
349
+ switch (_state.label) {
350
+ case 0:
351
+ return [
352
+ 4,
353
+ client.listObjects('/', 'dir1/', 100, {
354
+ delimiter: '/',
355
+ }),
356
+ ];
357
+ case 1:
358
+ objects = _state.sent();
359
+ console.log('MinIO Play dir1/ listing:', JSON.stringify(objects, null, 2));
360
+ expect(objects).toBeDefined();
361
+ expect(Array.isArray(objects)).toBe(true);
362
+ // Should find nested.txt
363
+ files =
364
+ (objects === null || objects === void 0
365
+ ? void 0
366
+ : objects.filter((o) => {
367
+ var _o_Key;
368
+ return !((_o_Key = o.Key) === null || _o_Key === void 0 ? void 0 : _o_Key.endsWith('/'));
369
+ })) || [];
370
+ expect(
371
+ files.some((f) => {
372
+ var _f_Key;
373
+ return (_f_Key = f.Key) === null || _f_Key === void 0 ? void 0 : _f_Key.includes('nested.txt');
374
+ }),
375
+ ).toBe(true);
376
+ return [2];
377
+ }
378
+ });
379
+ })());
380
+ });
412
381
  });
413
382
  /**
414
383
  * Unit tests for S3 directory detection logic (no network required)
@@ -416,169 +385,171 @@ describe('s3mini with MinIO Play', function() {
416
385
  * When using delimiter: '/' with listObjects, S3 returns:
417
386
  * - Files: Key without trailing /, Size > 0
418
387
  * - Directories: Key with trailing /, Size: 0
419
- */ describe('s3mini listObjects behavior', function() {
420
- test('directory detection logic - directories end with / and have Size: 0', function() {
421
- // Mock response similar to user's example
422
- var mockResponse = [
423
- {
424
- Key: 'fusion/README.md',
425
- LastModified: '2025-12-18T01:51:09.000Z',
426
- ETag: '"adc69293e8fd256b2609664f1e11cb53"',
427
- Size: 6,
428
- StorageClass: 'STANDARD'
429
- },
430
- {
431
- Key: 'fusion/home/',
432
- Size: 0,
433
- LastModified: new Date('1970-01-01T00:00:00.000Z'),
434
- ETag: '',
435
- StorageClass: ''
436
- },
437
- {
438
- Key: 'fusion/mcp/',
439
- Size: 0,
440
- LastModified: new Date('1970-01-01T00:00:00.000Z'),
441
- ETag: '',
442
- StorageClass: ''
443
- }
444
- ];
445
- var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
446
- try {
447
- // Test directory detection logic
448
- for(var _iterator = mockResponse[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
449
- var obj = _step.value;
450
- var isDir = obj.Key.endsWith('/');
451
- if (isDir) {
452
- expect(obj.Size).toBe(0);
453
- expect(obj.Key).toMatch(/\/$/);
454
- } else {
455
- expect(obj.Size).toBeGreaterThan(0);
456
- expect(obj.Key).not.toMatch(/\/$/);
457
- }
458
- }
459
- } catch (err) {
460
- _didIteratorError = true;
461
- _iteratorError = err;
462
- } finally{
463
- try {
464
- if (!_iteratorNormalCompletion && _iterator.return != null) {
465
- _iterator.return();
466
- }
467
- } finally{
468
- if (_didIteratorError) {
469
- throw _iteratorError;
470
- }
471
- }
472
- }
473
- // Count directories and files
474
- var dirs = mockResponse.filter(function(o) {
475
- return o.Key.endsWith('/');
476
- });
477
- var files = mockResponse.filter(function(o) {
478
- return !o.Key.endsWith('/');
479
- });
480
- expect(dirs).toHaveLength(2);
481
- expect(files).toHaveLength(1);
482
- });
483
- test('readdir should properly identify directories from S3 response', function() {
484
- var s3Response = [
485
- {
486
- Key: 'fusion/README.md',
487
- Size: 6,
488
- LastModified: new Date(),
489
- ETag: '"abc"'
490
- },
491
- {
492
- Key: 'fusion/home/',
493
- Size: 0,
494
- LastModified: new Date(0),
495
- ETag: ''
496
- },
497
- {
498
- Key: 'fusion/mcp/',
499
- Size: 0,
500
- LastModified: new Date(0),
501
- ETag: ''
502
- }
503
- ];
504
- var results = s3Response.map(function(obj) {
505
- var key = obj.Key;
506
- var isDir = key.endsWith('/');
507
- var name = isDir ? key.slice(0, -1).split('/').pop() : key.split('/').pop();
508
- return {
509
- name: name,
510
- kind: isDir ? 'directory' : 'file',
511
- size: obj.Size
512
- };
513
- });
514
- expect(results).toEqual([
515
- {
516
- name: 'README.md',
517
- kind: 'file',
518
- size: 6
519
- },
520
- {
521
- name: 'home',
522
- kind: 'directory',
523
- size: 0
524
- },
525
- {
526
- name: 'mcp',
527
- kind: 'directory',
528
- size: 0
529
- }
530
- ]);
531
- });
532
- test('should handle nested paths correctly', function() {
533
- var s3Response = [
534
- {
535
- Key: 'data/2024/01/file.csv',
536
- Size: 1024
537
- },
538
- {
539
- Key: 'data/2024/02/',
540
- Size: 0
541
- },
542
- {
543
- Key: 'data/config.json',
544
- Size: 256
545
- }
546
- ];
547
- var prefix = 'data/';
548
- var results = s3Response.map(function(obj) {
549
- var key = obj.Key;
550
- var relativeKey = key.startsWith(prefix) ? key.slice(prefix.length) : key;
551
- var isDir = key.endsWith('/');
552
- var parts = relativeKey.split('/').filter(Boolean);
553
- var name = parts[0];
554
- return {
555
- key: key,
556
- relativeKey: relativeKey,
557
- name: name,
558
- isDir: isDir
559
- };
560
- });
561
- // For non-recursive listing, only want immediate children
562
- var immediateChildren = results.filter(function(r) {
563
- var keyWithoutTrailingSlash = r.relativeKey.replace(/\/$/, '');
564
- return !keyWithoutTrailingSlash.includes('/');
565
- });
566
- expect(immediateChildren).toHaveLength(1);
567
- expect(immediateChildren[0].name).toBe('config.json');
568
- });
569
- test('should correctly strip prefix and build file stat', function() {
570
- var prefix = 'myapp/data';
571
- var normalizedPrefix = prefix.replace(/^\/+/, '').replace(/\/+$/, '');
572
- var stripPrefix = function(key) {
573
- if (!normalizedPrefix || !key.startsWith(normalizedPrefix + '/')) {
574
- return key.startsWith('/') ? key : '/' + key;
575
- }
576
- var withoutPrefix = key.slice(normalizedPrefix.length);
577
- return withoutPrefix || '/';
578
- };
579
- expect(stripPrefix('myapp/data/file.txt')).toBe('/file.txt');
580
- expect(stripPrefix('myapp/data/subdir/')).toBe('/subdir/');
581
- expect(stripPrefix('myapp/data/')).toBe('/');
582
- expect(stripPrefix('other/path')).toBe('/other/path');
583
- });
388
+ */ describe('s3mini listObjects behavior', () => {
389
+ test('directory detection logic - directories end with / and have Size: 0', () => {
390
+ // Mock response similar to user's example
391
+ var mockResponse = [
392
+ {
393
+ Key: 'fusion/README.md',
394
+ LastModified: '2025-12-18T01:51:09.000Z',
395
+ ETag: '"adc69293e8fd256b2609664f1e11cb53"',
396
+ Size: 6,
397
+ StorageClass: 'STANDARD',
398
+ },
399
+ {
400
+ Key: 'fusion/home/',
401
+ Size: 0,
402
+ LastModified: new Date('1970-01-01T00:00:00.000Z'),
403
+ ETag: '',
404
+ StorageClass: '',
405
+ },
406
+ {
407
+ Key: 'fusion/mcp/',
408
+ Size: 0,
409
+ LastModified: new Date('1970-01-01T00:00:00.000Z'),
410
+ ETag: '',
411
+ StorageClass: '',
412
+ },
413
+ ];
414
+ var _iteratorNormalCompletion = true,
415
+ _didIteratorError = false,
416
+ _iteratorError;
417
+ try {
418
+ // Test directory detection logic
419
+ for (
420
+ var _iterator = mockResponse[Symbol.iterator](), _step;
421
+ !(_iteratorNormalCompletion = (_step = _iterator.next()).done);
422
+ _iteratorNormalCompletion = true
423
+ ) {
424
+ var obj = _step.value;
425
+ var isDir = obj.Key.endsWith('/');
426
+ if (isDir) {
427
+ expect(obj.Size).toBe(0);
428
+ expect(obj.Key).toMatch(/\/$/);
429
+ } else {
430
+ expect(obj.Size).toBeGreaterThan(0);
431
+ expect(obj.Key).not.toMatch(/\/$/);
432
+ }
433
+ }
434
+ } catch (err) {
435
+ _didIteratorError = true;
436
+ _iteratorError = err;
437
+ } finally {
438
+ try {
439
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
440
+ _iterator.return();
441
+ }
442
+ } finally {
443
+ if (_didIteratorError) {
444
+ throw _iteratorError;
445
+ }
446
+ }
447
+ }
448
+ // Count directories and files
449
+ var dirs = mockResponse.filter((o) => o.Key.endsWith('/'));
450
+ var files = mockResponse.filter((o) => !o.Key.endsWith('/'));
451
+ expect(dirs).toHaveLength(2);
452
+ expect(files).toHaveLength(1);
453
+ });
454
+ test('readdir should properly identify directories from S3 response', () => {
455
+ var s3Response = [
456
+ {
457
+ Key: 'fusion/README.md',
458
+ Size: 6,
459
+ LastModified: new Date(),
460
+ ETag: '"abc"',
461
+ },
462
+ {
463
+ Key: 'fusion/home/',
464
+ Size: 0,
465
+ LastModified: new Date(0),
466
+ ETag: '',
467
+ },
468
+ {
469
+ Key: 'fusion/mcp/',
470
+ Size: 0,
471
+ LastModified: new Date(0),
472
+ ETag: '',
473
+ },
474
+ ];
475
+ var results = s3Response.map((obj) => {
476
+ var key = obj.Key;
477
+ var isDir = key.endsWith('/');
478
+ var name = isDir ? key.slice(0, -1).split('/').pop() : key.split('/').pop();
479
+ return {
480
+ name: name,
481
+ kind: isDir ? 'directory' : 'file',
482
+ size: obj.Size,
483
+ };
484
+ });
485
+ expect(results).toEqual([
486
+ {
487
+ name: 'README.md',
488
+ kind: 'file',
489
+ size: 6,
490
+ },
491
+ {
492
+ name: 'home',
493
+ kind: 'directory',
494
+ size: 0,
495
+ },
496
+ {
497
+ name: 'mcp',
498
+ kind: 'directory',
499
+ size: 0,
500
+ },
501
+ ]);
502
+ });
503
+ test('should handle nested paths correctly', () => {
504
+ var s3Response = [
505
+ {
506
+ Key: 'data/2024/01/file.csv',
507
+ Size: 1024,
508
+ },
509
+ {
510
+ Key: 'data/2024/02/',
511
+ Size: 0,
512
+ },
513
+ {
514
+ Key: 'data/config.json',
515
+ Size: 256,
516
+ },
517
+ ];
518
+ var prefix = 'data/';
519
+ var results = s3Response.map((obj) => {
520
+ var key = obj.Key;
521
+ var relativeKey = key.startsWith(prefix) ? key.slice(prefix.length) : key;
522
+ var isDir = key.endsWith('/');
523
+ var parts = relativeKey.split('/').filter(Boolean);
524
+ var name = parts[0];
525
+ return {
526
+ key: key,
527
+ relativeKey: relativeKey,
528
+ name: name,
529
+ isDir: isDir,
530
+ };
531
+ });
532
+ // For non-recursive listing, only want immediate children
533
+ var immediateChildren = results.filter((r) => {
534
+ var keyWithoutTrailingSlash = r.relativeKey.replace(/\/$/, '');
535
+ return !keyWithoutTrailingSlash.includes('/');
536
+ });
537
+ expect(immediateChildren).toHaveLength(1);
538
+ expect(immediateChildren[0].name).toBe('config.json');
539
+ });
540
+ test('should correctly strip prefix and build file stat', () => {
541
+ var prefix = 'myapp/data';
542
+ var normalizedPrefix = prefix.replace(/^\/+/, '').replace(/\/+$/, '');
543
+ var stripPrefix = (key) => {
544
+ if (!normalizedPrefix || !key.startsWith(normalizedPrefix + '/')) {
545
+ return key.startsWith('/') ? key : '/' + key;
546
+ }
547
+ var withoutPrefix = key.slice(normalizedPrefix.length);
548
+ return withoutPrefix || '/';
549
+ };
550
+ expect(stripPrefix('myapp/data/file.txt')).toBe('/file.txt');
551
+ expect(stripPrefix('myapp/data/subdir/')).toBe('/subdir/');
552
+ expect(stripPrefix('myapp/data/')).toBe('/');
553
+ expect(stripPrefix('other/path')).toBe('/other/path');
554
+ });
584
555
  });