@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,197 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { z } from 'zod/v4';
|
|
3
|
+
import { formatZodError } from './formatZodError';
|
|
4
|
+
|
|
5
|
+
describe('formatZodError', () => {
|
|
6
|
+
it('should format invalid_type error', () => {
|
|
7
|
+
const schema = z.object({
|
|
8
|
+
name: z.string(),
|
|
9
|
+
age: z.number(),
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
const result = schema.safeParse({ name: 123, age: 'not-a-number' });
|
|
13
|
+
expect(result.success).toBe(false);
|
|
14
|
+
if (!result.success) {
|
|
15
|
+
const formatted = formatZodError(result.error);
|
|
16
|
+
expect(formatted).toContain('name');
|
|
17
|
+
expect(formatted).toContain('age');
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it('should format required field error', () => {
|
|
22
|
+
const schema = z.object({
|
|
23
|
+
name: z.string(),
|
|
24
|
+
email: z.string().email(),
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
const result = schema.safeParse({});
|
|
28
|
+
expect(result.success).toBe(false);
|
|
29
|
+
if (!result.success) {
|
|
30
|
+
const formatted = formatZodError(result.error);
|
|
31
|
+
expect(formatted).toContain('必填');
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it('should format email validation error', () => {
|
|
36
|
+
const schema = z.object({
|
|
37
|
+
email: z.string().email(),
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
const result = schema.safeParse({ email: 'invalid-email' });
|
|
41
|
+
expect(result.success).toBe(false);
|
|
42
|
+
if (!result.success) {
|
|
43
|
+
const formatted = formatZodError(result.error);
|
|
44
|
+
expect(formatted).toContain('请输入有效的邮箱地址');
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
it('should format URL validation error', () => {
|
|
49
|
+
const schema = z.object({
|
|
50
|
+
url: z.string().url(),
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
const result = schema.safeParse({ url: 'not-a-url' });
|
|
54
|
+
expect(result.success).toBe(false);
|
|
55
|
+
if (!result.success) {
|
|
56
|
+
const formatted = formatZodError(result.error);
|
|
57
|
+
expect(formatted).toContain('请输入有效的 URL');
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it('should format too_small error for string', () => {
|
|
62
|
+
const schema = z.object({
|
|
63
|
+
name: z.string().min(5),
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
const result = schema.safeParse({ name: 'abc' });
|
|
67
|
+
expect(result.success).toBe(false);
|
|
68
|
+
if (!result.success) {
|
|
69
|
+
const formatted = formatZodError(result.error);
|
|
70
|
+
expect(formatted).toContain('至少需要');
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it('should format too_small error for number', () => {
|
|
75
|
+
const schema = z.object({
|
|
76
|
+
age: z.number().min(18),
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
const result = schema.safeParse({ age: 16 });
|
|
80
|
+
expect(result.success).toBe(false);
|
|
81
|
+
if (!result.success) {
|
|
82
|
+
const formatted = formatZodError(result.error);
|
|
83
|
+
expect(formatted).toContain('至少需要 18');
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
it('should format too_big error for string', () => {
|
|
88
|
+
const schema = z.object({
|
|
89
|
+
name: z.string().max(10),
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
const result = schema.safeParse({ name: 'this is too long' });
|
|
93
|
+
expect(result.success).toBe(false);
|
|
94
|
+
if (!result.success) {
|
|
95
|
+
const formatted = formatZodError(result.error);
|
|
96
|
+
expect(formatted).toContain('最多 10 个字符');
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it('should format invalid_enum_value error', () => {
|
|
101
|
+
const schema = z.object({
|
|
102
|
+
status: z.enum(['active', 'inactive', 'pending']),
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
const result = schema.safeParse({ status: 'invalid' });
|
|
106
|
+
expect(result.success).toBe(false);
|
|
107
|
+
if (!result.success) {
|
|
108
|
+
const formatted = formatZodError(result.error);
|
|
109
|
+
expect(formatted).toContain('必须是以下值之一');
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
it('should format invalid_literal error', () => {
|
|
114
|
+
const schema = z.object({
|
|
115
|
+
type: z.literal('user'),
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
const result = schema.safeParse({ type: 'admin' });
|
|
119
|
+
expect(result.success).toBe(false);
|
|
120
|
+
if (!result.success) {
|
|
121
|
+
const formatted = formatZodError(result.error);
|
|
122
|
+
expect(formatted).toContain('必须是 user');
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
it('should format nested object errors', () => {
|
|
127
|
+
const schema = z.object({
|
|
128
|
+
user: z.object({
|
|
129
|
+
name: z.string(),
|
|
130
|
+
email: z.string().email(),
|
|
131
|
+
}),
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
const result = schema.safeParse({
|
|
135
|
+
user: {
|
|
136
|
+
name: '',
|
|
137
|
+
email: 'invalid',
|
|
138
|
+
},
|
|
139
|
+
});
|
|
140
|
+
expect(result.success).toBe(false);
|
|
141
|
+
if (!result.success) {
|
|
142
|
+
const formatted = formatZodError(result.error);
|
|
143
|
+
expect(formatted).toContain('user');
|
|
144
|
+
expect(formatted).toContain('email');
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
it('should format array errors', () => {
|
|
149
|
+
const schema = z.object({
|
|
150
|
+
tags: z.array(z.string()).min(1),
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
const result = schema.safeParse({ tags: [] });
|
|
154
|
+
expect(result.success).toBe(false);
|
|
155
|
+
if (!result.success) {
|
|
156
|
+
const formatted = formatZodError(result.error);
|
|
157
|
+
expect(formatted).toContain('至少需要 1 项');
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
it('should format multiple errors', () => {
|
|
162
|
+
const schema = z.object({
|
|
163
|
+
name: z.string().min(1),
|
|
164
|
+
email: z.string().email(),
|
|
165
|
+
age: z.number().min(18),
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
const result = schema.safeParse({
|
|
169
|
+
name: '',
|
|
170
|
+
email: 'invalid',
|
|
171
|
+
age: 15,
|
|
172
|
+
});
|
|
173
|
+
expect(result.success).toBe(false);
|
|
174
|
+
if (!result.success) {
|
|
175
|
+
const formatted = formatZodError(result.error);
|
|
176
|
+
// Should contain multiple error messages separated by ';'
|
|
177
|
+
const parts = formatted.split(';');
|
|
178
|
+
expect(parts.length).toBeGreaterThan(1);
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
it('should use schema description when available', () => {
|
|
183
|
+
const schema = z.object({
|
|
184
|
+
name: z.string().min(1).describe('姓名'),
|
|
185
|
+
email: z.string().email().describe('邮箱地址'),
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
// Use empty string for name (triggers min(1) error) and invalid email
|
|
189
|
+
const result = schema.safeParse({ name: '', email: 'invalid' });
|
|
190
|
+
expect(result.success).toBe(false);
|
|
191
|
+
if (!result.success) {
|
|
192
|
+
const formatted = formatZodError(result.error, schema);
|
|
193
|
+
expect(formatted).toContain('姓名');
|
|
194
|
+
expect(formatted).toContain('邮箱地址');
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
});
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import type { core, ZodError } from 'zod/v4';
|
|
2
|
+
import { findJsonSchemaByPath } from './findJsonSchemaByPath';
|
|
3
|
+
import type { TypeSchema } from './TypeSchema';
|
|
4
|
+
|
|
5
|
+
// Zod 4 issue types with proper typing
|
|
6
|
+
type ZodIssue = core.$ZodIssue;
|
|
7
|
+
type ZodIssueInvalidType = core.$ZodIssueInvalidType;
|
|
8
|
+
type ZodIssueTooSmall = core.$ZodIssueTooSmall;
|
|
9
|
+
type ZodIssueTooBig = core.$ZodIssueTooBig;
|
|
10
|
+
type ZodIssueInvalidStringFormat = core.$ZodIssueInvalidStringFormat;
|
|
11
|
+
type ZodIssueInvalidValue = core.$ZodIssueInvalidValue;
|
|
12
|
+
type ZodIssueUnrecognizedKeys = core.$ZodIssueUnrecognizedKeys;
|
|
13
|
+
|
|
14
|
+
export function formatZodError(error: ZodError, schema?: TypeSchema): string {
|
|
15
|
+
if (!error.issues || error.issues.length === 0) {
|
|
16
|
+
return error.message || '验证失败';
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const messages: string[] = [];
|
|
20
|
+
|
|
21
|
+
// Iterate through issues and format each one
|
|
22
|
+
// We use manual iteration instead of error.format() to have better control
|
|
23
|
+
// over field name formatting with schema descriptions
|
|
24
|
+
for (const issue of error.issues) {
|
|
25
|
+
const formatted = formatIssueMessage(issue, schema);
|
|
26
|
+
if (formatted) {
|
|
27
|
+
const path = issue.path.map((p) => (typeof p === 'symbol' ? String(p) : p)) as (string | number)[];
|
|
28
|
+
let fieldName = formatPath(path);
|
|
29
|
+
|
|
30
|
+
// Try to get field description from schema
|
|
31
|
+
if (schema && path.length > 0) {
|
|
32
|
+
const fieldPath = path.map(String).join('.');
|
|
33
|
+
const fieldSchema = findJsonSchemaByPath(schema, fieldPath);
|
|
34
|
+
if (fieldSchema?.description) {
|
|
35
|
+
fieldName = fieldSchema.description;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
messages.push(`${fieldName}: ${formatted}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return messages.join(';');
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function formatIssueMessage(issue: ZodIssue, _schema?: TypeSchema): string {
|
|
47
|
+
let message = issue.message;
|
|
48
|
+
|
|
49
|
+
// 处理常见的错误类型,生成更友好的消息
|
|
50
|
+
switch (issue.code) {
|
|
51
|
+
case 'invalid_type': {
|
|
52
|
+
const i = issue as ZodIssueInvalidType;
|
|
53
|
+
// Zod v4 doesn't have 'received' field directly, extract from message
|
|
54
|
+
const match = issue.message.match(/received (\w+)/);
|
|
55
|
+
const received = match?.[1];
|
|
56
|
+
if (received === 'undefined') {
|
|
57
|
+
message = '必填';
|
|
58
|
+
} else if (received === 'null') {
|
|
59
|
+
message = '不能为空';
|
|
60
|
+
} else {
|
|
61
|
+
message = issue.message || `期望类型 ${i.expected},但收到 ${received}`;
|
|
62
|
+
}
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
case 'invalid_format': {
|
|
66
|
+
const i = issue as ZodIssueInvalidStringFormat;
|
|
67
|
+
if (i.format === 'email') {
|
|
68
|
+
message = '请输入有效的邮箱地址';
|
|
69
|
+
} else if (i.format === 'url') {
|
|
70
|
+
message = '请输入有效的 URL';
|
|
71
|
+
} else if (i.format === 'uuid') {
|
|
72
|
+
message = '请输入有效的 UUID';
|
|
73
|
+
} else if (i.format === 'date') {
|
|
74
|
+
message = '请输入有效的日期';
|
|
75
|
+
}
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
case 'too_small': {
|
|
79
|
+
const i = issue as ZodIssueTooSmall;
|
|
80
|
+
if (i.origin === 'string' && i.minimum === 1) {
|
|
81
|
+
message = '不能为空';
|
|
82
|
+
} else if (i.origin === 'string') {
|
|
83
|
+
message = `至少需要 ${i.minimum} 个字符`;
|
|
84
|
+
} else if (i.origin === 'number' || i.origin === 'int') {
|
|
85
|
+
message = `至少需要 ${i.minimum}`;
|
|
86
|
+
} else if (i.origin === 'array') {
|
|
87
|
+
message = `至少需要 ${i.minimum} 项`;
|
|
88
|
+
}
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
case 'too_big': {
|
|
92
|
+
const i = issue as ZodIssueTooBig;
|
|
93
|
+
if (i.origin === 'string') {
|
|
94
|
+
message = `最多 ${i.maximum} 个字符`;
|
|
95
|
+
} else if (i.origin === 'number' || i.origin === 'int') {
|
|
96
|
+
message = `最多 ${i.maximum}`;
|
|
97
|
+
} else if (i.origin === 'array') {
|
|
98
|
+
message = `最多 ${i.maximum} 项`;
|
|
99
|
+
}
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
case 'invalid_value': {
|
|
103
|
+
const i = issue as ZodIssueInvalidValue;
|
|
104
|
+
if (i.values.length === 1) {
|
|
105
|
+
// Single value means it's a literal check
|
|
106
|
+
message = `必须是 ${String(i.values[0])}`;
|
|
107
|
+
} else {
|
|
108
|
+
message = `必须是以下值之一: ${i.values.map(String).join(', ')}`;
|
|
109
|
+
}
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
112
|
+
case 'unrecognized_keys': {
|
|
113
|
+
const i = issue as ZodIssueUnrecognizedKeys;
|
|
114
|
+
message = `不支持的字段: ${i.keys.join(', ')}`;
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
case 'invalid_union': {
|
|
118
|
+
message = '不符合任何允许的类型';
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
case 'custom': {
|
|
122
|
+
// 保留自定义错误消息
|
|
123
|
+
message = issue.message;
|
|
124
|
+
break;
|
|
125
|
+
}
|
|
126
|
+
default:
|
|
127
|
+
// 保留原始消息
|
|
128
|
+
message = issue.message;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
return message;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
function formatPath(path: (string | number)[]): string {
|
|
135
|
+
if (path.length === 0) {
|
|
136
|
+
return '表单';
|
|
137
|
+
}
|
|
138
|
+
return path.map(String).join('.');
|
|
139
|
+
}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { deepFreeze } from '@wener/utils';
|
|
2
2
|
import { getSchemaCache } from './getSchemaCache';
|
|
3
|
-
import { SchemaRegistry } from './SchemaRegistry
|
|
3
|
+
import { SchemaRegistry } from './SchemaRegistry';
|
|
4
4
|
import type { TypeSchema } from './TypeSchema';
|
|
5
5
|
|
|
6
6
|
export function getSchemaOptions(s: TypeSchema): Array<{ value: string; label: string }> {
|
|
7
7
|
let js = SchemaRegistry.get(s);
|
|
8
8
|
return getSchemaCache(s, 'options', () => {
|
|
9
9
|
let out =
|
|
10
|
-
(js.anyOf || js.oneOf)?.map((v) => {
|
|
10
|
+
(js.anyOf || js.oneOf)?.map((v: any) => {
|
|
11
11
|
let value = v.const;
|
|
12
12
|
return {
|
|
13
13
|
label: String(v.description || v.title || value),
|
package/src/schema/index.ts
CHANGED
|
@@ -4,4 +4,4 @@ export { getSchemaOptions, getSchemaOptionLabel } from './getSchemaOptions';
|
|
|
4
4
|
export { toJsonSchema } from './toJsonSchema';
|
|
5
5
|
export { findJsonSchemaByPath } from './findJsonSchemaByPath';
|
|
6
6
|
export { createSchemaData } from './createSchemaData';
|
|
7
|
-
export { SchemaRegistry } from './SchemaRegistry
|
|
7
|
+
export { SchemaRegistry } from './SchemaRegistry';
|
|
@@ -33,7 +33,7 @@ export function toJsonSchema(schema: TypeSchema): JsonSchemaDef {
|
|
|
33
33
|
// prefer nullable
|
|
34
34
|
match(js)
|
|
35
35
|
.with({ anyOf: [P.select(), { type: 'null' }] }, (select) => {
|
|
36
|
-
delete js
|
|
36
|
+
delete js.anyOf;
|
|
37
37
|
Object.assign(js, select);
|
|
38
38
|
js.nullable = true;
|
|
39
39
|
})
|
|
@@ -70,9 +70,9 @@ function visit(js: JsonSchemaDef, f: (js: JsonSchemaDef) => void) {
|
|
|
70
70
|
const _visit = (
|
|
71
71
|
js: JsonSchemaDef,
|
|
72
72
|
f: (js: JsonSchemaDef) => void,
|
|
73
|
-
|
|
73
|
+
_parent: JsonSchemaDef | undefined,
|
|
74
74
|
path: string[],
|
|
75
|
-
|
|
75
|
+
_k?: string,
|
|
76
76
|
) => {
|
|
77
77
|
if (!js) {
|
|
78
78
|
return;
|
|
@@ -109,9 +109,9 @@ function visit(js: JsonSchemaDef, f: (js: JsonSchemaDef) => void) {
|
|
|
109
109
|
_visit(js, f, undefined, []);
|
|
110
110
|
}
|
|
111
111
|
|
|
112
|
-
function
|
|
112
|
+
function _resolveJsonSchemaDef(
|
|
113
113
|
js: JsonSchemaDef,
|
|
114
|
-
|
|
114
|
+
_ctx?: {
|
|
115
115
|
parent: JsonSchemaDef;
|
|
116
116
|
key: string;
|
|
117
117
|
},
|
|
@@ -129,7 +129,7 @@ function resolveJsonSchemaDef(
|
|
|
129
129
|
for (const key in schema.properties) {
|
|
130
130
|
const prop = schema.properties[key];
|
|
131
131
|
if (prop) {
|
|
132
|
-
schema.properties[key] =
|
|
132
|
+
schema.properties[key] = _resolveJsonSchemaDef(prop, { parent: schema, key });
|
|
133
133
|
}
|
|
134
134
|
}
|
|
135
135
|
return schema;
|
package/src/schema/validate.ts
CHANGED
|
@@ -107,7 +107,7 @@ export function parseData<S extends TypeSchema>(schema: S, data: unknown): Schem
|
|
|
107
107
|
);
|
|
108
108
|
}
|
|
109
109
|
|
|
110
|
-
function
|
|
110
|
+
function _formatIssues(_schema: TypeSchema, _issues: Array<ValidationIssue>): string {
|
|
111
111
|
return '';
|
|
112
112
|
}
|
|
113
113
|
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
function joinUrl(baseUrl: string, maybeUrl: string): string {
|
|
2
|
+
const sanitizedBase = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;
|
|
3
|
+
const sanitizedEndpoint = maybeUrl.startsWith('/') ? maybeUrl.slice(1) : maybeUrl;
|
|
4
|
+
return `${sanitizedBase}/${sanitizedEndpoint}`;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export function buildBaseUrl(url: string, baseUrl: string | undefined | null): string {
|
|
8
|
+
if (!baseUrl || /^https?:/.test(url)) {
|
|
9
|
+
return url;
|
|
10
|
+
}
|
|
11
|
+
return joinUrl(baseUrl, url);
|
|
12
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { forEachJsonSchema, type JsonSchemaDef } from '../jsonschema';
|
|
2
|
+
import { toJsonSchema, type TypeSchema } from '../schema';
|
|
3
|
+
|
|
4
|
+
export const RedactedText = '[redacted]';
|
|
5
|
+
|
|
6
|
+
export function buildRedactorFormSchema(
|
|
7
|
+
ts: TypeSchema,
|
|
8
|
+
{
|
|
9
|
+
shouldRedact = (schema) => schema['x-sensitive'] === true,
|
|
10
|
+
replacer = () => RedactedText,
|
|
11
|
+
}: {
|
|
12
|
+
shouldRedact?: (schema: JsonSchemaDef) => boolean;
|
|
13
|
+
replacer?: (key: string, value: any) => any;
|
|
14
|
+
},
|
|
15
|
+
) {
|
|
16
|
+
let js = toJsonSchema(ts);
|
|
17
|
+
|
|
18
|
+
let paths: string[][] = [];
|
|
19
|
+
|
|
20
|
+
forEachJsonSchema(js, (js, { path }) => {
|
|
21
|
+
if (shouldRedact(js)) {
|
|
22
|
+
paths.push(path);
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
const vis = (root: any, path: string[]) => {
|
|
26
|
+
switch (root) {
|
|
27
|
+
case null:
|
|
28
|
+
case undefined:
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
let c = root;
|
|
33
|
+
for (let i = 0; i < path.length; i++) {
|
|
34
|
+
let k = path[i];
|
|
35
|
+
if (c && typeof c === 'object' && k in c) {
|
|
36
|
+
let v = c[k];
|
|
37
|
+
if (path.length === 1) {
|
|
38
|
+
c[k] = replacer(k, v);
|
|
39
|
+
} else if (Array.isArray(v)) {
|
|
40
|
+
for (let vv of v) {
|
|
41
|
+
vis(vv, path.slice(i + 1));
|
|
42
|
+
}
|
|
43
|
+
} else {
|
|
44
|
+
vis(v, path.slice(i + 1));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
return (root: any) => {
|
|
51
|
+
if (!paths.length) {
|
|
52
|
+
return root;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
paths.forEach((path) => {
|
|
56
|
+
vis(root, path);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
return root;
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function _buildReversibleRedactText({
|
|
64
|
+
id,
|
|
65
|
+
type: _type,
|
|
66
|
+
key: _key,
|
|
67
|
+
timestamp,
|
|
68
|
+
}: {
|
|
69
|
+
id?: string | number;
|
|
70
|
+
type?: string;
|
|
71
|
+
key?: string;
|
|
72
|
+
timestamp?: number | boolean;
|
|
73
|
+
} = {}) {
|
|
74
|
+
if (!id) {
|
|
75
|
+
return RedactedText;
|
|
76
|
+
}
|
|
77
|
+
if (timestamp === true) {
|
|
78
|
+
timestamp = Date.now();
|
|
79
|
+
}
|
|
80
|
+
return `[redacted ${id}]`;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export function isRedactedText(v: any) {
|
|
84
|
+
return v === RedactedText || (typeof v === 'string' && v.startsWith('[redacted ') && v.endsWith(']'));
|
|
85
|
+
}
|
package/src/utils/index.ts
CHANGED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { maybeFunction, type MaybeFunction } from '@wener/utils';
|
|
2
|
+
|
|
3
|
+
export function resolveFeatureOptions<T>(
|
|
4
|
+
value: boolean | T | undefined | null,
|
|
5
|
+
defaultValue: MaybeFunction<T>,
|
|
6
|
+
): T | undefined {
|
|
7
|
+
if (value === false) {
|
|
8
|
+
return undefined;
|
|
9
|
+
}
|
|
10
|
+
if (value === true || value === undefined || value === null) {
|
|
11
|
+
return maybeFunction(defaultValue);
|
|
12
|
+
}
|
|
13
|
+
return value;
|
|
14
|
+
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
export {
|
|
2
|
-
type ParsedUnifiedSocialCreditCode as Result,
|
|
3
|
-
UnifiedSocialCreditCodeRegex as regex,
|
|
4
|
-
ParsedUnifiedSocialCreditCodeSchema as ResultSchema,
|
|
5
|
-
parseUnifiedSocialCreditCode as parse,
|
|
6
|
-
formatUnifiedSocialCreditCode as format,
|
|
7
|
-
} from './UnifiedSocialCreditCode';
|
package/src/cn/mod.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * as SchemaRegistry from './SchemaRegistry';
|