@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.
- package/lib/ai/qwen3vl/index.js +1 -1
- package/lib/ai/qwen3vl/utils.js +15 -15
- package/lib/ai/qwen3vl/utils.js.map +1 -1
- package/lib/ai/vision/DocLayoutElementTypeSchema.js +22 -22
- package/lib/ai/vision/ImageAnnotationSchema.js +63 -47
- package/lib/ai/vision/index.js +2 -2
- package/lib/ai/vision/resolveImageAnnotation.js +81 -95
- package/lib/cn/ChineseResidentIdNo.js +55 -41
- package/lib/cn/ChineseResidentIdNo.js.map +1 -1
- package/lib/cn/ChineseResidentIdNo.mod.js +6 -1
- package/lib/cn/ChineseResidentIdNo.test.js +22 -21
- package/lib/cn/DivisionCode.js +220 -235
- package/lib/cn/DivisionCode.mod.js +6 -1
- package/lib/cn/DivisionCode.test.js +92 -121
- package/lib/cn/Mod11.js +18 -37
- package/lib/cn/Mod11.js.map +1 -1
- package/lib/cn/Mod31.js +23 -41
- package/lib/cn/UnifiedSocialCreditCode.js +143 -137
- package/lib/cn/UnifiedSocialCreditCode.mod.js +6 -1
- package/lib/cn/UnifiedSocialCreditCode.test.js +21 -15
- package/lib/cn/formatChineseAmount.js +46 -71
- package/lib/cn/index.js +6 -6
- package/lib/cn/mod.js +5 -3
- package/lib/cn/parseChineseNumber.js +81 -85
- package/lib/cn/parseChineseNumber.test.js +183 -261
- package/lib/cn/pinyin/cartesianProduct.js +19 -19
- package/lib/cn/pinyin/cartesianProduct.test.js +78 -178
- package/lib/cn/pinyin/loader.js +13 -11
- package/lib/cn/pinyin/preload.js +2 -1
- package/lib/cn/pinyin/toPinyin.test.js +149 -161
- package/lib/cn/pinyin/toPinyinPure.js +28 -23
- package/lib/cn/pinyin/transform.js +11 -11
- package/lib/cn/types.d.js +2 -2
- package/lib/consola/createStandardConsolaReporter.js +14 -15
- package/lib/consola/formatLogObject.js +149 -133
- package/lib/consola/formatLogObject.js.map +1 -1
- package/lib/consola/formatLogObject.test.js +167 -178
- package/lib/consola/index.js +2 -2
- package/lib/data/formatSort.js +14 -12
- package/lib/data/formatSort.test.js +33 -33
- package/lib/data/index.js +3 -3
- package/lib/data/maybeNumber.js +23 -23
- package/lib/data/maybeNumber.js.map +1 -1
- package/lib/data/parseSort.js +75 -68
- package/lib/data/parseSort.test.js +196 -187
- package/lib/data/resolvePagination.js +38 -39
- package/lib/data/resolvePagination.test.js +228 -218
- package/lib/data/types.d.js +2 -2
- package/lib/data/types.d.js.map +1 -1
- package/lib/dayjs/dayjs.js +20 -20
- package/lib/dayjs/formatDuration.js +56 -56
- package/lib/dayjs/formatDuration.js.map +1 -1
- package/lib/dayjs/formatDuration.test.js +63 -77
- package/lib/dayjs/index.js +4 -4
- package/lib/dayjs/parseDuration.js +21 -26
- package/lib/dayjs/parseRelativeTime.js +65 -66
- package/lib/dayjs/parseRelativeTime.test.js +227 -243
- package/lib/dayjs/resolveRelativeTime.js +74 -144
- package/lib/dayjs/resolveRelativeTime.js.map +1 -1
- package/lib/dayjs/resolveRelativeTime.test.js +296 -307
- package/lib/decimal/index.js +1 -1
- package/lib/decimal/parseDecimal.js +12 -12
- package/lib/drain3/Drain.js +321 -0
- package/lib/drain3/Drain.js.map +1 -0
- package/lib/drain3/LogCluster.js +38 -0
- package/lib/drain3/LogCluster.js.map +1 -0
- package/lib/drain3/Node.js +39 -0
- package/lib/drain3/Node.js.map +1 -0
- package/lib/drain3/TemplateMiner.js +205 -0
- package/lib/drain3/TemplateMiner.js.map +1 -0
- package/lib/drain3/index.js +31 -0
- package/lib/drain3/index.js.map +1 -0
- package/lib/drain3/persistence/FilePersistence.js +24 -0
- package/lib/drain3/persistence/FilePersistence.js.map +1 -0
- package/lib/drain3/persistence/MemoryPersistence.js +18 -0
- package/lib/drain3/persistence/MemoryPersistence.js.map +1 -0
- package/lib/drain3/persistence/PersistenceHandler.js +5 -0
- package/lib/drain3/persistence/PersistenceHandler.js.map +1 -0
- package/lib/drain3/types.js +7 -0
- package/lib/drain3/types.js.map +1 -0
- package/lib/emittery/emitter.js +7 -7
- package/lib/emittery/index.js +1 -1
- package/lib/foundation/schema/SexType.js +15 -12
- package/lib/foundation/schema/index.js +1 -1
- package/lib/foundation/schema/parseSexType.js +15 -16
- package/lib/foundation/schema/types.js +8 -6
- package/lib/fs/FileSystemError.js +18 -18
- package/lib/fs/IFileSystem.d.js +2 -2
- package/lib/fs/IFileSystem.d.js.map +1 -1
- package/lib/fs/MemoryFileSystem.test.js +172 -181
- package/lib/fs/createBrowserFileSystem.js +222 -233
- package/lib/fs/createBrowserFileSystem.js.map +1 -1
- package/lib/fs/createMemoryFileSystem.js +473 -510
- package/lib/fs/createMemoryFileSystem.js.map +1 -1
- package/lib/fs/createSandboxFileSystem.js +102 -101
- package/lib/fs/createSandboxFileSystem.js.map +1 -1
- package/lib/fs/createWebDavFileSystem.js +162 -132
- package/lib/fs/createWebDavFileSystem.js.map +1 -1
- package/lib/fs/createWebFileSystem.js +202 -0
- package/lib/fs/createWebFileSystem.js.map +1 -0
- package/lib/fs/findMimeType.js +14 -14
- package/lib/fs/findMimeType.js.map +1 -1
- package/lib/fs/index.js +7 -7
- package/lib/fs/index.js.map +1 -1
- package/lib/fs/minio/createMinioFileSystem.js +977 -0
- package/lib/fs/minio/createMinioFileSystem.js.map +1 -0
- package/lib/fs/minio/index.js +2 -0
- package/lib/fs/minio/index.js.map +1 -0
- package/lib/fs/orpc/FileSystemContract.js +57 -57
- package/lib/fs/orpc/createContractClientFileSystem.js +88 -88
- package/lib/fs/orpc/createContractClientFileSystem.js.map +1 -1
- package/lib/fs/orpc/index.js +2 -2
- package/lib/fs/orpc/server/createFileSystemContractImpl.js +62 -60
- package/lib/fs/orpc/server/createFileSystemContractImpl.js.map +1 -1
- package/lib/fs/orpc/server/index.js +1 -1
- package/lib/fs/s3/createS3MiniFileSystem.js +756 -689
- package/lib/fs/s3/createS3MiniFileSystem.js.map +1 -1
- package/lib/fs/s3/index.js +1 -1
- package/lib/fs/s3/s3mini.test.js +524 -553
- package/lib/fs/scandir.js +56 -56
- package/lib/fs/server/createDatabaseFileSystem.js +834 -741
- package/lib/fs/server/createDatabaseFileSystem.js.map +1 -1
- package/lib/fs/server/createNodeFileSystem.js +407 -380
- package/lib/fs/server/createNodeFileSystem.js.map +1 -1
- package/lib/fs/server/dbfs.test.js +201 -214
- package/lib/fs/server/index.js +1 -1
- package/lib/fs/server/loadTestDatabase.js +40 -43
- package/lib/fs/tests/runFileSystemTest.js +352 -315
- package/lib/fs/tests/runFileSystemTest.js.map +1 -1
- package/lib/fs/types.js +17 -20
- package/lib/fs/utils/getFileUrl.js +24 -30
- package/lib/fs/utils.js +17 -17
- package/lib/fs/utils.js.map +1 -1
- package/lib/fs/webdav/index.js +2 -0
- package/lib/fs/webdav/index.js.map +1 -0
- package/lib/index.js +2 -2
- package/lib/jsonschema/JsonSchema.js +216 -155
- package/lib/jsonschema/JsonSchema.js.map +1 -1
- package/lib/jsonschema/JsonSchema.test.js +123 -124
- package/lib/jsonschema/forEachJsonSchema.js +41 -41
- package/lib/jsonschema/forEachJsonSchema.js.map +1 -1
- package/lib/jsonschema/index.js +2 -2
- package/lib/jsonschema/types.d.js +2 -2
- package/lib/jsonschema/types.d.js.map +1 -1
- package/lib/meta/defineFileType.js +32 -38
- package/lib/meta/defineInit.js +39 -35
- package/lib/meta/defineMetadata.js +37 -34
- package/lib/meta/defineMetadata.js.map +1 -1
- package/lib/meta/defineMetadata.test.js +13 -12
- package/lib/meta/index.js +3 -3
- package/lib/orpc/createOpenApiContractClient.js +26 -24
- package/lib/orpc/createOpenApiContractClient.js.map +1 -1
- package/lib/orpc/createRpcContractClient.js +37 -31
- package/lib/orpc/index.js +2 -2
- package/lib/orpc/resolveLinkPlugins.js +25 -25
- package/lib/password/PHC.js +187 -189
- package/lib/password/PHC.js.map +1 -1
- package/lib/password/PHC.test.js +517 -535
- package/lib/password/Password.js +85 -80
- package/lib/password/Password.test.js +330 -364
- package/lib/password/createArgon2PasswordAlgorithm.js +50 -51
- package/lib/password/createArgon2PasswordAlgorithm.js.map +1 -1
- package/lib/password/createBase64PasswordAlgorithm.js +11 -11
- package/lib/password/createBase64PasswordAlgorithm.js.map +1 -1
- package/lib/password/createBcryptPasswordAlgorithm.js +20 -18
- package/lib/password/createBcryptPasswordAlgorithm.js.map +1 -1
- package/lib/password/createPBKDF2PasswordAlgorithm.js +65 -52
- package/lib/password/createPBKDF2PasswordAlgorithm.js.map +1 -1
- package/lib/password/createScryptPasswordAlgorithm.js +74 -63
- package/lib/password/createScryptPasswordAlgorithm.js.map +1 -1
- package/lib/password/index.js +5 -5
- package/lib/password/server/index.js +1 -1
- package/lib/resource/Identifiable.js +2 -2
- package/lib/resource/ListQuery.js +42 -42
- package/lib/resource/ListQuery.js.map +1 -1
- package/lib/resource/getTitleOfResource.js +5 -5
- package/lib/resource/index.js +2 -2
- package/lib/resource/index.js.map +1 -1
- package/lib/resource/schema/AnyResourceSchema.js +91 -89
- package/lib/resource/schema/BaseResourceSchema.js +26 -26
- package/lib/resource/schema/ResourceActionType.js +117 -115
- package/lib/resource/schema/ResourceStatus.js +94 -92
- package/lib/resource/schema/ResourceType.js +25 -23
- package/lib/resource/schema/index.js +5 -5
- package/lib/resource/schema/types.js +86 -55
- package/lib/resource/schema/types.test.js +16 -13
- package/lib/s3/formatS3Url.js +60 -60
- package/lib/s3/formatS3Url.js.map +1 -1
- package/lib/s3/formatS3Url.test.js +238 -261
- package/lib/s3/index.js +2 -2
- package/lib/s3/parseS3Url.js +61 -60
- package/lib/s3/parseS3Url.js.map +1 -1
- package/lib/s3/parseS3Url.test.js +270 -269
- package/lib/schema/SchemaRegistry.js +41 -42
- package/lib/schema/SchemaRegistry.js.map +1 -1
- package/lib/schema/SchemaRegistry.mod.js +1 -1
- package/lib/schema/TypeSchema.d.js +2 -2
- package/lib/schema/TypeSchema.d.js.map +1 -1
- package/lib/schema/createSchemaData.js +113 -67
- package/lib/schema/createSchemaData.js.map +1 -1
- package/lib/schema/findJsonSchemaByPath.js +28 -23
- package/lib/schema/findJsonSchemaByPath.js.map +1 -1
- package/lib/schema/formatZodError.js +113 -134
- package/lib/schema/formatZodError.js.map +1 -1
- package/lib/schema/formatZodError.test.js +192 -195
- package/lib/schema/getSchemaCache.js +7 -7
- package/lib/schema/getSchemaOptions.js +17 -16
- package/lib/schema/index.js +6 -6
- package/lib/schema/toJsonSchema.js +196 -190
- package/lib/schema/toJsonSchema.js.map +1 -1
- package/lib/schema/toJsonSchema.test.js +34 -26
- package/lib/schema/validate.js +106 -97
- package/lib/schema/validate.js.map +1 -1
- package/lib/tools/generateSchema.js +40 -40
- package/lib/tools/renderJsonSchemaToMarkdownDoc.js +74 -74
- package/lib/utils/buildBaseUrl.js +8 -8
- package/lib/utils/buildRedactorFormSchema.js +55 -54
- package/lib/utils/buildRedactorFormSchema.js.map +1 -1
- package/lib/utils/getEstimateProcessTime.js +24 -19
- package/lib/utils/index.js +3 -3
- package/lib/utils/resolveFeatureOptions.js +9 -9
- package/package.json +37 -18
- package/src/ai/qwen3vl/utils.ts +1 -1
- package/src/ai/vision/index.ts +2 -2
- package/src/cn/ChineseResidentIdNo.ts +1 -1
- package/src/cn/Mod11.ts +1 -1
- package/src/cn/__snapshots__/ChineseResidentIdNo.test.ts.snap +1 -1
- package/src/cn/__snapshots__/UnifiedSocialCreditCode.test.ts.snap +0 -23
- package/src/cn/index.ts +1 -2
- package/src/cn/parseChineseNumber.test.ts +4 -4
- package/src/consola/formatLogObject.ts +6 -6
- package/src/consola/index.ts +1 -1
- package/src/data/index.ts +3 -4
- package/src/data/maybeNumber.ts +1 -1
- package/src/data/parseSort.test.ts +0 -1
- package/src/data/resolvePagination.ts +2 -2
- package/src/data/types.d.ts +2 -2
- package/src/dayjs/formatDuration.ts +10 -11
- package/src/dayjs/index.ts +1 -1
- package/src/dayjs/parseRelativeTime.ts +1 -1
- package/src/dayjs/resolveRelativeTime.ts +11 -14
- package/src/drain3/Drain.test.ts +378 -0
- package/src/drain3/Drain.ts +394 -0
- package/src/drain3/LogCluster.ts +46 -0
- package/src/drain3/Node.ts +53 -0
- package/src/drain3/TemplateMiner.ts +246 -0
- package/src/drain3/index.ts +34 -0
- package/src/drain3/persistence/FilePersistence.ts +24 -0
- package/src/drain3/persistence/MemoryPersistence.ts +23 -0
- package/src/drain3/persistence/PersistenceHandler.ts +19 -0
- package/src/drain3/types.ts +75 -0
- package/src/fs/IFileSystem.d.ts +1 -2
- package/src/fs/createBrowserFileSystem.ts +7 -5
- package/src/fs/createMemoryFileSystem.ts +9 -13
- package/src/fs/createSandboxFileSystem.ts +1 -1
- package/src/fs/createWebDavFileSystem.ts +30 -17
- package/src/fs/createWebFileSystem.ts +242 -0
- package/src/fs/findMimeType.ts +1 -4
- package/src/fs/index.ts +5 -5
- package/src/fs/minio/createMinioFileSystem.ts +1148 -0
- package/src/fs/minio/index.ts +1 -0
- package/src/fs/orpc/createContractClientFileSystem.ts +5 -5
- package/src/fs/orpc/server/createFileSystemContractImpl.ts +1 -1
- package/src/fs/s3/createS3MiniFileSystem.ts +120 -79
- package/src/fs/s3/s3fs.test.ts +441 -0
- package/src/fs/s3/s3mini.test.ts +2 -2
- package/src/fs/server/createDatabaseFileSystem.ts +78 -114
- package/src/fs/server/createNodeFileSystem.ts +32 -13
- package/src/fs/server/dbfs.test.ts +13 -8
- package/src/fs/server/index.ts +1 -0
- package/src/fs/server/loadTestDatabase.ts +8 -119
- package/src/fs/tests/runFileSystemTest.ts +29 -28
- package/src/fs/utils.ts +1 -1
- package/src/fs/webdav/index.ts +1 -0
- package/src/jsonschema/JsonSchema.ts +5 -5
- package/src/jsonschema/forEachJsonSchema.ts +1 -1
- package/src/jsonschema/index.ts +1 -1
- package/src/jsonschema/types.d.ts +1 -1
- package/src/meta/defineMetadata.ts +1 -1
- package/src/meta/index.ts +2 -3
- package/src/orm/createSqliteDialect.ts +17 -0
- package/src/orm/index.ts +1 -0
- package/src/orpc/createOpenApiContractClient.ts +3 -3
- package/src/orpc/index.ts +1 -1
- package/src/password/PHC.ts +3 -3
- package/src/password/createArgon2PasswordAlgorithm.ts +2 -2
- package/src/password/createBase64PasswordAlgorithm.ts +2 -2
- package/src/password/createBcryptPasswordAlgorithm.ts +4 -2
- package/src/password/createPBKDF2PasswordAlgorithm.ts +2 -2
- package/src/password/createScryptPasswordAlgorithm.ts +4 -4
- package/src/password/index.ts +2 -2
- package/src/resource/ListQuery.ts +4 -1
- package/src/resource/index.ts +3 -3
- package/src/resource/schema/index.ts +4 -4
- package/src/s3/formatS3Url.test.ts +1 -1
- package/src/s3/formatS3Url.ts +2 -2
- package/src/s3/index.ts +1 -1
- package/src/s3/parseS3Url.ts +1 -1
- package/src/schema/SchemaRegistry.ts +2 -2
- package/src/schema/TypeSchema.d.ts +6 -6
- package/src/schema/createSchemaData.ts +5 -5
- package/src/schema/findJsonSchemaByPath.ts +5 -5
- package/src/schema/formatZodError.test.ts +2 -1
- package/src/schema/formatZodError.ts +50 -62
- package/src/schema/index.ts +5 -5
- package/src/schema/toJsonSchema.ts +6 -6
- package/src/schema/validate.ts +2 -2
- package/src/utils/buildRedactorFormSchema.ts +4 -4
- package/src/utils/formatNumber.ts +18 -0
- package/src/utils/formatPercent.ts +17 -0
- package/src/utils/index.ts +3 -3
- package/src/utils/resolveFeatureOptions.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/fs/server/createNodeFileSystem.ts"],"sourcesContent":["import {\n\tcreateReadStream as nodeCreateReadStream,\n\tcreateWriteStream as nodeCreateWriteStream,\n\ttype Stats,\n} from 'node:fs';\nimport fsp from 'node:fs/promises';\nimport path from 'node:path';\nimport { Readable, type Writable } from 'node:stream';\nimport { pathToFileURL } from 'node:url';\nimport type {\n\tCopyOptions,\n\tCreateReadStreamOptions,\n\tCreateWriteStreamOptions,\n\tIFileStat,\n\tIFileSystem,\n\tMkdirOptions,\n\tReaddirOptions,\n\tReadFileOptions,\n\tRenameOptions,\n\tRmOptions,\n\tStatOptions,\n\tWriteFileOptions,\n} from '../IFileSystem';\n\nexport type INodeFileSystem = IFileSystem & {\n\treadonly root: string;\n\tresolvePath(filePath: string): string;\n};\n\n/**\n * Creates a Node.js filesystem adapter that implements the IFileSystem interface\n * @param options Configuration options for the filesystem\n * @param options.root Optional root directory to restrict all operations within\n */\nexport function createNodeFileSystem(options: { root?: string } = {}): INodeFileSystem {\n\treturn new NodeFs(options);\n}\n\ntype IFS = typeof import('fs/promises');\n\nclass NodeFs implements IFileSystem, INodeFileSystem {\n\treadonly root: string;\n\tprivate readonly fs: IFS;\n\n\tconstructor({\n\t\troot,\n\t\tfs = fsp,\n\t}: {\n\t\troot?: string;\n\t\tfs?: IFS;\n\t} = {}) {\n\t\t// Normalize the root path if provided\n\t\tif (root) {\n\t\t\tthis.root = path.resolve(root);\n\t\t} else {\n\t\t\tthis.root = '';\n\t\t}\n\t\tthis.fs = fs;\n\t}\n\n\t// Helper method to handle aborted signals consistently\n\tprivate checkAborted(signal?: AbortSignal): void {\n\t\tif (signal?.aborted) {\n\t\t\tthrow new Error('The operation was aborted');\n\t\t}\n\t}\n\n\t/**\n\t * Resolves and secures a path by:\n\t * 1. Normalizing the path\n\t * 2. Prepending the root directory if one is set\n\t * 3. Verifying the resulting path is within the root directory\n\t *\n\t * This prevents path traversal attacks.\n\t */\n\tresolvePath(filePath: string): string {\n\t\t// Handle empty paths\n\t\tif (!filePath) {\n\t\t\treturn this.root || '';\n\t\t}\n\n\t\t// Normalize to remove any '..' segments and handle slashes\n\t\tconst normalizedPath = path.normalize(filePath);\n\n\t\t// If no root is set, just return the normalized path\n\t\tif (!this.root) {\n\t\t\treturn normalizedPath;\n\t\t}\n\n\t\t// Join with root and resolve to absolute path\n\t\tconst resolvedPath = path.resolve(path.join(this.root, normalizedPath));\n\n\t\t// Security check: ensure the path is within the root directory\n\t\tif (!resolvedPath.startsWith(this.root)) {\n\t\t\tthrow new Error(`Security violation: Path ${filePath} attempts to access outside of the root directory`);\n\t\t}\n\n\t\treturn resolvedPath;\n\t}\n\n\t/**\n\t * Removes the root prefix from a path for external representation\n\t */\n\tprivate stripRoot(fullPath: string): string {\n\t\tif (!this.root || !fullPath.startsWith(this.root)) {\n\t\t\treturn fullPath;\n\t\t}\n\n\t\t// Remove the root prefix and ensure there's a leading slash\n\t\tlet relativePath = fullPath.substring(this.root.length);\n\t\tif (!relativePath) {\n\t\t\treturn '/';\n\t\t}\n\n\t\tif (!relativePath.startsWith('/') && !relativePath.startsWith('\\\\')) {\n\t\t\trelativePath = '/' + relativePath;\n\t\t}\n\n\t\t// Normalize to ensure consistent path separators\n\t\treturn path.normalize(relativePath).replace(/\\\\/g, '/');\n\t}\n\n\t/**\n\t * Converts a system file stat to our IFileStat interface,\n\t * stripping the root prefix from paths\n\t */\n\tprivate toFileStat(fullPath: string, fsStats: Stats): IFileStat {\n\t\tconst normalizedPath = this.stripRoot(fullPath);\n\t\tconst directoryPath = path.dirname(normalizedPath);\n\t\tconst directory = directoryPath === '.' ? '/' : directoryPath.replace(/\\\\/g, '/');\n\n\t\treturn {\n\t\t\tdirectory,\n\t\t\tpath: normalizedPath,\n\t\t\tname: path.basename(fullPath),\n\t\t\tkind: fsStats.isDirectory() ? 'directory' : 'file',\n\t\t\tmtime: fsStats.mtimeMs,\n\t\t\tsize: fsStats.size,\n\t\t\tmeta: {},\n\t\t};\n\t}\n\n\tasync readdir(dir: string, options: ReaddirOptions = {}): Promise<IFileStat[]> {\n\t\tconst { fs } = this;\n\t\tconst { glob, recursive, depth = 1, kind, hidden = true, signal } = options;\n\t\tthis.checkAborted(signal);\n\n\t\t// Resolve the directory path with security checks\n\t\tconst resolvedDir = this.resolvePath(dir);\n\n\t\t// Basic file listing\n\t\tconst entries = await fs.readdir(resolvedDir, { withFileTypes: true });\n\t\tlet results = await Promise.all(\n\t\t\tentries\n\t\t\t\t.filter((entry) => hidden || !entry.name.startsWith('.'))\n\t\t\t\t.filter((entry) => !kind || (kind === 'directory' ? entry.isDirectory() : entry.isFile()))\n\t\t\t\t.map(async (entry) => {\n\t\t\t\t\tthis.checkAborted(signal);\n\n\t\t\t\t\tconst entryFullPath = path.join(resolvedDir, entry.name);\n\t\t\t\t\tconst stat = await fs.stat(entryFullPath);\n\n\t\t\t\t\t// Convert to external representation\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdirectory: this.stripRoot(resolvedDir),\n\t\t\t\t\t\tpath: this.stripRoot(entryFullPath),\n\t\t\t\t\t\tname: entry.name,\n\t\t\t\t\t\tkind: entry.isDirectory() ? 'directory' : 'file',\n\t\t\t\t\t\tmtime: stat.mtimeMs,\n\t\t\t\t\t\tsize: stat.size,\n\t\t\t\t\t\tmeta: {},\n\t\t\t\t\t} as IFileStat;\n\t\t\t\t}),\n\t\t);\n\n\t\t// Handle recursive option\n\t\tif (recursive || depth > 1) {\n\t\t\tconst subdirs = results.filter((entry) => entry.kind === 'directory');\n\n\t\t\tfor (const subdir of subdirs) {\n\t\t\t\tthis.checkAborted(signal);\n\n\t\t\t\tconst maxDepth = recursive ? Infinity : depth - 1;\n\t\t\t\tif (maxDepth > 0) {\n\t\t\t\t\t// Need to convert the path back to a full path for the recursive call\n\t\t\t\t\tconst subdirFullPath = this.resolvePath(subdir.path);\n\n\t\t\t\t\tconst subEntries = await this.readdir(subdir.path, {\n\t\t\t\t\t\t...options,\n\t\t\t\t\t\tdepth: maxDepth,\n\t\t\t\t\t});\n\t\t\t\t\tresults = [...results, ...subEntries];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Handle glob filtering\n\t\tif (glob) {\n\t\t\tconst { matcher } = await import('micromatch');\n\t\t\tconst match = matcher(glob);\n\t\t\tresults = results.filter((entry) => match(entry.path));\n\t\t}\n\n\t\treturn results;\n\t}\n\n\tasync stat(filePath: string, options: StatOptions = {}): Promise<IFileStat> {\n\t\tconst { fs } = this;\n\n\t\tconst { signal } = options;\n\t\tthis.checkAborted(signal);\n\n\t\tconst resolvedPath = this.resolvePath(filePath);\n\n\t\ttry {\n\t\t\tconst stat = await fs.stat(resolvedPath);\n\t\t\treturn this.toFileStat(resolvedPath, stat);\n\t\t} catch (err: any) {\n\t\t\tif (err.code === 'ENOENT') {\n\t\t\t\tthrow new Error(`File not found: ${filePath}`);\n\t\t\t}\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tasync mkdir(dirPath: string, options: MkdirOptions = {}): Promise<void> {\n\t\tconst { fs } = this;\n\n\t\tconst { recursive = false, signal } = options;\n\t\tthis.checkAborted(signal);\n\n\t\tconst resolvedPath = this.resolvePath(dirPath);\n\n\t\ttry {\n\t\t\tawait fs.mkdir(resolvedPath, { recursive });\n\t\t} catch (err: any) {\n\t\t\tif (err.code === 'EEXIST' && recursive) {\n\t\t\t\t// Ignore if directory exists and recursive is true\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tasync readFile(path: string, options?: ReadFileOptions & { encoding: 'text' }): Promise<string>;\n\tasync readFile(path: string, options?: ReadFileOptions): Promise<Uint8Array>;\n\tasync readFile(path: string, options: ReadFileOptions = {}): Promise<string | Uint8Array> {\n\t\tconst { fs } = this;\n\n\t\tconst { encoding = 'binary', signal, onDownloadProgress } = options;\n\t\tthis.checkAborted(signal);\n\n\t\tconst resolvedPath = this.resolvePath(path);\n\n\t\ttry {\n\t\t\t// Handle progress reporting if needed\n\t\t\tif (onDownloadProgress) {\n\t\t\t\tconst stat = await fs.stat(resolvedPath);\n\t\t\t\tconst stream = this.createReadStream(path, { signal });\n\n\t\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\t\tconst chunks: Buffer[] = [];\n\t\t\t\t\tlet loaded = 0;\n\n\t\t\t\t\tstream.on('data', (chunk) => {\n\t\t\t\t\t\tchunks.push(Buffer.from(chunk));\n\t\t\t\t\t\tloaded += chunk.length;\n\t\t\t\t\t\tonDownloadProgress({ loaded, total: stat.size });\n\t\t\t\t\t});\n\n\t\t\t\t\tstream.on('end', () => {\n\t\t\t\t\t\tconst buffer = Buffer.concat(chunks);\n\t\t\t\t\t\tif (encoding === 'text') {\n\t\t\t\t\t\t\tresolve(buffer.toString('utf-8'));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tresolve(buffer);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tstream.on('error', reject);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Standard file reading\n\t\t\tif (encoding === 'text') {\n\t\t\t\treturn await fs.readFile(resolvedPath, { encoding: 'utf-8' });\n\t\t\t} else {\n\t\t\t\treturn await fs.readFile(resolvedPath);\n\t\t\t}\n\t\t} catch (err: any) {\n\t\t\tif (err.code === 'ENOENT') {\n\t\t\t\tthrow new Error(`File not found: ${path}`);\n\t\t\t}\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tasync writeFile(\n\t\tpath: string,\n\t\tdata: string | Buffer | ArrayBuffer | Readable,\n\t\toptions: WriteFileOptions = {},\n\t): Promise<void> {\n\t\tconst { fs } = this;\n\n\t\tconst { signal, overwrite = true, onUploadProgress } = options;\n\t\tthis.checkAborted(signal);\n\n\t\tconst resolvedPath = this.resolvePath(path);\n\n\t\t// Check if file exists and overwrite is false\n\t\tif (!overwrite) {\n\t\t\tconst exists = await this.exists(path);\n\t\t\tif (exists) {\n\t\t\t\tthrow new Error(`File already exists: ${path}`);\n\t\t\t}\n\t\t}\n\n\t\t// Create parent directories if they don't exist\n\t\tconst directory = this.getDirectoryName(resolvedPath);\n\t\tif (directory !== resolvedPath) {\n\t\t\ttry {\n\t\t\t\tawait this.mkdir(this.stripRoot(directory), { recursive: true });\n\t\t\t} catch (err: any) {\n\t\t\t\t// Ignore directory exists error\n\t\t\t\tif (err?.code !== 'EEXIST') {\n\t\t\t\t\tthrow err;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (data instanceof Readable) {\n\t\t\tlet _data = data;\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tconst writeStream = this.createWriteStream(path, options);\n\t\t\t\tlet totalBytes = 0;\n\n\t\t\t\tif (onUploadProgress) {\n\t\t\t\t\t_data.on('data', (chunk) => {\n\t\t\t\t\t\ttotalBytes += chunk.length;\n\t\t\t\t\t\tonUploadProgress({ loaded: totalBytes, total: -1 });\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t_data.pipe(writeStream);\n\n\t\t\t\twriteStream.on('finish', () => resolve());\n\t\t\t\twriteStream.on('error', reject);\n\n\t\t\t\tif (signal) {\n\t\t\t\t\tsignal.addEventListener('abort', () => {\n\t\t\t\t\t\t_data.destroy();\n\t\t\t\t\t\twriteStream.destroy();\n\t\t\t\t\t\treject(new Error('The operation was aborted'));\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\t// Convert ArrayBuffer to Buffer if necessary\n\t\t\tif (data instanceof ArrayBuffer) {\n\t\t\t\tdata = Buffer.from(data);\n\t\t\t}\n\t\t\tawait fs.writeFile(resolvedPath, data);\n\t\t}\n\t}\n\n\tasync rm(path: string, options: RmOptions = {}): Promise<void> {\n\t\tconst { fs } = this;\n\n\t\tconst { recursive = false, force = false, signal } = options;\n\t\tthis.checkAborted(signal);\n\n\t\tconst resolvedPath = this.resolvePath(path);\n\n\t\ttry {\n\t\t\tawait fs.rm(resolvedPath, { recursive, force });\n\t\t} catch (err: any) {\n\t\t\tif (force && err.code === 'ENOENT') {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tasync rename(oldPath: string, newPath: string, options: RenameOptions = {}): Promise<void> {\n\t\tconst { fs } = this;\n\n\t\tconst { signal, overwrite = false } = options;\n\t\tthis.checkAborted(signal);\n\n\t\tconst resolvedOldPath = this.resolvePath(oldPath);\n\t\tconst resolvedNewPath = this.resolvePath(newPath);\n\n\t\t// Check if target exists and overwrite is false\n\t\tif (!overwrite) {\n\t\t\tconst exists = await this.exists(newPath);\n\t\t\tif (exists) {\n\t\t\t\tthrow new Error(`Destination already exists: ${newPath}`);\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tawait fs.rename(resolvedOldPath, resolvedNewPath);\n\t\t} catch (err: any) {\n\t\t\tif (err.code === 'ENOENT') {\n\t\t\t\tthrow new Error(`Source file not found: ${oldPath}`);\n\t\t\t}\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tasync exists(path: string): Promise<boolean> {\n\t\tconst { fs } = this;\n\n\t\ttry {\n\t\t\tawait fs.access(this.resolvePath(path));\n\t\t\treturn true;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tasync copy(src: string, dest: string, options: CopyOptions = {}): Promise<void> {\n\t\tconst { fs } = this;\n\n\t\tconst { signal, overwrite = true, shallow = false } = options;\n\t\tthis.checkAborted(signal);\n\n\t\tconst resolvedSrc = this.resolvePath(src);\n\t\tconst resolvedDest = this.resolvePath(dest);\n\n\t\t// Check if source exists\n\t\ttry {\n\t\t\tconst stat = await fs.stat(resolvedSrc);\n\n\t\t\t// Check if destination exists and overwrite is false\n\t\t\tif (!overwrite) {\n\t\t\t\tconst exists = await this.exists(dest);\n\t\t\t\tif (exists) {\n\t\t\t\t\tthrow new Error(`Destination already exists: ${dest}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Create parent directory if it doesn't exist\n\t\t\tconst parentDir = this.getDirectoryName(resolvedDest);\n\t\t\tawait this.mkdir(this.stripRoot(parentDir), { recursive: true });\n\n\t\t\t// Copy recursively or not based on shallow and if it's a directory\n\t\t\tawait fs.cp(resolvedSrc, resolvedDest, {\n\t\t\t\trecursive: !shallow && stat.isDirectory(),\n\t\t\t\tforce: overwrite,\n\t\t\t});\n\t\t} catch (err: any) {\n\t\t\tif (err.code === 'ENOENT') {\n\t\t\t\tthrow new Error(`Source file not found: ${src}`);\n\t\t\t}\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tcreateReadStream(filePath: string, options: CreateReadStreamOptions = {}): Readable {\n\t\tconst resolvedPath = this.resolvePath(filePath);\n\t\tconst { signal, range } = options;\n\t\tconst stream = nodeCreateReadStream(resolvedPath, {\n\t\t\tstart: range?.start,\n\t\t\tend: range?.end,\n\t\t});\n\n\t\tsignal?.addEventListener('abort', () => stream.destroy(new Error('The operation was aborted')));\n\n\t\treturn stream;\n\t}\n\n\tcreateWriteStream(filePath: string, options: CreateWriteStreamOptions = {}): Writable {\n\t\tconst resolvedPath = this.resolvePath(filePath);\n\t\tconst { signal } = options;\n\t\tconst stream = nodeCreateWriteStream(resolvedPath, { flags: options.overwrite === false ? 'wx' : 'w' });\n\n\t\tsignal?.addEventListener('abort', () => stream.destroy(new Error('The operation was aborted')));\n\n\t\treturn stream;\n\t}\n\n\t// Helper to extract directory name correctly\n\tprivate getDirectoryName(filePath: string): string {\n\t\treturn path.dirname(filePath);\n\t}\n\n\tgetUrl(needle: IFileStat | string) {\n\t\tif (typeof needle === 'object' && needle?.kind !== 'file') {\n\t\t\treturn;\n\t\t}\n\t\tlet path = typeof needle === 'string' ? needle : needle.path;\n\t\tif (!path) {\n\t\t\treturn;\n\t\t}\n\t\t// file://\n\t\treturn pathToFileURL(this.resolvePath(path)).toString();\n\t}\n}\n"],"names":["createReadStream","nodeCreateReadStream","createWriteStream","nodeCreateWriteStream","fsp","path","Readable","pathToFileURL","createNodeFileSystem","options","NodeFs","root","fs","resolve","checkAborted","signal","aborted","Error","resolvePath","filePath","normalizedPath","normalize","resolvedPath","join","startsWith","stripRoot","fullPath","relativePath","substring","length","replace","toFileStat","fsStats","directoryPath","dirname","directory","name","basename","kind","isDirectory","mtime","mtimeMs","size","meta","readdir","dir","glob","recursive","depth","hidden","resolvedDir","entries","withFileTypes","results","Promise","all","filter","entry","isFile","map","entryFullPath","stat","subdirs","subdir","maxDepth","Infinity","subdirFullPath","subEntries","matcher","match","err","code","mkdir","dirPath","readFile","encoding","onDownloadProgress","stream","reject","chunks","loaded","on","chunk","push","Buffer","from","total","buffer","concat","toString","writeFile","data","overwrite","onUploadProgress","exists","getDirectoryName","_data","writeStream","totalBytes","pipe","addEventListener","destroy","ArrayBuffer","rm","force","rename","oldPath","newPath","resolvedOldPath","resolvedNewPath","access","copy","src","dest","shallow","resolvedSrc","resolvedDest","parentDir","cp","range","start","end","flags","getUrl","needle"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/fs/server/createNodeFileSystem.ts"],"sourcesContent":["import {\n\tcreateReadStream as nodeCreateReadStream,\n\tcreateWriteStream as nodeCreateWriteStream,\n\ttype Stats,\n} from 'node:fs';\nimport fsp from 'node:fs/promises';\nimport path from 'node:path';\nimport { Readable, type Writable } from 'node:stream';\nimport { pathToFileURL } from 'node:url';\nimport type {\n\tCopyOptions,\n\tCreateReadStreamOptions,\n\tCreateWriteStreamOptions,\n\tIFileStat,\n\tIServerFileSystem,\n\tMkdirOptions,\n\tReaddirOptions,\n\tReadFileOptions,\n\tRenameOptions,\n\tRmOptions,\n\tStatOptions,\n\tWritableData,\n\tWriteFileOptions,\n} from '../IFileSystem';\n\nexport type INodeFileSystem = IServerFileSystem & {\n\treadonly root: string;\n\tresolvePath(filePath: string): string;\n};\n\n/**\n * Creates a Node.js filesystem adapter that implements the IFileSystem interface\n * @param options Configuration options for the filesystem\n * @param options.root Optional root directory to restrict all operations within\n */\nexport function createNodeFileSystem(options: { root?: string } = {}): INodeFileSystem {\n\treturn new NodeFs(options);\n}\n\ntype IFS = typeof import('fs/promises');\n\nclass NodeFs implements IServerFileSystem, INodeFileSystem {\n\treadonly root: string;\n\tprivate readonly fs: IFS;\n\n\tconstructor({\n\t\troot,\n\t\tfs = fsp,\n\t}: {\n\t\troot?: string;\n\t\tfs?: IFS;\n\t} = {}) {\n\t\t// Normalize the root path if provided\n\t\tif (root) {\n\t\t\tthis.root = path.resolve(root);\n\t\t} else {\n\t\t\tthis.root = '';\n\t\t}\n\t\tthis.fs = fs;\n\t}\n\n\t// Helper method to handle aborted signals consistently\n\tprivate checkAborted(signal?: AbortSignal): void {\n\t\tif (signal?.aborted) {\n\t\t\tthrow new Error('The operation was aborted');\n\t\t}\n\t}\n\n\t/**\n\t * Resolves and secures a path by:\n\t * 1. Normalizing the path\n\t * 2. Prepending the root directory if one is set\n\t * 3. Verifying the resulting path is within the root directory\n\t *\n\t * This prevents path traversal attacks.\n\t */\n\tresolvePath(filePath: string): string {\n\t\t// Handle empty paths\n\t\tif (!filePath) {\n\t\t\treturn this.root || '';\n\t\t}\n\n\t\t// Normalize to remove any '..' segments and handle slashes\n\t\tconst normalizedPath = path.normalize(filePath);\n\n\t\t// If no root is set, just return the normalized path\n\t\tif (!this.root) {\n\t\t\treturn normalizedPath;\n\t\t}\n\n\t\t// Join with root and resolve to absolute path\n\t\tconst resolvedPath = path.resolve(path.join(this.root, normalizedPath));\n\n\t\t// Security check: ensure the path is within the root directory\n\t\tif (!resolvedPath.startsWith(this.root)) {\n\t\t\tthrow new Error(`Security violation: Path ${filePath} attempts to access outside of the root directory`);\n\t\t}\n\n\t\treturn resolvedPath;\n\t}\n\n\t/**\n\t * Removes the root prefix from a path for external representation\n\t */\n\tprivate stripRoot(fullPath: string): string {\n\t\tif (!this.root || !fullPath.startsWith(this.root)) {\n\t\t\treturn fullPath;\n\t\t}\n\n\t\t// Remove the root prefix and ensure there's a leading slash\n\t\tlet relativePath = fullPath.substring(this.root.length);\n\t\tif (!relativePath) {\n\t\t\treturn '/';\n\t\t}\n\n\t\tif (!relativePath.startsWith('/') && !relativePath.startsWith('\\\\')) {\n\t\t\trelativePath = `/${relativePath}`;\n\t\t}\n\n\t\t// Normalize to ensure consistent path separators\n\t\treturn path.normalize(relativePath).replace(/\\\\/g, '/');\n\t}\n\n\t/**\n\t * Converts a system file stat to our IFileStat interface,\n\t * stripping the root prefix from paths\n\t */\n\tprivate toFileStat(fullPath: string, fsStats: Stats): IFileStat {\n\t\tconst normalizedPath = this.stripRoot(fullPath);\n\t\tconst directoryPath = path.dirname(normalizedPath);\n\t\tconst directory = directoryPath === '.' ? '/' : directoryPath.replace(/\\\\/g, '/');\n\n\t\treturn {\n\t\t\tdirectory,\n\t\t\tpath: normalizedPath,\n\t\t\tname: path.basename(fullPath),\n\t\t\tkind: fsStats.isDirectory() ? 'directory' : 'file',\n\t\t\tmtime: fsStats.mtimeMs,\n\t\t\tsize: fsStats.size,\n\t\t\tmeta: {},\n\t\t};\n\t}\n\n\tasync readdir(dir: string, options: ReaddirOptions = {}): Promise<IFileStat[]> {\n\t\tconst { fs } = this;\n\t\tconst { glob, recursive, depth = 1, kind, hidden = true, signal } = options;\n\t\tthis.checkAborted(signal);\n\n\t\t// Resolve the directory path with security checks\n\t\tconst resolvedDir = this.resolvePath(dir);\n\n\t\t// Basic file listing\n\t\tconst entries = await fs.readdir(resolvedDir, { withFileTypes: true });\n\t\tlet results = await Promise.all(\n\t\t\tentries\n\t\t\t\t.filter((entry) => hidden || !entry.name.startsWith('.'))\n\t\t\t\t.filter((entry) => !kind || (kind === 'directory' ? entry.isDirectory() : entry.isFile()))\n\t\t\t\t.map(async (entry) => {\n\t\t\t\t\tthis.checkAborted(signal);\n\n\t\t\t\t\tconst entryFullPath = path.join(resolvedDir, entry.name);\n\t\t\t\t\tconst stat = await fs.stat(entryFullPath);\n\n\t\t\t\t\t// Convert to external representation\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdirectory: this.stripRoot(resolvedDir),\n\t\t\t\t\t\tpath: this.stripRoot(entryFullPath),\n\t\t\t\t\t\tname: entry.name,\n\t\t\t\t\t\tkind: entry.isDirectory() ? 'directory' : 'file',\n\t\t\t\t\t\tmtime: stat.mtimeMs,\n\t\t\t\t\t\tsize: stat.size,\n\t\t\t\t\t\tmeta: {},\n\t\t\t\t\t} as IFileStat;\n\t\t\t\t}),\n\t\t);\n\n\t\t// Handle recursive option\n\t\tif (recursive || depth > 1) {\n\t\t\tconst subdirs = results.filter((entry) => entry.kind === 'directory');\n\n\t\t\tfor (const subdir of subdirs) {\n\t\t\t\tthis.checkAborted(signal);\n\n\t\t\t\tconst maxDepth = recursive ? Infinity : depth - 1;\n\t\t\t\tif (maxDepth > 0) {\n\t\t\t\t\t// Need to convert the path back to a full path for the recursive call\n\t\t\t\t\tconst _subdirFullPath = this.resolvePath(subdir.path);\n\n\t\t\t\t\tconst subEntries = await this.readdir(subdir.path, {\n\t\t\t\t\t\t...options,\n\t\t\t\t\t\tdepth: maxDepth,\n\t\t\t\t\t});\n\t\t\t\t\tresults = [...results, ...subEntries];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Handle glob filtering\n\t\tif (glob) {\n\t\t\tconst { matcher } = await import('micromatch');\n\t\t\tconst match = matcher(glob);\n\t\t\tresults = results.filter((entry) => match(entry.path));\n\t\t}\n\n\t\treturn results;\n\t}\n\n\tasync stat(filePath: string, options: StatOptions = {}): Promise<IFileStat> {\n\t\tconst { fs } = this;\n\n\t\tconst { signal } = options;\n\t\tthis.checkAborted(signal);\n\n\t\tconst resolvedPath = this.resolvePath(filePath);\n\n\t\ttry {\n\t\t\tconst stat = await fs.stat(resolvedPath);\n\t\t\treturn this.toFileStat(resolvedPath, stat);\n\t\t} catch (err: any) {\n\t\t\tif (err.code === 'ENOENT') {\n\t\t\t\tthrow new Error(`File not found: ${filePath}`);\n\t\t\t}\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tasync mkdir(dirPath: string, options: MkdirOptions = {}): Promise<void> {\n\t\tconst { fs } = this;\n\n\t\tconst { recursive = false, signal } = options;\n\t\tthis.checkAborted(signal);\n\n\t\tconst resolvedPath = this.resolvePath(dirPath);\n\n\t\ttry {\n\t\t\tawait fs.mkdir(resolvedPath, { recursive });\n\t\t} catch (err: any) {\n\t\t\tif (err.code === 'EEXIST' && recursive) {\n\t\t\t\t// Ignore if directory exists and recursive is true\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tasync readFile(path: string, options?: ReadFileOptions & { encoding: 'text' }): Promise<string>;\n\tasync readFile(path: string, options?: ReadFileOptions): Promise<Uint8Array>;\n\tasync readFile(path: string, options: ReadFileOptions = {}): Promise<string | Uint8Array> {\n\t\tconst { fs } = this;\n\n\t\tconst { encoding = 'binary', signal, onDownloadProgress } = options;\n\t\tthis.checkAborted(signal);\n\n\t\tconst resolvedPath = this.resolvePath(path);\n\n\t\ttry {\n\t\t\t// Handle progress reporting if needed\n\t\t\tif (onDownloadProgress) {\n\t\t\t\tconst stat = await fs.stat(resolvedPath);\n\t\t\t\tconst stream = this.createReadStream(path, { signal });\n\n\t\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\t\tconst chunks: Buffer[] = [];\n\t\t\t\t\tlet loaded = 0;\n\n\t\t\t\t\tstream.on('data', (chunk) => {\n\t\t\t\t\t\tchunks.push(Buffer.from(chunk));\n\t\t\t\t\t\tloaded += chunk.length;\n\t\t\t\t\t\tonDownloadProgress({ loaded, total: stat.size });\n\t\t\t\t\t});\n\n\t\t\t\t\tstream.on('end', () => {\n\t\t\t\t\t\tconst buffer = Buffer.concat(chunks);\n\t\t\t\t\t\tif (encoding === 'text') {\n\t\t\t\t\t\t\tresolve(buffer.toString('utf-8'));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tresolve(buffer);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tstream.on('error', reject);\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Standard file reading\n\t\t\tif (encoding === 'text') {\n\t\t\t\treturn await fs.readFile(resolvedPath, { encoding: 'utf-8' });\n\t\t\t} else {\n\t\t\t\treturn await fs.readFile(resolvedPath);\n\t\t\t}\n\t\t} catch (err: any) {\n\t\t\tif (err.code === 'ENOENT') {\n\t\t\t\tthrow new Error(`File not found: ${path}`);\n\t\t\t}\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tasync writeFile(path: string, data: WritableData, options: WriteFileOptions = {}): Promise<void> {\n\t\tconst { fs } = this;\n\n\t\tconst { signal, overwrite = true, onUploadProgress } = options;\n\t\tthis.checkAborted(signal);\n\n\t\tconst resolvedPath = this.resolvePath(path);\n\n\t\t// Check if file exists and overwrite is false\n\t\tif (!overwrite) {\n\t\t\tconst exists = await this.exists(path);\n\t\t\tif (exists) {\n\t\t\t\tthrow new Error(`File already exists: ${path}`);\n\t\t\t}\n\t\t}\n\n\t\t// Create parent directories if they don't exist\n\t\tconst directory = this.getDirectoryName(resolvedPath);\n\t\tif (directory !== resolvedPath) {\n\t\t\ttry {\n\t\t\t\tawait this.mkdir(this.stripRoot(directory), { recursive: true });\n\t\t\t} catch (err: any) {\n\t\t\t\t// Ignore directory exists error\n\t\t\t\tif (err?.code !== 'EEXIST') {\n\t\t\t\t\tthrow err;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (data instanceof Readable) {\n\t\t\tlet _data = data;\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tconst writeStream = this.createWriteStream(path, options);\n\t\t\t\tlet totalBytes = 0;\n\n\t\t\t\tif (onUploadProgress) {\n\t\t\t\t\t_data.on('data', (chunk) => {\n\t\t\t\t\t\ttotalBytes += chunk.length;\n\t\t\t\t\t\tonUploadProgress({ loaded: totalBytes, total: -1 });\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t_data.pipe(writeStream);\n\n\t\t\t\twriteStream.on('finish', () => resolve());\n\t\t\t\twriteStream.on('error', reject);\n\n\t\t\t\tif (signal) {\n\t\t\t\t\tsignal.addEventListener('abort', () => {\n\t\t\t\t\t\t_data.destroy();\n\t\t\t\t\t\twriteStream.destroy();\n\t\t\t\t\t\treject(new Error('The operation was aborted'));\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t} else if (data instanceof ReadableStream) {\n\t\t\t// Handle web ReadableStream\n\t\t\tconst reader = data.getReader();\n\t\t\tconst chunks: Uint8Array[] = [];\n\t\t\tlet loaded = 0;\n\t\t\twhile (true) {\n\t\t\t\tconst { done, value } = await reader.read();\n\t\t\t\tif (done) break;\n\t\t\t\tif (value) {\n\t\t\t\t\tchunks.push(value);\n\t\t\t\t\tloaded += value.length;\n\t\t\t\t\tif (onUploadProgress) {\n\t\t\t\t\t\tonUploadProgress({ loaded, total: -1 });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tawait fs.writeFile(resolvedPath, Buffer.concat(chunks));\n\t\t} else {\n\t\t\t// Convert ArrayBuffer/ArrayBufferView to Buffer if necessary\n\t\t\tlet writeData: string | Buffer;\n\t\t\tif (data instanceof ArrayBuffer) {\n\t\t\t\twriteData = Buffer.from(data);\n\t\t\t} else if (ArrayBuffer.isView(data)) {\n\t\t\t\twriteData = Buffer.from(data.buffer, data.byteOffset, data.byteLength);\n\t\t\t} else {\n\t\t\t\twriteData = data;\n\t\t\t}\n\t\t\tawait fs.writeFile(resolvedPath, writeData);\n\t\t}\n\t}\n\n\tasync rm(path: string, options: RmOptions = {}): Promise<void> {\n\t\tconst { fs } = this;\n\n\t\tconst { recursive = false, force = false, signal } = options;\n\t\tthis.checkAborted(signal);\n\n\t\tconst resolvedPath = this.resolvePath(path);\n\n\t\ttry {\n\t\t\tawait fs.rm(resolvedPath, { recursive, force });\n\t\t} catch (err: any) {\n\t\t\tif (force && err.code === 'ENOENT') {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tasync rename(oldPath: string, newPath: string, options: RenameOptions = {}): Promise<void> {\n\t\tconst { fs } = this;\n\n\t\tconst { signal, overwrite = false } = options;\n\t\tthis.checkAborted(signal);\n\n\t\tconst resolvedOldPath = this.resolvePath(oldPath);\n\t\tconst resolvedNewPath = this.resolvePath(newPath);\n\n\t\t// Check if target exists and overwrite is false\n\t\tif (!overwrite) {\n\t\t\tconst exists = await this.exists(newPath);\n\t\t\tif (exists) {\n\t\t\t\tthrow new Error(`Destination already exists: ${newPath}`);\n\t\t\t}\n\t\t}\n\n\t\ttry {\n\t\t\tawait fs.rename(resolvedOldPath, resolvedNewPath);\n\t\t} catch (err: any) {\n\t\t\tif (err.code === 'ENOENT') {\n\t\t\t\tthrow new Error(`Source file not found: ${oldPath}`);\n\t\t\t}\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tasync exists(path: string): Promise<boolean> {\n\t\tconst { fs } = this;\n\n\t\ttry {\n\t\t\tawait fs.access(this.resolvePath(path));\n\t\t\treturn true;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tasync copy(src: string, dest: string, options: CopyOptions = {}): Promise<void> {\n\t\tconst { fs } = this;\n\n\t\tconst { signal, overwrite = true, shallow = false } = options;\n\t\tthis.checkAborted(signal);\n\n\t\tconst resolvedSrc = this.resolvePath(src);\n\t\tconst resolvedDest = this.resolvePath(dest);\n\n\t\t// Check if source exists\n\t\ttry {\n\t\t\tconst stat = await fs.stat(resolvedSrc);\n\n\t\t\t// Check if destination exists and overwrite is false\n\t\t\tif (!overwrite) {\n\t\t\t\tconst exists = await this.exists(dest);\n\t\t\t\tif (exists) {\n\t\t\t\t\tthrow new Error(`Destination already exists: ${dest}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Create parent directory if it doesn't exist\n\t\t\tconst parentDir = this.getDirectoryName(resolvedDest);\n\t\t\tawait this.mkdir(this.stripRoot(parentDir), { recursive: true });\n\n\t\t\t// Copy recursively or not based on shallow and if it's a directory\n\t\t\tawait fs.cp(resolvedSrc, resolvedDest, {\n\t\t\t\trecursive: !shallow && stat.isDirectory(),\n\t\t\t\tforce: overwrite,\n\t\t\t});\n\t\t} catch (err: any) {\n\t\t\tif (err.code === 'ENOENT') {\n\t\t\t\tthrow new Error(`Source file not found: ${src}`);\n\t\t\t}\n\t\t\tthrow err;\n\t\t}\n\t}\n\n\tcreateReadStream(filePath: string, options: CreateReadStreamOptions = {}): Readable {\n\t\tconst resolvedPath = this.resolvePath(filePath);\n\t\tconst { signal, range } = options;\n\t\tconst stream = nodeCreateReadStream(resolvedPath, {\n\t\t\tstart: range?.start,\n\t\t\tend: range?.end,\n\t\t});\n\n\t\tsignal?.addEventListener('abort', () => stream.destroy(new Error('The operation was aborted')));\n\n\t\treturn stream;\n\t}\n\n\tcreateWriteStream(filePath: string, options: CreateWriteStreamOptions = {}): Writable {\n\t\tconst resolvedPath = this.resolvePath(filePath);\n\t\tconst { signal } = options;\n\t\tconst stream = nodeCreateWriteStream(resolvedPath, { flags: options.overwrite === false ? 'wx' : 'w' });\n\n\t\tsignal?.addEventListener('abort', () => stream.destroy(new Error('The operation was aborted')));\n\n\t\treturn stream;\n\t}\n\n\t// Helper to extract directory name correctly\n\tprivate getDirectoryName(filePath: string): string {\n\t\treturn path.dirname(filePath);\n\t}\n\n\tgetUrl(needle: IFileStat | string) {\n\t\tif (typeof needle === 'object' && needle?.kind !== 'file') {\n\t\t\treturn;\n\t\t}\n\t\tlet path = typeof needle === 'string' ? needle : needle.path;\n\t\tif (!path) {\n\t\t\treturn;\n\t\t}\n\t\t// file://\n\t\treturn pathToFileURL(this.resolvePath(path)).toString();\n\t}\n}\n"],"names":["createReadStream","nodeCreateReadStream","createWriteStream","nodeCreateWriteStream","fsp","path","Readable","pathToFileURL","createNodeFileSystem","options","NodeFs","root","fs","resolve","checkAborted","signal","aborted","Error","resolvePath","filePath","normalizedPath","normalize","resolvedPath","join","startsWith","stripRoot","fullPath","relativePath","substring","length","replace","toFileStat","fsStats","directoryPath","dirname","directory","name","basename","kind","isDirectory","mtime","mtimeMs","size","meta","readdir","dir","glob","recursive","depth","hidden","resolvedDir","entries","withFileTypes","results","Promise","all","filter","entry","isFile","map","entryFullPath","stat","subdirs","subdir","maxDepth","Infinity","_subdirFullPath","subEntries","matcher","match","err","code","mkdir","dirPath","readFile","encoding","onDownloadProgress","stream","reject","chunks","loaded","on","chunk","push","Buffer","from","total","buffer","concat","toString","writeFile","data","overwrite","onUploadProgress","exists","getDirectoryName","_data","writeStream","totalBytes","pipe","addEventListener","destroy","ReadableStream","reader","getReader","done","value","read","writeData","ArrayBuffer","isView","byteOffset","byteLength","rm","force","rename","oldPath","newPath","resolvedOldPath","resolvedNewPath","access","copy","src","dest","shallow","resolvedSrc","resolvedDest","parentDir","cp","range","start","end","flags","getUrl","needle"],"mappings":"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"}
|
|
@@ -1,221 +1,208 @@
|
|
|
1
1
|
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
Promise.resolve(value).then(_next, _throw);
|
|
15
|
-
}
|
|
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
|
+
}
|
|
16
14
|
}
|
|
17
15
|
function _async_to_generator(fn) {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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
|
+
};
|
|
31
29
|
}
|
|
32
30
|
function _ts_generator(thisArg, body) {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
done: true
|
|
137
|
-
};
|
|
138
|
-
}
|
|
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
|
+
}
|
|
139
134
|
}
|
|
140
|
-
|
|
141
|
-
import {
|
|
142
|
-
import {
|
|
143
|
-
import {
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
_state.sent();
|
|
214
|
-
return [
|
|
215
|
-
2
|
|
216
|
-
];
|
|
217
|
-
}
|
|
218
|
-
});
|
|
219
|
-
})();
|
|
220
|
-
}, 60000); // Increase timeout to 60 seconds
|
|
135
|
+
|
|
136
|
+
import { beforeEach, describe, test } from 'vitest';
|
|
137
|
+
import { runFileSystemTest } from '../tests/runFileSystemTest.js';
|
|
138
|
+
import { createDatabaseFileSystem, FileNodeMetaEntity } from './createDatabaseFileSystem.js';
|
|
139
|
+
import { loadTestDatabase } from './loadTestDatabase.js';
|
|
140
|
+
|
|
141
|
+
describe('DatabaseFileSystem', () => {
|
|
142
|
+
var fs;
|
|
143
|
+
var em;
|
|
144
|
+
beforeEach(
|
|
145
|
+
() =>
|
|
146
|
+
_async_to_generator(function () {
|
|
147
|
+
var _ref, entityManager, rootNode, content, readmeFile;
|
|
148
|
+
return _ts_generator(this, (_state) => {
|
|
149
|
+
switch (_state.label) {
|
|
150
|
+
case 0:
|
|
151
|
+
return [4, loadTestDatabase()];
|
|
152
|
+
case 1:
|
|
153
|
+
(_ref = _state.sent()), (entityManager = _ref.em);
|
|
154
|
+
em = entityManager; // Type cast to match expected EntityManager type
|
|
155
|
+
fs = createDatabaseFileSystem({
|
|
156
|
+
getEntityManager: () => em,
|
|
157
|
+
});
|
|
158
|
+
return [4, fs.ensureRootNode()];
|
|
159
|
+
case 2:
|
|
160
|
+
rootNode = _state.sent();
|
|
161
|
+
// Create /README.txt file using EntityManager
|
|
162
|
+
content = Buffer.from('Hello');
|
|
163
|
+
readmeFile = em.create(FileNodeMetaEntity, {
|
|
164
|
+
filename: 'README.txt',
|
|
165
|
+
parent: rootNode,
|
|
166
|
+
kind: 'file',
|
|
167
|
+
size: content.length,
|
|
168
|
+
content: content,
|
|
169
|
+
atime: new Date(),
|
|
170
|
+
btime: new Date(),
|
|
171
|
+
ctime: new Date(),
|
|
172
|
+
mtime: new Date(),
|
|
173
|
+
});
|
|
174
|
+
return [4, em.persistAndFlush(readmeFile)];
|
|
175
|
+
case 3:
|
|
176
|
+
_state.sent();
|
|
177
|
+
return [2];
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
})(),
|
|
181
|
+
30000,
|
|
182
|
+
); // Increase timeout to 30 seconds
|
|
183
|
+
test(
|
|
184
|
+
'common tests',
|
|
185
|
+
() =>
|
|
186
|
+
_async_to_generator(function () {
|
|
187
|
+
return _ts_generator(this, (_state) => {
|
|
188
|
+
switch (_state.label) {
|
|
189
|
+
case 0:
|
|
190
|
+
return [
|
|
191
|
+
4,
|
|
192
|
+
runFileSystemTest(fs, {
|
|
193
|
+
writableStream: false,
|
|
194
|
+
readableStream: false,
|
|
195
|
+
readStream: false,
|
|
196
|
+
writeStream: false,
|
|
197
|
+
abort: false,
|
|
198
|
+
}),
|
|
199
|
+
];
|
|
200
|
+
case 1:
|
|
201
|
+
_state.sent();
|
|
202
|
+
return [2];
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
})(),
|
|
206
|
+
60000,
|
|
207
|
+
); // Increase timeout to 60 seconds
|
|
221
208
|
});
|
package/lib/fs/server/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { createNodeFileSystem } from
|
|
1
|
+
export { createNodeFileSystem } from './createNodeFileSystem.js';
|
|
2
2
|
//# sourceMappingURL=index.js.map
|