typia 13.1.0 → 13.1.19
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 +21 -0
- package/lib/executable/FileSystemIdentity.js +183 -0
- package/lib/executable/FileSystemIdentity.js.map +1 -0
- package/lib/executable/FileSystemIdentity.mjs +129 -0
- package/lib/executable/FileSystemIdentity.mjs.map +1 -0
- package/lib/executable/TypiaGenerateWizard.js +264 -104
- package/lib/executable/TypiaGenerateWizard.js.map +1 -1
- package/lib/executable/TypiaGenerateWizard.mjs +233 -93
- 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 +17 -0
- package/lib/internal/_ProtobufReader.js +117 -45
- package/lib/internal/_ProtobufReader.js.map +1 -1
- package/lib/internal/_ProtobufReader.mjs +108 -39
- 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/_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 +2 -1
- package/lib/internal/_randomFormatByte.js.map +1 -1
- package/lib/internal/_randomFormatByte.mjs +2 -1
- package/lib/internal/_randomFormatByte.mjs.map +1 -1
- package/lib/internal/_randomFormatDate.d.ts +2 -0
- package/lib/internal/_randomFormatDate.js +3 -2
- package/lib/internal/_randomFormatDate.js.map +1 -1
- package/lib/internal/_randomFormatDate.mjs +3 -2
- package/lib/internal/_randomFormatDate.mjs.map +1 -1
- package/lib/internal/_randomFormatDatetime.d.ts +2 -0
- package/lib/internal/_randomFormatDatetime.js +3 -2
- package/lib/internal/_randomFormatDatetime.js.map +1 -1
- package/lib/internal/_randomFormatDatetime.mjs +3 -2
- package/lib/internal/_randomFormatDatetime.mjs.map +1 -1
- package/lib/internal/_randomFormatDuration.d.ts +2 -1
- package/lib/internal/_randomFormatDuration.js +3 -2
- package/lib/internal/_randomFormatDuration.js.map +1 -1
- package/lib/internal/_randomFormatDuration.mjs +3 -2
- 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 +2 -1
- package/lib/internal/_randomFormatIpv4.js.map +1 -1
- package/lib/internal/_randomFormatIpv4.mjs +2 -1
- package/lib/internal/_randomFormatIpv4.mjs.map +1 -1
- package/lib/internal/_randomFormatIpv6.d.ts +2 -1
- package/lib/internal/_randomFormatIpv6.js +2 -1
- package/lib/internal/_randomFormatIpv6.js.map +1 -1
- package/lib/internal/_randomFormatIpv6.mjs +2 -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 +8 -1
- package/lib/internal/_randomFormatJsonPointer.js.map +1 -1
- package/lib/internal/_randomFormatJsonPointer.mjs +5 -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 +2 -1
- package/lib/internal/_randomFormatRegex.js.map +1 -1
- package/lib/internal/_randomFormatRegex.mjs +2 -1
- package/lib/internal/_randomFormatRegex.mjs.map +1 -1
- package/lib/internal/_randomFormatRelativeJsonPointer.d.ts +2 -1
- package/lib/internal/_randomFormatRelativeJsonPointer.js +3 -2
- package/lib/internal/_randomFormatRelativeJsonPointer.js.map +1 -1
- package/lib/internal/_randomFormatRelativeJsonPointer.mjs +3 -2
- package/lib/internal/_randomFormatRelativeJsonPointer.mjs.map +1 -1
- package/lib/internal/_randomFormatTime.d.ts +2 -1
- package/lib/internal/_randomFormatTime.js +3 -2
- package/lib/internal/_randomFormatTime.js.map +1 -1
- package/lib/internal/_randomFormatTime.mjs +3 -2
- 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 +33 -0
- package/lib/internal/_randomStringLength.js +48 -0
- package/lib/internal/_randomStringLength.js.map +1 -0
- package/lib/internal/_randomStringLength.mjs +44 -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/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 +81 -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/command_routes_and_diagnostics_coverage_test.go +3 -1
- 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_union_discrimination_transform_test.go +289 -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_stringify_special_key_transform_test.go +238 -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/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/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_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_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 +228 -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 +159 -1
- 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/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 +7 -4
- 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 +134 -7
- package/native/core/factories/internal/metadata/emplace_metadata_object.go +116 -8
- package/native/core/factories/internal/metadata/iterate_metadata.go +6 -0
- package/native/core/factories/internal/metadata/iterate_metadata_function.go +4 -11
- package/native/core/factories/internal/metadata/iterate_metadata_intersection.go +8 -6
- package/native/core/factories/internal/metadata/iterate_metadata_map.go +9 -0
- package/native/core/factories/internal/metadata/iterate_metadata_native.go +27 -2
- package/native/core/factories/internal/metadata/iterate_metadata_set.go +9 -0
- package/native/core/factories/internal/metadata/js_doc_link_text_test.go +69 -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 +393 -5
- 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/NotationJoiner.go +86 -28
- package/native/core/programmers/helpers/StringifyJoinder.go +32 -1
- package/native/core/programmers/helpers/UnionExplorer.go +203 -61
- package/native/core/programmers/helpers/joiner_branch_coverage_test.go +5 -3
- 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/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/openapi_v3_downgrader.go +641 -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 +52 -7
- package/native/core/programmers/json/JsonApplicationProgrammer.go +45 -11
- package/native/core/programmers/json/JsonSchemasProgrammer.go +12 -2
- package/native/core/programmers/llm/LlmApplicationProgrammer.go +12 -10
- 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 +40 -21
- 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 +270 -20
- package/native/core/schemas/metadata/MetadataDependency.go +388 -0
- package/native/core/schemas/metadata/MetadataObjectType.go +17 -4
- 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/package.json +16 -4
- package/src/executable/FileSystemIdentity.ts +189 -0
- package/src/executable/TypiaGenerateWizard.ts +377 -110
- package/src/functional.ts +30 -60
- package/src/internal/_ProtobufReader.ts +129 -43
- 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/_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 +4 -1
- package/src/internal/_randomFormatDate.ts +17 -12
- package/src/internal/_randomFormatDatetime.ts +15 -10
- package/src/internal/_randomFormatDuration.ts +16 -14
- 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 +3 -2
- package/src/internal/_randomFormatIpv6.ts +3 -2
- package/src/internal/_randomFormatIri.ts +3 -1
- package/src/internal/_randomFormatIriReference.ts +3 -1
- package/src/internal/_randomFormatJsonPointer.ts +8 -2
- package/src/internal/_randomFormatPassword.ts +11 -6
- package/src/internal/_randomFormatRegex.ts +4 -1
- package/src/internal/_randomFormatRelativeJsonPointer.ts +13 -6
- package/src/internal/_randomFormatTime.ts +13 -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 +26 -4
- package/src/internal/_randomStringLength.ts +72 -0
- package/src/internal/_stringLength.ts +5 -0
- package/src/internal/_validateReport.ts +5 -1
- package/src/internal/private/__notationRename.ts +24 -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/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/src/internal/private/__notationCapitalize.ts +0 -2
- package/src/internal/private/__notationUnsnake.ts +0 -24
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
package main
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"encoding/json"
|
|
5
|
+
"os"
|
|
6
|
+
"path/filepath"
|
|
7
|
+
"testing"
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
// TestProjectDependenciesStarBarrelTransform verifies a barrel reached through
|
|
11
|
+
// `export *` registers, even though no local specifier names the type.
|
|
12
|
+
//
|
|
13
|
+
// A named re-export publishes an export specifier the alias walk can step
|
|
14
|
+
// through hop by hop; `export * from "./alpha"` publishes none, so that walk
|
|
15
|
+
// has nothing to follow and would stop before reporting the barrel — while
|
|
16
|
+
// re-pointing the star at another module still changes the generated validator
|
|
17
|
+
// (samchon/typia#2126). The walk therefore reports each module specifier's
|
|
18
|
+
// resolved file directly, which is what keeps this shape covered.
|
|
19
|
+
//
|
|
20
|
+
// 1. Build a project where `a.ts` validates `Alpha` imported from `barrel.ts`,
|
|
21
|
+
// which reaches it only through `export * from "./alpha"`.
|
|
22
|
+
// 2. Run project transform mode and decode the JSON envelope.
|
|
23
|
+
// 3. Assert `dependencies["src/a.ts"]` contains the star barrel `barrel.ts`
|
|
24
|
+
// and the concrete module `alpha.ts`.
|
|
25
|
+
// 4. Assert it does NOT contain `beta.ts`, a module the same barrel also stars
|
|
26
|
+
// in but no consulted type reaches.
|
|
27
|
+
func TestProjectDependenciesStarBarrelTransform(t *testing.T) {
|
|
28
|
+
project := projectDependenciesStarBarrelProject(t)
|
|
29
|
+
out, errText, code := ttscTypiaTestCapture(func() int {
|
|
30
|
+
return runTransform([]string{
|
|
31
|
+
"--cwd", project,
|
|
32
|
+
"--tsconfig", "tsconfig.json",
|
|
33
|
+
"--output", "ts",
|
|
34
|
+
})
|
|
35
|
+
})
|
|
36
|
+
if code != 0 {
|
|
37
|
+
t.Fatalf("project transform failed: code=%d stderr=\n%s", code, errText)
|
|
38
|
+
}
|
|
39
|
+
var envelope struct {
|
|
40
|
+
Dependencies map[string][]string `json:"dependencies"`
|
|
41
|
+
}
|
|
42
|
+
if err := json.Unmarshal([]byte(out), &envelope); err != nil {
|
|
43
|
+
t.Fatalf("decode envelope: %v\n%s", err, out)
|
|
44
|
+
}
|
|
45
|
+
entries := envelope.Dependencies["src/a.ts"]
|
|
46
|
+
found := map[string]bool{}
|
|
47
|
+
for _, entry := range entries {
|
|
48
|
+
found[entry] = true
|
|
49
|
+
}
|
|
50
|
+
if !found["src/barrel.ts"] {
|
|
51
|
+
t.Fatalf("dependencies of src/a.ts must contain the star barrel src/barrel.ts: %v", entries)
|
|
52
|
+
}
|
|
53
|
+
if !found["src/alpha.ts"] {
|
|
54
|
+
t.Fatalf("dependencies of src/a.ts must contain the concrete module src/alpha.ts: %v", entries)
|
|
55
|
+
}
|
|
56
|
+
if found["src/beta.ts"] {
|
|
57
|
+
t.Fatalf("dependencies of src/a.ts must not contain src/beta.ts, which the barrel stars in but no consulted type reaches: %v", entries)
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
func projectDependenciesStarBarrelProject(t *testing.T) string {
|
|
62
|
+
t.Helper()
|
|
63
|
+
root := ttscTypiaTestRepoRoot(t)
|
|
64
|
+
base := filepath.Join(root, "packages", "typia", "native", ".tmp-ttsc-typia-tests")
|
|
65
|
+
if err := os.MkdirAll(base, 0o755); err != nil {
|
|
66
|
+
t.Fatalf("mkdir temp base: %v", err)
|
|
67
|
+
}
|
|
68
|
+
dir, err := os.MkdirTemp(base, "project-dependencies-star-barrel-")
|
|
69
|
+
if err != nil {
|
|
70
|
+
t.Fatalf("create temp fixture: %v", err)
|
|
71
|
+
}
|
|
72
|
+
t.Cleanup(func() { _ = os.RemoveAll(dir) })
|
|
73
|
+
src := filepath.Join(dir, "src")
|
|
74
|
+
if err := os.MkdirAll(src, 0o755); err != nil {
|
|
75
|
+
t.Fatalf("mkdir fixture src: %v", err)
|
|
76
|
+
}
|
|
77
|
+
if err := os.WriteFile(filepath.Join(dir, "tsconfig.json"), []byte(projectDependenciesEnvelopeTSConfig), 0o644); err != nil {
|
|
78
|
+
t.Fatalf("write tsconfig: %v", err)
|
|
79
|
+
}
|
|
80
|
+
for name, body := range map[string]string{
|
|
81
|
+
"a.ts": projectDependenciesStarBarrelSourceA,
|
|
82
|
+
"barrel.ts": projectDependenciesStarBarrelSourceBarrel,
|
|
83
|
+
"alpha.ts": projectDependenciesStarBarrelSourceAlpha,
|
|
84
|
+
"beta.ts": projectDependenciesStarBarrelSourceBeta,
|
|
85
|
+
} {
|
|
86
|
+
if err := os.WriteFile(filepath.Join(src, name), []byte(body), 0o644); err != nil {
|
|
87
|
+
t.Fatalf("write %s: %v", name, err)
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return dir
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const projectDependenciesStarBarrelSourceA = `import typia from "typia";
|
|
94
|
+
|
|
95
|
+
import { Alpha } from "./barrel";
|
|
96
|
+
|
|
97
|
+
export const validateAlpha = (input: unknown) => typia.validate<Alpha>(input);
|
|
98
|
+
`
|
|
99
|
+
|
|
100
|
+
const projectDependenciesStarBarrelSourceBarrel = `export * from "./alpha";
|
|
101
|
+
export * from "./beta";
|
|
102
|
+
`
|
|
103
|
+
|
|
104
|
+
const projectDependenciesStarBarrelSourceAlpha = `export interface Alpha {
|
|
105
|
+
id: string;
|
|
106
|
+
}
|
|
107
|
+
`
|
|
108
|
+
|
|
109
|
+
const projectDependenciesStarBarrelSourceBeta = `export interface Beta {
|
|
110
|
+
flag: boolean;
|
|
111
|
+
}
|
|
112
|
+
`
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
package main
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"encoding/json"
|
|
5
|
+
"os"
|
|
6
|
+
"path/filepath"
|
|
7
|
+
"testing"
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
// TestProjectReferenceGraphEnvelopeTransform verifies the project transform
|
|
11
|
+
// envelope carries the ttsc driver SDK's host-owned reference `graph` section
|
|
12
|
+
// alongside typia's precise `dependencies`.
|
|
13
|
+
//
|
|
14
|
+
// `graph` is the plugin-agnostic sound invalidation baseline: the ttsc consumer
|
|
15
|
+
// registers reach(edges, F) ∪ globals ∪ configs ∪ dependencies[F], so a
|
|
16
|
+
// consulted file the precise `dependencies` collection might not attribute is
|
|
17
|
+
// still guarded by the host baseline (samchon/typia#2107). This pins that
|
|
18
|
+
// typia's hand-rolled envelope now routes through driver.NewTransformGraph:
|
|
19
|
+
// direct reference edges (type-only included), ambient global-scope files, and
|
|
20
|
+
// the tsconfig `extends` chain, all keyed by the same driver.TransformOutputKey
|
|
21
|
+
// convention as the `typescript`/`dependencies` sections so a consumer joins
|
|
22
|
+
// them by key.
|
|
23
|
+
//
|
|
24
|
+
// 1. Build a project where `a.ts` imports `Bee` from `b.ts` (and calls
|
|
25
|
+
// `typia.validate<Bee>()`), `b.ts` imports type-only `Cee` from `c.ts`, an
|
|
26
|
+
// ambient `globals.d.ts` contributes a global augmentation, and
|
|
27
|
+
// `tsconfig.json` extends `tsconfig.base.json`.
|
|
28
|
+
// 2. Run project transform mode and decode the JSON envelope's `graph`.
|
|
29
|
+
// 3. Assert the `a.ts -> b.ts` and the type-only `b.ts -> c.ts` edges, the
|
|
30
|
+
// `globals.d.ts` global entry, and the `tsconfig.json` + `tsconfig.base.json`
|
|
31
|
+
// configs chain, all under keys that join with the `typescript` section.
|
|
32
|
+
// 4. Assert `dependencies` is still emitted next to `graph`, and that a
|
|
33
|
+
// non-global source is not misreported as a global.
|
|
34
|
+
func TestProjectReferenceGraphEnvelopeTransform(t *testing.T) {
|
|
35
|
+
project := projectReferenceGraphEnvelopeProject(t)
|
|
36
|
+
out, errText, code := ttscTypiaTestCapture(func() int {
|
|
37
|
+
return runTransform([]string{
|
|
38
|
+
"--cwd", project,
|
|
39
|
+
"--tsconfig", "tsconfig.json",
|
|
40
|
+
"--output", "ts",
|
|
41
|
+
})
|
|
42
|
+
})
|
|
43
|
+
if code != 0 {
|
|
44
|
+
t.Fatalf("project transform failed: code=%d stderr=\n%s", code, errText)
|
|
45
|
+
}
|
|
46
|
+
var envelope struct {
|
|
47
|
+
TypeScript map[string]string `json:"typescript"`
|
|
48
|
+
Graph *struct {
|
|
49
|
+
Edges map[string][]string `json:"edges"`
|
|
50
|
+
Globals []string `json:"globals"`
|
|
51
|
+
Configs []string `json:"configs"`
|
|
52
|
+
} `json:"graph"`
|
|
53
|
+
Dependencies map[string][]string `json:"dependencies"`
|
|
54
|
+
}
|
|
55
|
+
if err := json.Unmarshal([]byte(out), &envelope); err != nil {
|
|
56
|
+
t.Fatalf("decode envelope: %v\n%s", err, out)
|
|
57
|
+
}
|
|
58
|
+
if envelope.Graph == nil {
|
|
59
|
+
t.Fatalf("envelope must carry a graph section:\n%s", out)
|
|
60
|
+
}
|
|
61
|
+
if _, ok := envelope.TypeScript["src/a.ts"]; !ok {
|
|
62
|
+
t.Fatalf("typescript map must contain src/a.ts (graph keys join with it):\n%s", out)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
contains := func(values []string, want string) bool {
|
|
66
|
+
for _, value := range values {
|
|
67
|
+
if value == want {
|
|
68
|
+
return true
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return false
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Direct resolved edge from the transformed file to its import.
|
|
75
|
+
if !contains(envelope.Graph.Edges["src/a.ts"], "src/b.ts") {
|
|
76
|
+
t.Fatalf("graph edges of src/a.ts must contain src/b.ts: %v", envelope.Graph.Edges["src/a.ts"])
|
|
77
|
+
}
|
|
78
|
+
// Type-only edges must be included: b.ts imports Cee with `import type`.
|
|
79
|
+
if !contains(envelope.Graph.Edges["src/b.ts"], "src/c.ts") {
|
|
80
|
+
t.Fatalf("graph edges of src/b.ts must contain the type-only edge src/c.ts: %v", envelope.Graph.Edges["src/b.ts"])
|
|
81
|
+
}
|
|
82
|
+
// Ambient global-scope file appears in globals.
|
|
83
|
+
if !contains(envelope.Graph.Globals, "src/globals.d.ts") {
|
|
84
|
+
t.Fatalf("graph globals must contain src/globals.d.ts: %v", envelope.Graph.Globals)
|
|
85
|
+
}
|
|
86
|
+
// A plain module source is not a global-scope contributor.
|
|
87
|
+
if contains(envelope.Graph.Globals, "src/c.ts") {
|
|
88
|
+
t.Fatalf("graph globals must not contain the module source src/c.ts: %v", envelope.Graph.Globals)
|
|
89
|
+
}
|
|
90
|
+
// tsconfig extends chain: project config followed by its base.
|
|
91
|
+
if !contains(envelope.Graph.Configs, "tsconfig.json") {
|
|
92
|
+
t.Fatalf("graph configs must contain tsconfig.json: %v", envelope.Graph.Configs)
|
|
93
|
+
}
|
|
94
|
+
if !contains(envelope.Graph.Configs, "tsconfig.base.json") {
|
|
95
|
+
t.Fatalf("graph configs must contain the extended tsconfig.base.json: %v", envelope.Graph.Configs)
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// The precise dependencies channel remains emitted alongside graph.
|
|
99
|
+
if !contains(envelope.Dependencies["src/a.ts"], "src/b.ts") {
|
|
100
|
+
t.Fatalf("dependencies of src/a.ts must still be emitted alongside graph: %v", envelope.Dependencies["src/a.ts"])
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
func projectReferenceGraphEnvelopeProject(t *testing.T) string {
|
|
105
|
+
t.Helper()
|
|
106
|
+
root := ttscTypiaTestRepoRoot(t)
|
|
107
|
+
base := filepath.Join(root, "packages", "typia", "native", ".tmp-ttsc-typia-tests")
|
|
108
|
+
if err := os.MkdirAll(base, 0o755); err != nil {
|
|
109
|
+
t.Fatalf("mkdir temp base: %v", err)
|
|
110
|
+
}
|
|
111
|
+
dir, err := os.MkdirTemp(base, "project-reference-graph-envelope-")
|
|
112
|
+
if err != nil {
|
|
113
|
+
t.Fatalf("create temp fixture: %v", err)
|
|
114
|
+
}
|
|
115
|
+
t.Cleanup(func() { _ = os.RemoveAll(dir) })
|
|
116
|
+
src := filepath.Join(dir, "src")
|
|
117
|
+
if err := os.MkdirAll(src, 0o755); err != nil {
|
|
118
|
+
t.Fatalf("mkdir fixture src: %v", err)
|
|
119
|
+
}
|
|
120
|
+
files := map[string]string{
|
|
121
|
+
"tsconfig.json": projectReferenceGraphEnvelopeTSConfig,
|
|
122
|
+
"tsconfig.base.json": projectReferenceGraphEnvelopeTSConfigBase,
|
|
123
|
+
}
|
|
124
|
+
for name, body := range files {
|
|
125
|
+
if err := os.WriteFile(filepath.Join(dir, name), []byte(body), 0o644); err != nil {
|
|
126
|
+
t.Fatalf("write %s: %v", name, err)
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
for name, body := range map[string]string{
|
|
130
|
+
"a.ts": projectReferenceGraphEnvelopeSourceA,
|
|
131
|
+
"b.ts": projectReferenceGraphEnvelopeSourceB,
|
|
132
|
+
"c.ts": projectReferenceGraphEnvelopeSourceC,
|
|
133
|
+
"globals.d.ts": projectReferenceGraphEnvelopeGlobals,
|
|
134
|
+
} {
|
|
135
|
+
if err := os.WriteFile(filepath.Join(src, name), []byte(body), 0o644); err != nil {
|
|
136
|
+
t.Fatalf("write %s: %v", name, err)
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return dir
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
const projectReferenceGraphEnvelopeTSConfig = `{
|
|
143
|
+
"extends": "./tsconfig.base.json",
|
|
144
|
+
"compilerOptions": {
|
|
145
|
+
"rootDir": "src",
|
|
146
|
+
"outDir": "dist"
|
|
147
|
+
},
|
|
148
|
+
"include": ["src"]
|
|
149
|
+
}
|
|
150
|
+
`
|
|
151
|
+
|
|
152
|
+
const projectReferenceGraphEnvelopeTSConfigBase = `{
|
|
153
|
+
"compilerOptions": {
|
|
154
|
+
"target": "ES2022",
|
|
155
|
+
"module": "commonjs",
|
|
156
|
+
"moduleResolution": "bundler",
|
|
157
|
+
"ignoreDeprecations": "6.0",
|
|
158
|
+
"esModuleInterop": true,
|
|
159
|
+
"strict": true,
|
|
160
|
+
"skipLibCheck": true
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
`
|
|
164
|
+
|
|
165
|
+
const projectReferenceGraphEnvelopeSourceA = `import typia from "typia";
|
|
166
|
+
|
|
167
|
+
import { Bee } from "./b";
|
|
168
|
+
|
|
169
|
+
export const validateBee = (input: unknown) => typia.validate<Bee>(input);
|
|
170
|
+
`
|
|
171
|
+
|
|
172
|
+
const projectReferenceGraphEnvelopeSourceB = `import type { Cee } from "./c";
|
|
173
|
+
|
|
174
|
+
export interface Bee {
|
|
175
|
+
id: string;
|
|
176
|
+
nested: Cee;
|
|
177
|
+
}
|
|
178
|
+
`
|
|
179
|
+
|
|
180
|
+
const projectReferenceGraphEnvelopeSourceC = `export interface Cee {
|
|
181
|
+
value: number;
|
|
182
|
+
}
|
|
183
|
+
`
|
|
184
|
+
|
|
185
|
+
// A pure ambient declaration file (no import/export) is a script file, so it
|
|
186
|
+
// contributes to the global scope and must appear in graph.globals.
|
|
187
|
+
const projectReferenceGraphEnvelopeGlobals = `declare interface TypiaGraphGlobal {
|
|
188
|
+
tag: string;
|
|
189
|
+
}
|
|
190
|
+
`
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
package main
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"os"
|
|
5
|
+
"path/filepath"
|
|
6
|
+
"strings"
|
|
7
|
+
"testing"
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
// TestProtobufIsEncodeFiniteNumberTransform pins protobuf.isEncode against a bare
|
|
11
|
+
// number leaf so a non-finite value cannot be encoded into the message (#2196).
|
|
12
|
+
//
|
|
13
|
+
// protobuf.isEncode forces Options.Finite on its inner `__is` guard, then emits
|
|
14
|
+
// `__is(input) ? __encode(input) : null`. A protobuf double can hold NaN and
|
|
15
|
+
// Infinity, so the guard is the only thing keeping them out of the wire. While
|
|
16
|
+
// `is` dropped `finite`, that guard accepted NaN and the encoder wrote it; the
|
|
17
|
+
// guard must now carry Number.isFinite on the number leaf. Because isEncode has no
|
|
18
|
+
// separate error-path checker, the guard is the sole place the number leaf's
|
|
19
|
+
// finite check can appear, so its presence in the emit is an unambiguous oracle.
|
|
20
|
+
//
|
|
21
|
+
// 1. Transform a `protobuf.isEncode<{ value: number }>` fixture with default options.
|
|
22
|
+
// 2. Assert the emitted `__is` guards the number leaf with Number.isFinite.
|
|
23
|
+
func TestProtobufIsEncodeFiniteNumberTransform(t *testing.T) {
|
|
24
|
+
project := protobufIsEncodeFiniteNumberProject(t)
|
|
25
|
+
js := protobufIsEncodeFiniteNumberTransform(t, project)
|
|
26
|
+
needle := "Number.isFinite(input.value)"
|
|
27
|
+
if !strings.Contains(js, needle) {
|
|
28
|
+
t.Fatalf("protobuf.isEncode did not guard the number leaf with %q:\n%s", needle, js)
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
func protobufIsEncodeFiniteNumberProject(t *testing.T) string {
|
|
33
|
+
t.Helper()
|
|
34
|
+
root := ttscTypiaTestRepoRoot(t)
|
|
35
|
+
base := filepath.Join(root, "packages", "typia", "native", ".tmp-ttsc-typia-tests")
|
|
36
|
+
if err := os.MkdirAll(base, 0o755); err != nil {
|
|
37
|
+
t.Fatalf("mkdir temp base: %v", err)
|
|
38
|
+
}
|
|
39
|
+
dir, err := os.MkdirTemp(base, "protobuf-is-encode-finite-number-")
|
|
40
|
+
if err != nil {
|
|
41
|
+
t.Fatalf("create temp fixture: %v", err)
|
|
42
|
+
}
|
|
43
|
+
t.Cleanup(func() {
|
|
44
|
+
_ = os.RemoveAll(dir)
|
|
45
|
+
})
|
|
46
|
+
src := filepath.Join(dir, "src")
|
|
47
|
+
if err := os.MkdirAll(src, 0o755); err != nil {
|
|
48
|
+
t.Fatalf("mkdir fixture src: %v", err)
|
|
49
|
+
}
|
|
50
|
+
if err := os.WriteFile(filepath.Join(dir, "tsconfig.json"), []byte(protobufIsEncodeFiniteNumberTSConfig), 0o644); err != nil {
|
|
51
|
+
t.Fatalf("write tsconfig: %v", err)
|
|
52
|
+
}
|
|
53
|
+
if err := os.WriteFile(filepath.Join(src, "main.ts"), []byte(protobufIsEncodeFiniteNumberSource), 0o644); err != nil {
|
|
54
|
+
t.Fatalf("write source: %v", err)
|
|
55
|
+
}
|
|
56
|
+
return dir
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
func protobufIsEncodeFiniteNumberTransform(t *testing.T, project string) string {
|
|
60
|
+
t.Helper()
|
|
61
|
+
out, errText, code := ttscTypiaTestCapture(func() int {
|
|
62
|
+
return runTransform([]string{
|
|
63
|
+
"--cwd", project,
|
|
64
|
+
"--tsconfig", "tsconfig.json",
|
|
65
|
+
"--file", "src/main.ts",
|
|
66
|
+
"--output", "js",
|
|
67
|
+
})
|
|
68
|
+
})
|
|
69
|
+
if code != 0 {
|
|
70
|
+
t.Fatalf("protobuf isEncode finite transform failed: code=%d stderr=\n%s", code, errText)
|
|
71
|
+
}
|
|
72
|
+
return out
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const protobufIsEncodeFiniteNumberTSConfig = `{
|
|
76
|
+
"compilerOptions": {
|
|
77
|
+
"target": "ES2022",
|
|
78
|
+
"module": "commonjs",
|
|
79
|
+
"moduleResolution": "bundler",
|
|
80
|
+
"ignoreDeprecations": "6.0",
|
|
81
|
+
"types": ["*"],
|
|
82
|
+
"esModuleInterop": true,
|
|
83
|
+
"strict": true,
|
|
84
|
+
"skipLibCheck": true
|
|
85
|
+
},
|
|
86
|
+
"include": ["src"]
|
|
87
|
+
}
|
|
88
|
+
`
|
|
89
|
+
|
|
90
|
+
const protobufIsEncodeFiniteNumberSource = `import typia from "typia";
|
|
91
|
+
|
|
92
|
+
interface Box {
|
|
93
|
+
value: number;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export const encode = (input: unknown): Uint8Array | null =>
|
|
97
|
+
typia.protobuf.isEncode<Box>(input);
|
|
98
|
+
`
|
|
@@ -14,47 +14,70 @@ import (
|
|
|
14
14
|
// explicit protobuf field numbers were silently replaced by auto-numbering and
|
|
15
15
|
// duplicate-sequence validation never fired.
|
|
16
16
|
//
|
|
17
|
+
// The two messages live in separate fixtures because a duplicate-sequence
|
|
18
|
+
// diagnostic now withholds the whole file's artifact (samchon/typia#2117), so one
|
|
19
|
+
// combined source could no longer show the valid message's emitted numbers.
|
|
20
|
+
//
|
|
17
21
|
// 1. Transform a message fixture carrying explicit `Sequence<5>` / `Sequence<7>`
|
|
18
22
|
// field numbers plus an untagged property (auto-numbered after the highest
|
|
19
|
-
// explicit number).
|
|
20
|
-
// 2. Require
|
|
21
|
-
//
|
|
22
|
-
//
|
|
23
|
+
// explicit number), and require the emitted proto message to carry them.
|
|
24
|
+
// 2. Require a message whose two properties share `Sequence<1>` to fail the
|
|
25
|
+
// transform with a diagnostic naming the duplicate.
|
|
26
|
+
// 3. Require that rejected transform to publish no artifact.
|
|
23
27
|
func TestProtobufSequenceFieldNumbersTransform(t *testing.T) {
|
|
24
|
-
|
|
25
|
-
out, errText, code := ttscTypiaTestCapture(func() int {
|
|
26
|
-
return runTransform([]string{
|
|
27
|
-
"--cwd", project,
|
|
28
|
-
"--tsconfig", "tsconfig.json",
|
|
29
|
-
"--file", "src/main.ts",
|
|
30
|
-
"--output", "js",
|
|
31
|
-
})
|
|
32
|
-
})
|
|
28
|
+
out, errText, code := protobufSequenceFieldNumbersTransform(t, "sequenced-", protobufSequenceFieldNumbersSource)
|
|
33
29
|
if code != 0 {
|
|
34
30
|
t.Fatalf("protobuf sequence transform failed: code=%d stderr=\n%s", code, errText)
|
|
35
31
|
}
|
|
32
|
+
// The subject is the explicit `Sequence<5>` / `Sequence<7>` field numbers and
|
|
33
|
+
// the auto-numbered `8` after them; the presence label is `optional` because
|
|
34
|
+
// proto3 has no `required`, and emitting it would make the document reject
|
|
35
|
+
// under a Protobuf compiler (samchon/typia#2155). Compiler legality itself is
|
|
36
|
+
// pinned by TestProtobufMessageDocumentCompiles.
|
|
36
37
|
for _, line := range []string{
|
|
37
|
-
"
|
|
38
|
-
"
|
|
39
|
-
"
|
|
38
|
+
"optional string id = 5;",
|
|
39
|
+
"optional double age = 7;",
|
|
40
|
+
"optional bool flag = 8;",
|
|
40
41
|
} {
|
|
41
42
|
if !strings.Contains(out, line) {
|
|
42
43
|
t.Fatalf("emitted proto message should contain %q:\n%s", line, out)
|
|
43
44
|
}
|
|
44
45
|
}
|
|
45
|
-
|
|
46
|
-
|
|
46
|
+
|
|
47
|
+
dupOut, dupErr, dupCode := protobufSequenceFieldNumbersTransform(t, "duplicated-", protobufSequenceDuplicatedSource)
|
|
48
|
+
if dupCode != 3 {
|
|
49
|
+
t.Fatalf("duplicated sequence message should be rejected with code 3: code=%d stdout=\n%s\nstderr=\n%s", dupCode, dupOut, dupErr)
|
|
50
|
+
}
|
|
51
|
+
if !strings.Contains(dupErr, "error TS(typia.protobuf.message):") ||
|
|
52
|
+
!strings.Contains(dupErr, `The Sequence<1> tag is duplicated in two properties ("id" and "age")`) {
|
|
53
|
+
t.Fatalf("duplicated sequence diagnostic did not name the collision:\n%s", dupErr)
|
|
47
54
|
}
|
|
55
|
+
if dupOut != "" {
|
|
56
|
+
t.Fatalf("duplicated sequence message published an artifact:\n%s", dupOut)
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
func protobufSequenceFieldNumbersTransform(t *testing.T, prefix string, source string) (string, string, int) {
|
|
61
|
+
t.Helper()
|
|
62
|
+
project := protobufSequenceFieldNumbersProject(t, prefix, source)
|
|
63
|
+
return ttscTypiaTestCapture(func() int {
|
|
64
|
+
return runTransform([]string{
|
|
65
|
+
"--cwd", project,
|
|
66
|
+
"--tsconfig", "tsconfig.json",
|
|
67
|
+
"--file", "src/main.ts",
|
|
68
|
+
"--output", "js",
|
|
69
|
+
})
|
|
70
|
+
})
|
|
48
71
|
}
|
|
49
72
|
|
|
50
|
-
func protobufSequenceFieldNumbersProject(t *testing.T) string {
|
|
73
|
+
func protobufSequenceFieldNumbersProject(t *testing.T, prefix string, source string) string {
|
|
51
74
|
t.Helper()
|
|
52
75
|
root := ttscTypiaTestRepoRoot(t)
|
|
53
76
|
base := filepath.Join(root, "packages", "typia", "native", ".tmp-ttsc-typia-tests")
|
|
54
77
|
if err := os.MkdirAll(base, 0o755); err != nil {
|
|
55
78
|
t.Fatalf("mkdir temp base: %v", err)
|
|
56
79
|
}
|
|
57
|
-
dir, err := os.MkdirTemp(base, "protobuf-sequence-")
|
|
80
|
+
dir, err := os.MkdirTemp(base, "protobuf-sequence-"+prefix)
|
|
58
81
|
if err != nil {
|
|
59
82
|
t.Fatalf("create temp fixture: %v", err)
|
|
60
83
|
}
|
|
@@ -68,7 +91,7 @@ func protobufSequenceFieldNumbersProject(t *testing.T) string {
|
|
|
68
91
|
if err := os.WriteFile(filepath.Join(dir, "tsconfig.json"), []byte(protobufSequenceFieldNumbersTSConfig), 0o644); err != nil {
|
|
69
92
|
t.Fatalf("write tsconfig: %v", err)
|
|
70
93
|
}
|
|
71
|
-
if err := os.WriteFile(filepath.Join(src, "main.ts"), []byte(
|
|
94
|
+
if err := os.WriteFile(filepath.Join(src, "main.ts"), []byte(source), 0o644); err != nil {
|
|
72
95
|
t.Fatalf("write source: %v", err)
|
|
73
96
|
}
|
|
74
97
|
return dir
|
|
@@ -97,11 +120,18 @@ interface Sequenced {
|
|
|
97
120
|
flag: boolean;
|
|
98
121
|
}
|
|
99
122
|
|
|
123
|
+
export const sequenced = typia.protobuf.message<Sequenced>();
|
|
124
|
+
`
|
|
125
|
+
|
|
126
|
+
// protobufSequenceDuplicatedSource is the negative twin: the same message shape
|
|
127
|
+
// whose two properties claim one `Sequence<1>` number, which typia must reject
|
|
128
|
+
// rather than auto-renumber.
|
|
129
|
+
const protobufSequenceDuplicatedSource = `import typia, { tags } from "typia";
|
|
130
|
+
|
|
100
131
|
interface Duplicated {
|
|
101
132
|
id: string & tags.Sequence<1>;
|
|
102
133
|
age: number & tags.Sequence<1>;
|
|
103
134
|
}
|
|
104
135
|
|
|
105
|
-
export const sequenced = typia.protobuf.message<Sequenced>();
|
|
106
136
|
export const duplicated = typia.protobuf.message<Duplicated>();
|
|
107
137
|
`
|