@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/ai/qwen3vl/index.ts"],"sourcesContent":["export { fromQwen3VlBbox2d, toQwen3VlBbox2d } from './utils';\n"],"names":["fromQwen3VlBbox2d","toQwen3VlBbox2d"],"mappings":"AAAA,SAASA,iBAAiB,EAAEC,eAAe,QAAQ,UAAU"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
// xyxy
|
|
2
|
+
/**
|
|
3
|
+
* Convert Qwen3V format bbox (0-1000 range) to absolute pixel coordinates
|
|
4
|
+
* @param dimensions Image dimensions {width, height}
|
|
5
|
+
* @param bbox Bbox in Qwen3V format [x1, y1, x2, y2] where each value is 0-1000
|
|
6
|
+
* @returns Absolute pixel coordinates [x1, y1, x2, y2]
|
|
7
|
+
*/ export function fromQwen3VlBbox2d({ width, height }, bbox) {
|
|
8
|
+
const [x1, y1, x2, y2] = bbox;
|
|
9
|
+
return [
|
|
10
|
+
Math.floor(x1 / 1000 * width),
|
|
11
|
+
Math.floor(y1 / 1000 * height),
|
|
12
|
+
Math.floor(x2 / 1000 * width),
|
|
13
|
+
Math.floor(y2 / 1000 * height)
|
|
14
|
+
];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Convert absolute pixel coordinates to Qwen3V format bbox (0-1000 range)
|
|
18
|
+
* @param dimensions Image dimensions {width, height}
|
|
19
|
+
* @param bbox Absolute pixel coordinates [x1, y1, x2, y2]
|
|
20
|
+
* @returns Bbox in Qwen3V format [x1, y1, x2, y2] where each value is 0-1000
|
|
21
|
+
*/ export function toQwen3VlBbox2d({ width, height }, bbox) {
|
|
22
|
+
const [x1, y1, x2, y2] = bbox;
|
|
23
|
+
return [
|
|
24
|
+
Math.round(x1 / width * 1000),
|
|
25
|
+
Math.round(y1 / height * 1000),
|
|
26
|
+
Math.round(x2 / width * 1000),
|
|
27
|
+
Math.round(y2 / height * 1000)
|
|
28
|
+
];
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/ai/qwen3vl/utils.ts"],"sourcesContent":["// xyxy\ntype Bbox2d = [number, number, number, number];\ntype Dimensions = { width: number; height: number };\n// x_center, y_center, z_center, x_size, y_size, z_size, roll, pitch, yaw\ntype Bbox3d = [number, number, number, number, number, number, number, number, number];\n/**\n * Convert Qwen3V format bbox (0-1000 range) to absolute pixel coordinates\n * @param dimensions Image dimensions {width, height}\n * @param bbox Bbox in Qwen3V format [x1, y1, x2, y2] where each value is 0-1000\n * @returns Absolute pixel coordinates [x1, y1, x2, y2]\n */\nexport function fromQwen3VlBbox2d({ width, height }: Dimensions, bbox: Bbox2d): Bbox2d {\n\tconst [x1, y1, x2, y2] = bbox;\n\treturn [\n\t\tMath.floor((x1 / 1000) * width),\n\t\tMath.floor((y1 / 1000) * height),\n\t\tMath.floor((x2 / 1000) * width),\n\t\tMath.floor((y2 / 1000) * height),\n\t];\n}\n\n/**\n * Convert absolute pixel coordinates to Qwen3V format bbox (0-1000 range)\n * @param dimensions Image dimensions {width, height}\n * @param bbox Absolute pixel coordinates [x1, y1, x2, y2]\n * @returns Bbox in Qwen3V format [x1, y1, x2, y2] where each value is 0-1000\n */\nexport function toQwen3VlBbox2d({ width, height }: Dimensions, bbox: Bbox2d): Bbox2d {\n\tconst [x1, y1, x2, y2] = bbox;\n\treturn [\n\t\tMath.round((x1 / width) * 1000),\n\t\tMath.round((y1 / height) * 1000),\n\t\tMath.round((x2 / width) * 1000),\n\t\tMath.round((y2 / height) * 1000),\n\t];\n}\n"],"names":["fromQwen3VlBbox2d","width","height","bbox","x1","y1","x2","y2","Math","floor","toQwen3VlBbox2d","round"],"mappings":"AAAA,OAAO;AAKP;;;;;CAKC,GACD,OAAO,SAASA,kBAAkB,EAAEC,KAAK,EAAEC,MAAM,EAAc,EAAEC,IAAY;IAC5E,MAAM,CAACC,IAAIC,IAAIC,IAAIC,GAAG,GAAGJ;IACzB,OAAO;QACNK,KAAKC,KAAK,CAAC,AAACL,KAAK,OAAQH;QACzBO,KAAKC,KAAK,CAAC,AAACJ,KAAK,OAAQH;QACzBM,KAAKC,KAAK,CAAC,AAACH,KAAK,OAAQL;QACzBO,KAAKC,KAAK,CAAC,AAACF,KAAK,OAAQL;KACzB;AACF;AAEA;;;;;CAKC,GACD,OAAO,SAASQ,gBAAgB,EAAET,KAAK,EAAEC,MAAM,EAAc,EAAEC,IAAY;IAC1E,MAAM,CAACC,IAAIC,IAAIC,IAAIC,GAAG,GAAGJ;IACzB,OAAO;QACNK,KAAKG,KAAK,CAAC,AAACP,KAAKH,QAAS;QAC1BO,KAAKG,KAAK,CAAC,AAACN,KAAKH,SAAU;QAC3BM,KAAKG,KAAK,CAAC,AAACL,KAAKL,QAAS;QAC1BO,KAAKG,KAAK,CAAC,AAACJ,KAAKL,SAAU;KAC3B;AACF"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
// based on DocLayout-YOLO
|
|
3
|
+
export const DocLayoutElementType = Object.freeze({
|
|
4
|
+
Title: 'Title',
|
|
5
|
+
PlainText: 'PlainText',
|
|
6
|
+
Abandon: 'Abandon',
|
|
7
|
+
Figure: 'Figure',
|
|
8
|
+
FigureCaption: 'FigureCaption',
|
|
9
|
+
Table: 'Table',
|
|
10
|
+
TableCaption: 'TableCaption',
|
|
11
|
+
TableFootnote: 'TableFootnote',
|
|
12
|
+
IsolateFormula: 'IsolateFormula',
|
|
13
|
+
FormulaCaption: 'FormulaCaption'
|
|
14
|
+
});
|
|
15
|
+
export const DocLayoutElementTypeSchema = z.union([
|
|
16
|
+
z.literal(DocLayoutElementType.Title).describe('标题'),
|
|
17
|
+
z.literal(DocLayoutElementType.PlainText).describe('纯文本'),
|
|
18
|
+
z.literal(DocLayoutElementType.Abandon).describe('废弃'),
|
|
19
|
+
z.literal(DocLayoutElementType.Figure).describe('图片'),
|
|
20
|
+
z.literal(DocLayoutElementType.FigureCaption).describe('图片说明'),
|
|
21
|
+
z.literal(DocLayoutElementType.Table).describe('表格'),
|
|
22
|
+
z.literal(DocLayoutElementType.TableCaption).describe('表格标题'),
|
|
23
|
+
z.literal(DocLayoutElementType.TableFootnote).describe('表格脚注'),
|
|
24
|
+
z.literal(DocLayoutElementType.IsolateFormula).describe('独立公式'),
|
|
25
|
+
z.literal(DocLayoutElementType.FormulaCaption).describe('公式说明')
|
|
26
|
+
]);
|
|
27
|
+
|
|
28
|
+
//# sourceMappingURL=DocLayoutElementTypeSchema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/ai/vision/DocLayoutElementTypeSchema.ts"],"sourcesContent":["import { z } from 'zod';\n\n// based on DocLayout-YOLO\n\nexport const DocLayoutElementType = Object.freeze({\n\tTitle: 'Title',\n\tPlainText: 'PlainText',\n\tAbandon: 'Abandon',\n\tFigure: 'Figure',\n\tFigureCaption: 'FigureCaption',\n\tTable: 'Table',\n\tTableCaption: 'TableCaption',\n\tTableFootnote: 'TableFootnote',\n\tIsolateFormula: 'IsolateFormula',\n\tFormulaCaption: 'FormulaCaption',\n});\nexport type DocLayoutElementType = (typeof DocLayoutElementType)[keyof typeof DocLayoutElementType];\n\nexport const DocLayoutElementTypeSchema = z.union([\n\tz.literal(DocLayoutElementType.Title).describe('标题'),\n\tz.literal(DocLayoutElementType.PlainText).describe('纯文本'),\n\tz.literal(DocLayoutElementType.Abandon).describe('废弃'),\n\tz.literal(DocLayoutElementType.Figure).describe('图片'),\n\tz.literal(DocLayoutElementType.FigureCaption).describe('图片说明'),\n\tz.literal(DocLayoutElementType.Table).describe('表格'),\n\tz.literal(DocLayoutElementType.TableCaption).describe('表格标题'),\n\tz.literal(DocLayoutElementType.TableFootnote).describe('表格脚注'),\n\tz.literal(DocLayoutElementType.IsolateFormula).describe('独立公式'),\n\tz.literal(DocLayoutElementType.FormulaCaption).describe('公式说明'),\n]);\n"],"names":["z","DocLayoutElementType","Object","freeze","Title","PlainText","Abandon","Figure","FigureCaption","Table","TableCaption","TableFootnote","IsolateFormula","FormulaCaption","DocLayoutElementTypeSchema","union","literal","describe"],"mappings":"AAAA,SAASA,CAAC,QAAQ,MAAM;AAExB,0BAA0B;AAE1B,OAAO,MAAMC,uBAAuBC,OAAOC,MAAM,CAAC;IACjDC,OAAO;IACPC,WAAW;IACXC,SAAS;IACTC,QAAQ;IACRC,eAAe;IACfC,OAAO;IACPC,cAAc;IACdC,eAAe;IACfC,gBAAgB;IAChBC,gBAAgB;AACjB,GAAG;AAGH,OAAO,MAAMC,6BAA6Bd,EAAEe,KAAK,CAAC;IACjDf,EAAEgB,OAAO,CAACf,qBAAqBG,KAAK,EAAEa,QAAQ,CAAC;IAC/CjB,EAAEgB,OAAO,CAACf,qBAAqBI,SAAS,EAAEY,QAAQ,CAAC;IACnDjB,EAAEgB,OAAO,CAACf,qBAAqBK,OAAO,EAAEW,QAAQ,CAAC;IACjDjB,EAAEgB,OAAO,CAACf,qBAAqBM,MAAM,EAAEU,QAAQ,CAAC;IAChDjB,EAAEgB,OAAO,CAACf,qBAAqBO,aAAa,EAAES,QAAQ,CAAC;IACvDjB,EAAEgB,OAAO,CAACf,qBAAqBQ,KAAK,EAAEQ,QAAQ,CAAC;IAC/CjB,EAAEgB,OAAO,CAACf,qBAAqBS,YAAY,EAAEO,QAAQ,CAAC;IACtDjB,EAAEgB,OAAO,CAACf,qBAAqBU,aAAa,EAAEM,QAAQ,CAAC;IACvDjB,EAAEgB,OAAO,CAACf,qBAAqBW,cAAc,EAAEK,QAAQ,CAAC;IACxDjB,EAAEgB,OAAO,CAACf,qBAAqBY,cAAc,EAAEI,QAAQ,CAAC;CACxD,EAAE"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
export const ImageAnnotationSchema = z.looseObject({
|
|
3
|
+
id: z.string().optional(),
|
|
4
|
+
title: z.string().trim().optional().describe('标题'),
|
|
5
|
+
description: z.string().trim().optional().describe('描述'),
|
|
6
|
+
type: z.string().trim().optional().describe('类型'),
|
|
7
|
+
// 内容字段
|
|
8
|
+
text: z.string().optional().describe('文本内容'),
|
|
9
|
+
markdown: z.string().optional().describe('Markdown 内容'),
|
|
10
|
+
csv: z.string().optional().describe('CSV 内容'),
|
|
11
|
+
html: z.string().optional().describe('HTML 内容'),
|
|
12
|
+
data: z.any().optional().describe('任意数据'),
|
|
13
|
+
// 定位信息
|
|
14
|
+
field: z.string().trim().optional().describe('目标字段'),
|
|
15
|
+
file: z.string().trim().optional().describe('源文件'),
|
|
16
|
+
page: z.coerce.number().int().nonnegative().optional().describe('页码'),
|
|
17
|
+
// 几何/边界框信息
|
|
18
|
+
bbox: z.array(z.number()).optional().describe('边界框'),
|
|
19
|
+
xywh: z.array(z.number()).length(4, {
|
|
20
|
+
error: 'xywh 必须包含4个数字 [x, y, width, height]'
|
|
21
|
+
}).optional().describe('XYWH'),
|
|
22
|
+
xyxy: z.array(z.number()).length(4, {
|
|
23
|
+
error: 'xyxy 必须包含4个数字 [x1, y1, x2, y2]'
|
|
24
|
+
}).optional().describe('XYXY'),
|
|
25
|
+
polygon: z.array(z.number().array()).optional().describe('Polygon'),
|
|
26
|
+
x: z.coerce.number().optional().describe('X 坐标'),
|
|
27
|
+
y: z.coerce.number().optional().describe('Y 坐标'),
|
|
28
|
+
w: z.coerce.number().nonnegative().optional().describe('宽度'),
|
|
29
|
+
h: z.coerce.number().nonnegative().optional().describe('高度'),
|
|
30
|
+
label: z.string().trim().optional().describe('标签'),
|
|
31
|
+
confidence: z.coerce.number().min(0).max(1).optional().describe('置信度'),
|
|
32
|
+
score: z.coerce.number().optional().describe('原始分数'),
|
|
33
|
+
classes: z.array(z.object({
|
|
34
|
+
label: z.string().nonempty({
|
|
35
|
+
error: '分类标签不能为空'
|
|
36
|
+
}).describe('分类标签'),
|
|
37
|
+
confidence: z.coerce.number().min(0).max(1).optional().describe('分类置信度 (0-1)'),
|
|
38
|
+
score: z.coerce.number().optional().describe('分类原始分数')
|
|
39
|
+
})).optional().describe('多分类结果'),
|
|
40
|
+
// 元数据和标签
|
|
41
|
+
tags: z.array(z.string()).optional().describe('标签'),
|
|
42
|
+
metadata: z.record(z.string(), z.any()).optional().describe('元数据'),
|
|
43
|
+
attributes: z.record(z.string(), z.any()).optional().describe('属性'),
|
|
44
|
+
properties: z.record(z.string(), z.any()).optional().describe('属性'),
|
|
45
|
+
get annotations () {
|
|
46
|
+
return z.array(ImageAnnotationSchema).optional().describe('子注释');
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
//# sourceMappingURL=ImageAnnotationSchema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/ai/vision/ImageAnnotationSchema.ts"],"sourcesContent":["import { z } from 'zod';\n\nexport type ImageAnnotation = z.infer<typeof ImageAnnotationSchema>;\nexport const ImageAnnotationSchema = z.looseObject({\n\tid: z.string().optional(),\n\ttitle: z.string().trim().optional().describe('标题'),\n\tdescription: z.string().trim().optional().describe('描述'),\n\ttype: z.string().trim().optional().describe('类型'),\n\n\t// 内容字段\n\ttext: z.string().optional().describe('文本内容'),\n\tmarkdown: z.string().optional().describe('Markdown 内容'),\n\tcsv: z.string().optional().describe('CSV 内容'),\n\thtml: z.string().optional().describe('HTML 内容'),\n\tdata: z.any().optional().describe('任意数据'),\n\n\t// 定位信息\n\tfield: z.string().trim().optional().describe('目标字段'),\n\tfile: z.string().trim().optional().describe('源文件'),\n\tpage: z.coerce.number().int().nonnegative().optional().describe('页码'),\n\n\t// 几何/边界框信息\n\tbbox: z.array(z.number()).optional().describe('边界框'),\n\txywh: z\n\t\t.array(z.number())\n\t\t.length(4, { error: 'xywh 必须包含4个数字 [x, y, width, height]' })\n\t\t.optional()\n\t\t.describe('XYWH'),\n\txyxy: z.array(z.number()).length(4, { error: 'xyxy 必须包含4个数字 [x1, y1, x2, y2]' }).optional().describe('XYXY'),\n\tpolygon: z.array(z.number().array()).optional().describe('Polygon'),\n\tx: z.coerce.number().optional().describe('X 坐标'),\n\ty: z.coerce.number().optional().describe('Y 坐标'),\n\tw: z.coerce.number().nonnegative().optional().describe('宽度'),\n\th: z.coerce.number().nonnegative().optional().describe('高度'),\n\n\tlabel: z.string().trim().optional().describe('标签'),\n\tconfidence: z.coerce.number().min(0).max(1).optional().describe('置信度'),\n\tscore: z.coerce.number().optional().describe('原始分数'),\n\n\tclasses: z\n\t\t.array(\n\t\t\tz.object({\n\t\t\t\tlabel: z.string().nonempty({ error: '分类标签不能为空' }).describe('分类标签'),\n\t\t\t\tconfidence: z.coerce.number().min(0).max(1).optional().describe('分类置信度 (0-1)'),\n\t\t\t\tscore: z.coerce.number().optional().describe('分类原始分数'),\n\t\t\t}),\n\t\t)\n\t\t.optional()\n\t\t.describe('多分类结果'),\n\n\t// 元数据和标签\n\ttags: z.array(z.string()).optional().describe('标签'),\n\tmetadata: z.record(z.string(), z.any()).optional().describe('元数据'),\n\tattributes: z.record(z.string(), z.any()).optional().describe('属性'),\n\tproperties: z.record(z.string(), z.any()).optional().describe('属性'),\n\n\tget annotations(): z.ZodOptional<z.ZodArray<typeof ImageAnnotationSchema>> {\n\t\treturn z.array(ImageAnnotationSchema).optional().describe('子注释');\n\t},\n});\n"],"names":["z","ImageAnnotationSchema","looseObject","id","string","optional","title","trim","describe","description","type","text","markdown","csv","html","data","any","field","file","page","coerce","number","int","nonnegative","bbox","array","xywh","length","error","xyxy","polygon","x","y","w","h","label","confidence","min","max","score","classes","object","nonempty","tags","metadata","record","attributes","properties","annotations"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/ai/vision/index.ts"],"sourcesContent":["export { ImageAnnotationSchema, type ImageAnnotation } from './ImageAnnotationSchema';\nexport { resolveImageAnnotation, type ResolvedImageAnnotation } from './resolveImageAnnotation';\n"],"names":["ImageAnnotationSchema","resolveImageAnnotation"],"mappings":"AAAA,SAASA,qBAAqB,QAA8B,0BAA0B;AACtF,SAASC,sBAAsB,QAAsC,2BAA2B"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
export { resolveImageAnnotation };
|
|
2
|
+
function resolveImageAnnotation(input) {
|
|
3
|
+
const normalize = (input, { path = [], level = 0 } = {})=>{
|
|
4
|
+
input.id ||= path.join('.') || 'ROOT';
|
|
5
|
+
input.annotations ||= [];
|
|
6
|
+
input.tags ||= [];
|
|
7
|
+
input.attributes ||= {};
|
|
8
|
+
input.metadata ||= {};
|
|
9
|
+
if (!input.csv && input.html?.includes('<table') && globalThis.DOMParser) {
|
|
10
|
+
const parser = new DOMParser();
|
|
11
|
+
const doc = parser.parseFromString(input.html, 'text/html');
|
|
12
|
+
const table = doc.querySelector('table');
|
|
13
|
+
if (table) {
|
|
14
|
+
const rows = Array.from(table.querySelectorAll('tr'));
|
|
15
|
+
input.data = rows.map((row)=>Array.from(row.querySelectorAll('td')).map((td)=>td.textContent?.trim() || ''));
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
input.annotations.forEach((v, i)=>normalize(v, {
|
|
19
|
+
path: [
|
|
20
|
+
...path,
|
|
21
|
+
i
|
|
22
|
+
],
|
|
23
|
+
level: level + 1
|
|
24
|
+
}));
|
|
25
|
+
resolveBBox(input);
|
|
26
|
+
// can get bbox from annotations
|
|
27
|
+
let first = input.annotations.find((v)=>v.xyxy)?.xyxy;
|
|
28
|
+
if (!input.xyxy && first) {
|
|
29
|
+
const xyxy = input.annotations.reduce((acc, v)=>{
|
|
30
|
+
if (!v.xyxy) return acc;
|
|
31
|
+
return [
|
|
32
|
+
Math.min(acc[0], v.xyxy[0]),
|
|
33
|
+
Math.min(acc[1], v.xyxy[1]),
|
|
34
|
+
Math.max(acc[2], v.xyxy[2]),
|
|
35
|
+
Math.max(acc[3], v.xyxy[3])
|
|
36
|
+
];
|
|
37
|
+
}, first);
|
|
38
|
+
input.xyxy = xyxy;
|
|
39
|
+
input.xywh = xyxy2xywh(xyxy);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
const out = input;
|
|
43
|
+
normalize(out);
|
|
44
|
+
// out.annotations.forEach((v) => norm(v));
|
|
45
|
+
// only merge for root node
|
|
46
|
+
if (!out.markdown) {
|
|
47
|
+
out.markdown = out.annotations.map((v)=>v.markdown).join('\n');
|
|
48
|
+
out.markdown ||= undefined;
|
|
49
|
+
}
|
|
50
|
+
if (!out.text) {
|
|
51
|
+
out.text = out.annotations.map((v)=>v.text).join('\n');
|
|
52
|
+
out.text ||= undefined;
|
|
53
|
+
}
|
|
54
|
+
// fallback
|
|
55
|
+
out.text ||= out.markdown;
|
|
56
|
+
out.markdown ||= out.text;
|
|
57
|
+
return out;
|
|
58
|
+
}
|
|
59
|
+
function xywh2xyxy(input) {
|
|
60
|
+
if (!input) return;
|
|
61
|
+
const [x, y, w, h] = input;
|
|
62
|
+
return [
|
|
63
|
+
x,
|
|
64
|
+
y,
|
|
65
|
+
x + w,
|
|
66
|
+
y + h
|
|
67
|
+
];
|
|
68
|
+
}
|
|
69
|
+
function xyxy2xywh(input) {
|
|
70
|
+
if (!input) return;
|
|
71
|
+
const [x1, y1, x2, y2] = input;
|
|
72
|
+
return [
|
|
73
|
+
x1,
|
|
74
|
+
y1,
|
|
75
|
+
x2 - x1,
|
|
76
|
+
y2 - y1
|
|
77
|
+
];
|
|
78
|
+
}
|
|
79
|
+
function resolveBBox(input) {
|
|
80
|
+
let { x, y, w, h } = input;
|
|
81
|
+
let isNil = (v)=>v === undefined || v === null;
|
|
82
|
+
if (isNil(x) && input.xywh?.length) {
|
|
83
|
+
[x, y, w, h] = input.xywh;
|
|
84
|
+
}
|
|
85
|
+
if (isNil(x) && input.xyxy?.length) {
|
|
86
|
+
[x, y, w, h] = xyxy2xywh(input.xyxy);
|
|
87
|
+
}
|
|
88
|
+
if (!isNil(x)) {
|
|
89
|
+
input.xywh ||= [
|
|
90
|
+
x,
|
|
91
|
+
y,
|
|
92
|
+
w,
|
|
93
|
+
h
|
|
94
|
+
];
|
|
95
|
+
input.xyxy ||= xywh2xyxy(input.xywh);
|
|
96
|
+
input.x = x;
|
|
97
|
+
input.y = y;
|
|
98
|
+
input.w = w;
|
|
99
|
+
input.h = h;
|
|
100
|
+
return input;
|
|
101
|
+
}
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
//# sourceMappingURL=resolveImageAnnotation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/ai/vision/resolveImageAnnotation.ts"],"sourcesContent":["import type { ImageAnnotation } from './ImageAnnotationSchema';\n\nexport { resolveImageAnnotation };\n\nexport type ResolvedImageAnnotation = Omit<ImageAnnotation, 'id' | 'annotations' | 'attributes' | 'metadata'> & {\n\tid: string;\n\tannotations: ResolvedImageAnnotation[];\n\tattributes: Record<string, any>;\n\tmetadata: Record<string, any>;\n};\n\nfunction resolveImageAnnotation(input: Partial<ImageAnnotation>): ResolvedImageAnnotation {\n\tconst normalize = (\n\t\tinput: ImageAnnotation,\n\t\t{\n\t\t\tpath = [],\n\t\t\tlevel = 0,\n\t\t}: {\n\t\t\tpath?: number[];\n\t\t\tlevel?: number;\n\t\t} = {},\n\t) => {\n\t\tinput.id ||= path.join('.') || 'ROOT';\n\t\tinput.annotations ||= [];\n\t\tinput.tags ||= [];\n\t\tinput.attributes ||= {};\n\t\tinput.metadata ||= {};\n\n\t\tif (!input.csv && input.html?.includes('<table') && globalThis.DOMParser) {\n\t\t\tconst parser = new DOMParser();\n\t\t\tconst doc = parser.parseFromString(input.html, 'text/html');\n\t\t\tconst table = doc.querySelector('table');\n\n\t\t\tif (table) {\n\t\t\t\tconst rows = Array.from(table.querySelectorAll('tr'));\n\t\t\t\tinput.data = rows.map((row) =>\n\t\t\t\t\tArray.from(row.querySelectorAll('td')).map((td) => td.textContent?.trim() || ''),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tinput.annotations.forEach((v, i) => normalize(v, { path: [...path, i], level: level + 1 }));\n\n\t\tresolveBBox(input);\n\n\t\t// can get bbox from annotations\n\t\tlet first = input.annotations.find((v) => v.xyxy)?.xyxy;\n\t\tif (!input.xyxy && first) {\n\t\t\tconst xyxy = input.annotations.reduce((acc, v) => {\n\t\t\t\tif (!v.xyxy) return acc;\n\t\t\t\treturn [\n\t\t\t\t\tMath.min(acc[0], v.xyxy[0]),\n\t\t\t\t\tMath.min(acc[1], v.xyxy[1]),\n\t\t\t\t\tMath.max(acc[2], v.xyxy[2]),\n\t\t\t\t\tMath.max(acc[3], v.xyxy[3]),\n\t\t\t\t];\n\t\t\t}, first);\n\t\t\tinput.xyxy = xyxy;\n\t\t\tinput.xywh = xyxy2xywh(xyxy);\n\t\t}\n\t};\n\n\tconst out = input as ResolvedImageAnnotation;\n\tnormalize(out);\n\t// out.annotations.forEach((v) => norm(v));\n\n\t// only merge for root node\n\n\tif (!out.markdown) {\n\t\tout.markdown = out.annotations.map((v) => v.markdown).join('\\n');\n\t\tout.markdown ||= undefined;\n\t}\n\tif (!out.text) {\n\t\tout.text = out.annotations.map((v) => v.text).join('\\n');\n\t\tout.text ||= undefined;\n\t}\n\t// fallback\n\tout.text ||= out.markdown;\n\tout.markdown ||= out.text;\n\treturn out;\n}\n\nfunction xywh2xyxy(input?: number[]) {\n\tif (!input) return;\n\tconst [x, y, w, h] = input;\n\treturn [x, y, x + w, y + h];\n}\n\nfunction xyxy2xywh(input?: number[]) {\n\tif (!input) return;\n\tconst [x1, y1, x2, y2] = input;\n\treturn [x1, y1, x2 - x1, y2 - y1];\n}\n\ntype BBoxObject = {\n\txywh: number[];\n\txyxy: number[];\n\tx: number;\n\ty: number;\n\tw: number;\n\th: number;\n};\n\nfunction resolveBBox(input: {\n\txywh?: number[];\n\txyxy?: number[];\n\tx?: number;\n\ty?: number;\n\tw?: number;\n\th?: number;\n}): BBoxObject | undefined {\n\tlet { x, y, w, h } = input as {\n\t\tx: number;\n\t\ty: number;\n\t\tw: number;\n\t\th: number;\n\t};\n\tlet isNil = (v: any) => v === undefined || v === null;\n\tif (isNil(x) && input.xywh?.length) {\n\t\t[x, y, w, h] = input.xywh;\n\t}\n\tif (isNil(x) && input.xyxy?.length) {\n\t\t[x, y, w, h] = xyxy2xywh(input.xyxy)!;\n\t}\n\tif (!isNil(x)) {\n\t\tinput.xywh ||= [x, y, w, h];\n\t\tinput.xyxy ||= xywh2xyxy(input.xywh);\n\t\tinput.x = x;\n\t\tinput.y = y;\n\t\tinput.w = w;\n\t\tinput.h = h;\n\n\t\treturn input as BBoxObject;\n\t}\n\treturn;\n}\n"],"names":["resolveImageAnnotation","input","normalize","path","level","id","join","annotations","tags","attributes","metadata","csv","html","includes","globalThis","DOMParser","parser","doc","parseFromString","table","querySelector","rows","Array","from","querySelectorAll","data","map","row","td","textContent","trim","forEach","v","i","resolveBBox","first","find","xyxy","reduce","acc","Math","min","max","xywh","xyxy2xywh","out","markdown","undefined","text","xywh2xyxy","x","y","w","h","x1","y1","x2","y2","isNil","length"],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { z } from "zod/v4";
|
|
2
|
+
import { SexType, SexTypeSchema } from "../foundation/schema/index.js";
|
|
3
|
+
import { Mod11 } from "./Mod11.js";
|
|
4
|
+
export const ChineseResidentIdNoRegex = /^(?<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])$/;
|
|
5
|
+
export const ParsedChineseResidentIdNoSchema = z.object({
|
|
6
|
+
raw: z.string().regex(ChineseResidentIdNoRegex, "\u65E0\u6548\u768418\u4F4D\u8EAB\u4EFD\u8BC1\u53F7\u7801\u683C\u5F0F").describe("\u8EAB\u4EFD\u8BC1\u53F7\u7801"),
|
|
7
|
+
addressCode: z.string().length(6).describe("\u5730\u5740\u7801 "),
|
|
8
|
+
birthDate: z.iso.date().describe("\u51FA\u751F\u65E5\u671F"),
|
|
9
|
+
sequence: z.int().max(999).min(0).describe("\u987A\u5E8F\u7801"),
|
|
10
|
+
checkDigit: z.int().min(0).max(10).describe("\u6821\u9A8C\u7801"),
|
|
11
|
+
sex: SexTypeSchema.describe("\u6027\u522B"),
|
|
12
|
+
age: z.number().optional(),
|
|
13
|
+
valid: z.boolean().optional().describe("\u662F\u5426\u6709\u6548")
|
|
14
|
+
}).describe("\u5C45\u6C11\u8EAB\u4EFD\u8BC1\u53F7\u7801\u89E3\u6790\u5185\u5BB9");
|
|
15
|
+
export function parseChineseResidentIdNo(idNo) {
|
|
16
|
+
const reg = ChineseResidentIdNoRegex;
|
|
17
|
+
const match = idNo.match(reg);
|
|
18
|
+
if (!match || !match.groups) {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
const { division, year, month, day, sequence, checkDigit } = match.groups;
|
|
22
|
+
let seq = parseInt(sequence, 10);
|
|
23
|
+
return {
|
|
24
|
+
raw: idNo,
|
|
25
|
+
addressCode: division,
|
|
26
|
+
birthDate: `${year}-${month}-${day}`,
|
|
27
|
+
sequence: seq,
|
|
28
|
+
checkDigit: checkDigit.toUpperCase() === "X" ? 10 : parseInt(checkDigit),
|
|
29
|
+
sex: seq % 2 === 0 ? SexType.Male : SexType.Female,
|
|
30
|
+
age: new Date().getFullYear() - parseInt(year, 10),
|
|
31
|
+
valid: Mod11.validate(idNo)
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
export function formatChineseResidentIdNo({ addressCode, birthDate, sequence, checkDigit }) {
|
|
35
|
+
const date = typeof birthDate === "string" ? birthDate.replace(/-/g, "") : `${birthDate.getFullYear()}${String(birthDate.getMonth() + 1).padStart(2, "0")}${String(birthDate.getDate()).padStart(2, "0")}`;
|
|
36
|
+
const seq = String(sequence).padStart(3, "0");
|
|
37
|
+
const major = `${addressCode}${date}${seq}`;
|
|
38
|
+
const check = typeof checkDigit === "number" ? checkDigit === 10 ? "X" : String(checkDigit) : checkDigit?.toUpperCase() || Mod11.compute(major);
|
|
39
|
+
return `${major}${check}`;
|
|
40
|
+
}
|
|
41
|
+
(function (ChineseResidentIdNo) {
|
|
42
|
+
ChineseResidentIdNo.regex = ChineseResidentIdNoRegex;
|
|
43
|
+
ChineseResidentIdNo.parse = parseChineseResidentIdNo;
|
|
44
|
+
ChineseResidentIdNo.format = formatChineseResidentIdNo;
|
|
45
|
+
ChineseResidentIdNo.ResultSchema = ParsedChineseResidentIdNoSchema;
|
|
46
|
+
})(ChineseResidentIdNo || (ChineseResidentIdNo = {}));
|
|
47
|
+
export var ChineseResidentIdNo;
|
|
48
|
+
//# sourceMappingURL=ChineseResidentIdNo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/cn/ChineseResidentIdNo.ts"],"sourcesContent":["import { z } from 'zod/v4';\nimport { SexType, SexTypeSchema } from '../foundation/schema';\nimport { Mod11 } from './Mod11';\n\nexport const ChineseResidentIdNoRegex =\n\t/^(?<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])$/;\n\nexport type ParsedChineseResidentIdNo = z.infer<typeof ParsedChineseResidentIdNoSchema>;\nexport const ParsedChineseResidentIdNoSchema = z\n\t.object({\n\t\traw: z.string().regex(ChineseResidentIdNoRegex, '无效的18位身份证号码格式').describe('身份证号码'),\n\t\taddressCode: z.string().length(6).describe('地址码 '),\n\t\tbirthDate: z.iso.date().describe('出生日期'),\n\t\tsequence: z.int().max(999).min(0).describe('顺序码'),\n\t\tcheckDigit: z.int().min(0).max(10).describe('校验码'),\n\t\tsex: SexTypeSchema.describe('性别'),\n\t\tage: z.number().optional(),\n\t\tvalid: z.boolean().optional().describe('是否有效'),\n\t})\n\t.describe('居民身份证号码解析内容');\n\nexport function parseChineseResidentIdNo(idNo: string): ParsedChineseResidentIdNo | undefined {\n\tconst reg = ChineseResidentIdNoRegex;\n\tconst match = idNo.match(reg);\n\tif (!match || !match.groups) {\n\t\treturn undefined;\n\t}\n\tconst { division, year, month, day, sequence, checkDigit } = match.groups;\n\tlet seq = parseInt(sequence, 10);\n\treturn {\n\t\traw: idNo,\n\t\taddressCode: division,\n\t\tbirthDate: `${year}-${month}-${day}`,\n\t\tsequence: seq,\n\t\tcheckDigit: checkDigit.toUpperCase() === 'X' ? 10 : parseInt(checkDigit),\n\t\tsex: seq % 2 === 0 ? SexType.Male : SexType.Female,\n\t\tage: new Date().getFullYear() - parseInt(year, 10),\n\t\tvalid: Mod11.validate(idNo),\n\t};\n}\n\nexport function formatChineseResidentIdNo({\n\taddressCode,\n\tbirthDate,\n\tsequence,\n\tcheckDigit,\n}: {\n\taddressCode: string;\n\tbirthDate: string | Date;\n\tsequence: number | string;\n\tcheckDigit?: string | number;\n}): string {\n\tconst date =\n\t\ttypeof birthDate === 'string'\n\t\t\t? birthDate.replace(/-/g, '')\n\t\t\t: `${birthDate.getFullYear()}${String(birthDate.getMonth() + 1).padStart(2, '0')}${String(birthDate.getDate()).padStart(2, '0')}`;\n\tconst seq = String(sequence).padStart(3, '0');\n\tconst major = `${addressCode}${date}${seq}`;\n\tconst check =\n\t\ttypeof checkDigit === 'number'\n\t\t\t? checkDigit === 10\n\t\t\t\t? 'X'\n\t\t\t\t: String(checkDigit)\n\t\t\t: checkDigit?.toUpperCase() || Mod11.compute(major);\n\treturn `${major}${check}`;\n}\n\nexport namespace ChineseResidentIdNo {\n\texport const regex = ChineseResidentIdNoRegex;\n\texport const parse = parseChineseResidentIdNo;\n\texport const format = formatChineseResidentIdNo;\n\texport type Result = ParsedChineseResidentIdNo;\n\texport const ResultSchema = ParsedChineseResidentIdNoSchema;\n}\n"],"names":["z","SexType","SexTypeSchema","Mod11","ChineseResidentIdNoRegex","ParsedChineseResidentIdNoSchema","object","raw","string","regex","describe","addressCode","length","birthDate","iso","date","sequence","int","max","min","checkDigit","sex","age","number","optional","valid","boolean","parseChineseResidentIdNo","idNo","reg","match","groups","undefined","division","year","month","day","seq","parseInt","toUpperCase","Male","Female","Date","getFullYear","validate","formatChineseResidentIdNo","replace","String","getMonth","padStart","getDate","major","check","compute","ChineseResidentIdNo","parse","format","ResultSchema"],"mappings":"AAAA,SAASA,CAAC,QAAQ,SAAS;AAC3B,SAASC,OAAO,EAAEC,aAAa,QAAQ,uBAAuB;AAC9D,SAASC,KAAK,QAAQ,UAAU;AAEhC,OAAO,MAAMC,2BACZ,8IAA8I;AAG/I,OAAO,MAAMC,kCAAkCL,EAC7CM,MAAM,CAAC;IACPC,KAAKP,EAAEQ,MAAM,GAAGC,KAAK,CAACL,0BAA0B,iBAAiBM,QAAQ,CAAC;IAC1EC,aAAaX,EAAEQ,MAAM,GAAGI,MAAM,CAAC,GAAGF,QAAQ,CAAC;IAC3CG,WAAWb,EAAEc,GAAG,CAACC,IAAI,GAAGL,QAAQ,CAAC;IACjCM,UAAUhB,EAAEiB,GAAG,GAAGC,GAAG,CAAC,KAAKC,GAAG,CAAC,GAAGT,QAAQ,CAAC;IAC3CU,YAAYpB,EAAEiB,GAAG,GAAGE,GAAG,CAAC,GAAGD,GAAG,CAAC,IAAIR,QAAQ,CAAC;IAC5CW,KAAKnB,cAAcQ,QAAQ,CAAC;IAC5BY,KAAKtB,EAAEuB,MAAM,GAAGC,QAAQ;IACxBC,OAAOzB,EAAE0B,OAAO,GAAGF,QAAQ,GAAGd,QAAQ,CAAC;AACxC,GACCA,QAAQ,CAAC,eAAe;AAE1B,OAAO,SAASiB,yBAAyBC,IAAY;IACpD,MAAMC,MAAMzB;IACZ,MAAM0B,QAAQF,KAAKE,KAAK,CAACD;IACzB,IAAI,CAACC,SAAS,CAACA,MAAMC,MAAM,EAAE;QAC5B,OAAOC;IACR;IACA,MAAM,EAAEC,QAAQ,EAAEC,IAAI,EAAEC,KAAK,EAAEC,GAAG,EAAEpB,QAAQ,EAAEI,UAAU,EAAE,GAAGU,MAAMC,MAAM;IACzE,IAAIM,MAAMC,SAAStB,UAAU;IAC7B,OAAO;QACNT,KAAKqB;QACLjB,aAAasB;QACbpB,WAAW,GAAGqB,KAAK,CAAC,EAAEC,MAAM,CAAC,EAAEC,KAAK;QACpCpB,UAAUqB;QACVjB,YAAYA,WAAWmB,WAAW,OAAO,MAAM,KAAKD,SAASlB;QAC7DC,KAAKgB,MAAM,MAAM,IAAIpC,QAAQuC,IAAI,GAAGvC,QAAQwC,MAAM;QAClDnB,KAAK,IAAIoB,OAAOC,WAAW,KAAKL,SAASJ,MAAM;QAC/CT,OAAOtB,MAAMyC,QAAQ,CAAChB;IACvB;AACD;AAEA,OAAO,SAASiB,0BAA0B,EACzClC,WAAW,EACXE,SAAS,EACTG,QAAQ,EACRI,UAAU,EAMV;IACA,MAAML,OACL,OAAOF,cAAc,WAClBA,UAAUiC,OAAO,CAAC,MAAM,MACxB,GAAGjC,UAAU8B,WAAW,KAAKI,OAAOlC,UAAUmC,QAAQ,KAAK,GAAGC,QAAQ,CAAC,GAAG,OAAOF,OAAOlC,UAAUqC,OAAO,IAAID,QAAQ,CAAC,GAAG,MAAM;IACnI,MAAMZ,MAAMU,OAAO/B,UAAUiC,QAAQ,CAAC,GAAG;IACzC,MAAME,QAAQ,GAAGxC,cAAcI,OAAOsB,KAAK;IAC3C,MAAMe,QACL,OAAOhC,eAAe,WACnBA,eAAe,KACd,MACA2B,OAAO3B,cACRA,YAAYmB,iBAAiBpC,MAAMkD,OAAO,CAACF;IAC/C,OAAO,GAAGA,QAAQC,OAAO;AAC1B;UAEiBE;wBACH7C,QAAQL;wBACRmD,QAAQ5B;wBACR6B,SAASX;wBAETY,eAAepD;AAC7B,GANiBiD,wBAAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { ChineseResidentIdNoRegex as regex, parseChineseResidentIdNo as parse, formatChineseResidentIdNo as format, ParsedChineseResidentIdNoSchema as ResultSchema } from "./ChineseResidentIdNo.js";
|
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
import { describe, expect, it } from "vitest";
|
|
2
|
-
import {
|
|
3
|
-
describe("
|
|
2
|
+
import { ChineseResidentIdNo } from "./index.js";
|
|
3
|
+
describe("ChineseResidentIdNo", function () {
|
|
4
4
|
it("should parse", function () {
|
|
5
5
|
for (var _i = 0, _iter = [
|
|
6
6
|
"11010519491231002X"
|
|
7
7
|
]; _i < _iter.length; _i++) {
|
|
8
8
|
var a = _iter[_i];
|
|
9
|
-
var out =
|
|
10
|
-
expect(
|
|
9
|
+
var out = ChineseResidentIdNo.parse(a);
|
|
10
|
+
expect(out).toBeTruthy();
|
|
11
|
+
expect(ChineseResidentIdNo.format(out)).toBe(a);
|
|
11
12
|
expect(out).toMatchSnapshot();
|
|
12
13
|
}
|
|
13
14
|
});
|
|
14
15
|
it("should format with partial", function () {
|
|
15
|
-
expect(
|
|
16
|
-
|
|
16
|
+
expect(ChineseResidentIdNo.format({
|
|
17
|
+
addressCode: "110105",
|
|
17
18
|
birthDate: new Date("1949-12-31"),
|
|
18
19
|
sequence: 2
|
|
19
20
|
})).toBe("11010519491231002X");
|