@wener/common 2.0.1 → 2.0.3
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 +48 -0
- package/lib/cn/ChineseResidentIdNo.js.map +1 -0
- package/lib/cn/ChineseResidentIdNo.mod.js +1 -0
- package/lib/cn/{ResidentIdentityCardNumber.test.js → ChineseResidentIdNo.test.js} +7 -6
- package/lib/cn/DivisionCode.js +217 -301
- package/lib/cn/DivisionCode.js.map +1 -0
- package/lib/cn/DivisionCode.mod.js +1 -0
- package/lib/cn/DivisionCode.test.js +9 -15
- package/lib/cn/Mod11.js +43 -0
- package/lib/cn/Mod11.js.map +1 -0
- package/lib/cn/Mod31.js +49 -0
- package/lib/cn/Mod31.js.map +1 -0
- package/lib/cn/UnifiedSocialCreditCode.js +137 -113
- package/lib/cn/UnifiedSocialCreditCode.js.map +1 -0
- package/lib/cn/UnifiedSocialCreditCode.mod.js +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 +6 -2
- package/lib/cn/index.js.map +1 -0
- package/lib/cn/mod.js +6 -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 +67 -135
- 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 +5 -7
- 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 +40 -0
- package/lib/dayjs/dayjs.js.map +1 -0
- package/lib/dayjs/formatDuration.js +59 -0
- package/lib/dayjs/formatDuration.js.map +1 -0
- package/lib/dayjs/formatDuration.test.js +90 -0
- package/lib/dayjs/index.js +5 -0
- package/lib/dayjs/index.js.map +1 -0
- package/lib/dayjs/parseDuration.js +29 -0
- 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 +158 -0
- package/lib/dayjs/resolveRelativeTime.js.map +1 -0
- package/lib/dayjs/resolveRelativeTime.test.js +310 -0
- package/lib/decimal/index.js +2 -0
- package/lib/decimal/index.js.map +1 -0
- package/lib/decimal/parseDecimal.js +15 -0
- package/lib/decimal/parseDecimal.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 +16 -0
- package/lib/foundation/schema/SexType.js.map +1 -0
- package/lib/foundation/schema/index.js +2 -0
- package/lib/foundation/schema/index.js.map +1 -0
- package/lib/foundation/schema/parseSexType.js +19 -0
- package/lib/foundation/schema/parseSexType.js.map +1 -0
- package/lib/foundation/schema/types.js +7 -0
- 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 +248 -0
- package/lib/fs/createBrowserFileSystem.js.map +1 -0
- package/lib/fs/createMemoryFileSystem.js +516 -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 +137 -0
- package/lib/fs/createWebDavFileSystem.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/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 +705 -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 +401 -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 +318 -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/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 +30 -292
- 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 +47 -0
- 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 +2 -0
- package/lib/resource/index.js.map +1 -0
- package/lib/resource/schema/AnyResourceSchema.js +3 -2
- 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 +6 -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 +45 -0
- package/lib/schema/SchemaRegistry.js.map +1 -0
- package/lib/schema/SchemaRegistry.mod.js +2 -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 +140 -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 -0
- package/lib/schema/index.js.map +1 -0
- package/lib/schema/toJsonSchema.js +47 -290
- package/lib/schema/toJsonSchema.js.map +1 -0
- package/lib/schema/validate.js +33 -45
- 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 +21 -0
- package/lib/utils/getEstimateProcessTime.js.map +1 -0
- package/lib/utils/index.js +4 -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 +77 -20
- 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 +18 -0
- package/src/cn/ChineseResidentIdNo.ts +74 -0
- package/src/cn/DivisionCode.test.ts +3 -13
- package/src/cn/DivisionCode.ts +138 -193
- package/src/cn/{Mod11Checksum.ts → Mod11.ts} +3 -1
- package/src/cn/{Mod31Checksum.ts → Mod31.ts} +2 -0
- package/src/cn/UnifiedSocialCreditCode.test.ts +2 -2
- package/src/cn/UnifiedSocialCreditCode.ts +119 -124
- package/src/cn/__snapshots__/ChineseResidentIdNo.test.ts.snap +14 -0
- package/src/cn/__snapshots__/UnifiedSocialCreditCode.test.ts.snap +41 -12
- package/src/cn/formatChineseAmount.ts +61 -0
- package/src/cn/index.ts +6 -2
- 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 +46 -10
- package/src/dayjs/dayjs.ts +40 -0
- package/src/dayjs/formatDuration.test.ts +14 -0
- package/src/dayjs/formatDuration.ts +86 -0
- package/src/dayjs/index.ts +5 -0
- package/src/dayjs/parseDuration.ts +40 -0
- 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 +167 -0
- package/src/decimal/index.ts +1 -0
- package/src/decimal/parseDecimal.ts +16 -0
- package/src/emittery/emitter.ts +9 -0
- package/src/emittery/index.ts +1 -0
- package/src/foundation/schema/SexType.ts +21 -0
- package/src/foundation/schema/index.ts +1 -0
- package/src/foundation/schema/parseSexType.ts +19 -0
- package/src/foundation/schema/types.ts +8 -0
- package/src/fs/FileSystemError.ts +26 -0
- package/src/fs/IFileSystem.d.ts +102 -0
- package/src/fs/MemoryFileSystem.test.ts +37 -0
- package/src/fs/createBrowserFileSystem.ts +291 -0
- package/src/fs/createMemoryFileSystem.ts +604 -0
- package/src/fs/createSandboxFileSystem.ts +136 -0
- package/src/fs/createWebDavFileSystem.ts +172 -0
- package/src/fs/findMimeType.ts +23 -0
- package/src/fs/index.ts +8 -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 +830 -0
- package/src/fs/s3/index.ts +1 -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 +499 -0
- package/src/fs/server/dbfs.test.ts +47 -0
- package/src/fs/server/index.ts +1 -0
- package/src/fs/server/loadTestDatabase.ts +131 -0
- package/src/fs/tests/runFileSystemTest.ts +288 -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/jsonschema/JsonSchema.ts +118 -110
- package/src/jsonschema/forEachJsonSchema.ts +50 -0
- package/src/jsonschema/index.ts +1 -0
- 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 +3 -3
- package/src/password/Password.test.ts +1 -1
- package/src/password/Password.ts +2 -2
- package/src/password/createPBKDF2PasswordAlgorithm.ts +2 -2
- package/src/resource/ListQuery.ts +53 -0
- package/src/resource/index.ts +1 -0
- package/src/resource/schema/AnyResourceSchema.ts +17 -3
- package/src/resource/schema/index.ts +5 -0
- 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 +48 -0
- package/src/schema/createSchemaData.ts +1 -1
- package/src/schema/formatZodError.test.ts +196 -0
- package/src/schema/formatZodError.ts +151 -0
- package/src/schema/getSchemaOptions.ts +3 -3
- package/src/schema/index.ts +1 -0
- package/src/utils/buildBaseUrl.ts +12 -0
- package/src/utils/buildRedactorFormSchema.ts +85 -0
- package/src/utils/getEstimateProcessTime.ts +36 -0
- package/src/utils/index.ts +5 -0
- package/src/utils/resolveFeatureOptions.ts +14 -0
- package/lib/cn/Mod11Checksum.js +0 -85
- package/lib/cn/Mod31Checksum.js +0 -97
- package/lib/cn/ResidentIdentityCardNumber.js +0 -50
- package/lib/cn/formatDate.js +0 -13
- package/lib/cn/parseSex.js +0 -20
- package/lib/resource/schema/SchemaRegistry.js +0 -38
- package/lib/resource/schema/SexType.js +0 -10
- package/lib/search/AdvanceSearch.js +0 -9
- package/lib/search/AdvanceSearch.test.js +0 -435
- package/lib/search/formatAdvanceSearch.js +0 -78
- package/lib/search/index.js +0 -1
- package/lib/search/optimizeAdvanceSearch.js +0 -143
- package/lib/search/parseAdvanceSearch.js +0 -20
- package/lib/search/parser.d.js +0 -1
- package/lib/search/parser.js +0 -3088
- package/lib/search/types.d.js +0 -1
- package/src/cn/ResidentIdentityCardNumber.test.ts +0 -17
- package/src/cn/ResidentIdentityCardNumber.ts +0 -96
- package/src/cn/__snapshots__/ResidentIdentityCardNumber.test.ts.snap +0 -15
- package/src/cn/formatDate.ts +0 -12
- package/src/cn/parseSex.ts +0 -13
- package/src/resource/schema/SchemaRegistry.ts +0 -42
- package/src/resource/schema/SexType.ts +0 -13
- package/src/search/AdvanceSearch.test.ts +0 -149
- package/src/search/AdvanceSearch.ts +0 -14
- package/src/search/Makefile +0 -2
- package/src/search/__snapshots__/AdvanceSearch.test.ts.snap +0 -675
- package/src/search/formatAdvanceSearch.ts +0 -52
- package/src/search/index.ts +0 -1
- package/src/search/optimizeAdvanceSearch.ts +0 -77
- package/src/search/parseAdvanceSearch.ts +0 -23
- package/src/search/parser.d.ts +0 -8
- package/src/search/parser.js +0 -2794
- package/src/search/parser.peggy +0 -237
- package/src/search/types.d.ts +0 -45
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/utils/resolveFeatureOptions.ts"],"sourcesContent":["import { maybeFunction, type MaybeFunction } from '@wener/utils';\n\nexport function resolveFeatureOptions<T>(\n\tvalue: boolean | T | undefined | null,\n\tdefaultValue: MaybeFunction<T>,\n): T | undefined {\n\tif (value === false) {\n\t\treturn undefined;\n\t}\n\tif (value === true || value === undefined || value === null) {\n\t\treturn maybeFunction(defaultValue);\n\t}\n\treturn value;\n}\n"],"names":["maybeFunction","resolveFeatureOptions","value","defaultValue","undefined"],"mappings":"AAAA,SAASA,aAAa,QAA4B,eAAe;AAEjE,OAAO,SAASC,sBACfC,KAAqC,EACrCC,YAA8B;IAE9B,IAAID,UAAU,OAAO;QACpB,OAAOE;IACR;IACA,IAAIF,UAAU,QAAQA,UAAUE,aAAaF,UAAU,MAAM;QAC5D,OAAOF,cAAcG;IACtB;IACA,OAAOD;AACR"}
|
package/package.json
CHANGED
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wener/common",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.3",
|
|
4
4
|
"type": "module",
|
|
5
|
-
"description": "",
|
|
6
|
-
"
|
|
5
|
+
"description": "Common utils for console & server",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "https://github.com/wenerme/wener.git",
|
|
9
|
+
"directory": "packages/wener-common"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://github.com/wenerme/wener/tree/main/packages/wener-common",
|
|
12
|
+
"author": "wener",
|
|
7
13
|
"license": "MIT",
|
|
8
14
|
"exports": {
|
|
9
15
|
".": {
|
|
@@ -22,6 +28,34 @@
|
|
|
22
28
|
"types": "./src/data/index.ts",
|
|
23
29
|
"default": "./lib/data/index.js"
|
|
24
30
|
},
|
|
31
|
+
"./dayjs": {
|
|
32
|
+
"types": "./src/dayjs/index.ts",
|
|
33
|
+
"default": "./lib/dayjs/index.js"
|
|
34
|
+
},
|
|
35
|
+
"./decimal": {
|
|
36
|
+
"types": "./src/decimal/index.ts",
|
|
37
|
+
"default": "./lib/decimal/index.js"
|
|
38
|
+
},
|
|
39
|
+
"./fs": {
|
|
40
|
+
"types": "./src/fs/index.ts",
|
|
41
|
+
"default": "./lib/fs/index.js"
|
|
42
|
+
},
|
|
43
|
+
"./fs/orpc": {
|
|
44
|
+
"types": "./src/fs/orpc/index.ts",
|
|
45
|
+
"default": "./lib/fs/orpc/index.js"
|
|
46
|
+
},
|
|
47
|
+
"./fs/orpc/server": {
|
|
48
|
+
"types": "./src/fs/orpc/server/index.ts",
|
|
49
|
+
"default": "./lib/fs/orpc/server/index.js"
|
|
50
|
+
},
|
|
51
|
+
"./fs/s3": {
|
|
52
|
+
"types": "./src/fs/s3/index.ts",
|
|
53
|
+
"default": "./lib/fs/s3/index.js"
|
|
54
|
+
},
|
|
55
|
+
"./fs/server": {
|
|
56
|
+
"types": "./src/fs/server/index.ts",
|
|
57
|
+
"default": "./lib/fs/server/index.js"
|
|
58
|
+
},
|
|
25
59
|
"./jsonschema": {
|
|
26
60
|
"types": "./src/jsonschema/index.ts",
|
|
27
61
|
"default": "./lib/jsonschema/index.js"
|
|
@@ -30,6 +64,10 @@
|
|
|
30
64
|
"types": "./src/meta/index.ts",
|
|
31
65
|
"default": "./lib/meta/index.js"
|
|
32
66
|
},
|
|
67
|
+
"./orpc": {
|
|
68
|
+
"types": "./src/orpc/index.ts",
|
|
69
|
+
"default": "./lib/orpc/index.js"
|
|
70
|
+
},
|
|
33
71
|
"./password": {
|
|
34
72
|
"types": "./src/password/index.ts",
|
|
35
73
|
"default": "./lib/password/index.js"
|
|
@@ -38,13 +76,21 @@
|
|
|
38
76
|
"types": "./src/resource/index.ts",
|
|
39
77
|
"default": "./lib/resource/index.js"
|
|
40
78
|
},
|
|
79
|
+
"./resource/schema": {
|
|
80
|
+
"types": "./src/resource/schema/index.ts",
|
|
81
|
+
"default": "./lib/resource/schema/index.js"
|
|
82
|
+
},
|
|
83
|
+
"./s3": {
|
|
84
|
+
"types": "./src/s3/index.ts",
|
|
85
|
+
"default": "./lib/s3/index.js"
|
|
86
|
+
},
|
|
41
87
|
"./schema": {
|
|
42
88
|
"types": "./src/schema/index.ts",
|
|
43
89
|
"default": "./lib/schema/index.js"
|
|
44
90
|
},
|
|
45
|
-
"./
|
|
46
|
-
"types": "./src/
|
|
47
|
-
"default": "./lib/
|
|
91
|
+
"./utils": {
|
|
92
|
+
"types": "./src/utils/index.ts",
|
|
93
|
+
"default": "./lib/utils/index.js"
|
|
48
94
|
},
|
|
49
95
|
"./package.json": "./package.json"
|
|
50
96
|
},
|
|
@@ -56,33 +102,44 @@
|
|
|
56
102
|
],
|
|
57
103
|
"keywords": [],
|
|
58
104
|
"peerDependencies": {
|
|
105
|
+
"ajv": "*",
|
|
59
106
|
"zod": "*"
|
|
60
107
|
},
|
|
61
108
|
"dependencies": {
|
|
62
|
-
"@standard-schema/spec": "^1.
|
|
63
|
-
"@wener/utils": "^1.1.
|
|
109
|
+
"@standard-schema/spec": "^1.1.0",
|
|
110
|
+
"@wener/utils": "^1.1.58",
|
|
64
111
|
"date-fns": "^4.1.0",
|
|
65
|
-
"es-toolkit": "^1.
|
|
66
|
-
"std-env": "^3.
|
|
67
|
-
"ts-pattern": "^5.
|
|
112
|
+
"es-toolkit": "^1.43.0",
|
|
113
|
+
"std-env": "^3.10.0",
|
|
114
|
+
"ts-pattern": "^5.9.0"
|
|
68
115
|
},
|
|
69
116
|
"devDependencies": {
|
|
70
|
-
"@
|
|
117
|
+
"@orpc/client": "^1.13.4",
|
|
118
|
+
"@orpc/contract": "^1.13.4",
|
|
119
|
+
"@orpc/openapi-client": "^1.13.4",
|
|
120
|
+
"@sinclair/typebox": "^0.34.47",
|
|
71
121
|
"@sinclair/typebox-codegen": "^0.11.1",
|
|
72
122
|
"@types/argon2-browser": "^1.18.4",
|
|
73
|
-
"@types/bcrypt": "^
|
|
74
|
-
"
|
|
123
|
+
"@types/bcrypt": "^6.0.0",
|
|
124
|
+
"@types/micromatch": "^4.0.10",
|
|
125
|
+
"@types/mime-types": "^3.0.1",
|
|
75
126
|
"ajv-formats": "^3.0.1",
|
|
76
127
|
"ajv-i18n": "^4.2.0",
|
|
77
128
|
"ajv-keywords": "^5.1.0",
|
|
78
|
-
"argon2": "^0.
|
|
129
|
+
"argon2": "^0.44.0",
|
|
79
130
|
"argon2-browser": "^1.18.0",
|
|
80
|
-
"bcrypt": "^
|
|
81
|
-
"bcryptjs": "^3.0.
|
|
82
|
-
"chalk": "^5.
|
|
131
|
+
"bcrypt": "^6.0.0",
|
|
132
|
+
"bcryptjs": "^3.0.3",
|
|
133
|
+
"chalk": "^5.6.2",
|
|
83
134
|
"consola": "^3.4.2",
|
|
84
|
-
"dayjs": "^1.11.
|
|
85
|
-
"
|
|
135
|
+
"dayjs": "^1.11.19",
|
|
136
|
+
"decimal.js": "^10.6.0",
|
|
137
|
+
"emittery": "^1.2.0",
|
|
138
|
+
"micromatch": "^4.0.8",
|
|
139
|
+
"mime-types": "^3.0.2",
|
|
140
|
+
"pathe": "^2.0.3",
|
|
141
|
+
"s3mini": "^0.8.1",
|
|
142
|
+
"zod": "^4.3.5"
|
|
86
143
|
},
|
|
87
144
|
"scripts": {
|
|
88
145
|
"test": "echo \"Error: no test specified\" && exit 1"
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { fromQwen3VlBbox2d, toQwen3VlBbox2d } from './utils';
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// xyxy
|
|
2
|
+
type Bbox2d = [number, number, number, number];
|
|
3
|
+
type Dimensions = { width: number; height: number };
|
|
4
|
+
// x_center, y_center, z_center, x_size, y_size, z_size, roll, pitch, yaw
|
|
5
|
+
type Bbox3d = [number, number, number, number, number, number, number, number, number];
|
|
6
|
+
/**
|
|
7
|
+
* Convert Qwen3V format bbox (0-1000 range) to absolute pixel coordinates
|
|
8
|
+
* @param dimensions Image dimensions {width, height}
|
|
9
|
+
* @param bbox Bbox in Qwen3V format [x1, y1, x2, y2] where each value is 0-1000
|
|
10
|
+
* @returns Absolute pixel coordinates [x1, y1, x2, y2]
|
|
11
|
+
*/
|
|
12
|
+
export function fromQwen3VlBbox2d({ width, height }: Dimensions, bbox: Bbox2d): Bbox2d {
|
|
13
|
+
const [x1, y1, x2, y2] = bbox;
|
|
14
|
+
return [
|
|
15
|
+
Math.floor((x1 / 1000) * width),
|
|
16
|
+
Math.floor((y1 / 1000) * height),
|
|
17
|
+
Math.floor((x2 / 1000) * width),
|
|
18
|
+
Math.floor((y2 / 1000) * height),
|
|
19
|
+
];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Convert absolute pixel coordinates to Qwen3V format bbox (0-1000 range)
|
|
24
|
+
* @param dimensions Image dimensions {width, height}
|
|
25
|
+
* @param bbox Absolute pixel coordinates [x1, y1, x2, y2]
|
|
26
|
+
* @returns Bbox in Qwen3V format [x1, y1, x2, y2] where each value is 0-1000
|
|
27
|
+
*/
|
|
28
|
+
export function toQwen3VlBbox2d({ width, height }: Dimensions, bbox: Bbox2d): Bbox2d {
|
|
29
|
+
const [x1, y1, x2, y2] = bbox;
|
|
30
|
+
return [
|
|
31
|
+
Math.round((x1 / width) * 1000),
|
|
32
|
+
Math.round((y1 / height) * 1000),
|
|
33
|
+
Math.round((x2 / width) * 1000),
|
|
34
|
+
Math.round((y2 / height) * 1000),
|
|
35
|
+
];
|
|
36
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
// based on DocLayout-YOLO
|
|
4
|
+
|
|
5
|
+
export const DocLayoutElementType = Object.freeze({
|
|
6
|
+
Title: 'Title',
|
|
7
|
+
PlainText: 'PlainText',
|
|
8
|
+
Abandon: 'Abandon',
|
|
9
|
+
Figure: 'Figure',
|
|
10
|
+
FigureCaption: 'FigureCaption',
|
|
11
|
+
Table: 'Table',
|
|
12
|
+
TableCaption: 'TableCaption',
|
|
13
|
+
TableFootnote: 'TableFootnote',
|
|
14
|
+
IsolateFormula: 'IsolateFormula',
|
|
15
|
+
FormulaCaption: 'FormulaCaption',
|
|
16
|
+
});
|
|
17
|
+
export type DocLayoutElementType = (typeof DocLayoutElementType)[keyof typeof DocLayoutElementType];
|
|
18
|
+
|
|
19
|
+
export const DocLayoutElementTypeSchema = z.union([
|
|
20
|
+
z.literal(DocLayoutElementType.Title).describe('标题'),
|
|
21
|
+
z.literal(DocLayoutElementType.PlainText).describe('纯文本'),
|
|
22
|
+
z.literal(DocLayoutElementType.Abandon).describe('废弃'),
|
|
23
|
+
z.literal(DocLayoutElementType.Figure).describe('图片'),
|
|
24
|
+
z.literal(DocLayoutElementType.FigureCaption).describe('图片说明'),
|
|
25
|
+
z.literal(DocLayoutElementType.Table).describe('表格'),
|
|
26
|
+
z.literal(DocLayoutElementType.TableCaption).describe('表格标题'),
|
|
27
|
+
z.literal(DocLayoutElementType.TableFootnote).describe('表格脚注'),
|
|
28
|
+
z.literal(DocLayoutElementType.IsolateFormula).describe('独立公式'),
|
|
29
|
+
z.literal(DocLayoutElementType.FormulaCaption).describe('公式说明'),
|
|
30
|
+
]);
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
export type ImageAnnotation = z.infer<typeof ImageAnnotationSchema>;
|
|
4
|
+
export const ImageAnnotationSchema = z.looseObject({
|
|
5
|
+
id: z.string().optional(),
|
|
6
|
+
title: z.string().trim().optional().describe('标题'),
|
|
7
|
+
description: z.string().trim().optional().describe('描述'),
|
|
8
|
+
type: z.string().trim().optional().describe('类型'),
|
|
9
|
+
|
|
10
|
+
// 内容字段
|
|
11
|
+
text: z.string().optional().describe('文本内容'),
|
|
12
|
+
markdown: z.string().optional().describe('Markdown 内容'),
|
|
13
|
+
csv: z.string().optional().describe('CSV 内容'),
|
|
14
|
+
html: z.string().optional().describe('HTML 内容'),
|
|
15
|
+
data: z.any().optional().describe('任意数据'),
|
|
16
|
+
|
|
17
|
+
// 定位信息
|
|
18
|
+
field: z.string().trim().optional().describe('目标字段'),
|
|
19
|
+
file: z.string().trim().optional().describe('源文件'),
|
|
20
|
+
page: z.coerce.number().int().nonnegative().optional().describe('页码'),
|
|
21
|
+
|
|
22
|
+
// 几何/边界框信息
|
|
23
|
+
bbox: z.array(z.number()).optional().describe('边界框'),
|
|
24
|
+
xywh: z
|
|
25
|
+
.array(z.number())
|
|
26
|
+
.length(4, { error: 'xywh 必须包含4个数字 [x, y, width, height]' })
|
|
27
|
+
.optional()
|
|
28
|
+
.describe('XYWH'),
|
|
29
|
+
xyxy: z.array(z.number()).length(4, { error: 'xyxy 必须包含4个数字 [x1, y1, x2, y2]' }).optional().describe('XYXY'),
|
|
30
|
+
polygon: z.array(z.number().array()).optional().describe('Polygon'),
|
|
31
|
+
x: z.coerce.number().optional().describe('X 坐标'),
|
|
32
|
+
y: z.coerce.number().optional().describe('Y 坐标'),
|
|
33
|
+
w: z.coerce.number().nonnegative().optional().describe('宽度'),
|
|
34
|
+
h: z.coerce.number().nonnegative().optional().describe('高度'),
|
|
35
|
+
|
|
36
|
+
label: z.string().trim().optional().describe('标签'),
|
|
37
|
+
confidence: z.coerce.number().min(0).max(1).optional().describe('置信度'),
|
|
38
|
+
score: z.coerce.number().optional().describe('原始分数'),
|
|
39
|
+
|
|
40
|
+
classes: z
|
|
41
|
+
.array(
|
|
42
|
+
z.object({
|
|
43
|
+
label: z.string().nonempty({ error: '分类标签不能为空' }).describe('分类标签'),
|
|
44
|
+
confidence: z.coerce.number().min(0).max(1).optional().describe('分类置信度 (0-1)'),
|
|
45
|
+
score: z.coerce.number().optional().describe('分类原始分数'),
|
|
46
|
+
}),
|
|
47
|
+
)
|
|
48
|
+
.optional()
|
|
49
|
+
.describe('多分类结果'),
|
|
50
|
+
|
|
51
|
+
// 元数据和标签
|
|
52
|
+
tags: z.array(z.string()).optional().describe('标签'),
|
|
53
|
+
metadata: z.record(z.string(), z.any()).optional().describe('元数据'),
|
|
54
|
+
attributes: z.record(z.string(), z.any()).optional().describe('属性'),
|
|
55
|
+
properties: z.record(z.string(), z.any()).optional().describe('属性'),
|
|
56
|
+
|
|
57
|
+
get annotations(): z.ZodOptional<z.ZodArray<typeof ImageAnnotationSchema>> {
|
|
58
|
+
return z.array(ImageAnnotationSchema).optional().describe('子注释');
|
|
59
|
+
},
|
|
60
|
+
});
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import type { ImageAnnotation } from './ImageAnnotationSchema';
|
|
2
|
+
|
|
3
|
+
export { resolveImageAnnotation };
|
|
4
|
+
|
|
5
|
+
export type ResolvedImageAnnotation = Omit<ImageAnnotation, 'id' | 'annotations' | 'attributes' | 'metadata'> & {
|
|
6
|
+
id: string;
|
|
7
|
+
annotations: ResolvedImageAnnotation[];
|
|
8
|
+
attributes: Record<string, any>;
|
|
9
|
+
metadata: Record<string, any>;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
function resolveImageAnnotation(input: Partial<ImageAnnotation>): ResolvedImageAnnotation {
|
|
13
|
+
const normalize = (
|
|
14
|
+
input: ImageAnnotation,
|
|
15
|
+
{
|
|
16
|
+
path = [],
|
|
17
|
+
level = 0,
|
|
18
|
+
}: {
|
|
19
|
+
path?: number[];
|
|
20
|
+
level?: number;
|
|
21
|
+
} = {},
|
|
22
|
+
) => {
|
|
23
|
+
input.id ||= path.join('.') || 'ROOT';
|
|
24
|
+
input.annotations ||= [];
|
|
25
|
+
input.tags ||= [];
|
|
26
|
+
input.attributes ||= {};
|
|
27
|
+
input.metadata ||= {};
|
|
28
|
+
|
|
29
|
+
if (!input.csv && input.html?.includes('<table') && globalThis.DOMParser) {
|
|
30
|
+
const parser = new DOMParser();
|
|
31
|
+
const doc = parser.parseFromString(input.html, 'text/html');
|
|
32
|
+
const table = doc.querySelector('table');
|
|
33
|
+
|
|
34
|
+
if (table) {
|
|
35
|
+
const rows = Array.from(table.querySelectorAll('tr'));
|
|
36
|
+
input.data = rows.map((row) =>
|
|
37
|
+
Array.from(row.querySelectorAll('td')).map((td) => td.textContent?.trim() || ''),
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
input.annotations.forEach((v, i) => normalize(v, { path: [...path, i], level: level + 1 }));
|
|
42
|
+
|
|
43
|
+
resolveBBox(input);
|
|
44
|
+
|
|
45
|
+
// can get bbox from annotations
|
|
46
|
+
let first = input.annotations.find((v) => v.xyxy)?.xyxy;
|
|
47
|
+
if (!input.xyxy && first) {
|
|
48
|
+
const xyxy = input.annotations.reduce((acc, v) => {
|
|
49
|
+
if (!v.xyxy) return acc;
|
|
50
|
+
return [
|
|
51
|
+
Math.min(acc[0], v.xyxy[0]),
|
|
52
|
+
Math.min(acc[1], v.xyxy[1]),
|
|
53
|
+
Math.max(acc[2], v.xyxy[2]),
|
|
54
|
+
Math.max(acc[3], v.xyxy[3]),
|
|
55
|
+
];
|
|
56
|
+
}, first);
|
|
57
|
+
input.xyxy = xyxy;
|
|
58
|
+
input.xywh = xyxy2xywh(xyxy);
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
const out = input as ResolvedImageAnnotation;
|
|
63
|
+
normalize(out);
|
|
64
|
+
// out.annotations.forEach((v) => norm(v));
|
|
65
|
+
|
|
66
|
+
// only merge for root node
|
|
67
|
+
|
|
68
|
+
if (!out.markdown) {
|
|
69
|
+
out.markdown = out.annotations.map((v) => v.markdown).join('\n');
|
|
70
|
+
out.markdown ||= undefined;
|
|
71
|
+
}
|
|
72
|
+
if (!out.text) {
|
|
73
|
+
out.text = out.annotations.map((v) => v.text).join('\n');
|
|
74
|
+
out.text ||= undefined;
|
|
75
|
+
}
|
|
76
|
+
// fallback
|
|
77
|
+
out.text ||= out.markdown;
|
|
78
|
+
out.markdown ||= out.text;
|
|
79
|
+
return out;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function xywh2xyxy(input?: number[]) {
|
|
83
|
+
if (!input) return;
|
|
84
|
+
const [x, y, w, h] = input;
|
|
85
|
+
return [x, y, x + w, y + h];
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function xyxy2xywh(input?: number[]) {
|
|
89
|
+
if (!input) return;
|
|
90
|
+
const [x1, y1, x2, y2] = input;
|
|
91
|
+
return [x1, y1, x2 - x1, y2 - y1];
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
type BBoxObject = {
|
|
95
|
+
xywh: number[];
|
|
96
|
+
xyxy: number[];
|
|
97
|
+
x: number;
|
|
98
|
+
y: number;
|
|
99
|
+
w: number;
|
|
100
|
+
h: number;
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
function resolveBBox(input: {
|
|
104
|
+
xywh?: number[];
|
|
105
|
+
xyxy?: number[];
|
|
106
|
+
x?: number;
|
|
107
|
+
y?: number;
|
|
108
|
+
w?: number;
|
|
109
|
+
h?: number;
|
|
110
|
+
}): BBoxObject | undefined {
|
|
111
|
+
let { x, y, w, h } = input as {
|
|
112
|
+
x: number;
|
|
113
|
+
y: number;
|
|
114
|
+
w: number;
|
|
115
|
+
h: number;
|
|
116
|
+
};
|
|
117
|
+
let isNil = (v: any) => v === undefined || v === null;
|
|
118
|
+
if (isNil(x) && input.xywh?.length) {
|
|
119
|
+
[x, y, w, h] = input.xywh;
|
|
120
|
+
}
|
|
121
|
+
if (isNil(x) && input.xyxy?.length) {
|
|
122
|
+
[x, y, w, h] = xyxy2xywh(input.xyxy)!;
|
|
123
|
+
}
|
|
124
|
+
if (!isNil(x)) {
|
|
125
|
+
input.xywh ||= [x, y, w, h];
|
|
126
|
+
input.xyxy ||= xywh2xyxy(input.xywh);
|
|
127
|
+
input.x = x;
|
|
128
|
+
input.y = y;
|
|
129
|
+
input.w = w;
|
|
130
|
+
input.h = h;
|
|
131
|
+
|
|
132
|
+
return input as BBoxObject;
|
|
133
|
+
}
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { ChineseResidentIdNo } from './index';
|
|
3
|
+
|
|
4
|
+
describe('ChineseResidentIdNo', () => {
|
|
5
|
+
it('should parse', () => {
|
|
6
|
+
for (const a of ['11010519491231002X']) {
|
|
7
|
+
let out = ChineseResidentIdNo.parse(a);
|
|
8
|
+
expect(out).toBeTruthy();
|
|
9
|
+
expect(ChineseResidentIdNo.format(out!)).toBe(a);
|
|
10
|
+
expect(out).toMatchSnapshot();
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
it('should format with partial', () => {
|
|
14
|
+
expect(ChineseResidentIdNo.format({ addressCode: '110105', birthDate: new Date('1949-12-31'), sequence: 2 })).toBe(
|
|
15
|
+
'11010519491231002X',
|
|
16
|
+
);
|
|
17
|
+
});
|
|
18
|
+
});
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { z } from 'zod/v4';
|
|
2
|
+
import { SexType, SexTypeSchema } from '../foundation/schema';
|
|
3
|
+
import { Mod11 } from './Mod11';
|
|
4
|
+
|
|
5
|
+
export const ChineseResidentIdNoRegex =
|
|
6
|
+
/^(?<division>[1-9]\d{5})(?<year>(18|19|20)\d{2})(?<month>0[1-9]|1[0-2])(?<day>0[1-9]|[12]\d|3[01])(?<sequence>\d{3})(?<checkDigit>[0-9Xx])$/;
|
|
7
|
+
|
|
8
|
+
export type ParsedChineseResidentIdNo = z.infer<typeof ParsedChineseResidentIdNoSchema>;
|
|
9
|
+
export const ParsedChineseResidentIdNoSchema = z
|
|
10
|
+
.object({
|
|
11
|
+
raw: z.string().regex(ChineseResidentIdNoRegex, '无效的18位身份证号码格式').describe('身份证号码'),
|
|
12
|
+
addressCode: z.string().length(6).describe('地址码 '),
|
|
13
|
+
birthDate: z.iso.date().describe('出生日期'),
|
|
14
|
+
sequence: z.int().max(999).min(0).describe('顺序码'),
|
|
15
|
+
checkDigit: z.int().min(0).max(10).describe('校验码'),
|
|
16
|
+
sex: SexTypeSchema.describe('性别'),
|
|
17
|
+
age: z.number().optional(),
|
|
18
|
+
valid: z.boolean().optional().describe('是否有效'),
|
|
19
|
+
})
|
|
20
|
+
.describe('居民身份证号码解析内容');
|
|
21
|
+
|
|
22
|
+
export function parseChineseResidentIdNo(idNo: string): ParsedChineseResidentIdNo | undefined {
|
|
23
|
+
const reg = ChineseResidentIdNoRegex;
|
|
24
|
+
const match = idNo.match(reg);
|
|
25
|
+
if (!match || !match.groups) {
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
const { division, year, month, day, sequence, checkDigit } = match.groups;
|
|
29
|
+
let seq = parseInt(sequence, 10);
|
|
30
|
+
return {
|
|
31
|
+
raw: idNo,
|
|
32
|
+
addressCode: division,
|
|
33
|
+
birthDate: `${year}-${month}-${day}`,
|
|
34
|
+
sequence: seq,
|
|
35
|
+
checkDigit: checkDigit.toUpperCase() === 'X' ? 10 : parseInt(checkDigit),
|
|
36
|
+
sex: seq % 2 === 0 ? SexType.Male : SexType.Female,
|
|
37
|
+
age: new Date().getFullYear() - parseInt(year, 10),
|
|
38
|
+
valid: Mod11.validate(idNo),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export function formatChineseResidentIdNo({
|
|
43
|
+
addressCode,
|
|
44
|
+
birthDate,
|
|
45
|
+
sequence,
|
|
46
|
+
checkDigit,
|
|
47
|
+
}: {
|
|
48
|
+
addressCode: string;
|
|
49
|
+
birthDate: string | Date;
|
|
50
|
+
sequence: number | string;
|
|
51
|
+
checkDigit?: string | number;
|
|
52
|
+
}): string {
|
|
53
|
+
const date =
|
|
54
|
+
typeof birthDate === 'string'
|
|
55
|
+
? birthDate.replace(/-/g, '')
|
|
56
|
+
: `${birthDate.getFullYear()}${String(birthDate.getMonth() + 1).padStart(2, '0')}${String(birthDate.getDate()).padStart(2, '0')}`;
|
|
57
|
+
const seq = String(sequence).padStart(3, '0');
|
|
58
|
+
const major = `${addressCode}${date}${seq}`;
|
|
59
|
+
const check =
|
|
60
|
+
typeof checkDigit === 'number'
|
|
61
|
+
? checkDigit === 10
|
|
62
|
+
? 'X'
|
|
63
|
+
: String(checkDigit)
|
|
64
|
+
: checkDigit?.toUpperCase() || Mod11.compute(major);
|
|
65
|
+
return `${major}${check}`;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export namespace ChineseResidentIdNo {
|
|
69
|
+
export const regex = ChineseResidentIdNoRegex;
|
|
70
|
+
export const parse = parseChineseResidentIdNo;
|
|
71
|
+
export const format = formatChineseResidentIdNo;
|
|
72
|
+
export type Result = ParsedChineseResidentIdNo;
|
|
73
|
+
export const ResultSchema = ParsedChineseResidentIdNoSchema;
|
|
74
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { DivisionCode } from './
|
|
2
|
+
import { DivisionCode } from './index';
|
|
3
3
|
|
|
4
4
|
describe('DivisionCode', () => {
|
|
5
5
|
it('should parse', () => {
|
|
@@ -7,27 +7,17 @@ describe('DivisionCode', () => {
|
|
|
7
7
|
[
|
|
8
8
|
'441900003001',
|
|
9
9
|
{
|
|
10
|
-
province: '44',
|
|
11
|
-
city: '19',
|
|
12
|
-
county: '00',
|
|
13
|
-
town: '003',
|
|
14
|
-
village: '001',
|
|
15
10
|
codes: ['44', '19', '00', '003', '001'],
|
|
16
11
|
},
|
|
17
12
|
],
|
|
18
13
|
[
|
|
19
14
|
441900003001,
|
|
20
15
|
{
|
|
21
|
-
province: '44',
|
|
22
|
-
city: '19',
|
|
23
|
-
county: '00',
|
|
24
|
-
town: '003',
|
|
25
|
-
village: '001',
|
|
26
16
|
codes: ['44', '19', '00', '003', '001'],
|
|
27
17
|
},
|
|
28
18
|
],
|
|
29
|
-
[441900, {
|
|
30
|
-
['31', {
|
|
19
|
+
[441900, { codes: ['44', '19', '00'] }],
|
|
20
|
+
['31', { codes: ['31'] }],
|
|
31
21
|
['4', undefined],
|
|
32
22
|
['', undefined],
|
|
33
23
|
[null, undefined],
|