typia 13.1.1 → 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 +60 -6
- 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/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
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
package main
|
|
5
5
|
|
|
6
6
|
import (
|
|
7
|
+
"encoding/json"
|
|
7
8
|
"path/filepath"
|
|
8
9
|
"strings"
|
|
9
10
|
"testing"
|
|
@@ -16,10 +17,19 @@ import (
|
|
|
16
17
|
// Running them through the same project transform mode gives Go coverage for
|
|
17
18
|
// those native branches without duplicating that TypeScript corpus here.
|
|
18
19
|
//
|
|
20
|
+
// Each project is held to what its purpose guarantees, never to what its sources
|
|
21
|
+
// happen to contain today. The feature projects exist to compile accepted typia
|
|
22
|
+
// call sites, so they must transform without a diagnostic. `tests/test-error`
|
|
23
|
+
// exists to hold call sites typia rejects, so it must report them. `tests/debug`
|
|
24
|
+
// is a scratchpad whose contents are arbitrary by design (samchon/typia#2141): a
|
|
25
|
+
// valid sample and a deliberately broken one are equally legitimate states, so
|
|
26
|
+
// only the envelope contract itself is asserted for it. Asserting that the
|
|
27
|
+
// scratchpad reports diagnostics is asserting that it always holds broken code.
|
|
28
|
+
//
|
|
19
29
|
// 1. Resolve existing TypeScript catalog projects from the repository root.
|
|
20
30
|
// 2. Run project transform mode so every source file contributes call sites.
|
|
21
31
|
// 3. Require JSON project output to include a TypeScript map.
|
|
22
|
-
// 4.
|
|
32
|
+
// 4. Hold each project to its own purpose's diagnostic contract.
|
|
23
33
|
func TestProjectCatalogTransformCoverage(t *testing.T) {
|
|
24
34
|
root := transformCoverageRepoRoot(t)
|
|
25
35
|
for _, project := range []string{
|
|
@@ -35,14 +45,7 @@ func TestProjectCatalogTransformCoverage(t *testing.T) {
|
|
|
35
45
|
} {
|
|
36
46
|
project := project
|
|
37
47
|
t.Run(project, func(t *testing.T) {
|
|
38
|
-
|
|
39
|
-
out, errText, code := transformCoverageCapture(func() int {
|
|
40
|
-
return runTransform([]string{
|
|
41
|
-
"--cwd", cwd,
|
|
42
|
-
"--tsconfig", "tsconfig.json",
|
|
43
|
-
"--output", "ts",
|
|
44
|
-
})
|
|
45
|
-
})
|
|
48
|
+
out, errText, code := transformCatalogProject(root, project)
|
|
46
49
|
if code != 0 {
|
|
47
50
|
t.Fatalf("%s transform failed: code=%d stderr=\n%s", project, code, errText)
|
|
48
51
|
}
|
|
@@ -51,23 +54,66 @@ func TestProjectCatalogTransformCoverage(t *testing.T) {
|
|
|
51
54
|
}
|
|
52
55
|
})
|
|
53
56
|
}
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
57
|
+
// tests/test-error compiles deliberately invalid call sites, and reporting them
|
|
58
|
+
// is that workspace's entire reason to exist. Its diagnostics are a contract,
|
|
59
|
+
// not an accident of what it currently holds.
|
|
60
|
+
t.Run("test-error", func(t *testing.T) {
|
|
61
|
+
out, _, code := transformCatalogProject(root, "test-error")
|
|
62
|
+
if code != 3 {
|
|
63
|
+
t.Fatalf("test-error transform should report diagnostics with code 3, got %d", code)
|
|
64
|
+
}
|
|
65
|
+
if !strings.Contains(out, `"diagnostics"`) || !strings.Contains(out, `"typescript"`) {
|
|
66
|
+
t.Fatalf("test-error output should include diagnostics and TypeScript map:\n%s", out)
|
|
67
|
+
}
|
|
68
|
+
})
|
|
69
|
+
// tests/debug is a one-off repro scratchpad, so nothing about its sources is
|
|
70
|
+
// promised: it holds valid code between investigations and invalid code during
|
|
71
|
+
// one. What survives both states is the project transform's own envelope
|
|
72
|
+
// contract, so that is what this pins. The project must resolve and reach a
|
|
73
|
+
// transform decision rather than fail to load (exit 2), it must still
|
|
74
|
+
// contribute transformed sources, and its exit code must agree with the
|
|
75
|
+
// envelope it published.
|
|
76
|
+
//
|
|
77
|
+
// Accepting either 0 or 3 is derived, not observed: transform mode never
|
|
78
|
+
// typechecks, so exit 2 is reachable only from a flag, cwd, or tsconfig-load
|
|
79
|
+
// failure (semantic diagnostics belong to the build route). No source content a
|
|
80
|
+
// repro leaves behind can produce it -- even an outright type error still exits
|
|
81
|
+
// 0 here -- which is what makes the band content-agnostic.
|
|
82
|
+
//
|
|
83
|
+
// The envelope is decoded rather than substring-matched because `"typescript"`
|
|
84
|
+
// carries no `omitempty` and runTransformProject initializes the map before its
|
|
85
|
+
// source loop: the key is present even when the workspace resolved no source at
|
|
86
|
+
// all. That empty envelope is the shape a `rootDir` or `include` rot leaves
|
|
87
|
+
// behind, and this workspace is the one that already shipped such a rot
|
|
88
|
+
// (samchon/typia#2132), so a key-presence check would pass over the one failure
|
|
89
|
+
// worth catching here.
|
|
90
|
+
t.Run("debug", func(t *testing.T) {
|
|
91
|
+
out, errText, code := transformCatalogProject(root, "debug")
|
|
92
|
+
if code != 0 && code != 3 {
|
|
93
|
+
t.Fatalf("debug transform should load and transform the project, got code=%d stderr=\n%s", code, errText)
|
|
94
|
+
}
|
|
95
|
+
var envelope transformProjectOutput
|
|
96
|
+
if err := json.Unmarshal([]byte(out), &envelope); err != nil {
|
|
97
|
+
t.Fatalf("debug project output should be a transform envelope: %v\n%s", err, out)
|
|
98
|
+
}
|
|
99
|
+
if len(envelope.TypeScript) == 0 {
|
|
100
|
+
t.Fatalf("debug project should contribute transformed sources, got an empty TypeScript map:\n%s", out)
|
|
101
|
+
}
|
|
102
|
+
if diagnosed := len(envelope.Diagnostics) > 0; diagnosed != (code == 3) {
|
|
103
|
+
t.Fatalf("debug exit code %d disagrees with its envelope (diagnostics present: %v):\n%s", code, diagnosed, out)
|
|
104
|
+
}
|
|
105
|
+
})
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// transformCatalogProject runs project transform mode over one repository test
|
|
109
|
+
// project and returns its captured stdout, stderr, and exit code.
|
|
110
|
+
func transformCatalogProject(root string, project string) (string, string, int) {
|
|
111
|
+
cwd := filepath.Join(root, "tests", project)
|
|
112
|
+
return transformCoverageCapture(func() int {
|
|
113
|
+
return runTransform([]string{
|
|
114
|
+
"--cwd", cwd,
|
|
115
|
+
"--tsconfig", "tsconfig.json",
|
|
116
|
+
"--output", "ts",
|
|
71
117
|
})
|
|
72
|
-
}
|
|
118
|
+
})
|
|
73
119
|
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
package main
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"encoding/json"
|
|
5
|
+
"os"
|
|
6
|
+
"path/filepath"
|
|
7
|
+
"testing"
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
// TestProjectDependenciesBarrelReexportTransform verifies every barrel a type
|
|
11
|
+
// is reached through registers, and no sibling the barrel merely also exports.
|
|
12
|
+
//
|
|
13
|
+
// A barrel re-export is an intermediate whose CONTENTS select which declaration
|
|
14
|
+
// the reference reaches: re-pointing `export { Alpha } from "./alpha"` at
|
|
15
|
+
// another module changes the generated validator. Resolving the alias straight
|
|
16
|
+
// to its terminus reported only the concrete module, so a bundler cache had no
|
|
17
|
+
// edge to invalidate and served a stale validator (samchon/typia#2126). The
|
|
18
|
+
// negative twin pins the other direction — the chain must report the modules it
|
|
19
|
+
// walked, not everything the barrels export.
|
|
20
|
+
//
|
|
21
|
+
// 1. Build a project where `a.ts` validates `Alpha` imported from `barrel.ts`,
|
|
22
|
+
// which re-exports it from `inner.ts`, which re-exports it from `alpha.ts`;
|
|
23
|
+
// `barrel.ts` also re-exports an unconsumed `Beta` from `beta.ts`.
|
|
24
|
+
// 2. Run project transform mode and decode the JSON envelope.
|
|
25
|
+
// 3. Assert `dependencies["src/a.ts"]` contains both barrels (`barrel.ts`,
|
|
26
|
+
// `inner.ts`) and the concrete module `alpha.ts`.
|
|
27
|
+
// 4. Assert it does NOT contain `beta.ts`, which no consulted type reaches.
|
|
28
|
+
func TestProjectDependenciesBarrelReexportTransform(t *testing.T) {
|
|
29
|
+
project := projectDependenciesBarrelReexportProject(t)
|
|
30
|
+
out, errText, code := ttscTypiaTestCapture(func() int {
|
|
31
|
+
return runTransform([]string{
|
|
32
|
+
"--cwd", project,
|
|
33
|
+
"--tsconfig", "tsconfig.json",
|
|
34
|
+
"--output", "ts",
|
|
35
|
+
})
|
|
36
|
+
})
|
|
37
|
+
if code != 0 {
|
|
38
|
+
t.Fatalf("project transform failed: code=%d stderr=\n%s", code, errText)
|
|
39
|
+
}
|
|
40
|
+
var envelope struct {
|
|
41
|
+
Dependencies map[string][]string `json:"dependencies"`
|
|
42
|
+
}
|
|
43
|
+
if err := json.Unmarshal([]byte(out), &envelope); err != nil {
|
|
44
|
+
t.Fatalf("decode envelope: %v\n%s", err, out)
|
|
45
|
+
}
|
|
46
|
+
entries := envelope.Dependencies["src/a.ts"]
|
|
47
|
+
found := map[string]bool{}
|
|
48
|
+
for _, entry := range entries {
|
|
49
|
+
found[entry] = true
|
|
50
|
+
}
|
|
51
|
+
if !found["src/barrel.ts"] {
|
|
52
|
+
t.Fatalf("dependencies of src/a.ts must contain the barrel src/barrel.ts: %v", entries)
|
|
53
|
+
}
|
|
54
|
+
if !found["src/inner.ts"] {
|
|
55
|
+
t.Fatalf("dependencies of src/a.ts must contain the chained barrel src/inner.ts: %v", entries)
|
|
56
|
+
}
|
|
57
|
+
if !found["src/alpha.ts"] {
|
|
58
|
+
t.Fatalf("dependencies of src/a.ts must contain the concrete module src/alpha.ts: %v", entries)
|
|
59
|
+
}
|
|
60
|
+
if found["src/beta.ts"] {
|
|
61
|
+
t.Fatalf("dependencies of src/a.ts must not contain src/beta.ts, which the barrel exports but no consulted type reaches: %v", entries)
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
func projectDependenciesBarrelReexportProject(t *testing.T) string {
|
|
66
|
+
t.Helper()
|
|
67
|
+
root := ttscTypiaTestRepoRoot(t)
|
|
68
|
+
base := filepath.Join(root, "packages", "typia", "native", ".tmp-ttsc-typia-tests")
|
|
69
|
+
if err := os.MkdirAll(base, 0o755); err != nil {
|
|
70
|
+
t.Fatalf("mkdir temp base: %v", err)
|
|
71
|
+
}
|
|
72
|
+
dir, err := os.MkdirTemp(base, "project-dependencies-barrel-reexport-")
|
|
73
|
+
if err != nil {
|
|
74
|
+
t.Fatalf("create temp fixture: %v", err)
|
|
75
|
+
}
|
|
76
|
+
t.Cleanup(func() { _ = os.RemoveAll(dir) })
|
|
77
|
+
src := filepath.Join(dir, "src")
|
|
78
|
+
if err := os.MkdirAll(src, 0o755); err != nil {
|
|
79
|
+
t.Fatalf("mkdir fixture src: %v", err)
|
|
80
|
+
}
|
|
81
|
+
if err := os.WriteFile(filepath.Join(dir, "tsconfig.json"), []byte(projectDependenciesEnvelopeTSConfig), 0o644); err != nil {
|
|
82
|
+
t.Fatalf("write tsconfig: %v", err)
|
|
83
|
+
}
|
|
84
|
+
for name, body := range map[string]string{
|
|
85
|
+
"a.ts": projectDependenciesBarrelReexportSourceA,
|
|
86
|
+
"barrel.ts": projectDependenciesBarrelReexportSourceBarrel,
|
|
87
|
+
"inner.ts": projectDependenciesBarrelReexportSourceInner,
|
|
88
|
+
"alpha.ts": projectDependenciesBarrelReexportSourceAlpha,
|
|
89
|
+
"beta.ts": projectDependenciesBarrelReexportSourceBeta,
|
|
90
|
+
} {
|
|
91
|
+
if err := os.WriteFile(filepath.Join(src, name), []byte(body), 0o644); err != nil {
|
|
92
|
+
t.Fatalf("write %s: %v", name, err)
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return dir
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const projectDependenciesBarrelReexportSourceA = `import typia from "typia";
|
|
99
|
+
|
|
100
|
+
import { Alpha } from "./barrel";
|
|
101
|
+
|
|
102
|
+
export const validateAlpha = (input: unknown) => typia.validate<Alpha>(input);
|
|
103
|
+
`
|
|
104
|
+
|
|
105
|
+
const projectDependenciesBarrelReexportSourceBarrel = `export { Alpha } from "./inner";
|
|
106
|
+
export { Beta } from "./beta";
|
|
107
|
+
`
|
|
108
|
+
|
|
109
|
+
const projectDependenciesBarrelReexportSourceInner = `export { Alpha } from "./alpha";
|
|
110
|
+
`
|
|
111
|
+
|
|
112
|
+
const projectDependenciesBarrelReexportSourceAlpha = `export interface Alpha {
|
|
113
|
+
id: string;
|
|
114
|
+
}
|
|
115
|
+
`
|
|
116
|
+
|
|
117
|
+
const projectDependenciesBarrelReexportSourceBeta = `export interface Beta {
|
|
118
|
+
flag: boolean;
|
|
119
|
+
}
|
|
120
|
+
`
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
package main
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"encoding/json"
|
|
5
|
+
"os"
|
|
6
|
+
"path/filepath"
|
|
7
|
+
"testing"
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
// TestProjectDependenciesCollapsedAliasTransform verifies written references
|
|
11
|
+
// register files the checker's type graph collapses, and nothing more.
|
|
12
|
+
//
|
|
13
|
+
// An alias of an intrinsic (`type Inner = number`) is interned by the checker
|
|
14
|
+
// without an alias symbol, so the semantic type-graph touches alone can never
|
|
15
|
+
// see its declaring file — only the WRITTEN reference walk can. The negative
|
|
16
|
+
// twin pins the walk's boundary: a type referenced only inside a method BODY
|
|
17
|
+
// is not part of the consulted type surface and must not register.
|
|
18
|
+
//
|
|
19
|
+
// 1. Build a project where `a.ts` validates `Outer` (`t.ts`, an alias whose
|
|
20
|
+
// property type is the collapsed alias `Inner` from `u.ts`), the directly
|
|
21
|
+
// collapsed alias `Direct` from `v.ts`, and a class from `m.ts` whose
|
|
22
|
+
// method body (and only its body) references a type from `w.ts`.
|
|
23
|
+
// 2. Run project transform mode and decode the JSON envelope.
|
|
24
|
+
// 3. Assert `dependencies["src/a.ts"]` contains `t.ts`, `u.ts`, and `v.ts`.
|
|
25
|
+
// 4. Assert it does NOT contain `w.ts` (body-only reference).
|
|
26
|
+
func TestProjectDependenciesCollapsedAliasTransform(t *testing.T) {
|
|
27
|
+
project := projectDependenciesCollapsedAliasProject(t)
|
|
28
|
+
out, errText, code := ttscTypiaTestCapture(func() int {
|
|
29
|
+
return runTransform([]string{
|
|
30
|
+
"--cwd", project,
|
|
31
|
+
"--tsconfig", "tsconfig.json",
|
|
32
|
+
"--output", "ts",
|
|
33
|
+
})
|
|
34
|
+
})
|
|
35
|
+
if code != 0 {
|
|
36
|
+
t.Fatalf("project transform failed: code=%d stderr=\n%s", code, errText)
|
|
37
|
+
}
|
|
38
|
+
var envelope struct {
|
|
39
|
+
Dependencies map[string][]string `json:"dependencies"`
|
|
40
|
+
}
|
|
41
|
+
if err := json.Unmarshal([]byte(out), &envelope); err != nil {
|
|
42
|
+
t.Fatalf("decode envelope: %v\n%s", err, out)
|
|
43
|
+
}
|
|
44
|
+
entries := envelope.Dependencies["src/a.ts"]
|
|
45
|
+
found := map[string]bool{}
|
|
46
|
+
for _, entry := range entries {
|
|
47
|
+
found[entry] = true
|
|
48
|
+
}
|
|
49
|
+
if !found["src/t.ts"] {
|
|
50
|
+
t.Fatalf("dependencies of src/a.ts must contain the outer alias file src/t.ts: %v", entries)
|
|
51
|
+
}
|
|
52
|
+
if !found["src/u.ts"] {
|
|
53
|
+
t.Fatalf("dependencies of src/a.ts must contain the collapsed property alias file src/u.ts: %v", entries)
|
|
54
|
+
}
|
|
55
|
+
if !found["src/v.ts"] {
|
|
56
|
+
t.Fatalf("dependencies of src/a.ts must contain the collapsed top-level alias file src/v.ts: %v", entries)
|
|
57
|
+
}
|
|
58
|
+
if found["src/w.ts"] {
|
|
59
|
+
t.Fatalf("dependencies of src/a.ts must not contain the body-only reference file src/w.ts: %v", entries)
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
func projectDependenciesCollapsedAliasProject(t *testing.T) string {
|
|
64
|
+
t.Helper()
|
|
65
|
+
root := ttscTypiaTestRepoRoot(t)
|
|
66
|
+
base := filepath.Join(root, "packages", "typia", "native", ".tmp-ttsc-typia-tests")
|
|
67
|
+
if err := os.MkdirAll(base, 0o755); err != nil {
|
|
68
|
+
t.Fatalf("mkdir temp base: %v", err)
|
|
69
|
+
}
|
|
70
|
+
dir, err := os.MkdirTemp(base, "project-dependencies-collapsed-alias-")
|
|
71
|
+
if err != nil {
|
|
72
|
+
t.Fatalf("create temp fixture: %v", err)
|
|
73
|
+
}
|
|
74
|
+
t.Cleanup(func() { _ = os.RemoveAll(dir) })
|
|
75
|
+
src := filepath.Join(dir, "src")
|
|
76
|
+
if err := os.MkdirAll(src, 0o755); err != nil {
|
|
77
|
+
t.Fatalf("mkdir fixture src: %v", err)
|
|
78
|
+
}
|
|
79
|
+
if err := os.WriteFile(filepath.Join(dir, "tsconfig.json"), []byte(projectDependenciesEnvelopeTSConfig), 0o644); err != nil {
|
|
80
|
+
t.Fatalf("write tsconfig: %v", err)
|
|
81
|
+
}
|
|
82
|
+
for name, body := range map[string]string{
|
|
83
|
+
"a.ts": projectDependenciesCollapsedAliasSourceA,
|
|
84
|
+
"t.ts": projectDependenciesCollapsedAliasSourceT,
|
|
85
|
+
"u.ts": projectDependenciesCollapsedAliasSourceU,
|
|
86
|
+
"v.ts": projectDependenciesCollapsedAliasSourceV,
|
|
87
|
+
"m.ts": projectDependenciesCollapsedAliasSourceM,
|
|
88
|
+
"w.ts": projectDependenciesCollapsedAliasSourceW,
|
|
89
|
+
} {
|
|
90
|
+
if err := os.WriteFile(filepath.Join(src, name), []byte(body), 0o644); err != nil {
|
|
91
|
+
t.Fatalf("write %s: %v", name, err)
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return dir
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const projectDependenciesCollapsedAliasSourceA = `import typia from "typia";
|
|
98
|
+
|
|
99
|
+
import { WithMethod } from "./m";
|
|
100
|
+
import { Outer } from "./t";
|
|
101
|
+
import { Direct } from "./v";
|
|
102
|
+
|
|
103
|
+
export const validateOuter = (input: unknown) => typia.validate<Outer>(input);
|
|
104
|
+
export const validateDirect = (input: unknown) => typia.validate<Direct>(input);
|
|
105
|
+
export const validateWithMethod = (input: unknown) => typia.validate<WithMethod>(input);
|
|
106
|
+
`
|
|
107
|
+
|
|
108
|
+
const projectDependenciesCollapsedAliasSourceT = `import { Inner } from "./u";
|
|
109
|
+
|
|
110
|
+
export type Outer = { value: Inner };
|
|
111
|
+
`
|
|
112
|
+
|
|
113
|
+
const projectDependenciesCollapsedAliasSourceU = `export type Inner = number;
|
|
114
|
+
`
|
|
115
|
+
|
|
116
|
+
const projectDependenciesCollapsedAliasSourceV = `export type Direct = string;
|
|
117
|
+
`
|
|
118
|
+
|
|
119
|
+
const projectDependenciesCollapsedAliasSourceM = `import { BodyOnly } from "./w";
|
|
120
|
+
|
|
121
|
+
export class WithMethod {
|
|
122
|
+
public id!: string;
|
|
123
|
+
|
|
124
|
+
public describe(): string {
|
|
125
|
+
const helper: BodyOnly = { tag: "x" };
|
|
126
|
+
return helper.tag;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
`
|
|
130
|
+
|
|
131
|
+
const projectDependenciesCollapsedAliasSourceW = `export interface BodyOnly {
|
|
132
|
+
tag: string;
|
|
133
|
+
}
|
|
134
|
+
`
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
package main
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"encoding/json"
|
|
5
|
+
"os"
|
|
6
|
+
"path/filepath"
|
|
7
|
+
"strings"
|
|
8
|
+
"testing"
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
// TestProjectDependenciesCustomLibNameTransform verifies a project-owned
|
|
12
|
+
// ambient declaration file named `lib.custom.d.ts` appears in the transform
|
|
13
|
+
// envelope's `dependencies`.
|
|
14
|
+
//
|
|
15
|
+
// Default-library exclusion must come from the compiler's own classification,
|
|
16
|
+
// never from a filename pattern: a basename predicate (`lib.*.d.ts`) silently
|
|
17
|
+
// drops a project's own ambient file with that common naming, so its changes
|
|
18
|
+
// never invalidate consumers and persistent bundler caches serve stale
|
|
19
|
+
// validators (samchon/typia#2108). Compiler-owned default libraries must still
|
|
20
|
+
// stay excluded.
|
|
21
|
+
//
|
|
22
|
+
// 1. Build a project where `a.ts` calls `typia.validate<Bee>()` with `Bee`
|
|
23
|
+
// declared in `b.ts` consuming the ambient `CustomAmbient` interface
|
|
24
|
+
// declared in `src/lib.custom.d.ts`, plus a `Date` property so the
|
|
25
|
+
// analysis touches real default libraries.
|
|
26
|
+
// 2. Run project transform mode and decode the JSON envelope.
|
|
27
|
+
// 3. Assert `dependencies["src/a.ts"]` contains `src/lib.custom.d.ts`.
|
|
28
|
+
// 4. Assert no compiler-owned default library (virtual `bundled:///` URI or
|
|
29
|
+
// any value outside the project) leaks into the entry.
|
|
30
|
+
func TestProjectDependenciesCustomLibNameTransform(t *testing.T) {
|
|
31
|
+
project := projectDependenciesCustomLibNameProject(t)
|
|
32
|
+
out, errText, code := ttscTypiaTestCapture(func() int {
|
|
33
|
+
return runTransform([]string{
|
|
34
|
+
"--cwd", project,
|
|
35
|
+
"--tsconfig", "tsconfig.json",
|
|
36
|
+
"--output", "ts",
|
|
37
|
+
})
|
|
38
|
+
})
|
|
39
|
+
if code != 0 {
|
|
40
|
+
t.Fatalf("project transform failed: code=%d stderr=\n%s", code, errText)
|
|
41
|
+
}
|
|
42
|
+
var envelope struct {
|
|
43
|
+
TypeScript map[string]string `json:"typescript"`
|
|
44
|
+
Dependencies map[string][]string `json:"dependencies"`
|
|
45
|
+
}
|
|
46
|
+
if err := json.Unmarshal([]byte(out), &envelope); err != nil {
|
|
47
|
+
t.Fatalf("decode envelope: %v\n%s", err, out)
|
|
48
|
+
}
|
|
49
|
+
entries := envelope.Dependencies["src/a.ts"]
|
|
50
|
+
if len(entries) == 0 {
|
|
51
|
+
t.Fatalf("dependencies must contain an entry for src/a.ts:\n%s", out)
|
|
52
|
+
}
|
|
53
|
+
found := map[string]bool{}
|
|
54
|
+
for _, entry := range entries {
|
|
55
|
+
found[entry] = true
|
|
56
|
+
if strings.Contains(entry, "://") {
|
|
57
|
+
t.Fatalf("dependencies must exclude virtual URI sources, got %q in %v", entry, entries)
|
|
58
|
+
}
|
|
59
|
+
if filepath.IsAbs(filepath.FromSlash(entry)) || strings.HasPrefix(entry, "../") {
|
|
60
|
+
t.Fatalf("dependencies must not report files outside the project, got %q in %v", entry, entries)
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
if !found["src/lib.custom.d.ts"] {
|
|
64
|
+
t.Fatalf("dependencies of src/a.ts must contain the project-owned src/lib.custom.d.ts: %v", entries)
|
|
65
|
+
}
|
|
66
|
+
if !found["src/b.ts"] {
|
|
67
|
+
t.Fatalf("dependencies of src/a.ts must contain the direct declaration file src/b.ts: %v", entries)
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
func projectDependenciesCustomLibNameProject(t *testing.T) string {
|
|
72
|
+
t.Helper()
|
|
73
|
+
root := ttscTypiaTestRepoRoot(t)
|
|
74
|
+
base := filepath.Join(root, "packages", "typia", "native", ".tmp-ttsc-typia-tests")
|
|
75
|
+
if err := os.MkdirAll(base, 0o755); err != nil {
|
|
76
|
+
t.Fatalf("mkdir temp base: %v", err)
|
|
77
|
+
}
|
|
78
|
+
dir, err := os.MkdirTemp(base, "project-dependencies-custom-lib-name-")
|
|
79
|
+
if err != nil {
|
|
80
|
+
t.Fatalf("create temp fixture: %v", err)
|
|
81
|
+
}
|
|
82
|
+
t.Cleanup(func() { _ = os.RemoveAll(dir) })
|
|
83
|
+
src := filepath.Join(dir, "src")
|
|
84
|
+
if err := os.MkdirAll(src, 0o755); err != nil {
|
|
85
|
+
t.Fatalf("mkdir fixture src: %v", err)
|
|
86
|
+
}
|
|
87
|
+
if err := os.WriteFile(filepath.Join(dir, "tsconfig.json"), []byte(projectDependenciesCustomLibNameTSConfig), 0o644); err != nil {
|
|
88
|
+
t.Fatalf("write tsconfig: %v", err)
|
|
89
|
+
}
|
|
90
|
+
for name, body := range map[string]string{
|
|
91
|
+
"a.ts": projectDependenciesCustomLibNameSourceA,
|
|
92
|
+
"b.ts": projectDependenciesCustomLibNameSourceB,
|
|
93
|
+
"lib.custom.d.ts": projectDependenciesCustomLibNameSourceLib,
|
|
94
|
+
} {
|
|
95
|
+
if err := os.WriteFile(filepath.Join(src, name), []byte(body), 0o644); err != nil {
|
|
96
|
+
t.Fatalf("write %s: %v", name, err)
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return dir
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const projectDependenciesCustomLibNameTSConfig = `{
|
|
103
|
+
"compilerOptions": {
|
|
104
|
+
"target": "ES2022",
|
|
105
|
+
"module": "commonjs",
|
|
106
|
+
"moduleResolution": "bundler",
|
|
107
|
+
"ignoreDeprecations": "6.0",
|
|
108
|
+
"esModuleInterop": true,
|
|
109
|
+
"strict": true,
|
|
110
|
+
"skipLibCheck": true,
|
|
111
|
+
"rootDir": "src",
|
|
112
|
+
"outDir": "dist"
|
|
113
|
+
},
|
|
114
|
+
"include": ["src"]
|
|
115
|
+
}
|
|
116
|
+
`
|
|
117
|
+
|
|
118
|
+
const projectDependenciesCustomLibNameSourceA = `import typia from "typia";
|
|
119
|
+
|
|
120
|
+
import { Bee } from "./b";
|
|
121
|
+
|
|
122
|
+
export const validateBee = (input: unknown) => typia.validate<Bee>(input);
|
|
123
|
+
`
|
|
124
|
+
|
|
125
|
+
const projectDependenciesCustomLibNameSourceB = `export interface Bee {
|
|
126
|
+
id: string;
|
|
127
|
+
when: Date;
|
|
128
|
+
ambient: CustomAmbient;
|
|
129
|
+
}
|
|
130
|
+
`
|
|
131
|
+
|
|
132
|
+
const projectDependenciesCustomLibNameSourceLib = `declare interface CustomAmbient {
|
|
133
|
+
tag: string;
|
|
134
|
+
}
|
|
135
|
+
`
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
package main
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"encoding/json"
|
|
5
|
+
"os"
|
|
6
|
+
"path/filepath"
|
|
7
|
+
"testing"
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
// TestProjectDependenciesDefaultBarrelTransform verifies a default-export
|
|
11
|
+
// barrel reports the module it forwards to, and never a same-named sibling.
|
|
12
|
+
//
|
|
13
|
+
// A default import binds `default`, not its own local name, so an alias walk
|
|
14
|
+
// that stepped through the local name would look up whatever the barrel happens
|
|
15
|
+
// to export under it — reporting a module the reference never consults and
|
|
16
|
+
// invalidating consumers on edits that cannot reach them. `dependencies` names
|
|
17
|
+
// every file whose edit can change the generated output and ONLY those, so this
|
|
18
|
+
// pins both halves of that invariant on one fixture (samchon/typia#2126).
|
|
19
|
+
//
|
|
20
|
+
// 1. Build a project where `a.ts` validates the default import `Alpha` from
|
|
21
|
+
// `barrel.ts`, which forwards `default` from `real.ts` while separately
|
|
22
|
+
// exporting an unrelated NAMED `Alpha` from `unrelated.ts`.
|
|
23
|
+
// 2. Run project transform mode and decode the JSON envelope.
|
|
24
|
+
// 3. Assert `dependencies["src/a.ts"]` contains `barrel.ts` and `real.ts`.
|
|
25
|
+
// 4. Assert it does NOT contain `unrelated.ts`, whose only tie to the walk is
|
|
26
|
+
// sharing the local name of the default import.
|
|
27
|
+
func TestProjectDependenciesDefaultBarrelTransform(t *testing.T) {
|
|
28
|
+
project := projectDependenciesDefaultBarrelProject(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 default barrel src/barrel.ts: %v", entries)
|
|
52
|
+
}
|
|
53
|
+
if !found["src/real.ts"] {
|
|
54
|
+
t.Fatalf("dependencies of src/a.ts must contain the forwarded module src/real.ts: %v", entries)
|
|
55
|
+
}
|
|
56
|
+
if found["src/unrelated.ts"] {
|
|
57
|
+
t.Fatalf("dependencies of src/a.ts must not contain src/unrelated.ts: the default import never consults the barrel's same-named export: %v", entries)
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
func projectDependenciesDefaultBarrelProject(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-default-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": projectDependenciesDefaultBarrelSourceA,
|
|
82
|
+
"barrel.ts": projectDependenciesDefaultBarrelSourceBarrel,
|
|
83
|
+
"real.ts": projectDependenciesDefaultBarrelSourceReal,
|
|
84
|
+
"unrelated.ts": projectDependenciesDefaultBarrelSourceUnrelated,
|
|
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 projectDependenciesDefaultBarrelSourceA = `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 projectDependenciesDefaultBarrelSourceBarrel = `export { default } from "./real";
|
|
101
|
+
export { Alpha } from "./unrelated";
|
|
102
|
+
`
|
|
103
|
+
|
|
104
|
+
const projectDependenciesDefaultBarrelSourceReal = `interface Real {
|
|
105
|
+
id: string;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export default Real;
|
|
109
|
+
`
|
|
110
|
+
|
|
111
|
+
const projectDependenciesDefaultBarrelSourceUnrelated = `export interface Alpha {
|
|
112
|
+
nope: boolean;
|
|
113
|
+
}
|
|
114
|
+
`
|