@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,34 +1,34 @@
1
- import { createReadStream as nodeCreateReadStream, createWriteStream as nodeCreateWriteStream } from "node:fs";
2
- import fsp from "node:fs/promises";
3
- import path from "node:path";
4
- import { Readable } from "node:stream";
5
- import { pathToFileURL } from "node:url";
1
+ import { createReadStream as nodeCreateReadStream, createWriteStream as nodeCreateWriteStream } from 'node:fs';
2
+ import fsp from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { Readable } from 'node:stream';
5
+ import { pathToFileURL } from 'node:url';
6
6
  /**
7
7
  * Creates a Node.js filesystem adapter that implements the IFileSystem interface
8
8
  * @param options Configuration options for the filesystem
9
9
  * @param options.root Optional root directory to restrict all operations within
10
10
  */ export function createNodeFileSystem(options = {}) {
11
- return new NodeFs(options);
11
+ return new NodeFs(options);
12
12
  }
13
13
  let NodeFs = class NodeFs {
14
- root;
15
- fs;
16
- constructor({ root, fs = fsp } = {}){
17
- // Normalize the root path if provided
18
- if (root) {
19
- this.root = path.resolve(root);
20
- } else {
21
- this.root = '';
22
- }
23
- this.fs = fs;
24
- }
25
- // Helper method to handle aborted signals consistently
26
- checkAborted(signal) {
27
- if (signal?.aborted) {
28
- throw new Error('The operation was aborted');
29
- }
30
- }
31
- /**
14
+ root;
15
+ fs;
16
+ constructor({ root, fs = fsp } = {}) {
17
+ // Normalize the root path if provided
18
+ if (root) {
19
+ this.root = path.resolve(root);
20
+ } else {
21
+ this.root = '';
22
+ }
23
+ this.fs = fs;
24
+ }
25
+ // Helper method to handle aborted signals consistently
26
+ checkAborted(signal) {
27
+ if (signal?.aborted) {
28
+ throw new Error('The operation was aborted');
29
+ }
30
+ }
31
+ /**
32
32
  * Resolves and secures a path by:
33
33
  * 1. Normalizing the path
34
34
  * 2. Prepending the root directory if one is set
@@ -36,366 +36,393 @@ let NodeFs = class NodeFs {
36
36
  *
37
37
  * This prevents path traversal attacks.
38
38
  */ resolvePath(filePath) {
39
- // Handle empty paths
40
- if (!filePath) {
41
- return this.root || '';
42
- }
43
- // Normalize to remove any '..' segments and handle slashes
44
- const normalizedPath = path.normalize(filePath);
45
- // If no root is set, just return the normalized path
46
- if (!this.root) {
47
- return normalizedPath;
48
- }
49
- // Join with root and resolve to absolute path
50
- const resolvedPath = path.resolve(path.join(this.root, normalizedPath));
51
- // Security check: ensure the path is within the root directory
52
- if (!resolvedPath.startsWith(this.root)) {
53
- throw new Error(`Security violation: Path ${filePath} attempts to access outside of the root directory`);
54
- }
55
- return resolvedPath;
56
- }
57
- /**
39
+ // Handle empty paths
40
+ if (!filePath) {
41
+ return this.root || '';
42
+ }
43
+ // Normalize to remove any '..' segments and handle slashes
44
+ const normalizedPath = path.normalize(filePath);
45
+ // If no root is set, just return the normalized path
46
+ if (!this.root) {
47
+ return normalizedPath;
48
+ }
49
+ // Join with root and resolve to absolute path
50
+ const resolvedPath = path.resolve(path.join(this.root, normalizedPath));
51
+ // Security check: ensure the path is within the root directory
52
+ if (!resolvedPath.startsWith(this.root)) {
53
+ throw new Error(`Security violation: Path ${filePath} attempts to access outside of the root directory`);
54
+ }
55
+ return resolvedPath;
56
+ }
57
+ /**
58
58
  * Removes the root prefix from a path for external representation
59
59
  */ stripRoot(fullPath) {
60
- if (!this.root || !fullPath.startsWith(this.root)) {
61
- return fullPath;
62
- }
63
- // Remove the root prefix and ensure there's a leading slash
64
- let relativePath = fullPath.substring(this.root.length);
65
- if (!relativePath) {
66
- return '/';
67
- }
68
- if (!relativePath.startsWith('/') && !relativePath.startsWith('\\')) {
69
- relativePath = '/' + relativePath;
70
- }
71
- // Normalize to ensure consistent path separators
72
- return path.normalize(relativePath).replace(/\\/g, '/');
73
- }
74
- /**
60
+ if (!this.root || !fullPath.startsWith(this.root)) {
61
+ return fullPath;
62
+ }
63
+ // Remove the root prefix and ensure there's a leading slash
64
+ let relativePath = fullPath.substring(this.root.length);
65
+ if (!relativePath) {
66
+ return '/';
67
+ }
68
+ if (!relativePath.startsWith('/') && !relativePath.startsWith('\\')) {
69
+ relativePath = `/${relativePath}`;
70
+ }
71
+ // Normalize to ensure consistent path separators
72
+ return path.normalize(relativePath).replace(/\\/g, '/');
73
+ }
74
+ /**
75
75
  * Converts a system file stat to our IFileStat interface,
76
76
  * stripping the root prefix from paths
77
77
  */ toFileStat(fullPath, fsStats) {
78
- const normalizedPath = this.stripRoot(fullPath);
79
- const directoryPath = path.dirname(normalizedPath);
80
- const directory = directoryPath === '.' ? '/' : directoryPath.replace(/\\/g, '/');
81
- return {
82
- directory,
83
- path: normalizedPath,
84
- name: path.basename(fullPath),
85
- kind: fsStats.isDirectory() ? 'directory' : 'file',
86
- mtime: fsStats.mtimeMs,
87
- size: fsStats.size,
88
- meta: {}
89
- };
90
- }
91
- async readdir(dir, options = {}) {
92
- const { fs } = this;
93
- const { glob, recursive, depth = 1, kind, hidden = true, signal } = options;
94
- this.checkAborted(signal);
95
- // Resolve the directory path with security checks
96
- const resolvedDir = this.resolvePath(dir);
97
- // Basic file listing
98
- const entries = await fs.readdir(resolvedDir, {
99
- withFileTypes: true
100
- });
101
- let results = await Promise.all(entries.filter((entry)=>hidden || !entry.name.startsWith('.')).filter((entry)=>!kind || (kind === 'directory' ? entry.isDirectory() : entry.isFile())).map(async (entry)=>{
102
- this.checkAborted(signal);
103
- const entryFullPath = path.join(resolvedDir, entry.name);
104
- const stat = await fs.stat(entryFullPath);
105
- // Convert to external representation
106
- return {
107
- directory: this.stripRoot(resolvedDir),
108
- path: this.stripRoot(entryFullPath),
109
- name: entry.name,
110
- kind: entry.isDirectory() ? 'directory' : 'file',
111
- mtime: stat.mtimeMs,
112
- size: stat.size,
113
- meta: {}
114
- };
115
- }));
116
- // Handle recursive option
117
- if (recursive || depth > 1) {
118
- const subdirs = results.filter((entry)=>entry.kind === 'directory');
119
- for (const subdir of subdirs){
120
- this.checkAborted(signal);
121
- const maxDepth = recursive ? Infinity : depth - 1;
122
- if (maxDepth > 0) {
123
- // Need to convert the path back to a full path for the recursive call
124
- const subdirFullPath = this.resolvePath(subdir.path);
125
- const subEntries = await this.readdir(subdir.path, {
126
- ...options,
127
- depth: maxDepth
128
- });
129
- results = [
130
- ...results,
131
- ...subEntries
132
- ];
133
- }
134
- }
135
- }
136
- // Handle glob filtering
137
- if (glob) {
138
- const { matcher } = await import("micromatch");
139
- const match = matcher(glob);
140
- results = results.filter((entry)=>match(entry.path));
141
- }
142
- return results;
143
- }
144
- async stat(filePath, options = {}) {
145
- const { fs } = this;
146
- const { signal } = options;
147
- this.checkAborted(signal);
148
- const resolvedPath = this.resolvePath(filePath);
149
- try {
150
- const stat = await fs.stat(resolvedPath);
151
- return this.toFileStat(resolvedPath, stat);
152
- } catch (err) {
153
- if (err.code === 'ENOENT') {
154
- throw new Error(`File not found: ${filePath}`);
155
- }
156
- throw err;
157
- }
158
- }
159
- async mkdir(dirPath, options = {}) {
160
- const { fs } = this;
161
- const { recursive = false, signal } = options;
162
- this.checkAborted(signal);
163
- const resolvedPath = this.resolvePath(dirPath);
164
- try {
165
- await fs.mkdir(resolvedPath, {
166
- recursive
167
- });
168
- } catch (err) {
169
- if (err.code === 'EEXIST' && recursive) {
170
- // Ignore if directory exists and recursive is true
171
- return;
172
- }
173
- throw err;
174
- }
175
- }
176
- async readFile(path, options = {}) {
177
- const { fs } = this;
178
- const { encoding = 'binary', signal, onDownloadProgress } = options;
179
- this.checkAborted(signal);
180
- const resolvedPath = this.resolvePath(path);
181
- try {
182
- // Handle progress reporting if needed
183
- if (onDownloadProgress) {
184
- const stat = await fs.stat(resolvedPath);
185
- const stream = this.createReadStream(path, {
186
- signal
187
- });
188
- return new Promise((resolve, reject)=>{
189
- const chunks = [];
190
- let loaded = 0;
191
- stream.on('data', (chunk)=>{
192
- chunks.push(Buffer.from(chunk));
193
- loaded += chunk.length;
194
- onDownloadProgress({
195
- loaded,
196
- total: stat.size
197
- });
198
- });
199
- stream.on('end', ()=>{
200
- const buffer = Buffer.concat(chunks);
201
- if (encoding === 'text') {
202
- resolve(buffer.toString('utf-8'));
203
- } else {
204
- resolve(buffer);
205
- }
206
- });
207
- stream.on('error', reject);
208
- });
209
- }
210
- // Standard file reading
211
- if (encoding === 'text') {
212
- return await fs.readFile(resolvedPath, {
213
- encoding: 'utf-8'
214
- });
215
- } else {
216
- return await fs.readFile(resolvedPath);
217
- }
218
- } catch (err) {
219
- if (err.code === 'ENOENT') {
220
- throw new Error(`File not found: ${path}`);
221
- }
222
- throw err;
223
- }
224
- }
225
- async writeFile(path, data, options = {}) {
226
- const { fs } = this;
227
- const { signal, overwrite = true, onUploadProgress } = options;
228
- this.checkAborted(signal);
229
- const resolvedPath = this.resolvePath(path);
230
- // Check if file exists and overwrite is false
231
- if (!overwrite) {
232
- const exists = await this.exists(path);
233
- if (exists) {
234
- throw new Error(`File already exists: ${path}`);
235
- }
236
- }
237
- // Create parent directories if they don't exist
238
- const directory = this.getDirectoryName(resolvedPath);
239
- if (directory !== resolvedPath) {
240
- try {
241
- await this.mkdir(this.stripRoot(directory), {
242
- recursive: true
243
- });
244
- } catch (err) {
245
- // Ignore directory exists error
246
- if (err?.code !== 'EEXIST') {
247
- throw err;
248
- }
249
- }
250
- }
251
- if (data instanceof Readable) {
252
- let _data = data;
253
- return new Promise((resolve, reject)=>{
254
- const writeStream = this.createWriteStream(path, options);
255
- let totalBytes = 0;
256
- if (onUploadProgress) {
257
- _data.on('data', (chunk)=>{
258
- totalBytes += chunk.length;
259
- onUploadProgress({
260
- loaded: totalBytes,
261
- total: -1
262
- });
263
- });
264
- }
265
- _data.pipe(writeStream);
266
- writeStream.on('finish', ()=>resolve());
267
- writeStream.on('error', reject);
268
- if (signal) {
269
- signal.addEventListener('abort', ()=>{
270
- _data.destroy();
271
- writeStream.destroy();
272
- reject(new Error('The operation was aborted'));
273
- });
274
- }
275
- });
276
- } else {
277
- // Convert ArrayBuffer to Buffer if necessary
278
- if (data instanceof ArrayBuffer) {
279
- data = Buffer.from(data);
280
- }
281
- await fs.writeFile(resolvedPath, data);
282
- }
283
- }
284
- async rm(path, options = {}) {
285
- const { fs } = this;
286
- const { recursive = false, force = false, signal } = options;
287
- this.checkAborted(signal);
288
- const resolvedPath = this.resolvePath(path);
289
- try {
290
- await fs.rm(resolvedPath, {
291
- recursive,
292
- force
293
- });
294
- } catch (err) {
295
- if (force && err.code === 'ENOENT') {
296
- return;
297
- }
298
- throw err;
299
- }
300
- }
301
- async rename(oldPath, newPath, options = {}) {
302
- const { fs } = this;
303
- const { signal, overwrite = false } = options;
304
- this.checkAborted(signal);
305
- const resolvedOldPath = this.resolvePath(oldPath);
306
- const resolvedNewPath = this.resolvePath(newPath);
307
- // Check if target exists and overwrite is false
308
- if (!overwrite) {
309
- const exists = await this.exists(newPath);
310
- if (exists) {
311
- throw new Error(`Destination already exists: ${newPath}`);
312
- }
313
- }
314
- try {
315
- await fs.rename(resolvedOldPath, resolvedNewPath);
316
- } catch (err) {
317
- if (err.code === 'ENOENT') {
318
- throw new Error(`Source file not found: ${oldPath}`);
319
- }
320
- throw err;
321
- }
322
- }
323
- async exists(path) {
324
- const { fs } = this;
325
- try {
326
- await fs.access(this.resolvePath(path));
327
- return true;
328
- } catch {
329
- return false;
330
- }
331
- }
332
- async copy(src, dest, options = {}) {
333
- const { fs } = this;
334
- const { signal, overwrite = true, shallow = false } = options;
335
- this.checkAborted(signal);
336
- const resolvedSrc = this.resolvePath(src);
337
- const resolvedDest = this.resolvePath(dest);
338
- // Check if source exists
339
- try {
340
- const stat = await fs.stat(resolvedSrc);
341
- // Check if destination exists and overwrite is false
342
- if (!overwrite) {
343
- const exists = await this.exists(dest);
344
- if (exists) {
345
- throw new Error(`Destination already exists: ${dest}`);
346
- }
347
- }
348
- // Create parent directory if it doesn't exist
349
- const parentDir = this.getDirectoryName(resolvedDest);
350
- await this.mkdir(this.stripRoot(parentDir), {
351
- recursive: true
352
- });
353
- // Copy recursively or not based on shallow and if it's a directory
354
- await fs.cp(resolvedSrc, resolvedDest, {
355
- recursive: !shallow && stat.isDirectory(),
356
- force: overwrite
357
- });
358
- } catch (err) {
359
- if (err.code === 'ENOENT') {
360
- throw new Error(`Source file not found: ${src}`);
361
- }
362
- throw err;
363
- }
364
- }
365
- createReadStream(filePath, options = {}) {
366
- const resolvedPath = this.resolvePath(filePath);
367
- const { signal, range } = options;
368
- const stream = nodeCreateReadStream(resolvedPath, {
369
- start: range?.start,
370
- end: range?.end
371
- });
372
- signal?.addEventListener('abort', ()=>stream.destroy(new Error('The operation was aborted')));
373
- return stream;
374
- }
375
- createWriteStream(filePath, options = {}) {
376
- const resolvedPath = this.resolvePath(filePath);
377
- const { signal } = options;
378
- const stream = nodeCreateWriteStream(resolvedPath, {
379
- flags: options.overwrite === false ? 'wx' : 'w'
380
- });
381
- signal?.addEventListener('abort', ()=>stream.destroy(new Error('The operation was aborted')));
382
- return stream;
383
- }
384
- // Helper to extract directory name correctly
385
- getDirectoryName(filePath) {
386
- return path.dirname(filePath);
387
- }
388
- getUrl(needle) {
389
- if (typeof needle === 'object' && needle?.kind !== 'file') {
390
- return;
391
- }
392
- let path = typeof needle === 'string' ? needle : needle.path;
393
- if (!path) {
394
- return;
395
- }
396
- // file://
397
- return pathToFileURL(this.resolvePath(path)).toString();
398
- }
78
+ const normalizedPath = this.stripRoot(fullPath);
79
+ const directoryPath = path.dirname(normalizedPath);
80
+ const directory = directoryPath === '.' ? '/' : directoryPath.replace(/\\/g, '/');
81
+ return {
82
+ directory,
83
+ path: normalizedPath,
84
+ name: path.basename(fullPath),
85
+ kind: fsStats.isDirectory() ? 'directory' : 'file',
86
+ mtime: fsStats.mtimeMs,
87
+ size: fsStats.size,
88
+ meta: {},
89
+ };
90
+ }
91
+ async readdir(dir, options = {}) {
92
+ const { fs } = this;
93
+ const { glob, recursive, depth = 1, kind, hidden = true, signal } = options;
94
+ this.checkAborted(signal);
95
+ // Resolve the directory path with security checks
96
+ const resolvedDir = this.resolvePath(dir);
97
+ // Basic file listing
98
+ const entries = await fs.readdir(resolvedDir, {
99
+ withFileTypes: true,
100
+ });
101
+ let results = await Promise.all(
102
+ entries
103
+ .filter((entry) => hidden || !entry.name.startsWith('.'))
104
+ .filter((entry) => !kind || (kind === 'directory' ? entry.isDirectory() : entry.isFile()))
105
+ .map(async (entry) => {
106
+ this.checkAborted(signal);
107
+ const entryFullPath = path.join(resolvedDir, entry.name);
108
+ const stat = await fs.stat(entryFullPath);
109
+ // Convert to external representation
110
+ return {
111
+ directory: this.stripRoot(resolvedDir),
112
+ path: this.stripRoot(entryFullPath),
113
+ name: entry.name,
114
+ kind: entry.isDirectory() ? 'directory' : 'file',
115
+ mtime: stat.mtimeMs,
116
+ size: stat.size,
117
+ meta: {},
118
+ };
119
+ }),
120
+ );
121
+ // Handle recursive option
122
+ if (recursive || depth > 1) {
123
+ const subdirs = results.filter((entry) => entry.kind === 'directory');
124
+ for (const subdir of subdirs) {
125
+ this.checkAborted(signal);
126
+ const maxDepth = recursive ? Infinity : depth - 1;
127
+ if (maxDepth > 0) {
128
+ // Need to convert the path back to a full path for the recursive call
129
+ const _subdirFullPath = this.resolvePath(subdir.path);
130
+ const subEntries = await this.readdir(subdir.path, {
131
+ ...options,
132
+ depth: maxDepth,
133
+ });
134
+ results = [...results, ...subEntries];
135
+ }
136
+ }
137
+ }
138
+ // Handle glob filtering
139
+ if (glob) {
140
+ const { matcher } = await import('micromatch');
141
+ const match = matcher(glob);
142
+ results = results.filter((entry) => match(entry.path));
143
+ }
144
+ return results;
145
+ }
146
+ async stat(filePath, options = {}) {
147
+ const { fs } = this;
148
+ const { signal } = options;
149
+ this.checkAborted(signal);
150
+ const resolvedPath = this.resolvePath(filePath);
151
+ try {
152
+ const stat = await fs.stat(resolvedPath);
153
+ return this.toFileStat(resolvedPath, stat);
154
+ } catch (err) {
155
+ if (err.code === 'ENOENT') {
156
+ throw new Error(`File not found: ${filePath}`);
157
+ }
158
+ throw err;
159
+ }
160
+ }
161
+ async mkdir(dirPath, options = {}) {
162
+ const { fs } = this;
163
+ const { recursive = false, signal } = options;
164
+ this.checkAborted(signal);
165
+ const resolvedPath = this.resolvePath(dirPath);
166
+ try {
167
+ await fs.mkdir(resolvedPath, {
168
+ recursive,
169
+ });
170
+ } catch (err) {
171
+ if (err.code === 'EEXIST' && recursive) {
172
+ // Ignore if directory exists and recursive is true
173
+ return;
174
+ }
175
+ throw err;
176
+ }
177
+ }
178
+ async readFile(path, options = {}) {
179
+ const { fs } = this;
180
+ const { encoding = 'binary', signal, onDownloadProgress } = options;
181
+ this.checkAborted(signal);
182
+ const resolvedPath = this.resolvePath(path);
183
+ try {
184
+ // Handle progress reporting if needed
185
+ if (onDownloadProgress) {
186
+ const stat = await fs.stat(resolvedPath);
187
+ const stream = this.createReadStream(path, {
188
+ signal,
189
+ });
190
+ return new Promise((resolve, reject) => {
191
+ const chunks = [];
192
+ let loaded = 0;
193
+ stream.on('data', (chunk) => {
194
+ chunks.push(Buffer.from(chunk));
195
+ loaded += chunk.length;
196
+ onDownloadProgress({
197
+ loaded,
198
+ total: stat.size,
199
+ });
200
+ });
201
+ stream.on('end', () => {
202
+ const buffer = Buffer.concat(chunks);
203
+ if (encoding === 'text') {
204
+ resolve(buffer.toString('utf-8'));
205
+ } else {
206
+ resolve(buffer);
207
+ }
208
+ });
209
+ stream.on('error', reject);
210
+ });
211
+ }
212
+ // Standard file reading
213
+ if (encoding === 'text') {
214
+ return await fs.readFile(resolvedPath, {
215
+ encoding: 'utf-8',
216
+ });
217
+ } else {
218
+ return await fs.readFile(resolvedPath);
219
+ }
220
+ } catch (err) {
221
+ if (err.code === 'ENOENT') {
222
+ throw new Error(`File not found: ${path}`);
223
+ }
224
+ throw err;
225
+ }
226
+ }
227
+ async writeFile(path, data, options = {}) {
228
+ const { fs } = this;
229
+ const { signal, overwrite = true, onUploadProgress } = options;
230
+ this.checkAborted(signal);
231
+ const resolvedPath = this.resolvePath(path);
232
+ // Check if file exists and overwrite is false
233
+ if (!overwrite) {
234
+ const exists = await this.exists(path);
235
+ if (exists) {
236
+ throw new Error(`File already exists: ${path}`);
237
+ }
238
+ }
239
+ // Create parent directories if they don't exist
240
+ const directory = this.getDirectoryName(resolvedPath);
241
+ if (directory !== resolvedPath) {
242
+ try {
243
+ await this.mkdir(this.stripRoot(directory), {
244
+ recursive: true,
245
+ });
246
+ } catch (err) {
247
+ // Ignore directory exists error
248
+ if (err?.code !== 'EEXIST') {
249
+ throw err;
250
+ }
251
+ }
252
+ }
253
+ if (data instanceof Readable) {
254
+ let _data = data;
255
+ return new Promise((resolve, reject) => {
256
+ const writeStream = this.createWriteStream(path, options);
257
+ let totalBytes = 0;
258
+ if (onUploadProgress) {
259
+ _data.on('data', (chunk) => {
260
+ totalBytes += chunk.length;
261
+ onUploadProgress({
262
+ loaded: totalBytes,
263
+ total: -1,
264
+ });
265
+ });
266
+ }
267
+ _data.pipe(writeStream);
268
+ writeStream.on('finish', () => resolve());
269
+ writeStream.on('error', reject);
270
+ if (signal) {
271
+ signal.addEventListener('abort', () => {
272
+ _data.destroy();
273
+ writeStream.destroy();
274
+ reject(new Error('The operation was aborted'));
275
+ });
276
+ }
277
+ });
278
+ } else if (data instanceof ReadableStream) {
279
+ // Handle web ReadableStream
280
+ const reader = data.getReader();
281
+ const chunks = [];
282
+ let loaded = 0;
283
+ while (true) {
284
+ const { done, value } = await reader.read();
285
+ if (done) break;
286
+ if (value) {
287
+ chunks.push(value);
288
+ loaded += value.length;
289
+ if (onUploadProgress) {
290
+ onUploadProgress({
291
+ loaded,
292
+ total: -1,
293
+ });
294
+ }
295
+ }
296
+ }
297
+ await fs.writeFile(resolvedPath, Buffer.concat(chunks));
298
+ } else {
299
+ // Convert ArrayBuffer/ArrayBufferView to Buffer if necessary
300
+ let writeData;
301
+ if (data instanceof ArrayBuffer) {
302
+ writeData = Buffer.from(data);
303
+ } else if (ArrayBuffer.isView(data)) {
304
+ writeData = Buffer.from(data.buffer, data.byteOffset, data.byteLength);
305
+ } else {
306
+ writeData = data;
307
+ }
308
+ await fs.writeFile(resolvedPath, writeData);
309
+ }
310
+ }
311
+ async rm(path, options = {}) {
312
+ const { fs } = this;
313
+ const { recursive = false, force = false, signal } = options;
314
+ this.checkAborted(signal);
315
+ const resolvedPath = this.resolvePath(path);
316
+ try {
317
+ await fs.rm(resolvedPath, {
318
+ recursive,
319
+ force,
320
+ });
321
+ } catch (err) {
322
+ if (force && err.code === 'ENOENT') {
323
+ return;
324
+ }
325
+ throw err;
326
+ }
327
+ }
328
+ async rename(oldPath, newPath, options = {}) {
329
+ const { fs } = this;
330
+ const { signal, overwrite = false } = options;
331
+ this.checkAborted(signal);
332
+ const resolvedOldPath = this.resolvePath(oldPath);
333
+ const resolvedNewPath = this.resolvePath(newPath);
334
+ // Check if target exists and overwrite is false
335
+ if (!overwrite) {
336
+ const exists = await this.exists(newPath);
337
+ if (exists) {
338
+ throw new Error(`Destination already exists: ${newPath}`);
339
+ }
340
+ }
341
+ try {
342
+ await fs.rename(resolvedOldPath, resolvedNewPath);
343
+ } catch (err) {
344
+ if (err.code === 'ENOENT') {
345
+ throw new Error(`Source file not found: ${oldPath}`);
346
+ }
347
+ throw err;
348
+ }
349
+ }
350
+ async exists(path) {
351
+ const { fs } = this;
352
+ try {
353
+ await fs.access(this.resolvePath(path));
354
+ return true;
355
+ } catch {
356
+ return false;
357
+ }
358
+ }
359
+ async copy(src, dest, options = {}) {
360
+ const { fs } = this;
361
+ const { signal, overwrite = true, shallow = false } = options;
362
+ this.checkAborted(signal);
363
+ const resolvedSrc = this.resolvePath(src);
364
+ const resolvedDest = this.resolvePath(dest);
365
+ // Check if source exists
366
+ try {
367
+ const stat = await fs.stat(resolvedSrc);
368
+ // Check if destination exists and overwrite is false
369
+ if (!overwrite) {
370
+ const exists = await this.exists(dest);
371
+ if (exists) {
372
+ throw new Error(`Destination already exists: ${dest}`);
373
+ }
374
+ }
375
+ // Create parent directory if it doesn't exist
376
+ const parentDir = this.getDirectoryName(resolvedDest);
377
+ await this.mkdir(this.stripRoot(parentDir), {
378
+ recursive: true,
379
+ });
380
+ // Copy recursively or not based on shallow and if it's a directory
381
+ await fs.cp(resolvedSrc, resolvedDest, {
382
+ recursive: !shallow && stat.isDirectory(),
383
+ force: overwrite,
384
+ });
385
+ } catch (err) {
386
+ if (err.code === 'ENOENT') {
387
+ throw new Error(`Source file not found: ${src}`);
388
+ }
389
+ throw err;
390
+ }
391
+ }
392
+ createReadStream(filePath, options = {}) {
393
+ const resolvedPath = this.resolvePath(filePath);
394
+ const { signal, range } = options;
395
+ const stream = nodeCreateReadStream(resolvedPath, {
396
+ start: range?.start,
397
+ end: range?.end,
398
+ });
399
+ signal?.addEventListener('abort', () => stream.destroy(new Error('The operation was aborted')));
400
+ return stream;
401
+ }
402
+ createWriteStream(filePath, options = {}) {
403
+ const resolvedPath = this.resolvePath(filePath);
404
+ const { signal } = options;
405
+ const stream = nodeCreateWriteStream(resolvedPath, {
406
+ flags: options.overwrite === false ? 'wx' : 'w',
407
+ });
408
+ signal?.addEventListener('abort', () => stream.destroy(new Error('The operation was aborted')));
409
+ return stream;
410
+ }
411
+ // Helper to extract directory name correctly
412
+ getDirectoryName(filePath) {
413
+ return path.dirname(filePath);
414
+ }
415
+ getUrl(needle) {
416
+ if (typeof needle === 'object' && needle?.kind !== 'file') {
417
+ return;
418
+ }
419
+ let path = typeof needle === 'string' ? needle : needle.path;
420
+ if (!path) {
421
+ return;
422
+ }
423
+ // file://
424
+ return pathToFileURL(this.resolvePath(path)).toString();
425
+ }
399
426
  };
400
427
 
401
- //# sourceMappingURL=createNodeFileSystem.js.map
428
+ //# sourceMappingURL=createNodeFileSystem.js.map