@wener/common 2.0.2 → 2.0.5
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 +2 -0
- package/lib/ai/qwen3vl/index.js.map +1 -0
- package/lib/ai/qwen3vl/utils.js +31 -0
- package/lib/ai/qwen3vl/utils.js.map +1 -0
- package/lib/ai/vision/DocLayoutElementTypeSchema.js +28 -0
- package/lib/ai/vision/DocLayoutElementTypeSchema.js.map +1 -0
- package/lib/ai/vision/ImageAnnotationSchema.js +50 -0
- package/lib/ai/vision/ImageAnnotationSchema.js.map +1 -0
- package/lib/ai/vision/index.js +3 -0
- package/lib/ai/vision/index.js.map +1 -0
- package/lib/ai/vision/resolveImageAnnotation.js +105 -0
- package/lib/ai/vision/resolveImageAnnotation.js.map +1 -0
- package/lib/cn/ChineseResidentIdNo.js +22 -15
- package/lib/cn/ChineseResidentIdNo.js.map +1 -0
- package/lib/cn/ChineseResidentIdNo.test.js +1 -1
- package/lib/cn/DivisionCode.js +30 -25
- package/lib/cn/DivisionCode.js.map +1 -0
- package/lib/cn/DivisionCode.test.js +1 -1
- package/lib/cn/Mod11.js +38 -81
- package/lib/cn/Mod11.js.map +1 -0
- package/lib/cn/Mod31.js +41 -90
- package/lib/cn/Mod31.js.map +1 -0
- package/lib/cn/UnifiedSocialCreditCode.js +43 -34
- package/lib/cn/UnifiedSocialCreditCode.js.map +1 -0
- package/lib/cn/UnifiedSocialCreditCode.test.js +1 -1
- package/lib/cn/formatChineseAmount.js +77 -0
- package/lib/cn/formatChineseAmount.js.map +1 -0
- package/lib/cn/index.js +7 -1
- package/lib/cn/index.js.map +1 -0
- package/lib/cn/parseChineseNumber.js +94 -0
- package/lib/cn/parseChineseNumber.js.map +1 -0
- package/lib/cn/parseChineseNumber.test.js +278 -0
- package/lib/cn/pinyin/cartesianProduct.js +22 -0
- package/lib/cn/pinyin/cartesianProduct.js.map +1 -0
- package/lib/cn/pinyin/cartesianProduct.test.js +179 -0
- package/lib/cn/pinyin/data.json +23573 -0
- package/lib/cn/pinyin/loader.js +14 -0
- package/lib/cn/pinyin/loader.js.map +1 -0
- package/lib/cn/pinyin/preload.js +3 -0
- package/lib/cn/pinyin/preload.js.map +1 -0
- package/lib/cn/pinyin/toPinyin.test.js +167 -0
- package/lib/cn/pinyin/toPinyinPure.js +33 -0
- package/lib/cn/pinyin/toPinyinPure.js.map +1 -0
- package/lib/cn/pinyin/transform.js +14 -0
- package/lib/cn/pinyin/transform.js.map +1 -0
- package/lib/cn/types.d.js +2 -0
- package/lib/cn/types.d.js.map +1 -0
- package/lib/consola/createStandardConsolaReporter.js +6 -6
- package/lib/consola/createStandardConsolaReporter.js.map +1 -0
- package/lib/consola/formatLogObject.js +66 -146
- package/lib/consola/formatLogObject.js.map +1 -0
- package/lib/consola/formatLogObject.test.js +184 -0
- package/lib/consola/index.js +1 -0
- package/lib/consola/index.js.map +1 -0
- package/lib/data/formatSort.js +6 -5
- package/lib/data/formatSort.js.map +1 -0
- package/lib/data/index.js +1 -0
- package/lib/data/index.js.map +1 -0
- package/lib/data/maybeNumber.js +6 -8
- package/lib/data/maybeNumber.js.map +1 -0
- package/lib/data/parseSort.js +22 -28
- package/lib/data/parseSort.js.map +1 -0
- package/lib/data/resolvePagination.js +13 -17
- package/lib/data/resolvePagination.js.map +1 -0
- package/lib/data/types.d.js +2 -0
- package/lib/data/types.d.js.map +1 -0
- package/lib/dayjs/dayjs.js +21 -19
- package/lib/dayjs/dayjs.js.map +1 -0
- package/lib/dayjs/formatDuration.js +15 -14
- package/lib/dayjs/formatDuration.js.map +1 -0
- package/lib/dayjs/index.js +2 -0
- package/lib/dayjs/index.js.map +1 -0
- package/lib/dayjs/parseDuration.js +5 -8
- package/lib/dayjs/parseDuration.js.map +1 -0
- package/lib/dayjs/parseRelativeTime.js +90 -0
- package/lib/dayjs/parseRelativeTime.js.map +1 -0
- package/lib/dayjs/parseRelativeTime.test.js +247 -0
- package/lib/dayjs/resolveRelativeTime.js +87 -0
- package/lib/dayjs/resolveRelativeTime.js.map +1 -0
- package/lib/dayjs/resolveRelativeTime.test.js +310 -0
- package/lib/decimal/index.js +1 -0
- package/lib/decimal/index.js.map +1 -0
- package/lib/decimal/parseDecimal.js +3 -1
- package/lib/decimal/parseDecimal.js.map +1 -0
- package/lib/drain3/Drain.js +356 -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 +204 -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 +10 -0
- package/lib/emittery/emitter.js.map +1 -0
- package/lib/emittery/index.js +2 -0
- package/lib/emittery/index.js.map +1 -0
- package/lib/foundation/schema/SexType.js +5 -3
- package/lib/foundation/schema/SexType.js.map +1 -0
- package/lib/foundation/schema/index.js +1 -0
- package/lib/foundation/schema/index.js.map +1 -0
- package/lib/foundation/schema/parseSexType.js +1 -0
- package/lib/foundation/schema/parseSexType.js.map +1 -0
- package/lib/foundation/schema/types.js +4 -2
- package/lib/foundation/schema/types.js.map +1 -0
- package/lib/fs/FileSystemError.js +23 -0
- package/lib/fs/FileSystemError.js.map +1 -0
- package/lib/fs/IFileSystem.d.js +3 -0
- package/lib/fs/IFileSystem.d.js.map +1 -0
- package/lib/fs/MemoryFileSystem.test.js +188 -0
- package/lib/fs/createBrowserFileSystem.js +250 -0
- package/lib/fs/createBrowserFileSystem.js.map +1 -0
- package/lib/fs/createMemoryFileSystem.js +517 -0
- package/lib/fs/createMemoryFileSystem.js.map +1 -0
- package/lib/fs/createSandboxFileSystem.js +108 -0
- package/lib/fs/createSandboxFileSystem.js.map +1 -0
- package/lib/fs/createWebDavFileSystem.js +154 -0
- package/lib/fs/createWebDavFileSystem.js.map +1 -0
- package/lib/fs/createWebFileSystem.js +225 -0
- package/lib/fs/createWebFileSystem.js.map +1 -0
- package/lib/fs/findMimeType.js +17 -0
- package/lib/fs/findMimeType.js.map +1 -0
- package/lib/fs/index.js +8 -0
- package/lib/fs/index.js.map +1 -0
- package/lib/fs/minio/createMinioFileSystem.js +974 -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 +93 -0
- package/lib/fs/orpc/FileSystemContract.js.map +1 -0
- package/lib/fs/orpc/createContractClientFileSystem.js +93 -0
- package/lib/fs/orpc/createContractClientFileSystem.js.map +1 -0
- package/lib/fs/orpc/index.js +3 -0
- package/lib/fs/orpc/index.js.map +1 -0
- package/lib/fs/orpc/server/createFileSystemContractImpl.js +63 -0
- package/lib/fs/orpc/server/createFileSystemContractImpl.js.map +1 -0
- package/lib/fs/orpc/server/index.js +2 -0
- package/lib/fs/orpc/server/index.js.map +1 -0
- package/lib/fs/s3/createS3MiniFileSystem.js +753 -0
- package/lib/fs/s3/createS3MiniFileSystem.js.map +1 -0
- package/lib/fs/s3/index.js +2 -0
- package/lib/fs/s3/index.js.map +1 -0
- package/lib/fs/s3/s3mini.test.js +584 -0
- package/lib/fs/scandir.js +59 -0
- package/lib/fs/scandir.js.map +1 -0
- package/lib/fs/server/createDatabaseFileSystem.js +750 -0
- package/lib/fs/server/createDatabaseFileSystem.js.map +1 -0
- package/lib/fs/server/createNodeFileSystem.js +426 -0
- package/lib/fs/server/createNodeFileSystem.js.map +1 -0
- package/lib/fs/server/dbfs.test.js +221 -0
- package/lib/fs/server/index.js +2 -0
- package/lib/fs/server/index.js.map +1 -0
- package/lib/fs/server/loadTestDatabase.js +127 -0
- package/lib/fs/server/loadTestDatabase.js.map +1 -0
- package/lib/fs/tests/runFileSystemTest.js +319 -0
- package/lib/fs/tests/runFileSystemTest.js.map +1 -0
- package/lib/fs/types.js +27 -0
- package/lib/fs/types.js.map +1 -0
- package/lib/fs/utils/getFileUrl.js +35 -0
- package/lib/fs/utils/getFileUrl.js.map +1 -0
- package/lib/fs/utils.js +22 -0
- package/lib/fs/utils.js.map +1 -0
- package/lib/fs/webdav/index.js +2 -0
- package/lib/fs/webdav/index.js.map +1 -0
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -0
- package/lib/jsonschema/JsonSchema.js +146 -172
- package/lib/jsonschema/JsonSchema.js.map +1 -0
- package/lib/jsonschema/forEachJsonSchema.js +44 -0
- package/lib/jsonschema/forEachJsonSchema.js.map +1 -0
- package/lib/jsonschema/index.js +2 -0
- package/lib/jsonschema/index.js.map +1 -0
- package/lib/jsonschema/types.d.js +2 -0
- package/lib/jsonschema/types.d.js.map +1 -0
- package/lib/meta/defineFileType.js +20 -103
- package/lib/meta/defineFileType.js.map +1 -0
- package/lib/meta/defineInit.js +31 -250
- package/lib/meta/defineInit.js.map +1 -0
- package/lib/meta/defineMetadata.js +24 -140
- package/lib/meta/defineMetadata.js.map +1 -0
- package/lib/meta/index.js +1 -0
- package/lib/meta/index.js.map +1 -0
- package/lib/orpc/createOpenApiContractClient.js +27 -0
- package/lib/orpc/createOpenApiContractClient.js.map +1 -0
- package/lib/orpc/createRpcContractClient.js +34 -0
- package/lib/orpc/createRpcContractClient.js.map +1 -0
- package/lib/orpc/index.js +3 -0
- package/lib/orpc/index.js.map +1 -0
- package/lib/orpc/resolveLinkPlugins.js +28 -0
- package/lib/orpc/resolveLinkPlugins.js.map +1 -0
- package/lib/password/PHC.js +63 -87
- package/lib/password/PHC.js.map +1 -0
- package/lib/password/PHC.test.js +11 -3
- package/lib/password/Password.js +29 -294
- package/lib/password/Password.js.map +1 -0
- package/lib/password/Password.test.js +35 -22
- package/lib/password/createArgon2PasswordAlgorithm.js +35 -191
- package/lib/password/createArgon2PasswordAlgorithm.js.map +1 -0
- package/lib/password/createBase64PasswordAlgorithm.js +8 -141
- package/lib/password/createBase64PasswordAlgorithm.js.map +1 -0
- package/lib/password/createBcryptPasswordAlgorithm.js +13 -168
- package/lib/password/createBcryptPasswordAlgorithm.js.map +1 -0
- package/lib/password/createPBKDF2PasswordAlgorithm.js +46 -228
- package/lib/password/createPBKDF2PasswordAlgorithm.js.map +1 -0
- package/lib/password/createScryptPasswordAlgorithm.js +55 -211
- package/lib/password/createScryptPasswordAlgorithm.js.map +1 -0
- package/lib/password/index.js +1 -0
- package/lib/password/index.js.map +1 -0
- package/lib/password/server/index.js +1 -0
- package/lib/password/server/index.js.map +1 -0
- package/lib/resource/Identifiable.js +2 -0
- package/lib/resource/Identifiable.js.map +1 -0
- package/lib/resource/ListQuery.js +21 -93
- package/lib/resource/ListQuery.js.map +1 -0
- package/lib/resource/getTitleOfResource.js +3 -5
- package/lib/resource/getTitleOfResource.js.map +1 -0
- package/lib/resource/index.js +1 -0
- package/lib/resource/index.js.map +1 -0
- package/lib/resource/schema/AnyResourceSchema.js +2 -1
- package/lib/resource/schema/AnyResourceSchema.js.map +1 -0
- package/lib/resource/schema/BaseResourceSchema.js +2 -1
- package/lib/resource/schema/BaseResourceSchema.js.map +1 -0
- package/lib/resource/schema/ResourceActionType.js +6 -4
- package/lib/resource/schema/ResourceActionType.js.map +1 -0
- package/lib/resource/schema/ResourceStatus.js +5 -3
- package/lib/resource/schema/ResourceStatus.js.map +1 -0
- package/lib/resource/schema/ResourceType.js +5 -3
- package/lib/resource/schema/ResourceType.js.map +1 -0
- package/lib/resource/schema/index.js +1 -0
- package/lib/resource/schema/index.js.map +1 -0
- package/lib/resource/schema/types.js +16 -20
- package/lib/resource/schema/types.js.map +1 -0
- package/lib/s3/formatS3Url.js +65 -0
- package/lib/s3/formatS3Url.js.map +1 -0
- package/lib/s3/formatS3Url.test.js +262 -0
- package/lib/s3/index.js +3 -0
- package/lib/s3/index.js.map +1 -0
- package/lib/s3/parseS3Url.js +65 -0
- package/lib/s3/parseS3Url.js.map +1 -0
- package/lib/s3/parseS3Url.test.js +270 -0
- package/lib/schema/SchemaRegistry.js +38 -38
- package/lib/schema/SchemaRegistry.js.map +1 -0
- package/lib/schema/TypeSchema.d.js +2 -0
- package/lib/schema/TypeSchema.d.js.map +1 -0
- package/lib/schema/createSchemaData.js +26 -125
- package/lib/schema/createSchemaData.js.map +1 -0
- package/lib/schema/findJsonSchemaByPath.js +13 -36
- package/lib/schema/findJsonSchemaByPath.js.map +1 -0
- package/lib/schema/formatZodError.js +138 -0
- package/lib/schema/formatZodError.js.map +1 -0
- package/lib/schema/formatZodError.test.js +196 -0
- package/lib/schema/getSchemaCache.js +5 -5
- package/lib/schema/getSchemaCache.js.map +1 -0
- package/lib/schema/getSchemaOptions.js +8 -11
- package/lib/schema/getSchemaOptions.js.map +1 -0
- package/lib/schema/index.js +2 -1
- package/lib/schema/index.js.map +1 -0
- package/lib/schema/toJsonSchema.js +50 -293
- package/lib/schema/toJsonSchema.js.map +1 -0
- package/lib/schema/validate.js +34 -46
- package/lib/schema/validate.js.map +1 -0
- package/lib/tools/generateSchema.js +39 -197
- package/lib/tools/generateSchema.js.map +1 -0
- package/lib/tools/renderJsonSchemaToMarkdownDoc.js +55 -143
- package/lib/tools/renderJsonSchemaToMarkdownDoc.js.map +1 -0
- package/lib/utils/buildBaseUrl.js +13 -0
- package/lib/utils/buildBaseUrl.js.map +1 -0
- package/lib/utils/buildRedactorFormSchema.js +59 -0
- package/lib/utils/buildRedactorFormSchema.js.map +1 -0
- package/lib/utils/getEstimateProcessTime.js +12 -11
- package/lib/utils/getEstimateProcessTime.js.map +1 -0
- package/lib/utils/index.js +3 -0
- package/lib/utils/index.js.map +1 -0
- package/lib/utils/resolveFeatureOptions.js +12 -0
- package/lib/utils/resolveFeatureOptions.js.map +1 -0
- package/package.json +80 -13
- package/src/ai/qwen3vl/index.ts +1 -0
- package/src/ai/qwen3vl/utils.ts +36 -0
- package/src/ai/vision/DocLayoutElementTypeSchema.ts +30 -0
- package/src/ai/vision/ImageAnnotationSchema.ts +60 -0
- package/src/ai/vision/index.ts +2 -0
- package/src/ai/vision/resolveImageAnnotation.ts +135 -0
- package/src/cn/ChineseResidentIdNo.test.ts +1 -1
- package/src/cn/ChineseResidentIdNo.ts +9 -1
- package/src/cn/DivisionCode.test.ts +1 -1
- package/src/cn/DivisionCode.ts +8 -0
- package/src/cn/Mod11.ts +1 -1
- package/src/cn/UnifiedSocialCreditCode.test.ts +1 -1
- package/src/cn/UnifiedSocialCreditCode.ts +15 -0
- package/src/cn/__snapshots__/ChineseResidentIdNo.test.ts.snap +1 -1
- package/src/cn/formatChineseAmount.ts +61 -0
- package/src/cn/index.ts +7 -1
- package/src/cn/parseChineseNumber.test.ts +159 -0
- package/src/cn/parseChineseNumber.ts +97 -0
- package/src/cn/pinyin/cartesianProduct.test.ts +64 -0
- package/src/cn/pinyin/cartesianProduct.ts +24 -0
- package/src/cn/pinyin/data.json +23573 -0
- package/src/cn/pinyin/loader.ts +12 -0
- package/src/cn/pinyin/preload.ts +3 -0
- package/src/cn/pinyin/toPinyin.test.ts +12 -0
- package/src/cn/pinyin/toPinyinPure.ts +43 -0
- package/src/cn/pinyin/transform.ts +12 -0
- package/src/consola/formatLogObject.test.ts +27 -0
- package/src/consola/formatLogObject.ts +40 -12
- package/src/data/maybeNumber.ts +1 -1
- package/src/data/parseSort.test.ts +0 -1
- package/src/data/types.d.ts +2 -2
- package/src/dayjs/dayjs.ts +18 -18
- package/src/dayjs/formatDuration.ts +2 -2
- package/src/dayjs/index.ts +3 -1
- package/src/dayjs/parseRelativeTime.test.ts +185 -0
- package/src/dayjs/parseRelativeTime.ts +115 -0
- package/src/dayjs/resolveRelativeTime.test.ts +357 -0
- package/src/dayjs/resolveRelativeTime.ts +164 -0
- 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 +36 -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/emittery/emitter.ts +9 -0
- package/src/emittery/index.ts +1 -0
- package/src/fs/FileSystemError.ts +26 -0
- package/src/fs/IFileSystem.d.ts +101 -0
- package/src/fs/MemoryFileSystem.test.ts +37 -0
- package/src/fs/createBrowserFileSystem.ts +293 -0
- package/src/fs/createMemoryFileSystem.ts +600 -0
- package/src/fs/createSandboxFileSystem.ts +136 -0
- package/src/fs/createWebDavFileSystem.ts +190 -0
- package/src/fs/createWebFileSystem.ts +242 -0
- package/src/fs/findMimeType.ts +20 -0
- package/src/fs/index.ts +8 -0
- package/src/fs/minio/createMinioFileSystem.ts +1148 -0
- package/src/fs/minio/index.ts +1 -0
- package/src/fs/orpc/FileSystemContract.ts +92 -0
- package/src/fs/orpc/createContractClientFileSystem.ts +115 -0
- package/src/fs/orpc/index.ts +2 -0
- package/src/fs/orpc/server/createFileSystemContractImpl.ts +64 -0
- package/src/fs/orpc/server/index.ts +1 -0
- package/src/fs/s3/createS3MiniFileSystem.ts +871 -0
- package/src/fs/s3/index.ts +1 -0
- package/src/fs/s3/s3fs.test.ts +441 -0
- package/src/fs/s3/s3mini.test.ts +264 -0
- package/src/fs/scandir.ts +75 -0
- package/src/fs/server/createDatabaseFileSystem.ts +668 -0
- package/src/fs/server/createNodeFileSystem.ts +518 -0
- package/src/fs/server/dbfs.test.ts +48 -0
- package/src/fs/server/index.ts +1 -0
- package/src/fs/server/loadTestDatabase.ts +131 -0
- package/src/fs/tests/runFileSystemTest.ts +289 -0
- package/src/fs/types.ts +29 -0
- package/src/fs/utils/getFileUrl.ts +44 -0
- package/src/fs/utils.ts +23 -0
- package/src/fs/webdav/index.ts +1 -0
- package/src/jsonschema/JsonSchema.ts +118 -110
- package/src/jsonschema/forEachJsonSchema.ts +50 -0
- package/src/jsonschema/index.ts +1 -0
- package/src/jsonschema/types.d.ts +1 -1
- package/src/meta/defineMetadata.ts +1 -1
- package/src/orpc/createOpenApiContractClient.ts +52 -0
- package/src/orpc/createRpcContractClient.ts +50 -0
- package/src/orpc/index.ts +2 -0
- package/src/orpc/resolveLinkPlugins.ts +29 -0
- package/src/password/PHC.ts +6 -6
- package/src/password/Password.test.ts +1 -1
- package/src/password/createArgon2PasswordAlgorithm.ts +1 -1
- package/src/password/createBase64PasswordAlgorithm.ts +2 -2
- package/src/password/createBcryptPasswordAlgorithm.ts +4 -2
- package/src/password/createPBKDF2PasswordAlgorithm.ts +4 -4
- package/src/password/createScryptPasswordAlgorithm.ts +4 -4
- package/src/resource/ListQuery.ts +4 -1
- package/src/resource/index.ts +2 -2
- package/src/resource/schema/AnyResourceSchema.ts +16 -2
- package/src/s3/formatS3Url.test.ts +254 -0
- package/src/s3/formatS3Url.ts +84 -0
- package/src/s3/index.ts +2 -0
- package/src/s3/parseS3Url.test.ts +258 -0
- package/src/s3/parseS3Url.ts +88 -0
- package/src/schema/SchemaRegistry.ts +35 -33
- package/src/schema/TypeSchema.d.ts +6 -6
- package/src/schema/createSchemaData.ts +4 -4
- package/src/schema/findJsonSchemaByPath.ts +4 -4
- package/src/schema/formatZodError.test.ts +197 -0
- package/src/schema/formatZodError.ts +139 -0
- package/src/schema/getSchemaOptions.ts +2 -2
- package/src/schema/index.ts +1 -1
- package/src/schema/toJsonSchema.ts +6 -6
- package/src/schema/validate.ts +1 -1
- package/src/utils/buildBaseUrl.ts +12 -0
- package/src/utils/buildRedactorFormSchema.ts +85 -0
- package/src/utils/index.ts +4 -0
- package/src/utils/resolveFeatureOptions.ts +14 -0
- package/src/cn/ChineseResidentIdNo.mod.ts +0 -7
- package/src/cn/DivisionCode.mod.ts +0 -7
- package/src/cn/UnifiedSocialCreditCode.mod.ts +0 -7
- package/src/cn/mod.ts +0 -3
- package/src/schema/SchemaRegistry.mod.ts +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { createS3MiniFileSystem } from './createS3MiniFileSystem';
|
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
import { afterAll, beforeEach, describe, expect, test } from 'vitest';
|
|
2
|
+
import { createMinioFileSystem } from '../minio/createMinioFileSystem';
|
|
3
|
+
|
|
4
|
+
const S3_URL = process.env.S3_URL;
|
|
5
|
+
|
|
6
|
+
// Use a test prefix to avoid conflicts with real data
|
|
7
|
+
const TEST_PREFIX = `test-${Date.now()}`;
|
|
8
|
+
|
|
9
|
+
describe.skipIf(!S3_URL)('MinioFileSystem', () => {
|
|
10
|
+
let fs: ReturnType<typeof createMinioFileSystem>;
|
|
11
|
+
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
fs = createMinioFileSystem({
|
|
14
|
+
url: S3_URL!,
|
|
15
|
+
prefix: TEST_PREFIX,
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
// Cleanup: remove all test files after all tests
|
|
20
|
+
afterAll(async () => {
|
|
21
|
+
if (S3_URL && fs) {
|
|
22
|
+
try {
|
|
23
|
+
await fs.rm('/', { recursive: true, force: true });
|
|
24
|
+
} catch {
|
|
25
|
+
// Ignore cleanup errors
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
describe('readdir', () => {
|
|
31
|
+
test('should list root directory', async () => {
|
|
32
|
+
const entries = await fs.readdir('/');
|
|
33
|
+
expect(Array.isArray(entries)).toBe(true);
|
|
34
|
+
entries.forEach((entry) => {
|
|
35
|
+
expect(entry).toHaveProperty('path');
|
|
36
|
+
expect(entry).toHaveProperty('name');
|
|
37
|
+
expect(entry).toHaveProperty('kind');
|
|
38
|
+
expect(entry).toHaveProperty('size');
|
|
39
|
+
expect(entry).toHaveProperty('mtime');
|
|
40
|
+
expect(['file', 'directory']).toContain(entry.kind);
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
test('should list directory with recursive option', async () => {
|
|
45
|
+
// Create test structure
|
|
46
|
+
await fs.writeFile('/test-file.txt', 'test');
|
|
47
|
+
await fs.mkdir('/test-dir');
|
|
48
|
+
await fs.writeFile('/test-dir/nested.txt', 'nested');
|
|
49
|
+
|
|
50
|
+
const entries = await fs.readdir('/', { recursive: true });
|
|
51
|
+
const fileNames = entries.map((e) => e.name);
|
|
52
|
+
const paths = entries.map((e) => e.path);
|
|
53
|
+
expect(fileNames).toContain('test-file.txt');
|
|
54
|
+
expect(fileNames).toContain('test-dir');
|
|
55
|
+
// In recursive mode, nested files should appear with their relative path
|
|
56
|
+
expect(paths.some((p) => p.includes('nested.txt'))).toBe(true);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
test('should filter by kind', async () => {
|
|
60
|
+
await fs.writeFile('/filter-file.txt', 'test');
|
|
61
|
+
await fs.mkdir('/filter-dir');
|
|
62
|
+
|
|
63
|
+
const files = await fs.readdir('/', { kind: 'file' });
|
|
64
|
+
expect(files.every((f) => f.kind === 'file')).toBe(true);
|
|
65
|
+
|
|
66
|
+
const dirs = await fs.readdir('/', { kind: 'directory' });
|
|
67
|
+
expect(dirs.every((d) => d.kind === 'directory')).toBe(true);
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
test('should filter hidden files', async () => {
|
|
71
|
+
await fs.writeFile('/.hidden', 'hidden');
|
|
72
|
+
await fs.writeFile('/visible.txt', 'visible');
|
|
73
|
+
|
|
74
|
+
const entries = await fs.readdir('/', { hidden: false });
|
|
75
|
+
const names = entries.map((e) => e.name);
|
|
76
|
+
expect(names).not.toContain('.hidden');
|
|
77
|
+
expect(names).toContain('visible.txt');
|
|
78
|
+
|
|
79
|
+
const allEntries = await fs.readdir('/', { hidden: true });
|
|
80
|
+
const allNames = allEntries.map((e) => e.name);
|
|
81
|
+
expect(allNames).toContain('.hidden');
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
test('should support depth option', async () => {
|
|
85
|
+
await fs.mkdir('/depth1', { recursive: true });
|
|
86
|
+
await fs.mkdir('/depth1/depth2', { recursive: true });
|
|
87
|
+
await fs.writeFile('/depth1/depth2/file.txt', 'test');
|
|
88
|
+
|
|
89
|
+
const depth1 = await fs.readdir('/', { depth: 1 });
|
|
90
|
+
expect(depth1.some((e) => e.name === 'depth1')).toBe(true);
|
|
91
|
+
expect(depth1.some((e) => e.name === 'file.txt')).toBe(false);
|
|
92
|
+
|
|
93
|
+
const depth2 = await fs.readdir('/', { depth: 2 });
|
|
94
|
+
expect(depth2.some((e) => e.name === 'file.txt')).toBe(true);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
describe('stat', () => {
|
|
99
|
+
test('should stat root directory', async () => {
|
|
100
|
+
const stat = await fs.stat('/');
|
|
101
|
+
expect(stat.kind).toBe('directory');
|
|
102
|
+
expect(stat.path).toBe('/');
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
test('should stat a file', async () => {
|
|
106
|
+
await fs.writeFile('/stat-test.txt', 'test content');
|
|
107
|
+
const stat = await fs.stat('/stat-test.txt');
|
|
108
|
+
expect(stat.kind).toBe('file');
|
|
109
|
+
expect(stat.size).toBe(12); // "test content" is 12 bytes
|
|
110
|
+
expect(stat.name).toBe('stat-test.txt');
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
test('should stat a directory', async () => {
|
|
114
|
+
await fs.mkdir('/stat-dir');
|
|
115
|
+
const stat = await fs.stat('/stat-dir');
|
|
116
|
+
expect(stat.kind).toBe('directory');
|
|
117
|
+
expect(stat.name).toBe('stat-dir');
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
test('should throw error for non-existent file', async () => {
|
|
121
|
+
await expect(fs.stat('/nonexistent.txt')).rejects.toThrow('File not found');
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
describe('readFile and writeFile', () => {
|
|
126
|
+
test('should write and read text file', async () => {
|
|
127
|
+
const content = 'Hello, World!';
|
|
128
|
+
await fs.writeFile('/hello.txt', content);
|
|
129
|
+
const read = await fs.readFile('/hello.txt', { encoding: 'text' });
|
|
130
|
+
expect(read).toBe(content);
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
test('should write and read binary file', async () => {
|
|
134
|
+
const content = Buffer.from([0x48, 0x65, 0x6c, 0x6c, 0x6f]);
|
|
135
|
+
await fs.writeFile('/binary.bin', content);
|
|
136
|
+
const read = await fs.readFile('/binary.bin');
|
|
137
|
+
expect(Buffer.from(read)).toEqual(content);
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
test('should overwrite file by default', async () => {
|
|
141
|
+
await fs.writeFile('/overwrite.txt', 'original');
|
|
142
|
+
await fs.writeFile('/overwrite.txt', 'updated');
|
|
143
|
+
const content = await fs.readFile('/overwrite.txt', { encoding: 'text' });
|
|
144
|
+
expect(content).toBe('updated');
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
test('should prevent overwrite when overwrite=false', async () => {
|
|
148
|
+
await fs.writeFile('/no-overwrite.txt', 'original');
|
|
149
|
+
await expect(fs.writeFile('/no-overwrite.txt', 'new', { overwrite: false })).rejects.toThrow(
|
|
150
|
+
'File already exists',
|
|
151
|
+
);
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
test('should handle large files', async () => {
|
|
155
|
+
const largeContent = 'x'.repeat(10000);
|
|
156
|
+
await fs.writeFile('/large.txt', largeContent);
|
|
157
|
+
const read = await fs.readFile('/large.txt', { encoding: 'text' });
|
|
158
|
+
expect(read).toBe(largeContent);
|
|
159
|
+
expect(read.length).toBe(10000);
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
test('should throw error when reading non-existent file', async () => {
|
|
163
|
+
await expect(fs.readFile('/nonexistent.txt')).rejects.toThrow('File not found');
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
describe('mkdir', () => {
|
|
168
|
+
test('should create directory', async () => {
|
|
169
|
+
await fs.mkdir('/new-dir');
|
|
170
|
+
expect(await fs.exists('/new-dir')).toBe(true);
|
|
171
|
+
const stat = await fs.stat('/new-dir');
|
|
172
|
+
expect(stat.kind).toBe('directory');
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
test('should create nested directories recursively', async () => {
|
|
176
|
+
await fs.mkdir('/nested/deep/dir', { recursive: true });
|
|
177
|
+
expect(await fs.exists('/nested/deep/dir')).toBe(true);
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
test('should handle creating root directory', async () => {
|
|
181
|
+
await expect(fs.mkdir('/')).resolves.not.toThrow();
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
describe('rm', () => {
|
|
186
|
+
test('should remove a file', async () => {
|
|
187
|
+
await fs.writeFile('/to-remove.txt', 'content');
|
|
188
|
+
expect(await fs.exists('/to-remove.txt')).toBe(true);
|
|
189
|
+
|
|
190
|
+
await fs.rm('/to-remove.txt');
|
|
191
|
+
expect(await fs.exists('/to-remove.txt')).toBe(false);
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
test('should remove directory recursively', async () => {
|
|
195
|
+
await fs.mkdir('/rm-dir', { recursive: true });
|
|
196
|
+
await fs.writeFile('/rm-dir/file1.txt', 'file1');
|
|
197
|
+
await fs.writeFile('/rm-dir/file2.txt', 'file2');
|
|
198
|
+
await fs.mkdir('/rm-dir/subdir', { recursive: true });
|
|
199
|
+
await fs.writeFile('/rm-dir/subdir/file3.txt', 'file3');
|
|
200
|
+
|
|
201
|
+
await fs.rm('/rm-dir', { recursive: true });
|
|
202
|
+
expect(await fs.exists('/rm-dir')).toBe(false);
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
test('should handle force option', async () => {
|
|
206
|
+
await expect(fs.rm('/nonexistent.txt')).rejects.toThrow();
|
|
207
|
+
await expect(fs.rm('/nonexistent.txt', { force: true })).resolves.not.toThrow();
|
|
208
|
+
});
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
describe('rename', () => {
|
|
212
|
+
test('should rename a file', async () => {
|
|
213
|
+
await fs.writeFile('/old-name.txt', 'content');
|
|
214
|
+
await fs.rename('/old-name.txt', '/new-name.txt');
|
|
215
|
+
|
|
216
|
+
expect(await fs.exists('/old-name.txt')).toBe(false);
|
|
217
|
+
expect(await fs.exists('/new-name.txt')).toBe(true);
|
|
218
|
+
const content = await fs.readFile('/new-name.txt', { encoding: 'text' });
|
|
219
|
+
expect(content).toBe('content');
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
test('should rename a directory', async () => {
|
|
223
|
+
await fs.mkdir('/old-dir', { recursive: true });
|
|
224
|
+
await fs.writeFile('/old-dir/file.txt', 'content');
|
|
225
|
+
|
|
226
|
+
// Clean up any existing new-dir first
|
|
227
|
+
try {
|
|
228
|
+
await fs.rm('/new-dir', { recursive: true, force: true });
|
|
229
|
+
} catch {
|
|
230
|
+
// Ignore if doesn't exist
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
await fs.rename('/old-dir', '/new-dir');
|
|
234
|
+
|
|
235
|
+
expect(await fs.exists('/old-dir')).toBe(false);
|
|
236
|
+
expect(await fs.exists('/new-dir')).toBe(true);
|
|
237
|
+
expect(await fs.exists('/new-dir/file.txt')).toBe(true);
|
|
238
|
+
const content = await fs.readFile('/new-dir/file.txt', { encoding: 'text' });
|
|
239
|
+
expect(content).toBe('content');
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
test('should prevent overwrite when overwrite=false', async () => {
|
|
243
|
+
await fs.writeFile('/source.txt', 'source');
|
|
244
|
+
await fs.writeFile('/target.txt', 'target');
|
|
245
|
+
|
|
246
|
+
await expect(fs.rename('/source.txt', '/target.txt', { overwrite: false })).rejects.toThrow(
|
|
247
|
+
'Destination already exists',
|
|
248
|
+
);
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
test('should allow overwrite when overwrite=true', async () => {
|
|
252
|
+
await fs.writeFile('/source.txt', 'source');
|
|
253
|
+
await fs.writeFile('/target.txt', 'target');
|
|
254
|
+
|
|
255
|
+
await fs.rename('/source.txt', '/target.txt', { overwrite: true });
|
|
256
|
+
expect(await fs.exists('/source.txt')).toBe(false);
|
|
257
|
+
const content = await fs.readFile('/target.txt', { encoding: 'text' });
|
|
258
|
+
expect(content).toBe('source');
|
|
259
|
+
});
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
describe('copy', () => {
|
|
263
|
+
test('should copy a file', async () => {
|
|
264
|
+
await fs.writeFile('/source.txt', 'source content');
|
|
265
|
+
await fs.copy('/source.txt', '/dest.txt');
|
|
266
|
+
|
|
267
|
+
expect(await fs.exists('/source.txt')).toBe(true);
|
|
268
|
+
expect(await fs.exists('/dest.txt')).toBe(true);
|
|
269
|
+
const source = await fs.readFile('/source.txt', { encoding: 'text' });
|
|
270
|
+
const dest = await fs.readFile('/dest.txt', { encoding: 'text' });
|
|
271
|
+
expect(source).toBe(dest);
|
|
272
|
+
expect(dest).toBe('source content');
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
test('should copy a directory recursively', async () => {
|
|
276
|
+
await fs.mkdir('/copy-source', { recursive: true });
|
|
277
|
+
await fs.writeFile('/copy-source/file1.txt', 'file1');
|
|
278
|
+
await fs.writeFile('/copy-source/file2.txt', 'file2');
|
|
279
|
+
await fs.mkdir('/copy-source/subdir', { recursive: true });
|
|
280
|
+
await fs.writeFile('/copy-source/subdir/file3.txt', 'file3');
|
|
281
|
+
|
|
282
|
+
await fs.copy('/copy-source', '/copy-dest');
|
|
283
|
+
|
|
284
|
+
expect(await fs.exists('/copy-dest/file1.txt')).toBe(true);
|
|
285
|
+
expect(await fs.exists('/copy-dest/file2.txt')).toBe(true);
|
|
286
|
+
expect(await fs.exists('/copy-dest/subdir/file3.txt')).toBe(true);
|
|
287
|
+
});
|
|
288
|
+
|
|
289
|
+
test('should prevent overwrite when overwrite=false', async () => {
|
|
290
|
+
await fs.writeFile('/copy-src.txt', 'source');
|
|
291
|
+
await fs.writeFile('/copy-dst.txt', 'target');
|
|
292
|
+
|
|
293
|
+
await expect(fs.copy('/copy-src.txt', '/copy-dst.txt', { overwrite: false })).rejects.toThrow(
|
|
294
|
+
'Destination already exists',
|
|
295
|
+
);
|
|
296
|
+
});
|
|
297
|
+
|
|
298
|
+
test('should allow overwrite when overwrite=true', async () => {
|
|
299
|
+
await fs.writeFile('/copy-src.txt', 'source');
|
|
300
|
+
await fs.writeFile('/copy-dst.txt', 'target');
|
|
301
|
+
|
|
302
|
+
await fs.copy('/copy-src.txt', '/copy-dst.txt', { overwrite: true });
|
|
303
|
+
const content = await fs.readFile('/copy-dst.txt', { encoding: 'text' });
|
|
304
|
+
expect(content).toBe('source');
|
|
305
|
+
});
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
describe('exists', () => {
|
|
309
|
+
test('should return true for existing file', async () => {
|
|
310
|
+
await fs.writeFile('/exists-file.txt', 'test');
|
|
311
|
+
expect(await fs.exists('/exists-file.txt')).toBe(true);
|
|
312
|
+
});
|
|
313
|
+
|
|
314
|
+
test('should return true for existing directory', async () => {
|
|
315
|
+
await fs.mkdir('/exists-dir');
|
|
316
|
+
expect(await fs.exists('/exists-dir')).toBe(true);
|
|
317
|
+
});
|
|
318
|
+
|
|
319
|
+
test('should return true for root directory', async () => {
|
|
320
|
+
expect(await fs.exists('/')).toBe(true);
|
|
321
|
+
});
|
|
322
|
+
|
|
323
|
+
test('should return false for non-existent path', async () => {
|
|
324
|
+
expect(await fs.exists('/nonexistent')).toBe(false);
|
|
325
|
+
});
|
|
326
|
+
});
|
|
327
|
+
|
|
328
|
+
describe('streams', () => {
|
|
329
|
+
test('should support createReadStream', async () => {
|
|
330
|
+
await fs.writeFile('/stream-read.txt', 'Stream content');
|
|
331
|
+
const stream = fs.createReadStream('/stream-read.txt');
|
|
332
|
+
expect(stream).toBeDefined();
|
|
333
|
+
|
|
334
|
+
const chunks: Buffer[] = [];
|
|
335
|
+
// Use stream events instead of async iteration for compatibility
|
|
336
|
+
await new Promise<void>((resolve, reject) => {
|
|
337
|
+
stream.on('data', (chunk) => {
|
|
338
|
+
chunks.push(chunk);
|
|
339
|
+
});
|
|
340
|
+
stream.on('end', () => {
|
|
341
|
+
resolve();
|
|
342
|
+
});
|
|
343
|
+
stream.on('error', reject);
|
|
344
|
+
});
|
|
345
|
+
expect(Buffer.concat(chunks).toString()).toBe('Stream content');
|
|
346
|
+
});
|
|
347
|
+
|
|
348
|
+
test('should support createReadStream with range', async () => {
|
|
349
|
+
await fs.writeFile('/stream-range.txt', 'Hello, World!');
|
|
350
|
+
const stream = fs.createReadStream('/stream-range.txt', { range: { start: 0, end: 4 } });
|
|
351
|
+
|
|
352
|
+
const chunks: Buffer[] = [];
|
|
353
|
+
// Use stream events instead of async iteration for compatibility
|
|
354
|
+
await new Promise<void>((resolve, reject) => {
|
|
355
|
+
stream.on('data', (chunk) => {
|
|
356
|
+
chunks.push(chunk);
|
|
357
|
+
});
|
|
358
|
+
stream.on('end', () => {
|
|
359
|
+
resolve();
|
|
360
|
+
});
|
|
361
|
+
stream.on('error', reject);
|
|
362
|
+
});
|
|
363
|
+
expect(Buffer.concat(chunks).toString()).toBe('Hello');
|
|
364
|
+
});
|
|
365
|
+
|
|
366
|
+
test('should support createReadableStream', async () => {
|
|
367
|
+
await fs.writeFile('/readable-stream.txt', 'Readable stream content');
|
|
368
|
+
const stream = fs.createReadableStream('/readable-stream.txt');
|
|
369
|
+
|
|
370
|
+
const reader = stream.getReader();
|
|
371
|
+
const chunks: Uint8Array[] = [];
|
|
372
|
+
while (true) {
|
|
373
|
+
const { done, value } = await reader.read();
|
|
374
|
+
if (done) break;
|
|
375
|
+
if (value) chunks.push(value);
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
const content = Buffer.concat(chunks.map((c) => Buffer.from(c))).toString();
|
|
379
|
+
expect(content).toBe('Readable stream content');
|
|
380
|
+
});
|
|
381
|
+
|
|
382
|
+
test('should support createWritableStream', async () => {
|
|
383
|
+
const stream = fs.createWritableStream('/writable-stream.txt');
|
|
384
|
+
const writer = stream.getWriter();
|
|
385
|
+
|
|
386
|
+
await writer.write(new TextEncoder().encode('Part 1'));
|
|
387
|
+
await writer.write(new TextEncoder().encode('Part 2'));
|
|
388
|
+
await writer.close();
|
|
389
|
+
|
|
390
|
+
const content = await fs.readFile('/writable-stream.txt', { encoding: 'text' });
|
|
391
|
+
expect(content).toBe('Part 1Part 2');
|
|
392
|
+
});
|
|
393
|
+
});
|
|
394
|
+
|
|
395
|
+
describe('edge cases', () => {
|
|
396
|
+
test('should handle empty file', async () => {
|
|
397
|
+
await fs.writeFile('/empty.txt', '');
|
|
398
|
+
const stat = await fs.stat('/empty.txt');
|
|
399
|
+
expect(stat.size).toBe(0);
|
|
400
|
+
const content = await fs.readFile('/empty.txt', { encoding: 'text' });
|
|
401
|
+
expect(content).toBe('');
|
|
402
|
+
});
|
|
403
|
+
|
|
404
|
+
test('should handle special characters in filename', async () => {
|
|
405
|
+
await fs.writeFile('/file with spaces.txt', 'content');
|
|
406
|
+
expect(await fs.exists('/file with spaces.txt')).toBe(true);
|
|
407
|
+
const content = await fs.readFile('/file with spaces.txt', { encoding: 'text' });
|
|
408
|
+
expect(content).toBe('content');
|
|
409
|
+
});
|
|
410
|
+
|
|
411
|
+
test('should handle unicode content', async () => {
|
|
412
|
+
const unicode = '你好世界 🌍';
|
|
413
|
+
await fs.writeFile('/unicode.txt', unicode);
|
|
414
|
+
const content = await fs.readFile('/unicode.txt', { encoding: 'text' });
|
|
415
|
+
expect(content).toBe(unicode);
|
|
416
|
+
});
|
|
417
|
+
|
|
418
|
+
test('should handle path normalization', async () => {
|
|
419
|
+
await fs.writeFile('/normalize.txt', 'test');
|
|
420
|
+
expect(await fs.exists('/normalize.txt')).toBe(true);
|
|
421
|
+
expect(await fs.exists('/./normalize.txt')).toBe(true);
|
|
422
|
+
});
|
|
423
|
+
});
|
|
424
|
+
|
|
425
|
+
describe('prefix support', () => {
|
|
426
|
+
test('should scope operations to prefix', async () => {
|
|
427
|
+
const prefixedFs = createMinioFileSystem({
|
|
428
|
+
url: S3_URL!,
|
|
429
|
+
prefix: `${TEST_PREFIX}/prefixed`,
|
|
430
|
+
});
|
|
431
|
+
|
|
432
|
+
await prefixedFs.writeFile('/test.txt', 'prefixed content');
|
|
433
|
+
expect(await prefixedFs.exists('/test.txt')).toBe(true);
|
|
434
|
+
const content = await prefixedFs.readFile('/test.txt', { encoding: 'text' });
|
|
435
|
+
expect(content).toBe('prefixed content');
|
|
436
|
+
|
|
437
|
+
// Cleanup
|
|
438
|
+
await prefixedFs.rm('/', { recursive: true, force: true });
|
|
439
|
+
});
|
|
440
|
+
});
|
|
441
|
+
});
|