typia 13.1.1 → 13.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -0
- package/lib/_virtual/_rolldown/runtime.mjs +1 -5
- package/lib/executable/FileSystemIdentity.d.ts +44 -0
- package/lib/executable/FileSystemIdentity.js +213 -0
- package/lib/executable/FileSystemIdentity.js.map +1 -0
- package/lib/executable/FileSystemIdentity.mjs +133 -0
- package/lib/executable/FileSystemIdentity.mjs.map +1 -0
- package/lib/executable/TypiaGenerateWizard.js +272 -106
- package/lib/executable/TypiaGenerateWizard.js.map +1 -1
- package/lib/executable/TypiaGenerateWizard.mjs +239 -95
- package/lib/executable/TypiaGenerateWizard.mjs.map +1 -1
- package/lib/functional.d.ts +15 -12
- package/lib/functional.js.map +1 -1
- package/lib/functional.mjs.map +1 -1
- package/lib/internal/_ProtobufReader.d.ts +32 -0
- package/lib/internal/_ProtobufReader.js +148 -48
- package/lib/internal/_ProtobufReader.js.map +1 -1
- package/lib/internal/_ProtobufReader.mjs +137 -41
- package/lib/internal/_ProtobufReader.mjs.map +1 -1
- package/lib/internal/_createStandardSchema.js +18 -1
- package/lib/internal/_createStandardSchema.js.map +1 -1
- package/lib/internal/_createStandardSchema.mjs +12 -1
- package/lib/internal/_createStandardSchema.mjs.map +1 -1
- package/lib/internal/_decimal.d.ts +14 -0
- package/lib/internal/_decimal.js +61 -0
- package/lib/internal/_decimal.js.map +1 -0
- package/lib/internal/_decimal.mjs +49 -0
- package/lib/internal/_decimal.mjs.map +1 -0
- package/lib/internal/_httpQueryParseURLSearchParams.js +23 -2
- package/lib/internal/_httpQueryParseURLSearchParams.js.map +1 -1
- package/lib/internal/_httpQueryParseURLSearchParams.mjs +20 -2
- package/lib/internal/_httpQueryParseURLSearchParams.mjs.map +1 -1
- package/lib/internal/_isFormatByte.js +2 -5
- package/lib/internal/_isFormatByte.js.map +1 -1
- package/lib/internal/_isFormatByte.mjs +2 -5
- package/lib/internal/_isFormatByte.mjs.map +1 -1
- package/lib/internal/_isFormatDate.js +15 -2
- package/lib/internal/_isFormatDate.js.map +1 -1
- package/lib/internal/_isFormatDate.mjs +22 -2
- package/lib/internal/_isFormatDate.mjs.map +1 -1
- package/lib/internal/_isFormatDateTime.js +21 -2
- package/lib/internal/_isFormatDateTime.js.map +1 -1
- package/lib/internal/_isFormatDateTime.mjs +13 -2
- package/lib/internal/_isFormatDateTime.mjs.map +1 -1
- package/lib/internal/_isFormatIri.js +3 -2
- package/lib/internal/_isFormatIri.js.map +1 -1
- package/lib/internal/_isFormatIri.mjs +3 -2
- package/lib/internal/_isFormatIri.mjs.map +1 -1
- package/lib/internal/_isFormatIriReference.js +10 -2
- package/lib/internal/_isFormatIriReference.js.map +1 -1
- package/lib/internal/_isFormatIriReference.mjs +9 -2
- package/lib/internal/_isFormatIriReference.mjs.map +1 -1
- package/lib/internal/_isFormatUriReference.js +1 -1
- package/lib/internal/_isFormatUriReference.js.map +1 -1
- package/lib/internal/_isFormatUriReference.mjs +1 -1
- package/lib/internal/_isFormatUriReference.mjs.map +1 -1
- package/lib/internal/_isMultipleOf.d.ts +1 -0
- package/lib/internal/_isMultipleOf.js +13 -0
- package/lib/internal/_isMultipleOf.js.map +1 -0
- package/lib/internal/_isMultipleOf.mjs +12 -0
- package/lib/internal/_isMultipleOf.mjs.map +1 -0
- package/lib/internal/_isTypeFloat.js +1 -1
- package/lib/internal/_isTypeFloat.js.map +1 -1
- package/lib/internal/_isTypeFloat.mjs +1 -1
- package/lib/internal/_isTypeFloat.mjs.map +1 -1
- package/lib/internal/_isTypeInt64.js +1 -0
- package/lib/internal/_isTypeInt64.js.map +1 -1
- package/lib/internal/_isTypeInt64.mjs.map +1 -1
- package/lib/internal/_isTypeInt64Bigint.d.ts +1 -0
- package/lib/internal/_isTypeInt64Bigint.js +15 -0
- package/lib/internal/_isTypeInt64Bigint.js.map +1 -0
- package/lib/internal/_isTypeInt64Bigint.mjs +8 -0
- package/lib/internal/_isTypeInt64Bigint.mjs.map +1 -0
- package/lib/internal/_isTypeUint64.js +1 -0
- package/lib/internal/_isTypeUint64.js.map +1 -1
- package/lib/internal/_isTypeUint64.mjs.map +1 -1
- package/lib/internal/_isTypeUint64Bigint.d.ts +1 -0
- package/lib/internal/_isTypeUint64Bigint.js +10 -0
- package/lib/internal/_isTypeUint64Bigint.js.map +1 -0
- package/lib/internal/_isTypeUint64Bigint.mjs +8 -0
- package/lib/internal/_isTypeUint64Bigint.mjs.map +1 -0
- package/lib/internal/_isUniqueItems.js +96 -109
- package/lib/internal/_isUniqueItems.js.map +1 -1
- package/lib/internal/_isUniqueItems.mjs +62 -50
- package/lib/internal/_isUniqueItems.mjs.map +1 -1
- package/lib/internal/_jsonStringifyArray.d.ts +1 -0
- package/lib/internal/_jsonStringifyArray.js +48 -0
- package/lib/internal/_jsonStringifyArray.js.map +1 -0
- package/lib/internal/_jsonStringifyArray.mjs +40 -0
- package/lib/internal/_jsonStringifyArray.mjs.map +1 -0
- package/lib/internal/_jsonStringifyElement.d.ts +1 -0
- package/lib/internal/_jsonStringifyElement.js +23 -0
- package/lib/internal/_jsonStringifyElement.js.map +1 -0
- package/lib/internal/_jsonStringifyElement.mjs +23 -0
- package/lib/internal/_jsonStringifyElement.mjs.map +1 -0
- package/lib/internal/_jsonStringifyProperty.d.ts +1 -0
- package/lib/internal/_jsonStringifyProperty.js +31 -0
- package/lib/internal/_jsonStringifyProperty.js.map +1 -0
- package/lib/internal/_jsonStringifyProperty.mjs +31 -0
- package/lib/internal/_jsonStringifyProperty.mjs.map +1 -0
- package/lib/internal/_llmApplicationFinalize.js +1 -1
- package/lib/internal/_llmApplicationFinalize.js.map +1 -1
- package/lib/internal/_llmApplicationFinalize.mjs +1 -1
- package/lib/internal/_llmApplicationFinalize.mjs.map +1 -1
- package/lib/internal/_notationAny.js +8 -1
- package/lib/internal/_notationAny.js.map +1 -1
- package/lib/internal/_notationAny.mjs +7 -1
- package/lib/internal/_notationAny.mjs.map +1 -1
- package/lib/internal/_notationAssign.d.ts +1 -0
- package/lib/internal/_notationAssign.js +18 -0
- package/lib/internal/_notationAssign.js.map +1 -0
- package/lib/internal/_notationAssign.mjs +17 -0
- package/lib/internal/_notationAssign.mjs.map +1 -0
- package/lib/internal/_notationCamel.js +30 -9
- package/lib/internal/_notationCamel.js.map +1 -1
- package/lib/internal/_notationCamel.mjs +13 -5
- package/lib/internal/_notationCamel.mjs.map +1 -1
- package/lib/internal/_notationKebab.d.ts +1 -0
- package/lib/internal/_notationKebab.js +15 -0
- package/lib/internal/_notationKebab.js.map +1 -0
- package/lib/internal/_notationKebab.mjs +15 -0
- package/lib/internal/_notationKebab.mjs.map +1 -0
- package/lib/internal/_notationKeyCollision.d.ts +1 -0
- package/lib/internal/_notationKeyCollision.js +8 -0
- package/lib/internal/_notationKeyCollision.js.map +1 -0
- package/lib/internal/_notationKeyCollision.mjs +8 -0
- package/lib/internal/_notationKeyCollision.mjs.map +1 -0
- package/lib/internal/_notationPascal.js +20 -5
- package/lib/internal/_notationPascal.js.map +1 -1
- package/lib/internal/_notationPascal.mjs +10 -5
- package/lib/internal/_notationPascal.mjs.map +1 -1
- package/lib/internal/_notationSnake.js +25 -22
- package/lib/internal/_notationSnake.js.map +1 -1
- package/lib/internal/_notationSnake.mjs +11 -11
- package/lib/internal/_notationSnake.mjs.map +1 -1
- package/lib/internal/_plainCloneAny.js +174 -38
- package/lib/internal/_plainCloneAny.js.map +1 -1
- package/lib/internal/_plainCloneAny.mjs +126 -22
- package/lib/internal/_plainCloneAny.mjs.map +1 -1
- package/lib/internal/_randomArray.d.ts +1 -1
- package/lib/internal/_randomArray.js +11 -4
- package/lib/internal/_randomArray.js.map +1 -1
- package/lib/internal/_randomArray.mjs +9 -3
- package/lib/internal/_randomArray.mjs.map +1 -1
- package/lib/internal/_randomFormatByte.d.ts +2 -1
- package/lib/internal/_randomFormatByte.js +25 -1
- package/lib/internal/_randomFormatByte.js.map +1 -1
- package/lib/internal/_randomFormatByte.mjs +20 -1
- package/lib/internal/_randomFormatByte.mjs.map +1 -1
- package/lib/internal/_randomFormatDate.d.ts +3 -4
- package/lib/internal/_randomFormatDate.js +3 -10
- package/lib/internal/_randomFormatDate.js.map +1 -1
- package/lib/internal/_randomFormatDate.mjs +3 -6
- package/lib/internal/_randomFormatDate.mjs.map +1 -1
- package/lib/internal/_randomFormatDatetime.d.ts +3 -4
- package/lib/internal/_randomFormatDatetime.js +26 -8
- package/lib/internal/_randomFormatDatetime.js.map +1 -1
- package/lib/internal/_randomFormatDatetime.mjs +17 -6
- package/lib/internal/_randomFormatDatetime.mjs.map +1 -1
- package/lib/internal/_randomFormatDuration.d.ts +2 -1
- package/lib/internal/_randomFormatDuration.js +23 -14
- package/lib/internal/_randomFormatDuration.js.map +1 -1
- package/lib/internal/_randomFormatDuration.mjs +22 -13
- package/lib/internal/_randomFormatDuration.mjs.map +1 -1
- package/lib/internal/_randomFormatEmail.d.ts +2 -1
- package/lib/internal/_randomFormatEmail.js +8 -1
- package/lib/internal/_randomFormatEmail.js.map +1 -1
- package/lib/internal/_randomFormatEmail.mjs +5 -1
- package/lib/internal/_randomFormatEmail.mjs.map +1 -1
- package/lib/internal/_randomFormatHostname.d.ts +8 -1
- package/lib/internal/_randomFormatHostname.js +45 -2
- package/lib/internal/_randomFormatHostname.js.map +1 -1
- package/lib/internal/_randomFormatHostname.mjs +38 -2
- package/lib/internal/_randomFormatHostname.mjs.map +1 -1
- package/lib/internal/_randomFormatIdnEmail.d.ts +2 -1
- package/lib/internal/_randomFormatIdnEmail.js +16 -2
- package/lib/internal/_randomFormatIdnEmail.js.map +1 -1
- package/lib/internal/_randomFormatIdnEmail.mjs +11 -2
- package/lib/internal/_randomFormatIdnEmail.mjs.map +1 -1
- package/lib/internal/_randomFormatIdnHostname.d.ts +2 -1
- package/lib/internal/_randomFormatIdnHostname.js +26 -1
- package/lib/internal/_randomFormatIdnHostname.js.map +1 -1
- package/lib/internal/_randomFormatIdnHostname.mjs +25 -2
- package/lib/internal/_randomFormatIdnHostname.mjs.map +1 -1
- package/lib/internal/_randomFormatIpv4.d.ts +2 -1
- package/lib/internal/_randomFormatIpv4.js +32 -1
- package/lib/internal/_randomFormatIpv4.js.map +1 -1
- package/lib/internal/_randomFormatIpv4.mjs +23 -1
- package/lib/internal/_randomFormatIpv4.mjs.map +1 -1
- package/lib/internal/_randomFormatIpv6.d.ts +2 -1
- package/lib/internal/_randomFormatIpv6.js +58 -1
- package/lib/internal/_randomFormatIpv6.js.map +1 -1
- package/lib/internal/_randomFormatIpv6.mjs +45 -1
- package/lib/internal/_randomFormatIpv6.mjs.map +1 -1
- package/lib/internal/_randomFormatIri.d.ts +2 -1
- package/lib/internal/_randomFormatIri.js +1 -1
- package/lib/internal/_randomFormatIri.js.map +1 -1
- package/lib/internal/_randomFormatIri.mjs +1 -1
- package/lib/internal/_randomFormatIri.mjs.map +1 -1
- package/lib/internal/_randomFormatIriReference.d.ts +2 -1
- package/lib/internal/_randomFormatIriReference.js +1 -1
- package/lib/internal/_randomFormatIriReference.js.map +1 -1
- package/lib/internal/_randomFormatIriReference.mjs +1 -1
- package/lib/internal/_randomFormatIriReference.mjs.map +1 -1
- package/lib/internal/_randomFormatJsonPointer.d.ts +2 -1
- package/lib/internal/_randomFormatJsonPointer.js +20 -1
- package/lib/internal/_randomFormatJsonPointer.js.map +1 -1
- package/lib/internal/_randomFormatJsonPointer.mjs +15 -1
- package/lib/internal/_randomFormatJsonPointer.mjs.map +1 -1
- package/lib/internal/_randomFormatPassword.d.ts +2 -1
- package/lib/internal/_randomFormatPassword.js +7 -5
- package/lib/internal/_randomFormatPassword.js.map +1 -1
- package/lib/internal/_randomFormatPassword.mjs +5 -1
- package/lib/internal/_randomFormatPassword.mjs.map +1 -1
- package/lib/internal/_randomFormatRegex.d.ts +2 -1
- package/lib/internal/_randomFormatRegex.js +15 -1
- package/lib/internal/_randomFormatRegex.js.map +1 -1
- package/lib/internal/_randomFormatRegex.mjs +14 -1
- package/lib/internal/_randomFormatRegex.mjs.map +1 -1
- package/lib/internal/_randomFormatRelativeJsonPointer.d.ts +2 -1
- package/lib/internal/_randomFormatRelativeJsonPointer.js +20 -5
- package/lib/internal/_randomFormatRelativeJsonPointer.js.map +1 -1
- package/lib/internal/_randomFormatRelativeJsonPointer.mjs +21 -5
- package/lib/internal/_randomFormatRelativeJsonPointer.mjs.map +1 -1
- package/lib/internal/_randomFormatTime.d.ts +2 -1
- package/lib/internal/_randomFormatTime.js +34 -7
- package/lib/internal/_randomFormatTime.js.map +1 -1
- package/lib/internal/_randomFormatTime.mjs +37 -4
- package/lib/internal/_randomFormatTime.mjs.map +1 -1
- package/lib/internal/_randomFormatUri.d.ts +2 -1
- package/lib/internal/_randomFormatUri.js +1 -1
- package/lib/internal/_randomFormatUri.js.map +1 -1
- package/lib/internal/_randomFormatUri.mjs +1 -1
- package/lib/internal/_randomFormatUri.mjs.map +1 -1
- package/lib/internal/_randomFormatUriReference.d.ts +2 -1
- package/lib/internal/_randomFormatUriReference.js +1 -1
- package/lib/internal/_randomFormatUriReference.js.map +1 -1
- package/lib/internal/_randomFormatUriReference.mjs +1 -1
- package/lib/internal/_randomFormatUriReference.mjs.map +1 -1
- package/lib/internal/_randomFormatUriTemplate.d.ts +2 -1
- package/lib/internal/_randomFormatUriTemplate.js +1 -1
- package/lib/internal/_randomFormatUriTemplate.js.map +1 -1
- package/lib/internal/_randomFormatUriTemplate.mjs +1 -1
- package/lib/internal/_randomFormatUriTemplate.mjs.map +1 -1
- package/lib/internal/_randomFormatUrl.d.ts +2 -1
- package/lib/internal/_randomFormatUrl.js +21 -1
- package/lib/internal/_randomFormatUrl.js.map +1 -1
- package/lib/internal/_randomFormatUrl.mjs +18 -1
- package/lib/internal/_randomFormatUrl.mjs.map +1 -1
- package/lib/internal/_randomFormatUuid.d.ts +2 -1
- package/lib/internal/_randomFormatUuid.js +3 -2
- package/lib/internal/_randomFormatUuid.js.map +1 -1
- package/lib/internal/_randomFormatUuid.mjs +3 -2
- package/lib/internal/_randomFormatUuid.mjs.map +1 -1
- package/lib/internal/_randomInteger.js +59 -28
- package/lib/internal/_randomInteger.js.map +1 -1
- package/lib/internal/_randomInteger.mjs +56 -16
- package/lib/internal/_randomInteger.mjs.map +1 -1
- package/lib/internal/_randomMultiple.d.ts +8 -0
- package/lib/internal/_randomMultiple.js +168 -0
- package/lib/internal/_randomMultiple.js.map +1 -0
- package/lib/internal/_randomMultiple.mjs +158 -0
- package/lib/internal/_randomMultiple.mjs.map +1 -0
- package/lib/internal/_randomNumber.js +42 -42
- package/lib/internal/_randomNumber.js.map +1 -1
- package/lib/internal/_randomNumber.mjs +41 -27
- package/lib/internal/_randomNumber.mjs.map +1 -1
- package/lib/internal/_randomPattern.d.ts +2 -1
- package/lib/internal/_randomPattern.js +19 -4
- package/lib/internal/_randomPattern.js.map +1 -1
- package/lib/internal/_randomPattern.mjs +10 -4
- package/lib/internal/_randomPattern.mjs.map +1 -1
- package/lib/internal/_randomStringLength.d.ts +64 -0
- package/lib/internal/_randomStringLength.js +84 -0
- package/lib/internal/_randomStringLength.js.map +1 -0
- package/lib/internal/_randomStringLength.mjs +79 -0
- package/lib/internal/_randomStringLength.mjs.map +1 -0
- package/lib/internal/_stringLength.d.ts +1 -0
- package/lib/internal/_stringLength.js +11 -0
- package/lib/internal/_stringLength.js.map +1 -0
- package/lib/internal/_stringLength.mjs +10 -0
- package/lib/internal/_stringLength.mjs.map +1 -0
- package/lib/internal/_validateReport.js +4 -1
- package/lib/internal/_validateReport.js.map +1 -1
- package/lib/internal/_validateReport.mjs +2 -1
- package/lib/internal/_validateReport.mjs.map +1 -1
- package/lib/internal/private/__notationRename.d.ts +14 -0
- package/lib/internal/private/__notationRename.js +25 -0
- package/lib/internal/private/__notationRename.js.map +1 -0
- package/lib/internal/private/__notationRename.mjs +24 -0
- package/lib/internal/private/__notationRename.mjs.map +1 -0
- package/lib/internal/private/__randomComposition.d.ts +23 -0
- package/lib/internal/private/__randomComposition.js +48 -0
- package/lib/internal/private/__randomComposition.js.map +1 -0
- package/lib/internal/private/__randomComposition.mjs +54 -0
- package/lib/internal/private/__randomComposition.mjs.map +1 -0
- package/lib/internal/private/__randomEpoch.d.ts +19 -0
- package/lib/internal/private/__randomEpoch.js +31 -0
- package/lib/internal/private/__randomEpoch.js.map +1 -0
- package/lib/internal/private/__randomEpoch.mjs +28 -0
- package/lib/internal/private/__randomEpoch.mjs.map +1 -0
- package/lib/json.d.ts +2 -2
- package/lib/json.mjs.map +1 -1
- package/lib/module.d.ts +2 -2
- package/lib/module.js.map +1 -1
- package/lib/module.mjs.map +1 -1
- package/lib/notations.d.ts +20 -4
- package/lib/notations.js.map +1 -1
- package/lib/notations.mjs.map +1 -1
- package/native/adapter/plugin_options.go +117 -0
- package/native/adapter/plugin_options_payload_matrix_test.go +181 -0
- package/native/cmd/ttsc-typia/any_array_type_tags_transform_test.go +63 -9
- package/native/cmd/ttsc-typia/assert_guard_factory_contract_test.go +152 -0
- package/native/cmd/ttsc-typia/build.go +84 -64
- package/native/cmd/ttsc-typia/build_no_emit_preserves_analysis_options_test.go +67 -0
- package/native/cmd/ttsc-typia/build_no_emit_transform_diagnostics_test.go +138 -0
- package/native/cmd/ttsc-typia/build_plugin_options_come_from_payload_test.go +48 -0
- package/native/cmd/ttsc-typia/build_transactional_emit_success_test.go +81 -0
- package/native/cmd/ttsc-typia/build_transform_failure_atomicity_test.go +138 -0
- package/native/cmd/ttsc-typia/callable_interface_function_semantics_transform_test.go +331 -0
- package/native/cmd/ttsc-typia/callable_type_literal_boundaries_transform_test.go +1184 -0
- package/native/cmd/ttsc-typia/command_routes_and_diagnostics_coverage_test.go +3 -1
- package/native/cmd/ttsc-typia/compare_functional_union_membership_transform_test.go +434 -0
- package/native/cmd/ttsc-typia/compare_less_nan_transform_test.go +98 -0
- package/native/cmd/ttsc-typia/compare_native_object_overmatch_transform_test.go +161 -0
- package/native/cmd/ttsc-typia/compare_nondiscriminable_union_transform_test.go +343 -0
- package/native/cmd/ttsc-typia/compare_template_literal_union_transform_test.go +241 -0
- package/native/cmd/ttsc-typia/compare_union_discrimination_transform_test.go +289 -0
- package/native/cmd/ttsc-typia/default_library_spoof_native_identity_transform_test.go +216 -0
- package/native/cmd/ttsc-typia/escaped_property_key_path_transform_test.go +193 -0
- package/native/cmd/ttsc-typia/finite_option_number_leaf_transform_test.go +240 -0
- package/native/cmd/ttsc-typia/functional_promised_type_transform_test.go +220 -0
- package/native/cmd/ttsc-typia/functional_receiver_transform_test.go +232 -0
- package/native/cmd/ttsc-typia/is_object_function_member_transform_test.go +205 -0
- package/native/cmd/ttsc-typia/json_application_alias_function_validation_transform_test.go +151 -0
- package/native/cmd/ttsc-typia/json_is_stringify_finite_number_transform_test.go +198 -0
- package/native/cmd/ttsc-typia/json_schema_dynamic_key_determinism_transform_test.go +246 -0
- package/native/cmd/ttsc-typia/json_stringify_contextual_undefined_transform_test.go +556 -0
- package/native/cmd/ttsc-typia/json_stringify_special_key_transform_test.go +238 -0
- package/native/cmd/ttsc-typia/lib_replacement_native_identity_transform_test.go +277 -0
- package/native/cmd/ttsc-typia/main_wasm.go +21 -2
- package/native/cmd/ttsc-typia/native_collection_identity_is_transform_test.go +234 -0
- package/native/cmd/ttsc-typia/native_generic_name_guard_is_transform_test.go +194 -0
- package/native/cmd/ttsc-typia/native_name_collision_is_transform_test.go +204 -0
- package/native/cmd/ttsc-typia/native_named_intersection_union_transform_test.go +390 -0
- package/native/cmd/ttsc-typia/node_buffer_native_exports_is_transform_test.go +526 -0
- package/native/cmd/ttsc-typia/non_trailing_rest_tuple_transform_test.go +23 -11
- package/native/cmd/ttsc-typia/notation_dynamic_keys_transform_test.go +286 -0
- package/native/cmd/ttsc-typia/notation_kebab_case_transform_test.go +1 -1
- package/native/cmd/ttsc-typia/notation_literal_collision_transform_test.go +164 -0
- package/native/cmd/ttsc-typia/notation_pascal_case_transform_test.go +230 -0
- package/native/cmd/ttsc-typia/notation_unicode_key_transform_test.go +309 -0
- package/native/cmd/ttsc-typia/package_declaration_native_identity_is_transform_test.go +293 -0
- package/native/cmd/ttsc-typia/pattern_line_terminator_escape_transform_test.go +224 -0
- package/native/cmd/ttsc-typia/plain_prune_union_object_overmatch_transform_test.go +219 -0
- package/native/cmd/ttsc-typia/plugin_options_payload_helpers_test.go +181 -0
- package/native/cmd/ttsc-typia/private_field_filter_is_transform_test.go +278 -0
- package/native/cmd/ttsc-typia/project_catalog_transform_coverage_test.go +73 -27
- package/native/cmd/ttsc-typia/project_dependencies_barrel_reexport_transform_test.go +120 -0
- package/native/cmd/ttsc-typia/project_dependencies_collapsed_alias_transform_test.go +134 -0
- package/native/cmd/ttsc-typia/project_dependencies_custom_lib_name_transform_test.go +135 -0
- package/native/cmd/ttsc-typia/project_dependencies_default_barrel_transform_test.go +114 -0
- package/native/cmd/ttsc-typia/project_dependencies_empty_heritage_transform_test.go +100 -0
- package/native/cmd/ttsc-typia/project_dependencies_envelope_transform_test.go +148 -0
- package/native/cmd/ttsc-typia/project_dependencies_index_signature_alias_transform_test.go +139 -0
- package/native/cmd/ttsc-typia/project_dependencies_local_reexport_transform_test.go +122 -0
- package/native/cmd/ttsc-typia/project_dependencies_signature_alias_transform_test.go +125 -0
- package/native/cmd/ttsc-typia/project_dependencies_star_barrel_transform_test.go +112 -0
- package/native/cmd/ttsc-typia/project_reference_graph_envelope_transform_test.go +190 -0
- package/native/cmd/ttsc-typia/protobuf_diagnostic_code_transform_test.go +167 -0
- package/native/cmd/ttsc-typia/protobuf_is_encode_finite_number_transform_test.go +98 -0
- package/native/cmd/ttsc-typia/protobuf_sequence_field_numbers_transform_test.go +52 -22
- package/native/cmd/ttsc-typia/symbol_index_domain_transform_test.go +316 -0
- package/native/cmd/ttsc-typia/symbol_key_member_filter_transform_test.go +279 -0
- package/native/cmd/ttsc-typia/template_interpolation_type_tags_transform_test.go +86 -23
- package/native/cmd/ttsc-typia/template_literal_type_tags_transform_test.go +3 -1
- package/native/cmd/ttsc-typia/transform.go +251 -39
- package/native/cmd/ttsc-typia/{transform_declaration_source_produces_no_js_test.go → transform_declaration_source_produces_no_javascript_test.go} +10 -2
- package/native/cmd/ttsc-typia/transform_fixtures_emit_coverage_test.go +21 -4
- package/native/cmd/ttsc-typia/transform_helpers_test.go +236 -3
- package/native/cmd/ttsc-typia/transform_plugin_options_come_from_payload_test.go +43 -0
- package/native/cmd/ttsc-typia/transform_single_file_failure_atomicity_test.go +114 -0
- package/native/cmd/ttsc-typia/transform_single_file_failure_writes_no_stdout_test.go +43 -0
- package/native/cmd/ttsc-typia/transform_single_file_js_distinguishes_same_basename_sources_test.go +81 -0
- package/native/cmd/ttsc-typia/transform_single_file_js_empty_emit_reports_no_output_test.go +100 -0
- package/native/cmd/ttsc-typia/transform_single_file_js_locates_output_across_layouts_test.go +160 -0
- package/native/cmd/ttsc-typia/transform_single_file_success_publishes_artifact_test.go +54 -0
- package/native/cmd/ttsc-typia/transform_wasm_host_argv_reports_diagnostics_test.go +39 -0
- package/native/cmd/ttsc-typia/tuple_optional_compare_clone_transform_test.go +227 -0
- package/native/cmd/ttsc-typia/user_global_native_identity_transform_test.go +484 -0
- package/native/core/factories/FormatCheatSheet.go +40 -7
- package/native/core/factories/IdentifierFactory.go +131 -4
- package/native/core/factories/MetadataCommentTagFactory.go +83 -40
- package/native/core/factories/MetadataTypeTagFactory.go +13 -1
- package/native/core/factories/NumericRangeFactory.go +60 -17
- package/native/core/factories/ProtobufFactory.go +13 -5
- package/native/core/factories/factory_utility_coverage_test.go +8 -2
- package/native/core/factories/format_alias_resolves_to_cheat_sheet_test.go +57 -0
- package/native/core/factories/format_alias_table_targets_the_cheat_sheet_test.go +44 -0
- package/native/core/factories/identifier_factory_postfix_escapes_every_key_test.go +147 -0
- package/native/core/factories/identifier_factory_postfix_survives_every_code_point_test.go +86 -0
- package/native/core/factories/internal/metadata/MetadataHelper.go +226 -17
- package/native/core/factories/internal/metadata/emplace_metadata_object.go +141 -8
- package/native/core/factories/internal/metadata/iterate_metadata.go +6 -0
- package/native/core/factories/internal/metadata/iterate_metadata_function.go +5 -12
- package/native/core/factories/internal/metadata/iterate_metadata_intersection.go +111 -29
- package/native/core/factories/internal/metadata/iterate_metadata_map.go +5 -0
- package/native/core/factories/internal/metadata/iterate_metadata_native.go +45 -2
- package/native/core/factories/internal/metadata/iterate_metadata_set.go +5 -0
- package/native/core/factories/internal/metadata/type_arguments_precondition_test.go +70 -0
- package/native/core/factories/metadata_comment_tag_factory_coverage_test.go +39 -0
- package/native/core/factories/metadata_comment_tag_factory_exclusivity_matches_interface_test.go +84 -0
- package/native/core/factories/metadata_type_tag_factory_accepts_legal_tag_combinations_test.go +60 -0
- package/native/core/factories/metadata_type_tag_factory_declarations_test.go +86 -0
- package/native/core/factories/metadata_type_tag_factory_keeps_bool_form_exclusivity_test.go +38 -0
- package/native/core/factories/metadata_type_tag_factory_rejects_cross_kind_exclusive_tags_test.go +65 -0
- package/native/core/factories/metadata_type_tag_factory_rejects_duplicated_array_form_tags_test.go +41 -0
- package/native/core/factories/numeric_range_factory_enforces_64bit_bounds_test.go +69 -0
- package/native/core/factories/protobuf_recovery_ownership_test.go +64 -0
- package/native/core/programmers/IsProgrammer.go +15 -1
- package/native/core/programmers/RandomProgrammer.go +51 -14
- package/native/core/programmers/compare/CompareEqualProgrammer.go +410 -8
- package/native/core/programmers/compare/CompareLessProgrammer.go +4 -2
- package/native/core/programmers/functional/FunctionalAssertFunctionProgrammer.go +4 -6
- package/native/core/programmers/functional/FunctionalAssertParametersProgrammer.go +5 -13
- package/native/core/programmers/functional/FunctionalAssertReturnProgrammer.go +6 -14
- package/native/core/programmers/functional/FunctionalIsFunctionProgrammer.go +4 -6
- package/native/core/programmers/functional/FunctionalIsParametersProgrammer.go +49 -14
- package/native/core/programmers/functional/FunctionalIsReturnProgrammer.go +5 -13
- package/native/core/programmers/functional/FunctionalValidateFunctionProgrammer.go +4 -6
- package/native/core/programmers/functional/FunctionalValidateParametersProgrammer.go +5 -13
- package/native/core/programmers/functional/FunctionalValidateReturnProgrammer.go +5 -13
- package/native/core/programmers/functional/internal/FunctionalGeneralProgrammer.go +4 -17
- package/native/core/programmers/helpers/CloneJoiner.go +32 -0
- package/native/core/programmers/helpers/FunctionProgrammer.go +6 -13
- package/native/core/programmers/helpers/NotationJoiner.go +86 -28
- package/native/core/programmers/helpers/StringifyJoinder.go +161 -51
- package/native/core/programmers/helpers/UnionExplorer.go +203 -61
- package/native/core/programmers/helpers/joiner_branch_coverage_test.go +116 -118
- package/native/core/programmers/helpers/union_explorer_coverage_test.go +1 -1
- package/native/core/programmers/internal/CheckerProgrammer.go +100 -48
- package/native/core/programmers/iterate/check_template.go +344 -32
- package/native/core/programmers/iterate/iterate_check_coverage_test.go +76 -158
- package/native/core/programmers/iterate/iterate_utility_coverage_test.go +231 -270
- package/native/core/programmers/iterate/json_schema_discriminator.go +36 -10
- package/native/core/programmers/iterate/json_schema_discriminator_declaration_syntax_test.go +205 -0
- package/native/core/programmers/iterate/json_schema_object.go +49 -7
- package/native/core/programmers/iterate/json_schema_pattern_property_order_test.go +44 -0
- package/native/core/programmers/iterate/openapi_v3_downgrader.go +674 -0
- package/native/core/programmers/iterate/openapi_v3_downgrader_boolean_default_test.go +95 -0
- package/native/core/programmers/iterate/openapi_v3_downgrader_test.go +123 -0
- package/native/core/programmers/iterate/template_interpolation_tags_test.go +40 -8
- package/native/core/programmers/iterate/template_runtime_pattern.go +63 -7
- package/native/core/programmers/json/JsonApplicationProgrammer.go +45 -11
- package/native/core/programmers/json/JsonSchemasProgrammer.go +12 -2
- package/native/core/programmers/json/JsonStringifyProgrammer.go +47 -6
- package/native/core/programmers/llm/LlmApplicationProgrammer.go +21 -11
- package/native/core/programmers/llm/LlmSchemaProgrammer.go +23 -6
- package/native/core/programmers/llm/llm_reference_codec_test.go +24 -0
- package/native/core/programmers/notations/NotationGeneralProgrammer.go +183 -67
- package/native/core/programmers/notations/notation_general_helpers_test.go +1 -3
- package/native/core/programmers/notations/notation_general_programmer_pascal_multiword_test.go +72 -0
- package/native/core/programmers/notations/notation_general_programmer_underscore_boundary_test.go +68 -0
- package/native/core/programmers/plain/PlainClassifyProgrammer.go +23 -15
- package/native/core/programmers/plain/PlainCloneProgrammer.go +20 -7
- package/native/core/programmers/plain/PlainPruneProgrammer.go +19 -5
- package/native/core/programmers/plain/plain_tuple_seed_recovery_ownership_test.go +25 -0
- package/native/core/programmers/protobuf/ProtobufDecodeProgrammer.go +37 -28
- package/native/core/programmers/protobuf/ProtobufMessageProgrammer.go +41 -22
- package/native/core/programmers/protobuf/protobuf_programmer_helper_coverage_test.go +26 -0
- package/native/core/programmers/random_programmer_length_argument_test.go +53 -0
- package/native/core/schemas/metadata/MetadataCollection.go +266 -25
- package/native/core/schemas/metadata/MetadataDefaultLibrary.go +81 -0
- package/native/core/schemas/metadata/MetadataDependency.go +388 -0
- package/native/core/schemas/metadata/MetadataObjectType.go +24 -22
- package/native/core/schemas/metadata/metadata_collection_generic_argument_dot_test.go +122 -0
- package/native/core/schemas/metadata/metadata_collection_name_allocation_test.go +147 -0
- package/native/core/schemas/metadata/metadata_collection_openapi_name_cascade_test.go +55 -0
- package/native/core/schemas/metadata/metadata_collection_openapi_name_test.go +68 -0
- package/native/core/utils/PatternUtil.go +13 -0
- package/native/core/utils/PromiseTypeFactory.go +59 -0
- package/native/core/utils/ProtobufNameEncoder.go +8 -0
- package/native/core/utils/promise_type_factory_semantics_test.go +118 -0
- package/native/go.mod +9 -1
- package/native/transform/CallExpressionTransformer.go +12 -0
- package/native/transform/features/json/JsonApplicationTransformer.go +1 -1
- package/native/transform/features/json/JsonSchemaTransformer.go +1 -1
- package/native/transform/features/json/JsonSchemasTransformer.go +5 -4
- package/native/transform/features/protobuf/ProtobufMessageTransformer.go +1 -1
- package/package.json +12 -4
- package/src/executable/FileSystemIdentity.ts +222 -0
- package/src/executable/TypiaGenerateWizard.ts +386 -113
- package/src/functional.ts +30 -60
- package/src/internal/_ProtobufReader.ts +161 -46
- package/src/internal/_createStandardSchema.ts +15 -1
- package/src/internal/_decimal.ts +69 -0
- package/src/internal/_httpQueryParseURLSearchParams.ts +24 -2
- package/src/internal/_isFormatByte.ts +2 -5
- package/src/internal/_isFormatDate.ts +15 -2
- package/src/internal/_isFormatDateTime.ts +28 -2
- package/src/internal/_isFormatIri.ts +5 -2
- package/src/internal/_isFormatIriReference.ts +11 -3
- package/src/internal/_isFormatUriReference.ts +1 -1
- package/src/internal/_isMultipleOf.ts +8 -0
- package/src/internal/_isTypeFloat.ts +1 -1
- package/src/internal/_isTypeInt64.ts +1 -0
- package/src/internal/_isTypeInt64Bigint.ts +12 -0
- package/src/internal/_isTypeUint64.ts +1 -0
- package/src/internal/_isTypeUint64Bigint.ts +7 -0
- package/src/internal/_isUniqueItems.ts +134 -132
- package/src/internal/_jsonStringifyArray.ts +50 -0
- package/src/internal/_jsonStringifyElement.ts +19 -0
- package/src/internal/_jsonStringifyProperty.ts +30 -0
- package/src/internal/_llmApplicationFinalize.ts +6 -1
- package/src/internal/_notationAny.ts +9 -4
- package/src/internal/_notationAssign.ts +20 -0
- package/src/internal/_notationCamel.ts +31 -10
- package/src/internal/_notationKebab.ts +11 -0
- package/src/internal/_notationKeyCollision.ts +9 -0
- package/src/internal/_notationPascal.ts +19 -6
- package/src/internal/_notationSnake.ts +24 -21
- package/src/internal/_plainCloneAny.ts +208 -33
- package/src/internal/_randomArray.ts +13 -4
- package/src/internal/_randomFormatByte.ts +31 -1
- package/src/internal/_randomFormatDate.ts +6 -17
- package/src/internal/_randomFormatDatetime.ts +34 -15
- package/src/internal/_randomFormatDuration.ts +30 -13
- package/src/internal/_randomFormatEmail.ts +8 -2
- package/src/internal/_randomFormatHostname.ts +48 -1
- package/src/internal/_randomFormatIdnEmail.ts +18 -2
- package/src/internal/_randomFormatIdnHostname.ts +34 -2
- package/src/internal/_randomFormatIpv4.ts +43 -2
- package/src/internal/_randomFormatIpv6.ts +67 -2
- package/src/internal/_randomFormatIri.ts +3 -1
- package/src/internal/_randomFormatIriReference.ts +3 -1
- package/src/internal/_randomFormatJsonPointer.ts +28 -2
- package/src/internal/_randomFormatPassword.ts +11 -6
- package/src/internal/_randomFormatRegex.ts +22 -1
- package/src/internal/_randomFormatRelativeJsonPointer.ts +26 -6
- package/src/internal/_randomFormatTime.ts +46 -10
- package/src/internal/_randomFormatUri.ts +3 -1
- package/src/internal/_randomFormatUriReference.ts +3 -1
- package/src/internal/_randomFormatUriTemplate.ts +3 -1
- package/src/internal/_randomFormatUrl.ts +25 -2
- package/src/internal/_randomFormatUuid.ts +10 -6
- package/src/internal/_randomInteger.ts +87 -40
- package/src/internal/_randomMultiple.ts +245 -0
- package/src/internal/_randomNumber.ts +72 -55
- package/src/internal/_randomPattern.ts +29 -4
- package/src/internal/_randomStringLength.ts +116 -0
- package/src/internal/_stringLength.ts +5 -0
- package/src/internal/_validateReport.ts +5 -1
- package/src/internal/private/__notationRename.ts +21 -0
- package/src/internal/private/__randomComposition.ts +50 -0
- package/src/internal/private/__randomEpoch.ts +34 -0
- package/src/json.ts +2 -2
- package/src/module.ts +4 -6
- package/src/notations.ts +20 -4
- package/lib/internal/private/__notationCapitalize.d.ts +0 -1
- package/lib/internal/private/__notationCapitalize.js +0 -6
- package/lib/internal/private/__notationCapitalize.js.map +0 -1
- package/lib/internal/private/__notationCapitalize.mjs +0 -6
- package/lib/internal/private/__notationCapitalize.mjs.map +0 -1
- package/lib/internal/private/__notationUnsnake.d.ts +0 -4
- package/lib/internal/private/__notationUnsnake.js +0 -26
- package/lib/internal/private/__notationUnsnake.js.map +0 -1
- package/lib/internal/private/__notationUnsnake.mjs +0 -15
- package/lib/internal/private/__notationUnsnake.mjs.map +0 -1
- package/native/adapter/visit.go +0 -173
- package/native/adapter/visit_property_chain_edges_test.go +0 -129
- package/native/cmd/ttsc-typia/plugin_options_missing_config_test.go +0 -26
- package/native/cmd/ttsc-typia/plugin_options_undefined_false_test.go +0 -36
- package/native/core/programmers/helpers/disable_function_programmer_declare.go +0 -10
- package/native/core/programmers/iterate/check_union_array_like.go +0 -422
- package/native/core/programmers/iterate/prune_object_properties.go +0 -105
- package/native/core/programmers/iterate/stringify_dynamic_properties.go +0 -219
- package/native/core/programmers/iterate/stringify_native.go +0 -14
- package/native/core/programmers/iterate/stringify_regular_properties.go +0 -112
- package/native/core/schemas/metadata/MetadataApplication.go +0 -41
- package/src/internal/private/__notationCapitalize.ts +0 -2
- package/src/internal/private/__notationUnsnake.ts +0 -24
|
@@ -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
|
+
`
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
package main
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"encoding/json"
|
|
5
|
+
"os"
|
|
6
|
+
"path/filepath"
|
|
7
|
+
"testing"
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
// TestProjectDependenciesEmptyHeritageTransform verifies heritage targets
|
|
11
|
+
// register as dependencies even when they contribute no property yet.
|
|
12
|
+
//
|
|
13
|
+
// Inherited members carry their declaring file through their property symbols,
|
|
14
|
+
// but a base interface that is currently EMPTY surfaces no symbol at all — and
|
|
15
|
+
// gaining its first property is exactly the change that must invalidate the
|
|
16
|
+
// consumer's cached validator. This pins the explicit `extends` chain walk.
|
|
17
|
+
//
|
|
18
|
+
// 1. Build a project where `main.ts` validates `Doc`, `doc.ts` declares
|
|
19
|
+
// `Doc extends Empty`, and `empty.ts` declares the empty interface.
|
|
20
|
+
// 2. Run project transform mode and decode the JSON envelope.
|
|
21
|
+
// 3. Assert `dependencies["src/main.ts"]` contains both `src/doc.ts` (the
|
|
22
|
+
// declaring file) and `src/empty.ts` (the property-less heritage target).
|
|
23
|
+
func TestProjectDependenciesEmptyHeritageTransform(t *testing.T) {
|
|
24
|
+
project := projectDependenciesEmptyHeritageProject(t)
|
|
25
|
+
out, errText, code := ttscTypiaTestCapture(func() int {
|
|
26
|
+
return runTransform([]string{
|
|
27
|
+
"--cwd", project,
|
|
28
|
+
"--tsconfig", "tsconfig.json",
|
|
29
|
+
"--output", "ts",
|
|
30
|
+
})
|
|
31
|
+
})
|
|
32
|
+
if code != 0 {
|
|
33
|
+
t.Fatalf("project transform failed: code=%d stderr=\n%s", code, errText)
|
|
34
|
+
}
|
|
35
|
+
var envelope struct {
|
|
36
|
+
Dependencies map[string][]string `json:"dependencies"`
|
|
37
|
+
}
|
|
38
|
+
if err := json.Unmarshal([]byte(out), &envelope); err != nil {
|
|
39
|
+
t.Fatalf("decode envelope: %v\n%s", err, out)
|
|
40
|
+
}
|
|
41
|
+
entries := envelope.Dependencies["src/main.ts"]
|
|
42
|
+
found := map[string]bool{}
|
|
43
|
+
for _, entry := range entries {
|
|
44
|
+
found[entry] = true
|
|
45
|
+
}
|
|
46
|
+
if !found["src/doc.ts"] {
|
|
47
|
+
t.Fatalf("dependencies of src/main.ts must contain the declaring file src/doc.ts: %v", entries)
|
|
48
|
+
}
|
|
49
|
+
if !found["src/empty.ts"] {
|
|
50
|
+
t.Fatalf("dependencies of src/main.ts must contain the empty heritage target src/empty.ts: %v", entries)
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
func projectDependenciesEmptyHeritageProject(t *testing.T) string {
|
|
55
|
+
t.Helper()
|
|
56
|
+
root := ttscTypiaTestRepoRoot(t)
|
|
57
|
+
base := filepath.Join(root, "packages", "typia", "native", ".tmp-ttsc-typia-tests")
|
|
58
|
+
if err := os.MkdirAll(base, 0o755); err != nil {
|
|
59
|
+
t.Fatalf("mkdir temp base: %v", err)
|
|
60
|
+
}
|
|
61
|
+
dir, err := os.MkdirTemp(base, "project-dependencies-empty-heritage-")
|
|
62
|
+
if err != nil {
|
|
63
|
+
t.Fatalf("create temp fixture: %v", err)
|
|
64
|
+
}
|
|
65
|
+
t.Cleanup(func() { _ = os.RemoveAll(dir) })
|
|
66
|
+
src := filepath.Join(dir, "src")
|
|
67
|
+
if err := os.MkdirAll(src, 0o755); err != nil {
|
|
68
|
+
t.Fatalf("mkdir fixture src: %v", err)
|
|
69
|
+
}
|
|
70
|
+
if err := os.WriteFile(filepath.Join(dir, "tsconfig.json"), []byte(projectDependenciesEnvelopeTSConfig), 0o644); err != nil {
|
|
71
|
+
t.Fatalf("write tsconfig: %v", err)
|
|
72
|
+
}
|
|
73
|
+
for name, body := range map[string]string{
|
|
74
|
+
"main.ts": projectDependenciesEmptyHeritageMain,
|
|
75
|
+
"doc.ts": projectDependenciesEmptyHeritageDoc,
|
|
76
|
+
"empty.ts": projectDependenciesEmptyHeritageEmpty,
|
|
77
|
+
} {
|
|
78
|
+
if err := os.WriteFile(filepath.Join(src, name), []byte(body), 0o644); err != nil {
|
|
79
|
+
t.Fatalf("write %s: %v", name, err)
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return dir
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
const projectDependenciesEmptyHeritageMain = `import typia from "typia";
|
|
86
|
+
|
|
87
|
+
import { Doc } from "./doc";
|
|
88
|
+
|
|
89
|
+
export const validateDoc = (input: unknown) => typia.validate<Doc>(input);
|
|
90
|
+
`
|
|
91
|
+
|
|
92
|
+
const projectDependenciesEmptyHeritageDoc = `import { Empty } from "./empty";
|
|
93
|
+
|
|
94
|
+
export interface Doc extends Empty {
|
|
95
|
+
id: string;
|
|
96
|
+
}
|
|
97
|
+
`
|
|
98
|
+
|
|
99
|
+
const projectDependenciesEmptyHeritageEmpty = `export interface Empty {}
|
|
100
|
+
`
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
package main
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"encoding/json"
|
|
5
|
+
"os"
|
|
6
|
+
"path/filepath"
|
|
7
|
+
"strings"
|
|
8
|
+
"testing"
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
// TestProjectDependenciesEnvelopeTransform verifies the project transform
|
|
12
|
+
// envelope reports consulted declaration files per transformed file.
|
|
13
|
+
//
|
|
14
|
+
// The `dependencies` section is what lets the ttsc consumer register a
|
|
15
|
+
// validated type's declaring files with the bundler; without it, persistent
|
|
16
|
+
// caches and watch mode serve stale validators when only the type's own file
|
|
17
|
+
// changes (samchon/typia#2092). This pins the producer contract: direct and
|
|
18
|
+
// transitive declaration files attributed to the call-expression site,
|
|
19
|
+
// nothing attributed to files without typia calls, no self entry, and no
|
|
20
|
+
// default-library noise.
|
|
21
|
+
//
|
|
22
|
+
// 1. Build a project where `a.ts` calls `typia.validate<Bee>()` with `Bee`
|
|
23
|
+
// declared in `b.ts` referencing `Cee` from `c.ts` through a property type,
|
|
24
|
+
// plus `d.ts` with no typia call.
|
|
25
|
+
// 2. Run project transform mode and decode the JSON envelope.
|
|
26
|
+
// 3. Assert `dependencies["src/a.ts"]` contains both `src/b.ts` and `src/c.ts`.
|
|
27
|
+
// 4. Assert no entry exists for `src/b.ts`, `src/c.ts`, or `src/d.ts`, the
|
|
28
|
+
// entry omits `src/a.ts` itself, and no `lib.*.d.ts` value leaks.
|
|
29
|
+
func TestProjectDependenciesEnvelopeTransform(t *testing.T) {
|
|
30
|
+
project := projectDependenciesEnvelopeProject(t)
|
|
31
|
+
out, errText, code := ttscTypiaTestCapture(func() int {
|
|
32
|
+
return runTransform([]string{
|
|
33
|
+
"--cwd", project,
|
|
34
|
+
"--tsconfig", "tsconfig.json",
|
|
35
|
+
"--output", "ts",
|
|
36
|
+
})
|
|
37
|
+
})
|
|
38
|
+
if code != 0 {
|
|
39
|
+
t.Fatalf("project transform failed: code=%d stderr=\n%s", code, errText)
|
|
40
|
+
}
|
|
41
|
+
var envelope struct {
|
|
42
|
+
TypeScript map[string]string `json:"typescript"`
|
|
43
|
+
Dependencies map[string][]string `json:"dependencies"`
|
|
44
|
+
}
|
|
45
|
+
if err := json.Unmarshal([]byte(out), &envelope); err != nil {
|
|
46
|
+
t.Fatalf("decode envelope: %v\n%s", err, out)
|
|
47
|
+
}
|
|
48
|
+
if _, ok := envelope.TypeScript["src/a.ts"]; !ok {
|
|
49
|
+
t.Fatalf("typescript map must contain src/a.ts, got keys of:\n%s", out)
|
|
50
|
+
}
|
|
51
|
+
entries := envelope.Dependencies["src/a.ts"]
|
|
52
|
+
if len(entries) == 0 {
|
|
53
|
+
t.Fatalf("dependencies must contain an entry for src/a.ts:\n%s", out)
|
|
54
|
+
}
|
|
55
|
+
found := map[string]bool{}
|
|
56
|
+
for _, entry := range entries {
|
|
57
|
+
found[entry] = true
|
|
58
|
+
if entry == "src/a.ts" {
|
|
59
|
+
t.Fatalf("dependencies of src/a.ts must omit the file itself: %v", entries)
|
|
60
|
+
}
|
|
61
|
+
base := filepath.Base(filepath.FromSlash(entry))
|
|
62
|
+
if strings.HasPrefix(base, "lib.") && strings.HasSuffix(base, ".d.ts") {
|
|
63
|
+
t.Fatalf("dependencies must exclude default library files, got %q in %v", entry, entries)
|
|
64
|
+
}
|
|
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
|
+
if !found["src/c.ts"] {
|
|
70
|
+
t.Fatalf("dependencies of src/a.ts must contain the transitive declaration file src/c.ts: %v", entries)
|
|
71
|
+
}
|
|
72
|
+
for _, key := range []string{"src/b.ts", "src/c.ts", "src/d.ts"} {
|
|
73
|
+
if _, ok := envelope.Dependencies[key]; ok {
|
|
74
|
+
t.Fatalf("%s has no typia call and must report no dependency entry: %v", key, envelope.Dependencies[key])
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
func projectDependenciesEnvelopeProject(t *testing.T) string {
|
|
80
|
+
t.Helper()
|
|
81
|
+
root := ttscTypiaTestRepoRoot(t)
|
|
82
|
+
base := filepath.Join(root, "packages", "typia", "native", ".tmp-ttsc-typia-tests")
|
|
83
|
+
if err := os.MkdirAll(base, 0o755); err != nil {
|
|
84
|
+
t.Fatalf("mkdir temp base: %v", err)
|
|
85
|
+
}
|
|
86
|
+
dir, err := os.MkdirTemp(base, "project-dependencies-envelope-")
|
|
87
|
+
if err != nil {
|
|
88
|
+
t.Fatalf("create temp fixture: %v", err)
|
|
89
|
+
}
|
|
90
|
+
t.Cleanup(func() { _ = os.RemoveAll(dir) })
|
|
91
|
+
src := filepath.Join(dir, "src")
|
|
92
|
+
if err := os.MkdirAll(src, 0o755); err != nil {
|
|
93
|
+
t.Fatalf("mkdir fixture src: %v", err)
|
|
94
|
+
}
|
|
95
|
+
if err := os.WriteFile(filepath.Join(dir, "tsconfig.json"), []byte(projectDependenciesEnvelopeTSConfig), 0o644); err != nil {
|
|
96
|
+
t.Fatalf("write tsconfig: %v", err)
|
|
97
|
+
}
|
|
98
|
+
for name, body := range map[string]string{
|
|
99
|
+
"a.ts": projectDependenciesEnvelopeSourceA,
|
|
100
|
+
"b.ts": projectDependenciesEnvelopeSourceB,
|
|
101
|
+
"c.ts": projectDependenciesEnvelopeSourceC,
|
|
102
|
+
"d.ts": projectDependenciesEnvelopeSourceD,
|
|
103
|
+
} {
|
|
104
|
+
if err := os.WriteFile(filepath.Join(src, name), []byte(body), 0o644); err != nil {
|
|
105
|
+
t.Fatalf("write %s: %v", name, err)
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return dir
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const projectDependenciesEnvelopeTSConfig = `{
|
|
112
|
+
"compilerOptions": {
|
|
113
|
+
"target": "ES2022",
|
|
114
|
+
"module": "commonjs",
|
|
115
|
+
"moduleResolution": "bundler",
|
|
116
|
+
"ignoreDeprecations": "6.0",
|
|
117
|
+
"esModuleInterop": true,
|
|
118
|
+
"strict": true,
|
|
119
|
+
"skipLibCheck": true,
|
|
120
|
+
"rootDir": "src",
|
|
121
|
+
"outDir": "dist"
|
|
122
|
+
},
|
|
123
|
+
"include": ["src"]
|
|
124
|
+
}
|
|
125
|
+
`
|
|
126
|
+
|
|
127
|
+
const projectDependenciesEnvelopeSourceA = `import typia from "typia";
|
|
128
|
+
|
|
129
|
+
import { Bee } from "./b";
|
|
130
|
+
|
|
131
|
+
export const validateBee = (input: unknown) => typia.validate<Bee>(input);
|
|
132
|
+
`
|
|
133
|
+
|
|
134
|
+
const projectDependenciesEnvelopeSourceB = `import { Cee } from "./c";
|
|
135
|
+
|
|
136
|
+
export interface Bee {
|
|
137
|
+
id: string;
|
|
138
|
+
nested: Cee;
|
|
139
|
+
}
|
|
140
|
+
`
|
|
141
|
+
|
|
142
|
+
const projectDependenciesEnvelopeSourceC = `export interface Cee {
|
|
143
|
+
value: number;
|
|
144
|
+
}
|
|
145
|
+
`
|
|
146
|
+
|
|
147
|
+
const projectDependenciesEnvelopeSourceD = `export const plain: number = 42;
|
|
148
|
+
`
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
package main
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"encoding/json"
|
|
5
|
+
"os"
|
|
6
|
+
"path/filepath"
|
|
7
|
+
"testing"
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
// TestProjectDependenciesIndexSignatureAliasTransform verifies an index
|
|
11
|
+
// signature's written key and value aliases register their declaring files.
|
|
12
|
+
//
|
|
13
|
+
// Index signatures carry no property symbol, so the apparent-property walk that
|
|
14
|
+
// registers every ordinary member never sees them; their aliases-of-intrinsics
|
|
15
|
+
// are then collapsed by the checker and leave no trace on the type graph
|
|
16
|
+
// either. Both `[k: string]: Value` and `[k: Key]: string` therefore changed the
|
|
17
|
+
// generated validator with no reported edge to invalidate
|
|
18
|
+
// (samchon/typia#2126). The negative twin pins the boundary: a file reached only
|
|
19
|
+
// from a member the index signature does not consult must stay out.
|
|
20
|
+
//
|
|
21
|
+
// 1. Build a project where `a.ts` validates `Target` from `model.ts`, whose
|
|
22
|
+
// index signature uses the key alias `Key` (`key.ts`) and the value alias
|
|
23
|
+
// `Value` (`value.ts`), and whose unrelated property references `Kept`
|
|
24
|
+
// (`kept.ts`) while a method body alone references `BodyOnly` (`body.ts`).
|
|
25
|
+
// 2. Run project transform mode and decode the JSON envelope.
|
|
26
|
+
// 3. Assert `dependencies["src/a.ts"]` contains `key.ts`, `value.ts`, and
|
|
27
|
+
// `kept.ts`.
|
|
28
|
+
// 4. Assert it does NOT contain the body-only `body.ts`.
|
|
29
|
+
func TestProjectDependenciesIndexSignatureAliasTransform(t *testing.T) {
|
|
30
|
+
project := projectDependenciesIndexSignatureAliasProject(t)
|
|
31
|
+
out, errText, code := ttscTypiaTestCapture(func() int {
|
|
32
|
+
return runTransform([]string{
|
|
33
|
+
"--cwd", project,
|
|
34
|
+
"--tsconfig", "tsconfig.json",
|
|
35
|
+
"--output", "ts",
|
|
36
|
+
})
|
|
37
|
+
})
|
|
38
|
+
if code != 0 {
|
|
39
|
+
t.Fatalf("project transform failed: code=%d stderr=\n%s", code, errText)
|
|
40
|
+
}
|
|
41
|
+
var envelope struct {
|
|
42
|
+
Dependencies map[string][]string `json:"dependencies"`
|
|
43
|
+
}
|
|
44
|
+
if err := json.Unmarshal([]byte(out), &envelope); err != nil {
|
|
45
|
+
t.Fatalf("decode envelope: %v\n%s", err, out)
|
|
46
|
+
}
|
|
47
|
+
entries := envelope.Dependencies["src/a.ts"]
|
|
48
|
+
found := map[string]bool{}
|
|
49
|
+
for _, entry := range entries {
|
|
50
|
+
found[entry] = true
|
|
51
|
+
}
|
|
52
|
+
if !found["src/value.ts"] {
|
|
53
|
+
t.Fatalf("dependencies of src/a.ts must contain the index-signature value alias file src/value.ts: %v", entries)
|
|
54
|
+
}
|
|
55
|
+
if !found["src/key.ts"] {
|
|
56
|
+
t.Fatalf("dependencies of src/a.ts must contain the index-signature key alias file src/key.ts: %v", entries)
|
|
57
|
+
}
|
|
58
|
+
if !found["src/kept.ts"] {
|
|
59
|
+
t.Fatalf("dependencies of src/a.ts must contain the property alias file src/kept.ts: %v", entries)
|
|
60
|
+
}
|
|
61
|
+
if found["src/body.ts"] {
|
|
62
|
+
t.Fatalf("dependencies of src/a.ts must not contain the body-only reference file src/body.ts: %v", entries)
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
func projectDependenciesIndexSignatureAliasProject(t *testing.T) string {
|
|
67
|
+
t.Helper()
|
|
68
|
+
root := ttscTypiaTestRepoRoot(t)
|
|
69
|
+
base := filepath.Join(root, "packages", "typia", "native", ".tmp-ttsc-typia-tests")
|
|
70
|
+
if err := os.MkdirAll(base, 0o755); err != nil {
|
|
71
|
+
t.Fatalf("mkdir temp base: %v", err)
|
|
72
|
+
}
|
|
73
|
+
dir, err := os.MkdirTemp(base, "project-dependencies-index-signature-alias-")
|
|
74
|
+
if err != nil {
|
|
75
|
+
t.Fatalf("create temp fixture: %v", err)
|
|
76
|
+
}
|
|
77
|
+
t.Cleanup(func() { _ = os.RemoveAll(dir) })
|
|
78
|
+
src := filepath.Join(dir, "src")
|
|
79
|
+
if err := os.MkdirAll(src, 0o755); err != nil {
|
|
80
|
+
t.Fatalf("mkdir fixture src: %v", err)
|
|
81
|
+
}
|
|
82
|
+
if err := os.WriteFile(filepath.Join(dir, "tsconfig.json"), []byte(projectDependenciesEnvelopeTSConfig), 0o644); err != nil {
|
|
83
|
+
t.Fatalf("write tsconfig: %v", err)
|
|
84
|
+
}
|
|
85
|
+
for name, body := range map[string]string{
|
|
86
|
+
"a.ts": projectDependenciesIndexSignatureAliasSourceA,
|
|
87
|
+
"model.ts": projectDependenciesIndexSignatureAliasSourceModel,
|
|
88
|
+
"key.ts": projectDependenciesIndexSignatureAliasSourceKey,
|
|
89
|
+
"value.ts": projectDependenciesIndexSignatureAliasSourceValue,
|
|
90
|
+
"kept.ts": projectDependenciesIndexSignatureAliasSourceKept,
|
|
91
|
+
"body.ts": projectDependenciesIndexSignatureAliasSourceBody,
|
|
92
|
+
} {
|
|
93
|
+
if err := os.WriteFile(filepath.Join(src, name), []byte(body), 0o644); err != nil {
|
|
94
|
+
t.Fatalf("write %s: %v", name, err)
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
return dir
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const projectDependenciesIndexSignatureAliasSourceA = `import typia from "typia";
|
|
101
|
+
|
|
102
|
+
import { Holder, Target } from "./model";
|
|
103
|
+
|
|
104
|
+
export const validateTarget = (input: unknown) => typia.validate<Target>(input);
|
|
105
|
+
export const validateHolder = (input: unknown) => typia.validate<Holder>(input);
|
|
106
|
+
`
|
|
107
|
+
|
|
108
|
+
const projectDependenciesIndexSignatureAliasSourceModel = `import { BodyOnly } from "./body";
|
|
109
|
+
import { Kept } from "./kept";
|
|
110
|
+
import { Key } from "./key";
|
|
111
|
+
import { Value } from "./value";
|
|
112
|
+
|
|
113
|
+
export interface Target {
|
|
114
|
+
[key: Key]: Value;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export class Holder {
|
|
118
|
+
public kept!: Kept;
|
|
119
|
+
|
|
120
|
+
public describe(): string {
|
|
121
|
+
const helper: BodyOnly = { tag: "x" };
|
|
122
|
+
return helper.tag;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
`
|
|
126
|
+
|
|
127
|
+
const projectDependenciesIndexSignatureAliasSourceKey = `export type Key = string;
|
|
128
|
+
`
|
|
129
|
+
|
|
130
|
+
const projectDependenciesIndexSignatureAliasSourceValue = `export type Value = string;
|
|
131
|
+
`
|
|
132
|
+
|
|
133
|
+
const projectDependenciesIndexSignatureAliasSourceKept = `export type Kept = number;
|
|
134
|
+
`
|
|
135
|
+
|
|
136
|
+
const projectDependenciesIndexSignatureAliasSourceBody = `export interface BodyOnly {
|
|
137
|
+
tag: string;
|
|
138
|
+
}
|
|
139
|
+
`
|