typia 13.1.1 → 13.2.0
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/README.md +3 -0
- package/lib/_virtual/_rolldown/runtime.mjs +1 -5
- package/lib/executable/FileSystemIdentity.d.ts +44 -0
- package/lib/executable/FileSystemIdentity.js +213 -0
- package/lib/executable/FileSystemIdentity.js.map +1 -0
- package/lib/executable/FileSystemIdentity.mjs +133 -0
- package/lib/executable/FileSystemIdentity.mjs.map +1 -0
- package/lib/executable/TypiaGenerateWizard.js +272 -106
- package/lib/executable/TypiaGenerateWizard.js.map +1 -1
- package/lib/executable/TypiaGenerateWizard.mjs +239 -95
- package/lib/executable/TypiaGenerateWizard.mjs.map +1 -1
- package/lib/functional.d.ts +15 -12
- package/lib/functional.js.map +1 -1
- package/lib/functional.mjs.map +1 -1
- package/lib/internal/_ProtobufReader.d.ts +32 -0
- package/lib/internal/_ProtobufReader.js +148 -48
- package/lib/internal/_ProtobufReader.js.map +1 -1
- package/lib/internal/_ProtobufReader.mjs +137 -41
- package/lib/internal/_ProtobufReader.mjs.map +1 -1
- package/lib/internal/_createStandardSchema.js +18 -1
- package/lib/internal/_createStandardSchema.js.map +1 -1
- package/lib/internal/_createStandardSchema.mjs +12 -1
- package/lib/internal/_createStandardSchema.mjs.map +1 -1
- package/lib/internal/_decimal.d.ts +14 -0
- package/lib/internal/_decimal.js +61 -0
- package/lib/internal/_decimal.js.map +1 -0
- package/lib/internal/_decimal.mjs +49 -0
- package/lib/internal/_decimal.mjs.map +1 -0
- package/lib/internal/_httpQueryParseURLSearchParams.js +23 -2
- package/lib/internal/_httpQueryParseURLSearchParams.js.map +1 -1
- package/lib/internal/_httpQueryParseURLSearchParams.mjs +20 -2
- package/lib/internal/_httpQueryParseURLSearchParams.mjs.map +1 -1
- package/lib/internal/_isFormatByte.js +2 -5
- package/lib/internal/_isFormatByte.js.map +1 -1
- package/lib/internal/_isFormatByte.mjs +2 -5
- package/lib/internal/_isFormatByte.mjs.map +1 -1
- package/lib/internal/_isFormatDate.js +15 -2
- package/lib/internal/_isFormatDate.js.map +1 -1
- package/lib/internal/_isFormatDate.mjs +22 -2
- package/lib/internal/_isFormatDate.mjs.map +1 -1
- package/lib/internal/_isFormatDateTime.js +21 -2
- package/lib/internal/_isFormatDateTime.js.map +1 -1
- package/lib/internal/_isFormatDateTime.mjs +13 -2
- package/lib/internal/_isFormatDateTime.mjs.map +1 -1
- package/lib/internal/_isFormatIri.js +3 -2
- package/lib/internal/_isFormatIri.js.map +1 -1
- package/lib/internal/_isFormatIri.mjs +3 -2
- package/lib/internal/_isFormatIri.mjs.map +1 -1
- package/lib/internal/_isFormatIriReference.js +10 -2
- package/lib/internal/_isFormatIriReference.js.map +1 -1
- package/lib/internal/_isFormatIriReference.mjs +9 -2
- package/lib/internal/_isFormatIriReference.mjs.map +1 -1
- package/lib/internal/_isFormatUriReference.js +1 -1
- package/lib/internal/_isFormatUriReference.js.map +1 -1
- package/lib/internal/_isFormatUriReference.mjs +1 -1
- package/lib/internal/_isFormatUriReference.mjs.map +1 -1
- package/lib/internal/_isMultipleOf.d.ts +1 -0
- package/lib/internal/_isMultipleOf.js +13 -0
- package/lib/internal/_isMultipleOf.js.map +1 -0
- package/lib/internal/_isMultipleOf.mjs +12 -0
- package/lib/internal/_isMultipleOf.mjs.map +1 -0
- package/lib/internal/_isTypeFloat.js +1 -1
- package/lib/internal/_isTypeFloat.js.map +1 -1
- package/lib/internal/_isTypeFloat.mjs +1 -1
- package/lib/internal/_isTypeFloat.mjs.map +1 -1
- package/lib/internal/_isTypeInt64.js +1 -0
- package/lib/internal/_isTypeInt64.js.map +1 -1
- package/lib/internal/_isTypeInt64.mjs.map +1 -1
- package/lib/internal/_isTypeInt64Bigint.d.ts +1 -0
- package/lib/internal/_isTypeInt64Bigint.js +15 -0
- package/lib/internal/_isTypeInt64Bigint.js.map +1 -0
- package/lib/internal/_isTypeInt64Bigint.mjs +8 -0
- package/lib/internal/_isTypeInt64Bigint.mjs.map +1 -0
- package/lib/internal/_isTypeUint64.js +1 -0
- package/lib/internal/_isTypeUint64.js.map +1 -1
- package/lib/internal/_isTypeUint64.mjs.map +1 -1
- package/lib/internal/_isTypeUint64Bigint.d.ts +1 -0
- package/lib/internal/_isTypeUint64Bigint.js +10 -0
- package/lib/internal/_isTypeUint64Bigint.js.map +1 -0
- package/lib/internal/_isTypeUint64Bigint.mjs +8 -0
- package/lib/internal/_isTypeUint64Bigint.mjs.map +1 -0
- package/lib/internal/_isUniqueItems.js +96 -109
- package/lib/internal/_isUniqueItems.js.map +1 -1
- package/lib/internal/_isUniqueItems.mjs +62 -50
- package/lib/internal/_isUniqueItems.mjs.map +1 -1
- package/lib/internal/_jsonStringifyArray.d.ts +1 -0
- package/lib/internal/_jsonStringifyArray.js +48 -0
- package/lib/internal/_jsonStringifyArray.js.map +1 -0
- package/lib/internal/_jsonStringifyArray.mjs +40 -0
- package/lib/internal/_jsonStringifyArray.mjs.map +1 -0
- package/lib/internal/_jsonStringifyElement.d.ts +1 -0
- package/lib/internal/_jsonStringifyElement.js +23 -0
- package/lib/internal/_jsonStringifyElement.js.map +1 -0
- package/lib/internal/_jsonStringifyElement.mjs +23 -0
- package/lib/internal/_jsonStringifyElement.mjs.map +1 -0
- package/lib/internal/_jsonStringifyProperty.d.ts +1 -0
- package/lib/internal/_jsonStringifyProperty.js +31 -0
- package/lib/internal/_jsonStringifyProperty.js.map +1 -0
- package/lib/internal/_jsonStringifyProperty.mjs +31 -0
- package/lib/internal/_jsonStringifyProperty.mjs.map +1 -0
- package/lib/internal/_llmApplicationFinalize.js +1 -1
- package/lib/internal/_llmApplicationFinalize.js.map +1 -1
- package/lib/internal/_llmApplicationFinalize.mjs +1 -1
- package/lib/internal/_llmApplicationFinalize.mjs.map +1 -1
- package/lib/internal/_notationAny.js +8 -1
- package/lib/internal/_notationAny.js.map +1 -1
- package/lib/internal/_notationAny.mjs +7 -1
- package/lib/internal/_notationAny.mjs.map +1 -1
- package/lib/internal/_notationAssign.d.ts +1 -0
- package/lib/internal/_notationAssign.js +18 -0
- package/lib/internal/_notationAssign.js.map +1 -0
- package/lib/internal/_notationAssign.mjs +17 -0
- package/lib/internal/_notationAssign.mjs.map +1 -0
- package/lib/internal/_notationCamel.js +30 -9
- package/lib/internal/_notationCamel.js.map +1 -1
- package/lib/internal/_notationCamel.mjs +13 -5
- package/lib/internal/_notationCamel.mjs.map +1 -1
- package/lib/internal/_notationKebab.d.ts +1 -0
- package/lib/internal/_notationKebab.js +15 -0
- package/lib/internal/_notationKebab.js.map +1 -0
- package/lib/internal/_notationKebab.mjs +15 -0
- package/lib/internal/_notationKebab.mjs.map +1 -0
- package/lib/internal/_notationKeyCollision.d.ts +1 -0
- package/lib/internal/_notationKeyCollision.js +8 -0
- package/lib/internal/_notationKeyCollision.js.map +1 -0
- package/lib/internal/_notationKeyCollision.mjs +8 -0
- package/lib/internal/_notationKeyCollision.mjs.map +1 -0
- package/lib/internal/_notationPascal.js +20 -5
- package/lib/internal/_notationPascal.js.map +1 -1
- package/lib/internal/_notationPascal.mjs +10 -5
- package/lib/internal/_notationPascal.mjs.map +1 -1
- package/lib/internal/_notationSnake.js +25 -22
- package/lib/internal/_notationSnake.js.map +1 -1
- package/lib/internal/_notationSnake.mjs +11 -11
- package/lib/internal/_notationSnake.mjs.map +1 -1
- package/lib/internal/_plainCloneAny.js +174 -38
- package/lib/internal/_plainCloneAny.js.map +1 -1
- package/lib/internal/_plainCloneAny.mjs +126 -22
- package/lib/internal/_plainCloneAny.mjs.map +1 -1
- package/lib/internal/_randomArray.d.ts +1 -1
- package/lib/internal/_randomArray.js +11 -4
- package/lib/internal/_randomArray.js.map +1 -1
- package/lib/internal/_randomArray.mjs +9 -3
- package/lib/internal/_randomArray.mjs.map +1 -1
- package/lib/internal/_randomFormatByte.d.ts +2 -1
- package/lib/internal/_randomFormatByte.js +25 -1
- package/lib/internal/_randomFormatByte.js.map +1 -1
- package/lib/internal/_randomFormatByte.mjs +20 -1
- package/lib/internal/_randomFormatByte.mjs.map +1 -1
- package/lib/internal/_randomFormatDate.d.ts +3 -4
- package/lib/internal/_randomFormatDate.js +3 -10
- package/lib/internal/_randomFormatDate.js.map +1 -1
- package/lib/internal/_randomFormatDate.mjs +3 -6
- package/lib/internal/_randomFormatDate.mjs.map +1 -1
- package/lib/internal/_randomFormatDatetime.d.ts +3 -4
- package/lib/internal/_randomFormatDatetime.js +26 -8
- package/lib/internal/_randomFormatDatetime.js.map +1 -1
- package/lib/internal/_randomFormatDatetime.mjs +17 -6
- package/lib/internal/_randomFormatDatetime.mjs.map +1 -1
- package/lib/internal/_randomFormatDuration.d.ts +2 -1
- package/lib/internal/_randomFormatDuration.js +23 -14
- package/lib/internal/_randomFormatDuration.js.map +1 -1
- package/lib/internal/_randomFormatDuration.mjs +22 -13
- package/lib/internal/_randomFormatDuration.mjs.map +1 -1
- package/lib/internal/_randomFormatEmail.d.ts +2 -1
- package/lib/internal/_randomFormatEmail.js +8 -1
- package/lib/internal/_randomFormatEmail.js.map +1 -1
- package/lib/internal/_randomFormatEmail.mjs +5 -1
- package/lib/internal/_randomFormatEmail.mjs.map +1 -1
- package/lib/internal/_randomFormatHostname.d.ts +8 -1
- package/lib/internal/_randomFormatHostname.js +45 -2
- package/lib/internal/_randomFormatHostname.js.map +1 -1
- package/lib/internal/_randomFormatHostname.mjs +38 -2
- package/lib/internal/_randomFormatHostname.mjs.map +1 -1
- package/lib/internal/_randomFormatIdnEmail.d.ts +2 -1
- package/lib/internal/_randomFormatIdnEmail.js +16 -2
- package/lib/internal/_randomFormatIdnEmail.js.map +1 -1
- package/lib/internal/_randomFormatIdnEmail.mjs +11 -2
- package/lib/internal/_randomFormatIdnEmail.mjs.map +1 -1
- package/lib/internal/_randomFormatIdnHostname.d.ts +2 -1
- package/lib/internal/_randomFormatIdnHostname.js +26 -1
- package/lib/internal/_randomFormatIdnHostname.js.map +1 -1
- package/lib/internal/_randomFormatIdnHostname.mjs +25 -2
- package/lib/internal/_randomFormatIdnHostname.mjs.map +1 -1
- package/lib/internal/_randomFormatIpv4.d.ts +2 -1
- package/lib/internal/_randomFormatIpv4.js +32 -1
- package/lib/internal/_randomFormatIpv4.js.map +1 -1
- package/lib/internal/_randomFormatIpv4.mjs +23 -1
- package/lib/internal/_randomFormatIpv4.mjs.map +1 -1
- package/lib/internal/_randomFormatIpv6.d.ts +2 -1
- package/lib/internal/_randomFormatIpv6.js +58 -1
- package/lib/internal/_randomFormatIpv6.js.map +1 -1
- package/lib/internal/_randomFormatIpv6.mjs +45 -1
- package/lib/internal/_randomFormatIpv6.mjs.map +1 -1
- package/lib/internal/_randomFormatIri.d.ts +2 -1
- package/lib/internal/_randomFormatIri.js +1 -1
- package/lib/internal/_randomFormatIri.js.map +1 -1
- package/lib/internal/_randomFormatIri.mjs +1 -1
- package/lib/internal/_randomFormatIri.mjs.map +1 -1
- package/lib/internal/_randomFormatIriReference.d.ts +2 -1
- package/lib/internal/_randomFormatIriReference.js +1 -1
- package/lib/internal/_randomFormatIriReference.js.map +1 -1
- package/lib/internal/_randomFormatIriReference.mjs +1 -1
- package/lib/internal/_randomFormatIriReference.mjs.map +1 -1
- package/lib/internal/_randomFormatJsonPointer.d.ts +2 -1
- package/lib/internal/_randomFormatJsonPointer.js +20 -1
- package/lib/internal/_randomFormatJsonPointer.js.map +1 -1
- package/lib/internal/_randomFormatJsonPointer.mjs +15 -1
- package/lib/internal/_randomFormatJsonPointer.mjs.map +1 -1
- package/lib/internal/_randomFormatPassword.d.ts +2 -1
- package/lib/internal/_randomFormatPassword.js +7 -5
- package/lib/internal/_randomFormatPassword.js.map +1 -1
- package/lib/internal/_randomFormatPassword.mjs +5 -1
- package/lib/internal/_randomFormatPassword.mjs.map +1 -1
- package/lib/internal/_randomFormatRegex.d.ts +2 -1
- package/lib/internal/_randomFormatRegex.js +15 -1
- package/lib/internal/_randomFormatRegex.js.map +1 -1
- package/lib/internal/_randomFormatRegex.mjs +14 -1
- package/lib/internal/_randomFormatRegex.mjs.map +1 -1
- package/lib/internal/_randomFormatRelativeJsonPointer.d.ts +2 -1
- package/lib/internal/_randomFormatRelativeJsonPointer.js +20 -5
- package/lib/internal/_randomFormatRelativeJsonPointer.js.map +1 -1
- package/lib/internal/_randomFormatRelativeJsonPointer.mjs +21 -5
- package/lib/internal/_randomFormatRelativeJsonPointer.mjs.map +1 -1
- package/lib/internal/_randomFormatTime.d.ts +2 -1
- package/lib/internal/_randomFormatTime.js +34 -7
- package/lib/internal/_randomFormatTime.js.map +1 -1
- package/lib/internal/_randomFormatTime.mjs +37 -4
- package/lib/internal/_randomFormatTime.mjs.map +1 -1
- package/lib/internal/_randomFormatUri.d.ts +2 -1
- package/lib/internal/_randomFormatUri.js +1 -1
- package/lib/internal/_randomFormatUri.js.map +1 -1
- package/lib/internal/_randomFormatUri.mjs +1 -1
- package/lib/internal/_randomFormatUri.mjs.map +1 -1
- package/lib/internal/_randomFormatUriReference.d.ts +2 -1
- package/lib/internal/_randomFormatUriReference.js +1 -1
- package/lib/internal/_randomFormatUriReference.js.map +1 -1
- package/lib/internal/_randomFormatUriReference.mjs +1 -1
- package/lib/internal/_randomFormatUriReference.mjs.map +1 -1
- package/lib/internal/_randomFormatUriTemplate.d.ts +2 -1
- package/lib/internal/_randomFormatUriTemplate.js +1 -1
- package/lib/internal/_randomFormatUriTemplate.js.map +1 -1
- package/lib/internal/_randomFormatUriTemplate.mjs +1 -1
- package/lib/internal/_randomFormatUriTemplate.mjs.map +1 -1
- package/lib/internal/_randomFormatUrl.d.ts +2 -1
- package/lib/internal/_randomFormatUrl.js +21 -1
- package/lib/internal/_randomFormatUrl.js.map +1 -1
- package/lib/internal/_randomFormatUrl.mjs +18 -1
- package/lib/internal/_randomFormatUrl.mjs.map +1 -1
- package/lib/internal/_randomFormatUuid.d.ts +2 -1
- package/lib/internal/_randomFormatUuid.js +3 -2
- package/lib/internal/_randomFormatUuid.js.map +1 -1
- package/lib/internal/_randomFormatUuid.mjs +3 -2
- package/lib/internal/_randomFormatUuid.mjs.map +1 -1
- package/lib/internal/_randomInteger.js +59 -28
- package/lib/internal/_randomInteger.js.map +1 -1
- package/lib/internal/_randomInteger.mjs +56 -16
- package/lib/internal/_randomInteger.mjs.map +1 -1
- package/lib/internal/_randomMultiple.d.ts +8 -0
- package/lib/internal/_randomMultiple.js +168 -0
- package/lib/internal/_randomMultiple.js.map +1 -0
- package/lib/internal/_randomMultiple.mjs +158 -0
- package/lib/internal/_randomMultiple.mjs.map +1 -0
- package/lib/internal/_randomNumber.js +42 -42
- package/lib/internal/_randomNumber.js.map +1 -1
- package/lib/internal/_randomNumber.mjs +41 -27
- package/lib/internal/_randomNumber.mjs.map +1 -1
- package/lib/internal/_randomPattern.d.ts +2 -1
- package/lib/internal/_randomPattern.js +19 -4
- package/lib/internal/_randomPattern.js.map +1 -1
- package/lib/internal/_randomPattern.mjs +10 -4
- package/lib/internal/_randomPattern.mjs.map +1 -1
- package/lib/internal/_randomStringLength.d.ts +64 -0
- package/lib/internal/_randomStringLength.js +84 -0
- package/lib/internal/_randomStringLength.js.map +1 -0
- package/lib/internal/_randomStringLength.mjs +79 -0
- package/lib/internal/_randomStringLength.mjs.map +1 -0
- package/lib/internal/_stringLength.d.ts +1 -0
- package/lib/internal/_stringLength.js +11 -0
- package/lib/internal/_stringLength.js.map +1 -0
- package/lib/internal/_stringLength.mjs +10 -0
- package/lib/internal/_stringLength.mjs.map +1 -0
- package/lib/internal/_validateReport.js +4 -1
- package/lib/internal/_validateReport.js.map +1 -1
- package/lib/internal/_validateReport.mjs +2 -1
- package/lib/internal/_validateReport.mjs.map +1 -1
- package/lib/internal/private/__notationRename.d.ts +14 -0
- package/lib/internal/private/__notationRename.js +25 -0
- package/lib/internal/private/__notationRename.js.map +1 -0
- package/lib/internal/private/__notationRename.mjs +24 -0
- package/lib/internal/private/__notationRename.mjs.map +1 -0
- package/lib/internal/private/__randomComposition.d.ts +23 -0
- package/lib/internal/private/__randomComposition.js +48 -0
- package/lib/internal/private/__randomComposition.js.map +1 -0
- package/lib/internal/private/__randomComposition.mjs +54 -0
- package/lib/internal/private/__randomComposition.mjs.map +1 -0
- package/lib/internal/private/__randomEpoch.d.ts +19 -0
- package/lib/internal/private/__randomEpoch.js +31 -0
- package/lib/internal/private/__randomEpoch.js.map +1 -0
- package/lib/internal/private/__randomEpoch.mjs +28 -0
- package/lib/internal/private/__randomEpoch.mjs.map +1 -0
- package/lib/json.d.ts +2 -2
- package/lib/json.mjs.map +1 -1
- package/lib/module.d.ts +2 -2
- package/lib/module.js.map +1 -1
- package/lib/module.mjs.map +1 -1
- package/lib/notations.d.ts +20 -4
- package/lib/notations.js.map +1 -1
- package/lib/notations.mjs.map +1 -1
- package/native/adapter/plugin_options.go +117 -0
- package/native/adapter/plugin_options_payload_matrix_test.go +181 -0
- package/native/cmd/ttsc-typia/any_array_type_tags_transform_test.go +63 -9
- package/native/cmd/ttsc-typia/assert_guard_factory_contract_test.go +152 -0
- package/native/cmd/ttsc-typia/build.go +84 -64
- package/native/cmd/ttsc-typia/build_no_emit_preserves_analysis_options_test.go +67 -0
- package/native/cmd/ttsc-typia/build_no_emit_transform_diagnostics_test.go +138 -0
- package/native/cmd/ttsc-typia/build_plugin_options_come_from_payload_test.go +48 -0
- package/native/cmd/ttsc-typia/build_transactional_emit_success_test.go +81 -0
- package/native/cmd/ttsc-typia/build_transform_failure_atomicity_test.go +138 -0
- package/native/cmd/ttsc-typia/callable_interface_function_semantics_transform_test.go +331 -0
- package/native/cmd/ttsc-typia/callable_type_literal_boundaries_transform_test.go +1184 -0
- package/native/cmd/ttsc-typia/command_routes_and_diagnostics_coverage_test.go +3 -1
- package/native/cmd/ttsc-typia/compare_functional_union_membership_transform_test.go +434 -0
- package/native/cmd/ttsc-typia/compare_less_nan_transform_test.go +98 -0
- package/native/cmd/ttsc-typia/compare_native_object_overmatch_transform_test.go +161 -0
- package/native/cmd/ttsc-typia/compare_nondiscriminable_union_transform_test.go +343 -0
- package/native/cmd/ttsc-typia/compare_template_literal_union_transform_test.go +241 -0
- package/native/cmd/ttsc-typia/compare_union_discrimination_transform_test.go +289 -0
- package/native/cmd/ttsc-typia/default_library_spoof_native_identity_transform_test.go +216 -0
- package/native/cmd/ttsc-typia/escaped_property_key_path_transform_test.go +193 -0
- package/native/cmd/ttsc-typia/finite_option_number_leaf_transform_test.go +240 -0
- package/native/cmd/ttsc-typia/functional_promised_type_transform_test.go +220 -0
- package/native/cmd/ttsc-typia/functional_receiver_transform_test.go +232 -0
- package/native/cmd/ttsc-typia/is_object_function_member_transform_test.go +205 -0
- package/native/cmd/ttsc-typia/json_application_alias_function_validation_transform_test.go +151 -0
- package/native/cmd/ttsc-typia/json_is_stringify_finite_number_transform_test.go +198 -0
- package/native/cmd/ttsc-typia/json_schema_dynamic_key_determinism_transform_test.go +246 -0
- package/native/cmd/ttsc-typia/json_stringify_contextual_undefined_transform_test.go +556 -0
- package/native/cmd/ttsc-typia/json_stringify_special_key_transform_test.go +238 -0
- package/native/cmd/ttsc-typia/lib_replacement_native_identity_transform_test.go +277 -0
- package/native/cmd/ttsc-typia/main_wasm.go +21 -2
- package/native/cmd/ttsc-typia/native_collection_identity_is_transform_test.go +234 -0
- package/native/cmd/ttsc-typia/native_generic_name_guard_is_transform_test.go +194 -0
- package/native/cmd/ttsc-typia/native_name_collision_is_transform_test.go +204 -0
- package/native/cmd/ttsc-typia/native_named_intersection_union_transform_test.go +390 -0
- package/native/cmd/ttsc-typia/node_buffer_native_exports_is_transform_test.go +526 -0
- package/native/cmd/ttsc-typia/non_trailing_rest_tuple_transform_test.go +23 -11
- package/native/cmd/ttsc-typia/notation_dynamic_keys_transform_test.go +286 -0
- package/native/cmd/ttsc-typia/notation_kebab_case_transform_test.go +1 -1
- package/native/cmd/ttsc-typia/notation_literal_collision_transform_test.go +164 -0
- package/native/cmd/ttsc-typia/notation_pascal_case_transform_test.go +230 -0
- package/native/cmd/ttsc-typia/notation_unicode_key_transform_test.go +309 -0
- package/native/cmd/ttsc-typia/package_declaration_native_identity_is_transform_test.go +293 -0
- package/native/cmd/ttsc-typia/pattern_line_terminator_escape_transform_test.go +224 -0
- package/native/cmd/ttsc-typia/plain_prune_union_object_overmatch_transform_test.go +219 -0
- package/native/cmd/ttsc-typia/plugin_options_payload_helpers_test.go +181 -0
- package/native/cmd/ttsc-typia/private_field_filter_is_transform_test.go +278 -0
- package/native/cmd/ttsc-typia/project_catalog_transform_coverage_test.go +73 -27
- package/native/cmd/ttsc-typia/project_dependencies_barrel_reexport_transform_test.go +120 -0
- package/native/cmd/ttsc-typia/project_dependencies_collapsed_alias_transform_test.go +134 -0
- package/native/cmd/ttsc-typia/project_dependencies_custom_lib_name_transform_test.go +135 -0
- package/native/cmd/ttsc-typia/project_dependencies_default_barrel_transform_test.go +114 -0
- package/native/cmd/ttsc-typia/project_dependencies_empty_heritage_transform_test.go +100 -0
- package/native/cmd/ttsc-typia/project_dependencies_envelope_transform_test.go +148 -0
- package/native/cmd/ttsc-typia/project_dependencies_index_signature_alias_transform_test.go +139 -0
- package/native/cmd/ttsc-typia/project_dependencies_local_reexport_transform_test.go +122 -0
- package/native/cmd/ttsc-typia/project_dependencies_signature_alias_transform_test.go +125 -0
- package/native/cmd/ttsc-typia/project_dependencies_star_barrel_transform_test.go +112 -0
- package/native/cmd/ttsc-typia/project_reference_graph_envelope_transform_test.go +190 -0
- package/native/cmd/ttsc-typia/protobuf_diagnostic_code_transform_test.go +167 -0
- package/native/cmd/ttsc-typia/protobuf_is_encode_finite_number_transform_test.go +98 -0
- package/native/cmd/ttsc-typia/protobuf_sequence_field_numbers_transform_test.go +52 -22
- package/native/cmd/ttsc-typia/symbol_index_domain_transform_test.go +316 -0
- package/native/cmd/ttsc-typia/symbol_key_member_filter_transform_test.go +279 -0
- package/native/cmd/ttsc-typia/template_interpolation_type_tags_transform_test.go +86 -23
- package/native/cmd/ttsc-typia/template_literal_type_tags_transform_test.go +3 -1
- package/native/cmd/ttsc-typia/transform.go +251 -39
- package/native/cmd/ttsc-typia/{transform_declaration_source_produces_no_js_test.go → transform_declaration_source_produces_no_javascript_test.go} +10 -2
- package/native/cmd/ttsc-typia/transform_fixtures_emit_coverage_test.go +21 -4
- package/native/cmd/ttsc-typia/transform_helpers_test.go +236 -3
- package/native/cmd/ttsc-typia/transform_plugin_options_come_from_payload_test.go +43 -0
- package/native/cmd/ttsc-typia/transform_single_file_failure_atomicity_test.go +114 -0
- package/native/cmd/ttsc-typia/transform_single_file_failure_writes_no_stdout_test.go +43 -0
- package/native/cmd/ttsc-typia/transform_single_file_js_distinguishes_same_basename_sources_test.go +81 -0
- package/native/cmd/ttsc-typia/transform_single_file_js_empty_emit_reports_no_output_test.go +100 -0
- package/native/cmd/ttsc-typia/transform_single_file_js_locates_output_across_layouts_test.go +160 -0
- package/native/cmd/ttsc-typia/transform_single_file_success_publishes_artifact_test.go +54 -0
- package/native/cmd/ttsc-typia/transform_wasm_host_argv_reports_diagnostics_test.go +39 -0
- package/native/cmd/ttsc-typia/tuple_optional_compare_clone_transform_test.go +227 -0
- package/native/cmd/ttsc-typia/user_global_native_identity_transform_test.go +484 -0
- package/native/core/factories/FormatCheatSheet.go +40 -7
- package/native/core/factories/IdentifierFactory.go +131 -4
- package/native/core/factories/MetadataCommentTagFactory.go +83 -40
- package/native/core/factories/MetadataTypeTagFactory.go +13 -1
- package/native/core/factories/NumericRangeFactory.go +60 -17
- package/native/core/factories/ProtobufFactory.go +13 -5
- package/native/core/factories/factory_utility_coverage_test.go +8 -2
- package/native/core/factories/format_alias_resolves_to_cheat_sheet_test.go +57 -0
- package/native/core/factories/format_alias_table_targets_the_cheat_sheet_test.go +44 -0
- package/native/core/factories/identifier_factory_postfix_escapes_every_key_test.go +147 -0
- package/native/core/factories/identifier_factory_postfix_survives_every_code_point_test.go +86 -0
- package/native/core/factories/internal/metadata/MetadataHelper.go +226 -17
- package/native/core/factories/internal/metadata/emplace_metadata_object.go +141 -8
- package/native/core/factories/internal/metadata/iterate_metadata.go +6 -0
- package/native/core/factories/internal/metadata/iterate_metadata_function.go +5 -12
- package/native/core/factories/internal/metadata/iterate_metadata_intersection.go +111 -29
- package/native/core/factories/internal/metadata/iterate_metadata_map.go +5 -0
- package/native/core/factories/internal/metadata/iterate_metadata_native.go +45 -2
- package/native/core/factories/internal/metadata/iterate_metadata_set.go +5 -0
- package/native/core/factories/internal/metadata/type_arguments_precondition_test.go +70 -0
- package/native/core/factories/metadata_comment_tag_factory_coverage_test.go +39 -0
- package/native/core/factories/metadata_comment_tag_factory_exclusivity_matches_interface_test.go +84 -0
- package/native/core/factories/metadata_type_tag_factory_accepts_legal_tag_combinations_test.go +60 -0
- package/native/core/factories/metadata_type_tag_factory_declarations_test.go +86 -0
- package/native/core/factories/metadata_type_tag_factory_keeps_bool_form_exclusivity_test.go +38 -0
- package/native/core/factories/metadata_type_tag_factory_rejects_cross_kind_exclusive_tags_test.go +65 -0
- package/native/core/factories/metadata_type_tag_factory_rejects_duplicated_array_form_tags_test.go +41 -0
- package/native/core/factories/numeric_range_factory_enforces_64bit_bounds_test.go +69 -0
- package/native/core/factories/protobuf_recovery_ownership_test.go +64 -0
- package/native/core/programmers/IsProgrammer.go +15 -1
- package/native/core/programmers/RandomProgrammer.go +51 -14
- package/native/core/programmers/compare/CompareEqualProgrammer.go +410 -8
- package/native/core/programmers/compare/CompareLessProgrammer.go +4 -2
- package/native/core/programmers/functional/FunctionalAssertFunctionProgrammer.go +4 -6
- package/native/core/programmers/functional/FunctionalAssertParametersProgrammer.go +5 -13
- package/native/core/programmers/functional/FunctionalAssertReturnProgrammer.go +6 -14
- package/native/core/programmers/functional/FunctionalIsFunctionProgrammer.go +4 -6
- package/native/core/programmers/functional/FunctionalIsParametersProgrammer.go +49 -14
- package/native/core/programmers/functional/FunctionalIsReturnProgrammer.go +5 -13
- package/native/core/programmers/functional/FunctionalValidateFunctionProgrammer.go +4 -6
- package/native/core/programmers/functional/FunctionalValidateParametersProgrammer.go +5 -13
- package/native/core/programmers/functional/FunctionalValidateReturnProgrammer.go +5 -13
- package/native/core/programmers/functional/internal/FunctionalGeneralProgrammer.go +4 -17
- package/native/core/programmers/helpers/CloneJoiner.go +32 -0
- package/native/core/programmers/helpers/FunctionProgrammer.go +6 -13
- package/native/core/programmers/helpers/NotationJoiner.go +86 -28
- package/native/core/programmers/helpers/StringifyJoinder.go +161 -51
- package/native/core/programmers/helpers/UnionExplorer.go +203 -61
- package/native/core/programmers/helpers/joiner_branch_coverage_test.go +116 -118
- package/native/core/programmers/helpers/union_explorer_coverage_test.go +1 -1
- package/native/core/programmers/internal/CheckerProgrammer.go +100 -48
- package/native/core/programmers/iterate/check_template.go +344 -32
- package/native/core/programmers/iterate/iterate_check_coverage_test.go +76 -158
- package/native/core/programmers/iterate/iterate_utility_coverage_test.go +231 -270
- package/native/core/programmers/iterate/json_schema_discriminator.go +36 -10
- package/native/core/programmers/iterate/json_schema_discriminator_declaration_syntax_test.go +205 -0
- package/native/core/programmers/iterate/json_schema_object.go +49 -7
- package/native/core/programmers/iterate/json_schema_pattern_property_order_test.go +44 -0
- package/native/core/programmers/iterate/openapi_v3_downgrader.go +674 -0
- package/native/core/programmers/iterate/openapi_v3_downgrader_boolean_default_test.go +95 -0
- package/native/core/programmers/iterate/openapi_v3_downgrader_test.go +123 -0
- package/native/core/programmers/iterate/template_interpolation_tags_test.go +40 -8
- package/native/core/programmers/iterate/template_runtime_pattern.go +63 -7
- package/native/core/programmers/json/JsonApplicationProgrammer.go +45 -11
- package/native/core/programmers/json/JsonSchemasProgrammer.go +12 -2
- package/native/core/programmers/json/JsonStringifyProgrammer.go +47 -6
- package/native/core/programmers/llm/LlmApplicationProgrammer.go +21 -11
- package/native/core/programmers/llm/LlmSchemaProgrammer.go +23 -6
- package/native/core/programmers/llm/llm_reference_codec_test.go +24 -0
- package/native/core/programmers/notations/NotationGeneralProgrammer.go +183 -67
- package/native/core/programmers/notations/notation_general_helpers_test.go +1 -3
- package/native/core/programmers/notations/notation_general_programmer_pascal_multiword_test.go +72 -0
- package/native/core/programmers/notations/notation_general_programmer_underscore_boundary_test.go +68 -0
- package/native/core/programmers/plain/PlainClassifyProgrammer.go +23 -15
- package/native/core/programmers/plain/PlainCloneProgrammer.go +20 -7
- package/native/core/programmers/plain/PlainPruneProgrammer.go +19 -5
- package/native/core/programmers/plain/plain_tuple_seed_recovery_ownership_test.go +25 -0
- package/native/core/programmers/protobuf/ProtobufDecodeProgrammer.go +37 -28
- package/native/core/programmers/protobuf/ProtobufMessageProgrammer.go +41 -22
- package/native/core/programmers/protobuf/protobuf_programmer_helper_coverage_test.go +26 -0
- package/native/core/programmers/random_programmer_length_argument_test.go +53 -0
- package/native/core/schemas/metadata/MetadataCollection.go +266 -25
- package/native/core/schemas/metadata/MetadataDefaultLibrary.go +81 -0
- package/native/core/schemas/metadata/MetadataDependency.go +388 -0
- package/native/core/schemas/metadata/MetadataObjectType.go +24 -22
- package/native/core/schemas/metadata/metadata_collection_generic_argument_dot_test.go +122 -0
- package/native/core/schemas/metadata/metadata_collection_name_allocation_test.go +147 -0
- package/native/core/schemas/metadata/metadata_collection_openapi_name_cascade_test.go +55 -0
- package/native/core/schemas/metadata/metadata_collection_openapi_name_test.go +68 -0
- package/native/core/utils/PatternUtil.go +13 -0
- package/native/core/utils/PromiseTypeFactory.go +59 -0
- package/native/core/utils/ProtobufNameEncoder.go +8 -0
- package/native/core/utils/promise_type_factory_semantics_test.go +118 -0
- package/native/go.mod +9 -1
- package/native/transform/CallExpressionTransformer.go +12 -0
- package/native/transform/features/json/JsonApplicationTransformer.go +1 -1
- package/native/transform/features/json/JsonSchemaTransformer.go +1 -1
- package/native/transform/features/json/JsonSchemasTransformer.go +5 -4
- package/native/transform/features/protobuf/ProtobufMessageTransformer.go +1 -1
- package/package.json +12 -4
- package/src/executable/FileSystemIdentity.ts +222 -0
- package/src/executable/TypiaGenerateWizard.ts +386 -113
- package/src/functional.ts +30 -60
- package/src/internal/_ProtobufReader.ts +161 -46
- package/src/internal/_createStandardSchema.ts +15 -1
- package/src/internal/_decimal.ts +69 -0
- package/src/internal/_httpQueryParseURLSearchParams.ts +24 -2
- package/src/internal/_isFormatByte.ts +2 -5
- package/src/internal/_isFormatDate.ts +15 -2
- package/src/internal/_isFormatDateTime.ts +28 -2
- package/src/internal/_isFormatIri.ts +5 -2
- package/src/internal/_isFormatIriReference.ts +11 -3
- package/src/internal/_isFormatUriReference.ts +1 -1
- package/src/internal/_isMultipleOf.ts +8 -0
- package/src/internal/_isTypeFloat.ts +1 -1
- package/src/internal/_isTypeInt64.ts +1 -0
- package/src/internal/_isTypeInt64Bigint.ts +12 -0
- package/src/internal/_isTypeUint64.ts +1 -0
- package/src/internal/_isTypeUint64Bigint.ts +7 -0
- package/src/internal/_isUniqueItems.ts +134 -132
- package/src/internal/_jsonStringifyArray.ts +50 -0
- package/src/internal/_jsonStringifyElement.ts +19 -0
- package/src/internal/_jsonStringifyProperty.ts +30 -0
- package/src/internal/_llmApplicationFinalize.ts +6 -1
- package/src/internal/_notationAny.ts +9 -4
- package/src/internal/_notationAssign.ts +20 -0
- package/src/internal/_notationCamel.ts +31 -10
- package/src/internal/_notationKebab.ts +11 -0
- package/src/internal/_notationKeyCollision.ts +9 -0
- package/src/internal/_notationPascal.ts +19 -6
- package/src/internal/_notationSnake.ts +24 -21
- package/src/internal/_plainCloneAny.ts +208 -33
- package/src/internal/_randomArray.ts +13 -4
- package/src/internal/_randomFormatByte.ts +31 -1
- package/src/internal/_randomFormatDate.ts +6 -17
- package/src/internal/_randomFormatDatetime.ts +34 -15
- package/src/internal/_randomFormatDuration.ts +30 -13
- package/src/internal/_randomFormatEmail.ts +8 -2
- package/src/internal/_randomFormatHostname.ts +48 -1
- package/src/internal/_randomFormatIdnEmail.ts +18 -2
- package/src/internal/_randomFormatIdnHostname.ts +34 -2
- package/src/internal/_randomFormatIpv4.ts +43 -2
- package/src/internal/_randomFormatIpv6.ts +67 -2
- package/src/internal/_randomFormatIri.ts +3 -1
- package/src/internal/_randomFormatIriReference.ts +3 -1
- package/src/internal/_randomFormatJsonPointer.ts +28 -2
- package/src/internal/_randomFormatPassword.ts +11 -6
- package/src/internal/_randomFormatRegex.ts +22 -1
- package/src/internal/_randomFormatRelativeJsonPointer.ts +26 -6
- package/src/internal/_randomFormatTime.ts +46 -10
- package/src/internal/_randomFormatUri.ts +3 -1
- package/src/internal/_randomFormatUriReference.ts +3 -1
- package/src/internal/_randomFormatUriTemplate.ts +3 -1
- package/src/internal/_randomFormatUrl.ts +25 -2
- package/src/internal/_randomFormatUuid.ts +10 -6
- package/src/internal/_randomInteger.ts +87 -40
- package/src/internal/_randomMultiple.ts +245 -0
- package/src/internal/_randomNumber.ts +72 -55
- package/src/internal/_randomPattern.ts +29 -4
- package/src/internal/_randomStringLength.ts +116 -0
- package/src/internal/_stringLength.ts +5 -0
- package/src/internal/_validateReport.ts +5 -1
- package/src/internal/private/__notationRename.ts +21 -0
- package/src/internal/private/__randomComposition.ts +50 -0
- package/src/internal/private/__randomEpoch.ts +34 -0
- package/src/json.ts +2 -2
- package/src/module.ts +4 -6
- package/src/notations.ts +20 -4
- package/lib/internal/private/__notationCapitalize.d.ts +0 -1
- package/lib/internal/private/__notationCapitalize.js +0 -6
- package/lib/internal/private/__notationCapitalize.js.map +0 -1
- package/lib/internal/private/__notationCapitalize.mjs +0 -6
- package/lib/internal/private/__notationCapitalize.mjs.map +0 -1
- package/lib/internal/private/__notationUnsnake.d.ts +0 -4
- package/lib/internal/private/__notationUnsnake.js +0 -26
- package/lib/internal/private/__notationUnsnake.js.map +0 -1
- package/lib/internal/private/__notationUnsnake.mjs +0 -15
- package/lib/internal/private/__notationUnsnake.mjs.map +0 -1
- package/native/adapter/visit.go +0 -173
- package/native/adapter/visit_property_chain_edges_test.go +0 -129
- package/native/cmd/ttsc-typia/plugin_options_missing_config_test.go +0 -26
- package/native/cmd/ttsc-typia/plugin_options_undefined_false_test.go +0 -36
- package/native/core/programmers/helpers/disable_function_programmer_declare.go +0 -10
- package/native/core/programmers/iterate/check_union_array_like.go +0 -422
- package/native/core/programmers/iterate/prune_object_properties.go +0 -105
- package/native/core/programmers/iterate/stringify_dynamic_properties.go +0 -219
- package/native/core/programmers/iterate/stringify_native.go +0 -14
- package/native/core/programmers/iterate/stringify_regular_properties.go +0 -112
- package/native/core/schemas/metadata/MetadataApplication.go +0 -41
- package/src/internal/private/__notationCapitalize.ts +0 -2
- package/src/internal/private/__notationUnsnake.ts +0 -24
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
package factories
|
|
2
2
|
|
|
3
3
|
import (
|
|
4
|
-
"
|
|
4
|
+
"fmt"
|
|
5
5
|
"strings"
|
|
6
|
+
"unicode/utf8"
|
|
6
7
|
|
|
7
8
|
shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
8
9
|
shimprinter "github.com/microsoft/typescript-go/shim/printer"
|
|
@@ -71,12 +72,138 @@ func (identifierFactoryNamespace) GetName(input *shimast.Expression) string {
|
|
|
71
72
|
return "unknown"
|
|
72
73
|
}
|
|
73
74
|
|
|
75
|
+
// Postfix renders the accessor for `str` as JavaScript source for a string
|
|
76
|
+
// literal, because callers splice the result straight into emitted text (see
|
|
77
|
+
// AssertProgrammer and ValidateProgrammer building `_path + <postfix>`).
|
|
78
|
+
//
|
|
79
|
+
// The value of that literal must equal what the runtime helper
|
|
80
|
+
// `typia/lib/internal/_accessExpressionAsString` computes for the same key,
|
|
81
|
+
// since dynamic keys take that runtime path while sole-literal keys are folded
|
|
82
|
+
// here at compile time. Both must produce one path grammar, which
|
|
83
|
+
// `typia/lib/internal/_createStandardSchema` parses back with JSON.parse.
|
|
84
|
+
//
|
|
85
|
+
// So there are two nested levels, and they escape for different readers. The
|
|
86
|
+
// key becomes JSON text, which is part of the path a user sees and JSON.parse
|
|
87
|
+
// reads. That text is then embedded in JavaScript source. Escaping only one
|
|
88
|
+
// level emits a file that does not parse; escaping both for the same reader
|
|
89
|
+
// makes the reported path disagree with the runtime helper.
|
|
74
90
|
func (identifierFactoryNamespace) Postfix(str string) string {
|
|
75
91
|
if identifierFactory_variable(str) {
|
|
76
|
-
return "
|
|
92
|
+
return identifierFactory_source("." + str)
|
|
77
93
|
}
|
|
78
|
-
|
|
79
|
-
|
|
94
|
+
return identifierFactory_source("[" + identifierFactory_json(str) + "]")
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// identifierFactory_json renders `str` as JSON text, matching JSON.stringify so
|
|
98
|
+
// that the path this lands in is the one _accessExpressionAsString builds for
|
|
99
|
+
// the same key at runtime, and so JSON.parse in _createStandardSchema reads the
|
|
100
|
+
// key back out.
|
|
101
|
+
func identifierFactory_json(str string) string {
|
|
102
|
+
return identifierFactory_quote(str, false)
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// identifierFactory_source renders `str` as JavaScript source for a string
|
|
106
|
+
// literal whose value is exactly `str`.
|
|
107
|
+
//
|
|
108
|
+
// This is JSON's escape set plus the line separators. JSON string syntax is
|
|
109
|
+
// otherwise a subset of JavaScript's: both forbid a raw `"` and `\`, and JSON
|
|
110
|
+
// already escapes every character below U+0020, which covers the CR and LF that
|
|
111
|
+
// JavaScript also forbids raw. U+2028 and U+2029 are the whole difference, being
|
|
112
|
+
// line terminators to JavaScript but ordinary characters to JSON.
|
|
113
|
+
func identifierFactory_source(str string) string {
|
|
114
|
+
return identifierFactory_quote(str, true)
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// identifierFactory_quote writes a quoted literal, escaping the line separators
|
|
118
|
+
// only when the reader is a JavaScript parser.
|
|
119
|
+
//
|
|
120
|
+
// strconv.Quote cannot serve either role: it escapes for Go, and Go and
|
|
121
|
+
// JavaScript disagree. Quote renders U+0007 as `\a` and a non-printable astral
|
|
122
|
+
// rune as `\U0001d173`; JavaScript has neither escape and decodes them as the
|
|
123
|
+
// identity escapes `a` and `U`, silently corrupting the key, while JSON.parse
|
|
124
|
+
// rejects both outright.
|
|
125
|
+
func identifierFactory_quote(str string, source bool) string {
|
|
126
|
+
var builder strings.Builder
|
|
127
|
+
builder.Grow(len(str) + 2)
|
|
128
|
+
builder.WriteByte('"')
|
|
129
|
+
for i := 0; i < len(str); {
|
|
130
|
+
if char := str[i]; char < utf8.RuneSelf {
|
|
131
|
+
i++
|
|
132
|
+
switch char {
|
|
133
|
+
case '"':
|
|
134
|
+
builder.WriteString("\\\"")
|
|
135
|
+
case '\\':
|
|
136
|
+
builder.WriteString("\\\\")
|
|
137
|
+
case '\b':
|
|
138
|
+
builder.WriteString("\\b")
|
|
139
|
+
case '\f':
|
|
140
|
+
builder.WriteString("\\f")
|
|
141
|
+
case '\n':
|
|
142
|
+
builder.WriteString("\\n")
|
|
143
|
+
case '\r':
|
|
144
|
+
builder.WriteString("\\r")
|
|
145
|
+
case '\t':
|
|
146
|
+
builder.WriteString("\\t")
|
|
147
|
+
default:
|
|
148
|
+
// JSON forbids a raw control character in a string, and JSON.parse
|
|
149
|
+
// throws on one rather than reporting the validation issue that the
|
|
150
|
+
// path belongs to. Every other ASCII byte is safe verbatim.
|
|
151
|
+
if char < 0x20 {
|
|
152
|
+
builder.WriteString(identifierFactory_unicode_escape(rune(char)))
|
|
153
|
+
} else {
|
|
154
|
+
builder.WriteByte(char)
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
continue
|
|
158
|
+
}
|
|
159
|
+
if unit, size := identifierFactory_surrogate(str[i:]); size != 0 {
|
|
160
|
+
// A lone surrogate reaches here WTF-8 encoded and has no valid UTF-8
|
|
161
|
+
// form, so it survives only as an escape. JSON.stringify does the same.
|
|
162
|
+
builder.WriteString(identifierFactory_unicode_escape(unit))
|
|
163
|
+
i += size
|
|
164
|
+
continue
|
|
165
|
+
}
|
|
166
|
+
rune_, size := utf8.DecodeRuneInString(str[i:])
|
|
167
|
+
if rune_ == utf8.RuneError && size == 1 {
|
|
168
|
+
// Not UTF-8 at all. No escape can denote the byte, so spend the
|
|
169
|
+
// replacement character and keep the literal well-formed; the
|
|
170
|
+
// alternative is emitting a file that does not parse.
|
|
171
|
+
builder.WriteString(identifierFactory_unicode_escape(utf8.RuneError))
|
|
172
|
+
i++
|
|
173
|
+
continue
|
|
174
|
+
}
|
|
175
|
+
if source && (rune_ == '\u2028' || rune_ == '\u2029') {
|
|
176
|
+
// A line terminator to JavaScript, so a raw one would end the literal on
|
|
177
|
+
// a target below ES2019. Escaping it in the source is invisible to the
|
|
178
|
+
// reader of the path, because JavaScript decodes it straight back.
|
|
179
|
+
builder.WriteString(identifierFactory_unicode_escape(rune_))
|
|
180
|
+
i += size
|
|
181
|
+
continue
|
|
182
|
+
}
|
|
183
|
+
builder.WriteString(str[i : i+size])
|
|
184
|
+
i += size
|
|
185
|
+
}
|
|
186
|
+
builder.WriteByte('"')
|
|
187
|
+
return builder.String()
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// identifierFactory_unicode_escape writes the `\uXXXX` form, which denotes one
|
|
191
|
+
// UTF-16 code unit and so only spans the Basic Multilingual Plane. Every caller
|
|
192
|
+
// passes a control character, a surrogate, or the replacement character; an
|
|
193
|
+
// astral rune needs no escape and must keep taking the verbatim path, because
|
|
194
|
+
// four hex digits cannot spell it.
|
|
195
|
+
func identifierFactory_unicode_escape(value rune) string {
|
|
196
|
+
return fmt.Sprintf("\\u%04x", value)
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// identifierFactory_surrogate decodes a leading WTF-8 encoded surrogate code
|
|
200
|
+
// unit, which utf8.DecodeRuneInString reports as an error because no valid
|
|
201
|
+
// UTF-8 sequence denotes one.
|
|
202
|
+
func identifierFactory_surrogate(str string) (rune, int) {
|
|
203
|
+
if len(str) < 3 || str[0] != 0xed || str[1] < 0xa0 || str[1] > 0xbf || str[2] < 0x80 || str[2] > 0xbf {
|
|
204
|
+
return 0, 0
|
|
205
|
+
}
|
|
206
|
+
return rune(str[0]&0x0f)<<12 | rune(str[1]&0x3f)<<6 | rune(str[2]&0x3f), 3
|
|
80
207
|
}
|
|
81
208
|
|
|
82
209
|
func (identifierFactoryNamespace) Parameter(name any, typeNode *shimast.TypeNode, init *shimast.Node, emit ...*shimprinter.EmitContext) *shimast.Node {
|
|
@@ -207,8 +207,8 @@ var metadataCommentTagFactory_PARSER = map[string]metadataCommentTagFactory_pars
|
|
|
207
207
|
Value string
|
|
208
208
|
}{Report: props.Report, Value: props.Value, Unsigned: true})
|
|
209
209
|
return metadataCommentTagFactory_TagRecord{"array": {
|
|
210
|
-
{Name: "MinItems<" + props.Value + ">", Target: "array", Kind: "minItems", Value: value, Validate: props.Value + " <= $input.length", Exclusive:
|
|
211
|
-
{Name: "MaxItems<" + props.Value + ">", Target: "array", Kind: "maxItems", Value: value, Validate: "$input.length <= " + props.Value, Exclusive:
|
|
210
|
+
{Name: "MinItems<" + props.Value + ">", Target: "array", Kind: "minItems", Value: value, Validate: props.Value + " <= $input.length", Exclusive: metadataCommentTagFactory_exclusive("minItems"), Schema: map[string]any{"minItems": value}},
|
|
211
|
+
{Name: "MaxItems<" + props.Value + ">", Target: "array", Kind: "maxItems", Value: value, Validate: "$input.length <= " + props.Value, Exclusive: metadataCommentTagFactory_exclusive("maxItems"), Schema: map[string]any{"maxItems": value}},
|
|
212
212
|
}}
|
|
213
213
|
},
|
|
214
214
|
"minItems": func(props struct {
|
|
@@ -220,7 +220,7 @@ var metadataCommentTagFactory_PARSER = map[string]metadataCommentTagFactory_pars
|
|
|
220
220
|
Unsigned bool
|
|
221
221
|
Value string
|
|
222
222
|
}{Report: props.Report, Value: props.Value, Unsigned: true})
|
|
223
|
-
return metadataCommentTagFactory_TagRecord{"array": {{Name: "MinItems<" + props.Value + ">", Target: "array", Kind: "minItems", Value: value, Validate: props.Value + " <= $input.length", Exclusive:
|
|
223
|
+
return metadataCommentTagFactory_TagRecord{"array": {{Name: "MinItems<" + props.Value + ">", Target: "array", Kind: "minItems", Value: value, Validate: props.Value + " <= $input.length", Exclusive: metadataCommentTagFactory_exclusive("minItems"), Schema: map[string]any{"minItems": value}}}}
|
|
224
224
|
},
|
|
225
225
|
"maxItems": func(props struct {
|
|
226
226
|
Report func(msg string) any
|
|
@@ -231,60 +231,60 @@ var metadataCommentTagFactory_PARSER = map[string]metadataCommentTagFactory_pars
|
|
|
231
231
|
Unsigned bool
|
|
232
232
|
Value string
|
|
233
233
|
}{Report: props.Report, Value: props.Value, Unsigned: true})
|
|
234
|
-
return metadataCommentTagFactory_TagRecord{"array": {{Name: "MaxItems<" + props.Value + ">", Target: "array", Kind: "maxItems", Value: value, Validate: "$input.length <= " + props.Value, Exclusive:
|
|
234
|
+
return metadataCommentTagFactory_TagRecord{"array": {{Name: "MaxItems<" + props.Value + ">", Target: "array", Kind: "maxItems", Value: value, Validate: "$input.length <= " + props.Value, Exclusive: metadataCommentTagFactory_exclusive("maxItems"), Schema: map[string]any{"maxItems": value}}}}
|
|
235
235
|
},
|
|
236
236
|
"uniqueItems": func(props struct {
|
|
237
237
|
Report func(msg string) any
|
|
238
238
|
Value string
|
|
239
239
|
}) metadataCommentTagFactory_TagRecord {
|
|
240
|
-
return metadataCommentTagFactory_TagRecord{"array": {{Name: "UniqueItems", Target: "array", Kind: "uniqueItems", Value: true, Validate: "$
|
|
240
|
+
return metadataCommentTagFactory_TagRecord{"array": {{Name: "UniqueItems", Target: "array", Kind: "uniqueItems", Value: true, Validate: "$importInternal(\"isUniqueItems\")($input)", Exclusive: metadataCommentTagFactory_exclusive("uniqueItems"), Schema: map[string]any{"uniqueItems": true}}}}
|
|
241
241
|
},
|
|
242
242
|
"type": metadataCommentTagFactory_parse_type,
|
|
243
243
|
"minimum": func(props struct {
|
|
244
244
|
Report func(msg string) any
|
|
245
245
|
Value string
|
|
246
246
|
}) metadataCommentTagFactory_TagRecord {
|
|
247
|
-
return metadataCommentTagFactory_numeric(props, "Minimum", "minimum", props.Value+" <= $input", props.Value+" <= $input"
|
|
247
|
+
return metadataCommentTagFactory_numeric(props, "Minimum", "minimum", props.Value+" <= $input", props.Value+" <= $input")
|
|
248
248
|
},
|
|
249
249
|
"maximum": func(props struct {
|
|
250
250
|
Report func(msg string) any
|
|
251
251
|
Value string
|
|
252
252
|
}) metadataCommentTagFactory_TagRecord {
|
|
253
|
-
return metadataCommentTagFactory_numeric(props, "Maximum", "maximum", "$input <= "+props.Value, "$input <= "+props.Value
|
|
253
|
+
return metadataCommentTagFactory_numeric(props, "Maximum", "maximum", "$input <= "+props.Value, "$input <= "+props.Value)
|
|
254
254
|
},
|
|
255
255
|
"exclusiveMinimum": func(props struct {
|
|
256
256
|
Report func(msg string) any
|
|
257
257
|
Value string
|
|
258
258
|
}) metadataCommentTagFactory_TagRecord {
|
|
259
|
-
return metadataCommentTagFactory_numeric(props, "ExclusiveMinimum", "exclusiveMinimum", props.Value+" < $input", props.Value+" < $input"
|
|
259
|
+
return metadataCommentTagFactory_numeric(props, "ExclusiveMinimum", "exclusiveMinimum", props.Value+" < $input", props.Value+" < $input")
|
|
260
260
|
},
|
|
261
261
|
"exclusiveMaximum": func(props struct {
|
|
262
262
|
Report func(msg string) any
|
|
263
263
|
Value string
|
|
264
264
|
}) metadataCommentTagFactory_TagRecord {
|
|
265
|
-
return metadataCommentTagFactory_numeric(props, "ExclusiveMaximum", "exclusiveMaximum", "$input < "+props.Value, "$input < "+props.Value
|
|
265
|
+
return metadataCommentTagFactory_numeric(props, "ExclusiveMaximum", "exclusiveMaximum", "$input < "+props.Value, "$input < "+props.Value)
|
|
266
266
|
},
|
|
267
267
|
"multipleOf": func(props struct {
|
|
268
268
|
Report func(msg string) any
|
|
269
269
|
Value string
|
|
270
270
|
}) metadataCommentTagFactory_TagRecord {
|
|
271
|
-
return metadataCommentTagFactory_numeric(props, "MultipleOf", "multipleOf", "$input
|
|
271
|
+
return metadataCommentTagFactory_numeric(props, "MultipleOf", "multipleOf", "$importInternal(\"_isMultipleOf\")($input, "+props.Value+")", "$input % "+props.Value+"n === 0n")
|
|
272
272
|
},
|
|
273
273
|
"format": func(props struct {
|
|
274
274
|
Report func(msg string) any
|
|
275
275
|
Value string
|
|
276
276
|
}) metadataCommentTagFactory_TagRecord {
|
|
277
|
-
|
|
277
|
+
name, validate, ok := formatCheatSheet_resolve(props.Value)
|
|
278
278
|
if ok == false {
|
|
279
279
|
return metadataCommentTagFactory_TagRecord{}
|
|
280
280
|
}
|
|
281
|
-
return metadataCommentTagFactory_TagRecord{"string": {{Name: "Format<" + strconv.Quote(
|
|
281
|
+
return metadataCommentTagFactory_TagRecord{"string": {{Name: "Format<" + strconv.Quote(name) + ">", Target: "string", Kind: "format", Value: name, Validate: validate, Exclusive: metadataCommentTagFactory_exclusive("format"), Schema: map[string]any{"format": name}}}}
|
|
282
282
|
},
|
|
283
283
|
"pattern": func(props struct {
|
|
284
284
|
Report func(msg string) any
|
|
285
285
|
Value string
|
|
286
286
|
}) metadataCommentTagFactory_TagRecord {
|
|
287
|
-
return metadataCommentTagFactory_TagRecord{"string": {{Name: "Pattern<" + strconv.Quote(props.Value) + ">", Target: "string", Kind: "pattern", Value: props.Value, Validate: "RegExp(" + strconv.Quote(props.Value) + ").test($input)", Exclusive:
|
|
287
|
+
return metadataCommentTagFactory_TagRecord{"string": {{Name: "Pattern<" + strconv.Quote(props.Value) + ">", Target: "string", Kind: "pattern", Value: props.Value, Validate: "RegExp(" + strconv.Quote(props.Value) + ").test($input)", Exclusive: metadataCommentTagFactory_exclusive("pattern"), Schema: map[string]any{"pattern": props.Value}}}}
|
|
288
288
|
},
|
|
289
289
|
"length": func(props struct {
|
|
290
290
|
Report func(msg string) any
|
|
@@ -292,8 +292,8 @@ var metadataCommentTagFactory_PARSER = map[string]metadataCommentTagFactory_pars
|
|
|
292
292
|
}) metadataCommentTagFactory_TagRecord {
|
|
293
293
|
value := metadataCommentTagFactory_parse_number(props)
|
|
294
294
|
return metadataCommentTagFactory_TagRecord{"string": {
|
|
295
|
-
{Name: "MinLength<" + props.Value + ">", Target: "string", Kind: "minLength", Value: value, Validate: props.Value + " <= $input
|
|
296
|
-
{Name: "MaxLength<" + props.Value + ">", Target: "string", Kind: "maxLength", Value: value, Validate: "$input
|
|
295
|
+
{Name: "MinLength<" + props.Value + ">", Target: "string", Kind: "minLength", Value: value, Validate: props.Value + " <= $importInternal(\"_stringLength\")($input)", Exclusive: metadataCommentTagFactory_exclusive("minLength"), Schema: map[string]any{"minLength": value}},
|
|
296
|
+
{Name: "MaxLength<" + props.Value + ">", Target: "string", Kind: "maxLength", Value: value, Validate: "$importInternal(\"_stringLength\")($input) <= " + props.Value, Exclusive: metadataCommentTagFactory_exclusive("maxLength"), Schema: map[string]any{"maxLength": value}},
|
|
297
297
|
}}
|
|
298
298
|
},
|
|
299
299
|
"minLength": func(props struct {
|
|
@@ -301,17 +301,58 @@ var metadataCommentTagFactory_PARSER = map[string]metadataCommentTagFactory_pars
|
|
|
301
301
|
Value string
|
|
302
302
|
}) metadataCommentTagFactory_TagRecord {
|
|
303
303
|
value := metadataCommentTagFactory_parse_number(props)
|
|
304
|
-
return metadataCommentTagFactory_TagRecord{"string": {{Name: "MinLength<" + props.Value + ">", Target: "string", Kind: "minLength", Value: value, Validate: props.Value + " <= $input
|
|
304
|
+
return metadataCommentTagFactory_TagRecord{"string": {{Name: "MinLength<" + props.Value + ">", Target: "string", Kind: "minLength", Value: value, Validate: props.Value + " <= $importInternal(\"_stringLength\")($input)", Exclusive: metadataCommentTagFactory_exclusive("minLength"), Schema: map[string]any{"minLength": value}}}}
|
|
305
305
|
},
|
|
306
306
|
"maxLength": func(props struct {
|
|
307
307
|
Report func(msg string) any
|
|
308
308
|
Value string
|
|
309
309
|
}) metadataCommentTagFactory_TagRecord {
|
|
310
310
|
value := metadataCommentTagFactory_parse_number(props)
|
|
311
|
-
return metadataCommentTagFactory_TagRecord{"string": {{Name: "MaxLength<" + props.Value + ">", Target: "string", Kind: "maxLength", Value: value, Validate: "$input
|
|
311
|
+
return metadataCommentTagFactory_TagRecord{"string": {{Name: "MaxLength<" + props.Value + ">", Target: "string", Kind: "maxLength", Value: value, Validate: "$importInternal(\"_stringLength\")($input) <= " + props.Value, Exclusive: metadataCommentTagFactory_exclusive("maxLength"), Schema: map[string]any{"maxLength": value}}}}
|
|
312
312
|
},
|
|
313
313
|
}
|
|
314
314
|
|
|
315
|
+
// metadataCommentTagFactory_EXCLUSIVE is the single authority for every JSDoc
|
|
316
|
+
// comment tag's mutual-exclusivity rule, keyed by tag kind and transcribing the
|
|
317
|
+
// `exclusive` field the matching @typia/interface tag declares
|
|
318
|
+
// (packages/interface/src/tags/*.ts). The JSDoc path and the type-tag path must
|
|
319
|
+
// enforce the same exclusivity, because MetadataTypeTagFactory.Validate reads
|
|
320
|
+
// this list for both; the type-tag path takes it straight from the declaration,
|
|
321
|
+
// so the comment path must publish the identical value. Hand-copying a separate
|
|
322
|
+
// list per parser is exactly what let `@format` (a bare `true`) and `@pattern`
|
|
323
|
+
// (`["format"]`, missing its own kind) drift from the declared
|
|
324
|
+
// `["format", "pattern"]`. Every parser now reads its list from here, so no one
|
|
325
|
+
// list can diverge on its own again. Each `[]string` names its own kind plus
|
|
326
|
+
// every cross-kind partner it may not share a property with, in the declaration
|
|
327
|
+
// order; `true` forbids only same-kind duplication.
|
|
328
|
+
var metadataCommentTagFactory_EXCLUSIVE = map[string]any{
|
|
329
|
+
"minItems": true,
|
|
330
|
+
"maxItems": true,
|
|
331
|
+
"uniqueItems": true,
|
|
332
|
+
"type": true,
|
|
333
|
+
"minimum": []string{"minimum", "exclusiveMinimum"},
|
|
334
|
+
"maximum": []string{"maximum", "exclusiveMaximum"},
|
|
335
|
+
"exclusiveMinimum": []string{"exclusiveMinimum", "minimum"},
|
|
336
|
+
"exclusiveMaximum": []string{"exclusiveMaximum", "maximum"},
|
|
337
|
+
"multipleOf": true,
|
|
338
|
+
"format": []string{"format", "pattern"},
|
|
339
|
+
"pattern": []string{"format", "pattern"},
|
|
340
|
+
"minLength": true,
|
|
341
|
+
"maxLength": true,
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
// metadataCommentTagFactory_exclusive returns the declared exclusivity rule for
|
|
345
|
+
// a tag kind. It panics on an unknown kind so a newly added comment tag that
|
|
346
|
+
// forgets its rule fails loudly here rather than silently emitting a tag with a
|
|
347
|
+
// nil `Exclusive` that the validator would never check.
|
|
348
|
+
func metadataCommentTagFactory_exclusive(kind string) any {
|
|
349
|
+
value, ok := metadataCommentTagFactory_EXCLUSIVE[kind]
|
|
350
|
+
if ok == false {
|
|
351
|
+
panic("no exclusive rule for comment tag kind: " + kind)
|
|
352
|
+
}
|
|
353
|
+
return value
|
|
354
|
+
}
|
|
355
|
+
|
|
315
356
|
func metadataCommentTagFactory_parse_type(props struct {
|
|
316
357
|
Report func(msg string) any
|
|
317
358
|
Value string
|
|
@@ -342,11 +383,15 @@ func metadataCommentTagFactory_parse_type(props struct {
|
|
|
342
383
|
} else if value == "uint32" {
|
|
343
384
|
validate = "Math.floor($input) === $input && 0 <= $input && $input <= 4294967295"
|
|
344
385
|
} else if value == "int64" {
|
|
345
|
-
|
|
386
|
+
// Delegate to the runtime helper instead of restating the bound. The 64-bit
|
|
387
|
+
// maxima are not representable as JavaScript numbers, so an inline literal
|
|
388
|
+
// here silently rounds up and admits an out-of-range value; the helper owns
|
|
389
|
+
// the one correct spelling and documents why it is exclusive.
|
|
390
|
+
validate = "$importInternal(\"isTypeInt64\")($input)"
|
|
346
391
|
} else if value == "uint64" {
|
|
347
|
-
validate = "
|
|
392
|
+
validate = "$importInternal(\"isTypeUint64\")($input)"
|
|
348
393
|
} else if value == "float" {
|
|
349
|
-
validate = "-
|
|
394
|
+
validate = "-3.4028235e38 <= $input && $input <= 3.4028235e38"
|
|
350
395
|
}
|
|
351
396
|
var numberSchema any
|
|
352
397
|
if value == "int8" || value == "int16" || value == "int32" || value == "int64" {
|
|
@@ -359,11 +404,19 @@ func metadataCommentTagFactory_parse_type(props struct {
|
|
|
359
404
|
bigintSchema = map[string]any{"minimum": 0}
|
|
360
405
|
}
|
|
361
406
|
record := metadataCommentTagFactory_TagRecord{
|
|
362
|
-
"number": {{Name: "Type<" + strconv.Quote(value) + ">", Target: "number", Kind: "type", Value: value, Validate: validate, Exclusive:
|
|
407
|
+
"number": {{Name: "Type<" + strconv.Quote(value) + ">", Target: "number", Kind: "type", Value: value, Validate: validate, Exclusive: metadataCommentTagFactory_exclusive("type"), Schema: numberSchema}},
|
|
363
408
|
}
|
|
364
409
|
if value == "int64" || value == "uint64" {
|
|
410
|
+
// The bigint form used to emit `true` for int64 and a lower bound only for
|
|
411
|
+
// uint64, so `bigint & Type<"int64">` -- the spelling the documentation
|
|
412
|
+
// recommends -- certified any magnitude at all. Both now delegate to the
|
|
413
|
+
// helper that holds the exact inclusive bound a bigint can represent.
|
|
414
|
+
bigintValidate := "$importInternal(\"isTypeUint64Bigint\")($input)"
|
|
415
|
+
if value == "int64" {
|
|
416
|
+
bigintValidate = "$importInternal(\"isTypeInt64Bigint\")($input)"
|
|
417
|
+
}
|
|
365
418
|
record["bigint"] = []schemametadata.IMetadataTypeTag{
|
|
366
|
-
{Name: "Type<" + strconv.Quote(value) + ">", Target: "bigint", Kind: "type", Value: value, Validate:
|
|
419
|
+
{Name: "Type<" + strconv.Quote(value) + ">", Target: "bigint", Kind: "type", Value: value, Validate: bigintValidate, Exclusive: metadataCommentTagFactory_exclusive("type"), Schema: bigintSchema},
|
|
367
420
|
}
|
|
368
421
|
}
|
|
369
422
|
return record
|
|
@@ -372,21 +425,21 @@ func metadataCommentTagFactory_parse_type(props struct {
|
|
|
372
425
|
func metadataCommentTagFactory_numeric(props struct {
|
|
373
426
|
Report func(msg string) any
|
|
374
427
|
Value string
|
|
375
|
-
}, name string, kind string, numberValidate string, bigintValidate string
|
|
428
|
+
}, name string, kind string, numberValidate string, bigintValidate string) metadataCommentTagFactory_TagRecord {
|
|
376
429
|
number := metadataCommentTagFactory_parse_number(props)
|
|
377
430
|
integer := metadataCommentTagFactory_parse_integer(struct {
|
|
378
431
|
Report func(msg string) any
|
|
379
432
|
Unsigned bool
|
|
380
433
|
Value string
|
|
381
|
-
}{Report:
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
bigint = int64(*integer)
|
|
385
|
-
}
|
|
386
|
-
return metadataCommentTagFactory_TagRecord{
|
|
434
|
+
}{Report: func(string) any { return nil }, Value: props.Value, Unsigned: false})
|
|
435
|
+
exclusive := metadataCommentTagFactory_exclusive(kind)
|
|
436
|
+
record := metadataCommentTagFactory_TagRecord{
|
|
387
437
|
"number": {{Name: name + "<" + props.Value + ">", Target: "number", Kind: kind, Value: number, Validate: numberValidate, Exclusive: exclusive, Schema: map[string]any{kind: number}}},
|
|
388
|
-
"bigint": {{Name: name + "<" + props.Value + "n>", Target: "bigint", Kind: kind, Value: bigint, Validate: bigintValidate, Exclusive: exclusive, Schema: map[string]any{kind: number}}},
|
|
389
438
|
}
|
|
439
|
+
if integer != nil {
|
|
440
|
+
record["bigint"] = []schemametadata.IMetadataTypeTag{{Name: name + "<" + props.Value + "n>", Target: "bigint", Kind: kind, Value: int64(*integer), Validate: bigintValidate, Exclusive: exclusive, Schema: map[string]any{kind: number}}}
|
|
441
|
+
}
|
|
442
|
+
return record
|
|
390
443
|
}
|
|
391
444
|
|
|
392
445
|
func metadataCommentTagFactory_parse_number(props struct {
|
|
@@ -426,16 +479,6 @@ func metadataCommentTagFactory_parse_integer(props struct {
|
|
|
426
479
|
return &value
|
|
427
480
|
}
|
|
428
481
|
|
|
429
|
-
var metadataCommentTagFactory_FORMATS = func() map[string][2]string {
|
|
430
|
-
output := map[string][2]string{}
|
|
431
|
-
for key, value := range FormatCheatSheet {
|
|
432
|
-
output[key] = [2]string{key, value}
|
|
433
|
-
}
|
|
434
|
-
output["datetime"] = [2]string{"date-time", "!isNaN(new Date($input).getTime())"}
|
|
435
|
-
output["dateTime"] = [2]string{"date-time", "!isNaN(new Date($input).getTime())"}
|
|
436
|
-
return output
|
|
437
|
-
}()
|
|
438
|
-
|
|
439
482
|
func metadataCommentTagFactory_includes(values []string, target string) bool {
|
|
440
483
|
for _, value := range values {
|
|
441
484
|
if value == target {
|
|
@@ -246,9 +246,21 @@ func (metadataTypeTagFactoryNamespace) Validate(props struct {
|
|
|
246
246
|
}{Property: nil, Message: "kind '" + tag.Kind + "' can't be duplicated"})
|
|
247
247
|
}
|
|
248
248
|
case []string:
|
|
249
|
+
// The `exclusive` list names every kind this tag may not share a property
|
|
250
|
+
// with, itself included, and it is the authoritative spec. Reject when any
|
|
251
|
+
// other tag's kind appears in the list, matching kinds against kinds.
|
|
252
|
+
//
|
|
253
|
+
// Two bugs made this inert: it compared the list of kinds against
|
|
254
|
+
// `opposite.Name` ("minimum" against "Minimum<0>"), which never matched,
|
|
255
|
+
// and it also required `opposite.Kind == tag.Kind`, which excluded the
|
|
256
|
+
// cross-kind partners the list exists to catch. Both must go, or a
|
|
257
|
+
// forbidden combination keeps compiling: `Minimum<5> & Minimum<0>` emits
|
|
258
|
+
// `{"minimum":0}` yet its validator requires 5, and `Minimum<0> &
|
|
259
|
+
// ExclusiveMinimum<5>` or `Format<"uuid"> & Pattern<...>` coexist though
|
|
260
|
+
// the declarations forbid it.
|
|
249
261
|
var some *schemametadata.IMetadataTypeTag
|
|
250
262
|
for j, opposite := range props.Tags {
|
|
251
|
-
if i != j &&
|
|
263
|
+
if i != j && metadataTypeTagFactory_includes(exclusive, opposite.Kind) {
|
|
252
264
|
copied := opposite
|
|
253
265
|
some = &copied
|
|
254
266
|
break
|
|
@@ -23,30 +23,27 @@ func (numericRangeFactoryNamespace) Number(t string, input *shimast.Expression,
|
|
|
23
23
|
case "uint64":
|
|
24
24
|
return numericRangeFactory_number_uint64(input, emit...)
|
|
25
25
|
case "float":
|
|
26
|
-
return numericRangeFactory_between("-
|
|
26
|
+
return numericRangeFactory_between("-3.4028235e38", "3.4028235e38", emit...)(input)
|
|
27
27
|
default:
|
|
28
28
|
return nativecontext.EmitFactoryOf(numericRangeFactory_factory, emit...).NewKeywordExpression(shimast.KindTrueKeyword)
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
+
// Bigint narrows a protobuf union candidate whose atomic type is `bigint`.
|
|
33
|
+
//
|
|
34
|
+
// ProtobufFactory only ever routes "int64" and "uint64" here, so the fall-through
|
|
35
|
+
// used to be the int64 case: it returned a bare `true`, and a `bigint &
|
|
36
|
+
// Type<"int64">` candidate matched any magnitude at all. Both types are now
|
|
37
|
+
// explicit, and the default is reached only by an unknown type.
|
|
32
38
|
func (numericRangeFactoryNamespace) Bigint(t string, input *shimast.Expression, emit ...*shimprinter.EmitContext) *shimast.Node {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
return
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
nil,
|
|
41
|
-
f.NewNodeList([]*shimast.Node{ExpressionFactory.Number(0, emit...)}),
|
|
42
|
-
shimast.NodeFlagsNone,
|
|
43
|
-
),
|
|
44
|
-
nil,
|
|
45
|
-
f.NewToken(shimast.KindLessThanEqualsToken),
|
|
46
|
-
input,
|
|
47
|
-
)
|
|
39
|
+
switch t {
|
|
40
|
+
case "int64":
|
|
41
|
+
return numericRangeFactory_bigint_between("-9223372036854775808", "9223372036854775807", input, emit...)
|
|
42
|
+
case "uint64":
|
|
43
|
+
return numericRangeFactory_bigint_between("0", "18446744073709551615", input, emit...)
|
|
44
|
+
default:
|
|
45
|
+
return nativecontext.EmitFactoryOf(numericRangeFactory_factory, emit...).NewKeywordExpression(shimast.KindTrueKeyword)
|
|
48
46
|
}
|
|
49
|
-
return f.NewKeywordExpression(shimast.KindTrueKeyword)
|
|
50
47
|
}
|
|
51
48
|
|
|
52
49
|
func numericRangeFactory_number_int32(input *shimast.Expression, emit ...*shimprinter.EmitContext) *shimast.Node {
|
|
@@ -65,6 +62,8 @@ func numericRangeFactory_number_uint32(input *shimast.Expression, emit ...*shimp
|
|
|
65
62
|
)
|
|
66
63
|
}
|
|
67
64
|
|
|
65
|
+
// numericRangeFactory_number_int64 bounds a `number` candidate to the int64 range.
|
|
66
|
+
// The maximum is 2**63 - 1, the int64 upper bound.
|
|
68
67
|
func numericRangeFactory_number_int64(input *shimast.Expression, emit ...*shimprinter.EmitContext) *shimast.Node {
|
|
69
68
|
return numericRangeFactory_logical_and(
|
|
70
69
|
numericRangeFactory_integer(input, emit...),
|
|
@@ -73,6 +72,8 @@ func numericRangeFactory_number_int64(input *shimast.Expression, emit ...*shimpr
|
|
|
73
72
|
)
|
|
74
73
|
}
|
|
75
74
|
|
|
75
|
+
// numericRangeFactory_number_uint64 bounds a `number` candidate to the uint64 range.
|
|
76
|
+
// The maximum is 2**64 - 1, the uint64 upper bound.
|
|
76
77
|
func numericRangeFactory_number_uint64(input *shimast.Expression, emit ...*shimprinter.EmitContext) *shimast.Node {
|
|
77
78
|
return numericRangeFactory_logical_and(
|
|
78
79
|
numericRangeFactory_integer(input, emit...),
|
|
@@ -121,6 +122,48 @@ func numericRangeFactory_between(x string, y string, emit ...*shimprinter.EmitCo
|
|
|
121
122
|
}
|
|
122
123
|
}
|
|
123
124
|
|
|
125
|
+
// numericRangeFactory_bigint_literal emits `BigInt("<value>")`.
|
|
126
|
+
//
|
|
127
|
+
// The argument has to stay a string literal. `BigInt(9223372036854775807)` would
|
|
128
|
+
// round its number literal to 2**63 before BigInt ever parsed it -- the same
|
|
129
|
+
// rounding that broke the number path -- while the string form parses the digits
|
|
130
|
+
// exactly.
|
|
131
|
+
func numericRangeFactory_bigint_literal(value string, emit ...*shimprinter.EmitContext) *shimast.Node {
|
|
132
|
+
f := nativecontext.EmitFactoryOf(numericRangeFactory_factory, emit...)
|
|
133
|
+
return f.NewCallExpression(
|
|
134
|
+
f.NewIdentifier("BigInt"),
|
|
135
|
+
nil,
|
|
136
|
+
nil,
|
|
137
|
+
f.NewNodeList([]*shimast.Node{f.NewStringLiteral(value, shimast.TokenFlagsNone)}),
|
|
138
|
+
shimast.NodeFlagsNone,
|
|
139
|
+
)
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// numericRangeFactory_bigint_between emits `BigInt(x) <= input && input <= BigInt(y)`.
|
|
143
|
+
//
|
|
144
|
+
// Both comparisons are inclusive because a bigint represents the true 64-bit
|
|
145
|
+
// bounds exactly, unlike the number path's exclusive approximation.
|
|
146
|
+
func numericRangeFactory_bigint_between(x string, y string, input *shimast.Expression, emit ...*shimprinter.EmitContext) *shimast.Node {
|
|
147
|
+
f := nativecontext.EmitFactoryOf(numericRangeFactory_factory, emit...)
|
|
148
|
+
return numericRangeFactory_logical_and(
|
|
149
|
+
f.NewBinaryExpression(
|
|
150
|
+
nil,
|
|
151
|
+
numericRangeFactory_bigint_literal(x, emit...),
|
|
152
|
+
nil,
|
|
153
|
+
f.NewToken(shimast.KindLessThanEqualsToken),
|
|
154
|
+
input,
|
|
155
|
+
),
|
|
156
|
+
f.NewBinaryExpression(
|
|
157
|
+
nil,
|
|
158
|
+
input,
|
|
159
|
+
nil,
|
|
160
|
+
f.NewToken(shimast.KindLessThanEqualsToken),
|
|
161
|
+
numericRangeFactory_bigint_literal(y, emit...),
|
|
162
|
+
),
|
|
163
|
+
emit...,
|
|
164
|
+
)
|
|
165
|
+
}
|
|
166
|
+
|
|
124
167
|
func numericRangeFactory_logical_and(x *shimast.Expression, y *shimast.Expression, emit ...*shimprinter.EmitContext) *shimast.Node {
|
|
125
168
|
return nativecontext.EmitFactoryOf(numericRangeFactory_factory, emit...).NewBinaryExpression(
|
|
126
169
|
nil,
|
|
@@ -17,6 +17,11 @@ type protobufFactoryNamespace struct{}
|
|
|
17
17
|
var ProtobufFactory = protobufFactoryNamespace{}
|
|
18
18
|
|
|
19
19
|
type ProtobufFactory_IProps struct {
|
|
20
|
+
// Method is the fully qualified typia API the call site invoked, exactly as
|
|
21
|
+
// it must appear in the diagnostic code (`typia.protobuf.encode`). It is the
|
|
22
|
+
// sole source of that code: composing the code here from a shorter spelling
|
|
23
|
+
// let the encode and decode programmers, which already pass the whole call
|
|
24
|
+
// accessor, report `typia.protobuf.typia.protobuf.encode`.
|
|
20
25
|
Method string
|
|
21
26
|
Checker *shimchecker.Checker
|
|
22
27
|
Components *schemametadata.MetadataCollection
|
|
@@ -40,13 +45,20 @@ func (protobufFactoryNamespace) Metadata(props ProtobufFactory_IProps) *schemame
|
|
|
40
45
|
Code string
|
|
41
46
|
Errors []nativecontext.TransformerError_MetadataFactory_IError
|
|
42
47
|
}{
|
|
43
|
-
Code:
|
|
48
|
+
Code: props.Method,
|
|
44
49
|
Errors: protobufFactory_errors(result.Errors),
|
|
45
50
|
}))
|
|
46
51
|
}
|
|
52
|
+
protobufFactory_emplaceObjects(props.Components.Objects())
|
|
47
53
|
return result.Data
|
|
48
54
|
}
|
|
49
55
|
|
|
56
|
+
func protobufFactory_emplaceObjects(objects []*schemametadata.MetadataObjectType) {
|
|
57
|
+
for _, object := range objects {
|
|
58
|
+
ProtobufFactory.EmplaceObject(object)
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
50
62
|
func (protobufFactoryNamespace) EmplaceObject(object *schemametadata.MetadataObjectType) {
|
|
51
63
|
for _, property := range object.Properties {
|
|
52
64
|
protobufFactory_emplaceProperty(property)
|
|
@@ -335,10 +347,6 @@ func protobufFactory_validate() MetadataFactory_Validator {
|
|
|
335
347
|
}
|
|
336
348
|
visited[obj.Type] = true
|
|
337
349
|
protobufFactory_validateObject(obj.Type, &errors)
|
|
338
|
-
func() {
|
|
339
|
-
defer func() { _ = recover() }()
|
|
340
|
-
ProtobufFactory.EmplaceObject(obj.Type)
|
|
341
|
-
}()
|
|
342
350
|
}
|
|
343
351
|
noSupport := func(msg string) { insert("does not support " + msg) }
|
|
344
352
|
if props.Metadata.Any {
|
|
@@ -499,8 +499,14 @@ export let inner!: Outer.Inner;
|
|
|
499
499
|
Report: typeTagReport,
|
|
500
500
|
Type: "string",
|
|
501
501
|
Tags: []schemametadata.IMetadataTypeTag{
|
|
502
|
-
|
|
503
|
-
|
|
502
|
+
// Format and Pattern as they are actually declared: both list the
|
|
503
|
+
// kinds `["format", "pattern"]`, so intersecting them on one property
|
|
504
|
+
// is forbidden. The cross-kind conflict fires on the opposite's kind,
|
|
505
|
+
// not its name, and without a same-kind guard. The previous fixture
|
|
506
|
+
// named the opposite in `exclusive` by tag name, the only shape the
|
|
507
|
+
// doubly-broken check could fire on and no real declaration produces.
|
|
508
|
+
{Target: "string", Kind: "format", Name: "Format<\"uuid\">", Exclusive: []string{"format", "pattern"}},
|
|
509
|
+
{Target: "string", Kind: "pattern", Name: "Pattern<\"^x$\">", Exclusive: []string{"format", "pattern"}},
|
|
504
510
|
},
|
|
505
511
|
})
|
|
506
512
|
invalidExclusiveReports := []string{}
|