@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,318 +1,355 @@
1
- import { expect } from "vitest";
2
- import { FileSystemError, FileSystemErrorCode } from "../FileSystemError.js";
1
+ import { expect } from 'vitest';
2
+ import { FileSystemError, FileSystemErrorCode } from '../FileSystemError.js';
3
3
  export async function runFileSystemTest(fs, options = {}) {
4
- const { writableStream = true, readableStream = true, readStream = true, writeStream = true, abort = true } = options;
5
- // should be implemented
6
- const stat = await fs.stat("/README.txt");
7
- expect(stat).toMatchObject({
8
- path: "/README.txt",
9
- directory: "/",
10
- name: "README.txt",
11
- kind: "file",
12
- size: 5
13
- });
14
- await fs.mkdir("/");
15
- const entries = await fs.readdir("/");
16
- expect(entries.some((e) => e.name === "README.txt")).toBe(true);
17
- await fs.mkdir("/test");
18
- if (fs.getUrl) {
19
- expect(fs.getUrl(await fs.stat("/README.txt"))).toBeTypeOf("string");
20
- }
21
- // should handle AbortSignal
22
- if (abort) {
23
- const controller = new AbortController();
24
- controller.abort();
25
- await expect(fs.stat("/README.txt", {
26
- signal: controller.signal
27
- })).rejects.toThrow(Error);
28
- await expect(fs.readdir("/", {
29
- signal: controller.signal
30
- })).rejects.toThrow(Error);
31
- await expect(fs.mkdir("/test", {
32
- signal: controller.signal
33
- })).rejects.toThrow(Error);
34
- await expect(fs.readFile("/README.txt", {
35
- signal: controller.signal
36
- })).rejects.toThrow(Error);
37
- await expect(fs.writeFile("/test.txt", "test", {
38
- signal: controller.signal
39
- })).rejects.toThrow(Error);
40
- await expect(fs.rm("/README.txt", {
41
- signal: controller.signal
42
- })).rejects.toThrow(Error);
43
- await expect(fs.rename("/README.txt", "/new.txt", {
44
- signal: controller.signal
45
- })).rejects.toThrow(Error);
46
- await expect(fs.copy("/README.txt", "/copy.txt", {
47
- signal: controller.signal
48
- })).rejects.toThrow(Error);
49
- }
50
- // should validate input parameters
51
- await expect(fs.stat("")).rejects.toThrow(FileSystemError);
52
- await expect(fs.stat("")).rejects.toMatchObject({
53
- code: FileSystemErrorCode.EINVAL
54
- });
55
- await expect(fs.stat(null)).rejects.toThrow(FileSystemError);
56
- await expect(fs.stat(null)).rejects.toMatchObject({
57
- code: FileSystemErrorCode.EINVAL
58
- });
59
- await expect(fs.stat(undefined)).rejects.toThrow(FileSystemError);
60
- await expect(fs.stat(undefined)).rejects.toMatchObject({
61
- code: FileSystemErrorCode.EINVAL
62
- });
63
- await expect(fs.stat(123)).rejects.toThrow(FileSystemError);
64
- await expect(fs.stat(123)).rejects.toMatchObject({
65
- code: FileSystemErrorCode.EINVAL
66
- });
67
- await expect(fs.writeFile("", "test")).rejects.toThrow(FileSystemError);
68
- await expect(fs.writeFile("", "test")).rejects.toMatchObject({
69
- code: FileSystemErrorCode.EINVAL
70
- });
71
- await expect(fs.writeFile("/test", null)).rejects.toThrow(FileSystemError);
72
- await expect(fs.writeFile("/test", null)).rejects.toMatchObject({
73
- code: FileSystemErrorCode.EINVAL
74
- });
75
- await expect(fs.writeFile("/test", undefined)).rejects.toThrow(FileSystemError);
76
- await expect(fs.writeFile("/test", undefined)).rejects.toMatchObject({
77
- code: FileSystemErrorCode.EINVAL
78
- });
79
- await expect(fs.writeFile("/", "test")).rejects.toThrow(FileSystemError);
80
- await expect(fs.writeFile("/", "test")).rejects.toMatchObject({
81
- code: FileSystemErrorCode.EINVAL
82
- });
83
- // should support streaming operations
84
- if (readStream && fs.createReadStream) {
85
- await fs.writeFile("/stream.txt", "Hello, World!");
86
- // Test createReadStream
87
- const readStream = fs.createReadStream("/stream.txt");
88
- expect(readStream).toBeDefined();
89
- const chunks = [];
90
- for await (const chunk of readStream) {
91
- chunks.push(chunk);
92
- }
93
- expect(Buffer.concat(chunks).toString()).toBe("Hello, World!");
94
- // Test createReadStream with range
95
- const rangeStream = fs.createReadStream("/stream.txt", {
96
- range: {
97
- start: 0,
98
- end: 4
99
- }
100
- });
101
- const rangeChunks = [];
102
- for await (const chunk of rangeStream) {
103
- rangeChunks.push(chunk);
104
- }
105
- expect(Buffer.concat(rangeChunks).toString()).toBe("Hello");
106
- }
107
- if (writeStream && fs.createWriteStream) {
108
- // Test createWriteStream
109
- const writeStream = fs.createWriteStream("/write-test.txt");
110
- expect(writeStream).toBeDefined();
111
- writeStream.write("Test content");
112
- writeStream.end();
113
- await new Promise((resolve) => writeStream.on("finish", resolve));
114
- expect(await fs.readFile("/write-test.txt", {
115
- encoding: "text"
116
- })).toBe("Test content");
117
- }
118
- // should support Web Streams API
119
- if (readableStream) {
120
- await fs.writeFile("/webstream.txt", "Web Stream Test");
121
- // Test createReadableStream
122
- const readableStream = fs.createReadableStream("/webstream.txt");
123
- expect(readableStream).toBeDefined();
124
- const reader = readableStream.getReader();
125
- const { value } = await reader.read();
126
- expect(value?.toString()).toBe("Web Stream Test");
127
- }
128
- if (writableStream) {
129
- // Test createWritableStream
130
- const writableStream = fs.createWritableStream("/web-write-test.txt");
131
- expect(writableStream).toBeDefined();
132
- const writer = writableStream.getWriter();
133
- await writer.write(Buffer.from("Web Stream Write Test"));
134
- await writer.close();
135
- expect(await fs.readFile("/web-write-test.txt", {
136
- encoding: "text"
137
- })).toBe("Web Stream Write Test");
138
- }
139
- // should handle streaming errors
140
- if (abort && readStream && fs.createReadStream) {
141
- const controller2 = new AbortController();
142
- // Test read stream with abort
143
- const readStream = fs.createReadStream("/README.txt", {
144
- signal: controller2.signal
145
- });
146
- controller2.abort();
147
- await expect(new Promise((_, reject) => {
148
- readStream.on("error", reject);
149
- })).rejects.toThrow(Error);
150
- }
151
- if (abort && writeStream && fs.createWriteStream) {
152
- // Test write stream with abort
153
- const controller3 = new AbortController();
154
- const writeStream = fs.createWriteStream("/abort-test.txt", {
155
- signal: controller3.signal
156
- });
157
- controller3.abort();
158
- await expect(new Promise((_, reject) => {
159
- writeStream.on("error", reject);
160
- writeStream.write("test");
161
- })).rejects.toThrow(Error);
162
- }
163
- // should handle file operations correctly
164
- // Test file creation
165
- await fs.writeFile("/newfile.txt", "New content");
166
- expect(await fs.exists("/newfile.txt")).toBe(true);
167
- const stat2 = await fs.stat("/newfile.txt");
168
- expect(stat2.kind).toBe("file");
169
- expect(stat2.size).toBe(11); // "New content" is 11 bytes
170
- // Test file reading
171
- const content = await fs.readFile("/newfile.txt", {
172
- encoding: "text"
173
- });
174
- expect(content).toBe("New content");
175
- // Test file reading as binary
176
- const binary = await fs.readFile("/newfile.txt");
177
- expect(Buffer.from(binary).toString()).toBe("New content");
178
- // Test file overwrite
179
- await fs.writeFile("/newfile.txt", "Updated content");
180
- expect(await fs.readFile("/newfile.txt", {
181
- encoding: "text"
182
- })).toBe("Updated content");
183
- // Test file overwrite protection
184
- await expect(fs.writeFile("/newfile.txt", "Should fail", {
185
- overwrite: false
186
- })).rejects.toThrow(FileSystemError);
187
- await expect(fs.writeFile("/newfile.txt", "Should fail", {
188
- overwrite: false
189
- })).rejects.toMatchObject({
190
- code: FileSystemErrorCode.EEXIST
191
- });
192
- // Test large file write (should use file_node_content table)
193
- // Create ~1KB data to test large file handling
194
- const largeData = "x".repeat(1024); // 1KB of data
195
- await fs.writeFile("/largefile.txt", largeData);
196
- const largeFileStat = await fs.stat("/largefile.txt");
197
- expect(largeFileStat.size).toBe(1024);
198
- const largeFileContent = await fs.readFile("/largefile.txt", {
199
- encoding: "text"
200
- });
201
- expect(largeFileContent).toBe(largeData);
202
- expect(largeFileContent.length).toBe(1024);
203
- // should handle directory operations correctly
204
- // Test directory creation
205
- await fs.mkdir("/newdir");
206
- expect(await fs.exists("/newdir")).toBe(true);
207
- const stat3 = await fs.stat("/newdir");
208
- expect(stat3.kind).toBe("directory");
209
- // Test recursive directory creation
210
- await fs.mkdir("/deep/nested/dir", {
211
- recursive: true
212
- });
213
- expect(await fs.exists("/deep/nested/dir")).toBe(true);
214
- // Test non-recursive directory creation failure
215
- await expect(fs.mkdir("/another/deep/dir")).rejects.toThrow(FileSystemError);
216
- await expect(fs.mkdir("/another/deep/dir")).rejects.toMatchObject({
217
- code: FileSystemErrorCode.ENOENT
218
- });
219
- // Test directory listing
220
- await fs.writeFile("/newdir/file1.txt", "File 1");
221
- await fs.writeFile("/newdir/file2.txt", "File 2");
222
- const contents = await fs.readdir("/newdir");
223
- expect(contents).toHaveLength(2);
224
- expect(contents.map((f) => f.name)).toContain("file1.txt");
225
- expect(contents.map((f) => f.name)).toContain("file2.txt");
226
- // should handle file removal correctly
227
- await fs.writeFile("/toremove.txt", "Remove me");
228
- expect(await fs.exists("/toremove.txt")).toBe(true);
229
- await fs.rm("/toremove.txt");
230
- expect(await fs.exists("/toremove.txt")).toBe(false);
231
- // Test force removal
232
- await expect(fs.rm("/nonexistent.txt")).rejects.toThrow(FileSystemError);
233
- await expect(fs.rm("/nonexistent.txt")).rejects.toMatchObject({
234
- code: FileSystemErrorCode.ENOENT
235
- });
236
- await fs.rm("/nonexistent.txt", {
237
- force: true
238
- }); // Should not throw
239
- // Test recursive removal
240
- await fs.mkdir("/dirwithfiles", {
241
- recursive: true
242
- });
243
- await fs.writeFile("/dirwithfiles/file.txt", "content");
244
- await expect(fs.rm("/dirwithfiles")).rejects.toThrow(FileSystemError);
245
- await expect(fs.rm("/dirwithfiles")).rejects.toMatchObject({
246
- code: FileSystemErrorCode.ENOTEMPTY
247
- });
248
- await fs.rm("/dirwithfiles", {
249
- recursive: true
250
- });
251
- expect(await fs.exists("/dirwithfiles")).toBe(false);
252
- // should handle file rename correctly
253
- await fs.writeFile("/rename.txt", "Original content");
254
- expect(await fs.exists("/rename.txt")).toBe(true);
255
- await fs.rename("/rename.txt", "/renamed.txt");
256
- expect(await fs.exists("/rename.txt")).toBe(false);
257
- expect(await fs.exists("/renamed.txt")).toBe(true);
258
- expect(await fs.readFile("/renamed.txt", {
259
- encoding: "text"
260
- })).toBe("Original content");
261
- // should handle file copy correctly
262
- await fs.writeFile("/copy.txt", "Copy me");
263
- expect(await fs.exists("/copy.txt")).toBe(true);
264
- await fs.copy("/copy.txt", "/copied.txt");
265
- expect(await fs.exists("/copy.txt")).toBe(true);
266
- expect(await fs.exists("/copied.txt")).toBe(true);
267
- expect(await fs.readFile("/copied.txt", {
268
- encoding: "text"
269
- })).toBe("Copy me");
270
- // Test copy overwrite
271
- await fs.writeFile("/target2.txt", "Target content");
272
- await expect(fs.copy("/copy.txt", "/target2.txt")).rejects.toThrow(FileSystemError);
273
- await expect(fs.copy("/copy.txt", "/target2.txt")).rejects.toMatchObject({
274
- code: FileSystemErrorCode.EEXIST
275
- });
276
- await fs.copy("/copy.txt", "/target2.txt", {
277
- overwrite: true
278
- });
279
- expect(await fs.readFile("/target2.txt", {
280
- encoding: "text"
281
- })).toBe("Copy me");
282
- // should handle edge cases correctly
283
- // Test root directory operations
284
- await expect(fs.stat("/")).resolves.toBeDefined();
285
- await expect(fs.readdir("/")).resolves.toBeDefined();
286
- await fs.mkdir("/"); // Should not throw
287
- // Test path normalization
288
- await fs.writeFile("/normalize.txt", "test");
289
- expect(await fs.exists("/normalize.txt")).toBe(true);
290
- expect(await fs.exists("/./normalize.txt")).toBe(true);
291
- // Note: the exists method may return true for files with trailing slashes due to normalization
292
- // Test error cases
293
- await expect(fs.stat("/nonexistent")).rejects.toThrow(FileSystemError);
294
- await expect(fs.stat("/nonexistent")).rejects.toMatchObject({
295
- code: FileSystemErrorCode.ENOENT
296
- });
297
- await expect(fs.readdir("/nonexistent")).rejects.toThrow(FileSystemError);
298
- await expect(fs.readdir("/nonexistent")).rejects.toMatchObject({
299
- code: FileSystemErrorCode.ENOENT
300
- });
301
- await expect(fs.readFile("/nonexistent")).rejects.toThrow(FileSystemError);
302
- await expect(fs.readFile("/nonexistent")).rejects.toMatchObject({
303
- code: FileSystemErrorCode.ENOENT
304
- });
305
- await expect(fs.rm("/nonexistent")).rejects.toThrow(FileSystemError);
306
- await expect(fs.rm("/nonexistent")).rejects.toMatchObject({
307
- code: FileSystemErrorCode.ENOENT
308
- });
309
- await expect(fs.rename("/nonexistent", "/new")).rejects.toThrow(FileSystemError);
310
- await expect(fs.rename("/nonexistent", "/new")).rejects.toMatchObject({
311
- code: FileSystemErrorCode.ENOENT
312
- });
313
- await expect(fs.copy("/nonexistent", "/new")).rejects.toThrow(FileSystemError);
314
- await expect(fs.copy("/nonexistent", "/new")).rejects.toMatchObject({
315
- code: FileSystemErrorCode.ENOENT
316
- });
4
+ const { writableStream = true, readableStream = true, readStream = true, writeStream = true, abort = true } = options;
5
+ // should be implemented
6
+ const stat = await fs.stat('/README.txt');
7
+ expect(stat).toMatchObject({
8
+ path: '/README.txt',
9
+ directory: '/',
10
+ name: 'README.txt',
11
+ kind: 'file',
12
+ size: 5,
13
+ });
14
+ await fs.mkdir('/');
15
+ const entries = await fs.readdir('/');
16
+ expect(entries.some((e) => e.name === 'README.txt')).toBe(true);
17
+ await fs.mkdir('/test');
18
+ if (fs.getUrl) {
19
+ expect(fs.getUrl(await fs.stat('/README.txt'))).toBeTypeOf('string');
20
+ }
21
+ // should handle AbortSignal
22
+ if (abort) {
23
+ const controller = new AbortController();
24
+ controller.abort();
25
+ await expect(
26
+ fs.stat('/README.txt', {
27
+ signal: controller.signal,
28
+ }),
29
+ ).rejects.toThrow(Error);
30
+ await expect(
31
+ fs.readdir('/', {
32
+ signal: controller.signal,
33
+ }),
34
+ ).rejects.toThrow(Error);
35
+ await expect(
36
+ fs.mkdir('/test', {
37
+ signal: controller.signal,
38
+ }),
39
+ ).rejects.toThrow(Error);
40
+ await expect(
41
+ fs.readFile('/README.txt', {
42
+ signal: controller.signal,
43
+ }),
44
+ ).rejects.toThrow(Error);
45
+ await expect(
46
+ fs.writeFile('/test.txt', 'test', {
47
+ signal: controller.signal,
48
+ }),
49
+ ).rejects.toThrow(Error);
50
+ await expect(
51
+ fs.rm('/README.txt', {
52
+ signal: controller.signal,
53
+ }),
54
+ ).rejects.toThrow(Error);
55
+ await expect(
56
+ fs.rename('/README.txt', '/new.txt', {
57
+ signal: controller.signal,
58
+ }),
59
+ ).rejects.toThrow(Error);
60
+ await expect(
61
+ fs.copy('/README.txt', '/copy.txt', {
62
+ signal: controller.signal,
63
+ }),
64
+ ).rejects.toThrow(Error);
65
+ }
66
+ // should validate input parameters
67
+ await expect(fs.stat('')).rejects.toThrow(FileSystemError);
68
+ await expect(fs.stat('')).rejects.toMatchObject({
69
+ code: FileSystemErrorCode.EINVAL,
70
+ });
71
+ await expect(fs.stat(null)).rejects.toThrow(FileSystemError);
72
+ await expect(fs.stat(null)).rejects.toMatchObject({
73
+ code: FileSystemErrorCode.EINVAL,
74
+ });
75
+ await expect(fs.stat(undefined)).rejects.toThrow(FileSystemError);
76
+ await expect(fs.stat(undefined)).rejects.toMatchObject({
77
+ code: FileSystemErrorCode.EINVAL,
78
+ });
79
+ await expect(fs.stat(123)).rejects.toThrow(FileSystemError);
80
+ await expect(fs.stat(123)).rejects.toMatchObject({
81
+ code: FileSystemErrorCode.EINVAL,
82
+ });
83
+ await expect(fs.writeFile('', 'test')).rejects.toThrow(FileSystemError);
84
+ await expect(fs.writeFile('', 'test')).rejects.toMatchObject({
85
+ code: FileSystemErrorCode.EINVAL,
86
+ });
87
+ await expect(fs.writeFile('/test', null)).rejects.toThrow(FileSystemError);
88
+ await expect(fs.writeFile('/test', null)).rejects.toMatchObject({
89
+ code: FileSystemErrorCode.EINVAL,
90
+ });
91
+ await expect(fs.writeFile('/test', undefined)).rejects.toThrow(FileSystemError);
92
+ await expect(fs.writeFile('/test', undefined)).rejects.toMatchObject({
93
+ code: FileSystemErrorCode.EINVAL,
94
+ });
95
+ await expect(fs.writeFile('/', 'test')).rejects.toThrow(FileSystemError);
96
+ await expect(fs.writeFile('/', 'test')).rejects.toMatchObject({
97
+ code: FileSystemErrorCode.EINVAL,
98
+ });
99
+ // should support streaming operations
100
+ const serverFs = fs;
101
+ if (readStream && 'createReadStream' in fs) {
102
+ await fs.writeFile('/stream.txt', 'Hello, World!');
103
+ // Test createReadStream
104
+ const readStreamObj = serverFs.createReadStream('/stream.txt');
105
+ expect(readStreamObj).toBeDefined();
106
+ const chunks = [];
107
+ for await (const chunk of readStreamObj) {
108
+ chunks.push(chunk);
109
+ }
110
+ expect(Buffer.concat(chunks).toString()).toBe('Hello, World!');
111
+ // Test createReadStream with range
112
+ const rangeStream = serverFs.createReadStream('/stream.txt', {
113
+ range: {
114
+ start: 0,
115
+ end: 4,
116
+ },
117
+ });
118
+ const rangeChunks = [];
119
+ for await (const chunk of rangeStream) {
120
+ rangeChunks.push(chunk);
121
+ }
122
+ expect(Buffer.concat(rangeChunks).toString()).toBe('Hello');
123
+ }
124
+ if (writeStream && 'createWriteStream' in fs) {
125
+ // Test createWriteStream
126
+ const writeStreamObj = serverFs.createWriteStream('/write-test.txt');
127
+ expect(writeStreamObj).toBeDefined();
128
+ writeStreamObj.write('Test content');
129
+ writeStreamObj.end();
130
+ await new Promise((resolve) => writeStreamObj.on('finish', resolve));
131
+ expect(
132
+ await fs.readFile('/write-test.txt', {
133
+ encoding: 'text',
134
+ }),
135
+ ).toBe('Test content');
136
+ }
137
+ // should support Web Streams API
138
+ if (readableStream && fs.createReadableStream) {
139
+ await fs.writeFile('/webstream.txt', 'Web Stream Test');
140
+ // Test createReadableStream
141
+ const readableStreamObj = fs.createReadableStream('/webstream.txt');
142
+ expect(readableStreamObj).toBeDefined();
143
+ const reader = readableStreamObj.getReader();
144
+ const { value } = await reader.read();
145
+ expect(value?.toString()).toBe('Web Stream Test');
146
+ }
147
+ if (writableStream && fs.createWritableStream) {
148
+ // Test createWritableStream
149
+ const writableStreamObj = fs.createWritableStream('/web-write-test.txt');
150
+ expect(writableStreamObj).toBeDefined();
151
+ const writer = writableStreamObj.getWriter();
152
+ await writer.write(Buffer.from('Web Stream Write Test'));
153
+ await writer.close();
154
+ expect(
155
+ await fs.readFile('/web-write-test.txt', {
156
+ encoding: 'text',
157
+ }),
158
+ ).toBe('Web Stream Write Test');
159
+ }
160
+ // should handle streaming errors
161
+ if (abort && readStream && 'createReadStream' in fs) {
162
+ const controller2 = new AbortController();
163
+ // Test read stream with abort
164
+ const readStreamObj = serverFs.createReadStream('/README.txt', {
165
+ signal: controller2.signal,
166
+ });
167
+ controller2.abort();
168
+ await expect(
169
+ new Promise((_, reject) => {
170
+ readStreamObj.on('error', reject);
171
+ }),
172
+ ).rejects.toThrow(Error);
173
+ }
174
+ if (abort && writeStream && 'createWriteStream' in fs) {
175
+ // Test write stream with abort
176
+ const controller3 = new AbortController();
177
+ const writeStreamObj = serverFs.createWriteStream('/abort-test.txt', {
178
+ signal: controller3.signal,
179
+ });
180
+ controller3.abort();
181
+ await expect(
182
+ new Promise((_, reject) => {
183
+ writeStreamObj.on('error', reject);
184
+ writeStreamObj.write('test');
185
+ }),
186
+ ).rejects.toThrow(Error);
187
+ }
188
+ // should handle file operations correctly
189
+ // Test file creation
190
+ await fs.writeFile('/newfile.txt', 'New content');
191
+ expect(await fs.exists('/newfile.txt')).toBe(true);
192
+ const stat2 = await fs.stat('/newfile.txt');
193
+ expect(stat2.kind).toBe('file');
194
+ expect(stat2.size).toBe(11); // "New content" is 11 bytes
195
+ // Test file reading
196
+ const content = await fs.readFile('/newfile.txt', {
197
+ encoding: 'text',
198
+ });
199
+ expect(content).toBe('New content');
200
+ // Test file reading as binary
201
+ const binary = await fs.readFile('/newfile.txt');
202
+ expect(Buffer.from(binary).toString()).toBe('New content');
203
+ // Test file overwrite
204
+ await fs.writeFile('/newfile.txt', 'Updated content');
205
+ expect(
206
+ await fs.readFile('/newfile.txt', {
207
+ encoding: 'text',
208
+ }),
209
+ ).toBe('Updated content');
210
+ // Test file overwrite protection
211
+ await expect(
212
+ fs.writeFile('/newfile.txt', 'Should fail', {
213
+ overwrite: false,
214
+ }),
215
+ ).rejects.toThrow(FileSystemError);
216
+ await expect(
217
+ fs.writeFile('/newfile.txt', 'Should fail', {
218
+ overwrite: false,
219
+ }),
220
+ ).rejects.toMatchObject({
221
+ code: FileSystemErrorCode.EEXIST,
222
+ });
223
+ // Test large file write (should use file_node_content table)
224
+ // Create ~1KB data to test large file handling
225
+ const largeData = 'x'.repeat(1024); // 1KB of data
226
+ await fs.writeFile('/largefile.txt', largeData);
227
+ const largeFileStat = await fs.stat('/largefile.txt');
228
+ expect(largeFileStat.size).toBe(1024);
229
+ const largeFileContent = await fs.readFile('/largefile.txt', {
230
+ encoding: 'text',
231
+ });
232
+ expect(largeFileContent).toBe(largeData);
233
+ expect(largeFileContent.length).toBe(1024);
234
+ // should handle directory operations correctly
235
+ // Test directory creation
236
+ await fs.mkdir('/newdir');
237
+ expect(await fs.exists('/newdir')).toBe(true);
238
+ const stat3 = await fs.stat('/newdir');
239
+ expect(stat3.kind).toBe('directory');
240
+ // Test recursive directory creation
241
+ await fs.mkdir('/deep/nested/dir', {
242
+ recursive: true,
243
+ });
244
+ expect(await fs.exists('/deep/nested/dir')).toBe(true);
245
+ // Test non-recursive directory creation failure
246
+ await expect(fs.mkdir('/another/deep/dir')).rejects.toThrow(FileSystemError);
247
+ await expect(fs.mkdir('/another/deep/dir')).rejects.toMatchObject({
248
+ code: FileSystemErrorCode.ENOENT,
249
+ });
250
+ // Test directory listing
251
+ await fs.writeFile('/newdir/file1.txt', 'File 1');
252
+ await fs.writeFile('/newdir/file2.txt', 'File 2');
253
+ const contents = await fs.readdir('/newdir');
254
+ expect(contents).toHaveLength(2);
255
+ expect(contents.map((f) => f.name)).toContain('file1.txt');
256
+ expect(contents.map((f) => f.name)).toContain('file2.txt');
257
+ // should handle file removal correctly
258
+ await fs.writeFile('/toremove.txt', 'Remove me');
259
+ expect(await fs.exists('/toremove.txt')).toBe(true);
260
+ await fs.rm('/toremove.txt');
261
+ expect(await fs.exists('/toremove.txt')).toBe(false);
262
+ // Test force removal
263
+ await expect(fs.rm('/nonexistent.txt')).rejects.toThrow(FileSystemError);
264
+ await expect(fs.rm('/nonexistent.txt')).rejects.toMatchObject({
265
+ code: FileSystemErrorCode.ENOENT,
266
+ });
267
+ await fs.rm('/nonexistent.txt', {
268
+ force: true,
269
+ }); // Should not throw
270
+ // Test recursive removal
271
+ await fs.mkdir('/dirwithfiles', {
272
+ recursive: true,
273
+ });
274
+ await fs.writeFile('/dirwithfiles/file.txt', 'content');
275
+ await expect(fs.rm('/dirwithfiles')).rejects.toThrow(FileSystemError);
276
+ await expect(fs.rm('/dirwithfiles')).rejects.toMatchObject({
277
+ code: FileSystemErrorCode.ENOTEMPTY,
278
+ });
279
+ await fs.rm('/dirwithfiles', {
280
+ recursive: true,
281
+ });
282
+ expect(await fs.exists('/dirwithfiles')).toBe(false);
283
+ // should handle file rename correctly
284
+ await fs.writeFile('/rename.txt', 'Original content');
285
+ expect(await fs.exists('/rename.txt')).toBe(true);
286
+ await fs.rename('/rename.txt', '/renamed.txt');
287
+ expect(await fs.exists('/rename.txt')).toBe(false);
288
+ expect(await fs.exists('/renamed.txt')).toBe(true);
289
+ expect(
290
+ await fs.readFile('/renamed.txt', {
291
+ encoding: 'text',
292
+ }),
293
+ ).toBe('Original content');
294
+ // should handle file copy correctly
295
+ await fs.writeFile('/copy.txt', 'Copy me');
296
+ expect(await fs.exists('/copy.txt')).toBe(true);
297
+ await fs.copy('/copy.txt', '/copied.txt');
298
+ expect(await fs.exists('/copy.txt')).toBe(true);
299
+ expect(await fs.exists('/copied.txt')).toBe(true);
300
+ expect(
301
+ await fs.readFile('/copied.txt', {
302
+ encoding: 'text',
303
+ }),
304
+ ).toBe('Copy me');
305
+ // Test copy overwrite
306
+ await fs.writeFile('/target2.txt', 'Target content');
307
+ await expect(fs.copy('/copy.txt', '/target2.txt')).rejects.toThrow(FileSystemError);
308
+ await expect(fs.copy('/copy.txt', '/target2.txt')).rejects.toMatchObject({
309
+ code: FileSystemErrorCode.EEXIST,
310
+ });
311
+ await fs.copy('/copy.txt', '/target2.txt', {
312
+ overwrite: true,
313
+ });
314
+ expect(
315
+ await fs.readFile('/target2.txt', {
316
+ encoding: 'text',
317
+ }),
318
+ ).toBe('Copy me');
319
+ // should handle edge cases correctly
320
+ // Test root directory operations
321
+ await expect(fs.stat('/')).resolves.toBeDefined();
322
+ await expect(fs.readdir('/')).resolves.toBeDefined();
323
+ await fs.mkdir('/'); // Should not throw
324
+ // Test path normalization
325
+ await fs.writeFile('/normalize.txt', 'test');
326
+ expect(await fs.exists('/normalize.txt')).toBe(true);
327
+ expect(await fs.exists('/./normalize.txt')).toBe(true);
328
+ // Note: the exists method may return true for files with trailing slashes due to normalization
329
+ // Test error cases
330
+ await expect(fs.stat('/nonexistent')).rejects.toThrow(FileSystemError);
331
+ await expect(fs.stat('/nonexistent')).rejects.toMatchObject({
332
+ code: FileSystemErrorCode.ENOENT,
333
+ });
334
+ await expect(fs.readdir('/nonexistent')).rejects.toThrow(FileSystemError);
335
+ await expect(fs.readdir('/nonexistent')).rejects.toMatchObject({
336
+ code: FileSystemErrorCode.ENOENT,
337
+ });
338
+ await expect(fs.readFile('/nonexistent')).rejects.toThrow(FileSystemError);
339
+ await expect(fs.readFile('/nonexistent')).rejects.toMatchObject({
340
+ code: FileSystemErrorCode.ENOENT,
341
+ });
342
+ await expect(fs.rm('/nonexistent')).rejects.toThrow(FileSystemError);
343
+ await expect(fs.rm('/nonexistent')).rejects.toMatchObject({
344
+ code: FileSystemErrorCode.ENOENT,
345
+ });
346
+ await expect(fs.rename('/nonexistent', '/new')).rejects.toThrow(FileSystemError);
347
+ await expect(fs.rename('/nonexistent', '/new')).rejects.toMatchObject({
348
+ code: FileSystemErrorCode.ENOENT,
349
+ });
350
+ await expect(fs.copy('/nonexistent', '/new')).rejects.toThrow(FileSystemError);
351
+ await expect(fs.copy('/nonexistent', '/new')).rejects.toMatchObject({
352
+ code: FileSystemErrorCode.ENOENT,
353
+ });
317
354
  }
318
355
  //# sourceMappingURL=runFileSystemTest.js.map