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,278 @@
|
|
|
1
|
+
package main
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"os"
|
|
5
|
+
"os/exec"
|
|
6
|
+
"path/filepath"
|
|
7
|
+
"strings"
|
|
8
|
+
"testing"
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
// TestPrivateFieldFilterIsTransform verifies an ES `#private` instance field is
|
|
12
|
+
// excluded from a class's validated shape, so a real instance passes its own
|
|
13
|
+
// `is`/`assert`/`validate` guard (#2213).
|
|
14
|
+
//
|
|
15
|
+
// A `#private` field is installed only by the constructor and is unreachable via
|
|
16
|
+
// index access, so it is not part of a type's structural, externally-observable
|
|
17
|
+
// shape. Before the fix the member filter excluded only the TypeScript keyword
|
|
18
|
+
// `private`/`protected` members, so a `#private` field leaked into the validated
|
|
19
|
+
// shape as a mangled key (`input["�#1@#secret"]`) that no runtime object
|
|
20
|
+
// carries — making the guard unconditionally false.
|
|
21
|
+
//
|
|
22
|
+
// 1. Emit `is`/`assert`/`validate` for a class carrying a `#private` field
|
|
23
|
+
// alongside a public property, a subclass that adds another `#private`, an
|
|
24
|
+
// all-`#private` class, a class with `#private` method / accessor members,
|
|
25
|
+
// and a keyword `private`/`protected` class.
|
|
26
|
+
// 2. Assert the emitted validators never reference a mangled `#private` key.
|
|
27
|
+
// 3. Execute the validators against real instances and plain public-shape
|
|
28
|
+
// objects, proving each passes on its public shape.
|
|
29
|
+
func TestPrivateFieldFilterIsTransform(t *testing.T) {
|
|
30
|
+
project := privateFieldFilterProject(t)
|
|
31
|
+
|
|
32
|
+
ts := privateFieldFilterTransform(t, project, "ts")
|
|
33
|
+
// A `#private` member surfaces in a validator only as a mangled key —
|
|
34
|
+
// `input["�#1@#secret"]`. The class SOURCE (echoed above the validators)
|
|
35
|
+
// also spells `#secret`, so the bare name is not a defect marker; the `@#`
|
|
36
|
+
// infix is unique to the mangled key and never appears in class source, so it
|
|
37
|
+
// is the exact byte signature of the leak.
|
|
38
|
+
if strings.Contains(ts, "@#") {
|
|
39
|
+
t.Fatalf("emit references a mangled #private key (leaked into validated shape):\n%s", ts)
|
|
40
|
+
}
|
|
41
|
+
// The public shape must still be validated.
|
|
42
|
+
for _, needle := range []string{"input.label", "input.tag"} {
|
|
43
|
+
if !strings.Contains(ts, needle) {
|
|
44
|
+
t.Fatalf("emit dropped a public property %q:\n%s", needle, ts)
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
privateFieldFilterRunRuntimeCases(
|
|
49
|
+
t,
|
|
50
|
+
project,
|
|
51
|
+
privateFieldFilterTransform(t, project, "js"),
|
|
52
|
+
)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
func privateFieldFilterProject(t *testing.T) string {
|
|
56
|
+
t.Helper()
|
|
57
|
+
root := ttscTypiaTestRepoRoot(t)
|
|
58
|
+
base := filepath.Join(root, "packages", "typia", "native", ".tmp-ttsc-typia-tests")
|
|
59
|
+
if err := os.MkdirAll(base, 0o755); err != nil {
|
|
60
|
+
t.Fatalf("mkdir temp base: %v", err)
|
|
61
|
+
}
|
|
62
|
+
dir, err := os.MkdirTemp(base, "private-field-filter-")
|
|
63
|
+
if err != nil {
|
|
64
|
+
t.Fatalf("create temp fixture: %v", err)
|
|
65
|
+
}
|
|
66
|
+
t.Cleanup(func() {
|
|
67
|
+
_ = os.RemoveAll(dir)
|
|
68
|
+
})
|
|
69
|
+
src := filepath.Join(dir, "src")
|
|
70
|
+
if err := os.MkdirAll(src, 0o755); err != nil {
|
|
71
|
+
t.Fatalf("mkdir fixture src: %v", err)
|
|
72
|
+
}
|
|
73
|
+
if err := os.WriteFile(filepath.Join(dir, "tsconfig.json"), []byte(privateFieldFilterTSConfig), 0o644); err != nil {
|
|
74
|
+
t.Fatalf("write tsconfig: %v", err)
|
|
75
|
+
}
|
|
76
|
+
if err := os.WriteFile(filepath.Join(src, "main.ts"), []byte(privateFieldFilterSource), 0o644); err != nil {
|
|
77
|
+
t.Fatalf("write source: %v", err)
|
|
78
|
+
}
|
|
79
|
+
return dir
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
func privateFieldFilterTransform(t *testing.T, project string, output string) string {
|
|
83
|
+
t.Helper()
|
|
84
|
+
out, errText, code := ttscTypiaTestCapture(func() int {
|
|
85
|
+
return runTransform([]string{
|
|
86
|
+
"--cwd", project,
|
|
87
|
+
"--tsconfig", "tsconfig.json",
|
|
88
|
+
"--file", "src/main.ts",
|
|
89
|
+
"--output", output,
|
|
90
|
+
})
|
|
91
|
+
})
|
|
92
|
+
if code != 0 {
|
|
93
|
+
t.Fatalf("private field filter transform failed: output=%s code=%d stderr=\n%s", output, code, errText)
|
|
94
|
+
}
|
|
95
|
+
return out
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
func privateFieldFilterRunRuntimeCases(t *testing.T, project string, js string) {
|
|
99
|
+
t.Helper()
|
|
100
|
+
node, err := exec.LookPath("node")
|
|
101
|
+
if err != nil {
|
|
102
|
+
t.Skip("node executable not found")
|
|
103
|
+
}
|
|
104
|
+
runtimeDir := filepath.Join(project, "runtime")
|
|
105
|
+
if err := os.MkdirAll(runtimeDir, 0o755); err != nil {
|
|
106
|
+
t.Fatalf("mkdir runtime dir: %v", err)
|
|
107
|
+
}
|
|
108
|
+
ttscTypiaTestWriteCommonRuntimeStubs(t, runtimeDir)
|
|
109
|
+
runtimeJS := ttscTypiaTestRewriteCommonJS(t, js)
|
|
110
|
+
if err := os.WriteFile(filepath.Join(runtimeDir, "main.cjs"), []byte(runtimeJS), 0o644); err != nil {
|
|
111
|
+
t.Fatalf("write runtime module: %v", err)
|
|
112
|
+
}
|
|
113
|
+
runner := filepath.Join(runtimeDir, "run.cjs")
|
|
114
|
+
if err := os.WriteFile(runner, []byte(privateFieldFilterRuntimeRunner), 0o644); err != nil {
|
|
115
|
+
t.Fatalf("write runtime runner: %v", err)
|
|
116
|
+
}
|
|
117
|
+
cmd := exec.Command(node, runner)
|
|
118
|
+
cmd.Dir = runtimeDir
|
|
119
|
+
if output, err := cmd.CombinedOutput(); err != nil {
|
|
120
|
+
t.Fatalf("private field filter runtime cases failed: %v\n%s", err, output)
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const privateFieldFilterTSConfig = `{
|
|
125
|
+
"compilerOptions": {
|
|
126
|
+
"target": "ES2022",
|
|
127
|
+
"module": "commonjs",
|
|
128
|
+
"moduleResolution": "bundler",
|
|
129
|
+
"ignoreDeprecations": "6.0",
|
|
130
|
+
"types": ["*"],
|
|
131
|
+
"esModuleInterop": true,
|
|
132
|
+
"strict": true,
|
|
133
|
+
"skipLibCheck": true
|
|
134
|
+
},
|
|
135
|
+
"include": ["src"]
|
|
136
|
+
}
|
|
137
|
+
`
|
|
138
|
+
|
|
139
|
+
const privateFieldFilterSource = `import typia from "typia";
|
|
140
|
+
|
|
141
|
+
export class Box {
|
|
142
|
+
#secret: boolean;
|
|
143
|
+
public label: string;
|
|
144
|
+
constructor(label: string, secret: boolean) {
|
|
145
|
+
this.label = label;
|
|
146
|
+
this.#secret = secret;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export class SubBox extends Box {
|
|
151
|
+
#extra: number;
|
|
152
|
+
public tag: string;
|
|
153
|
+
constructor() {
|
|
154
|
+
super("hi", true);
|
|
155
|
+
this.#extra = 1;
|
|
156
|
+
this.tag = "t";
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
export class SoloPrivate {
|
|
161
|
+
#solo: string;
|
|
162
|
+
constructor() {
|
|
163
|
+
this.#solo = "x";
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
export class MethodPrivate {
|
|
168
|
+
public label: string;
|
|
169
|
+
#hidden(): number {
|
|
170
|
+
return 1;
|
|
171
|
+
}
|
|
172
|
+
get #view(): number {
|
|
173
|
+
return 2;
|
|
174
|
+
}
|
|
175
|
+
set #view(_next: number) {}
|
|
176
|
+
constructor(label: string) {
|
|
177
|
+
this.label = label;
|
|
178
|
+
void this.#hidden();
|
|
179
|
+
this.#view = this.#view;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
export class KeywordBox {
|
|
184
|
+
private secret: boolean;
|
|
185
|
+
protected token: string;
|
|
186
|
+
public label: string;
|
|
187
|
+
constructor(label: string, secret: boolean, token: string) {
|
|
188
|
+
this.label = label;
|
|
189
|
+
this.secret = secret;
|
|
190
|
+
this.token = token;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
export const isBox = typia.createIs<Box>();
|
|
195
|
+
export const assertBox = typia.createAssert<Box>();
|
|
196
|
+
export const validateBox = typia.createValidate<Box>();
|
|
197
|
+
export const isSubBox = typia.createIs<SubBox>();
|
|
198
|
+
export const isSolo = typia.createIs<SoloPrivate>();
|
|
199
|
+
export const isMethod = typia.createIs<MethodPrivate>();
|
|
200
|
+
export const isKeyword = typia.createIs<KeywordBox>();
|
|
201
|
+
`
|
|
202
|
+
|
|
203
|
+
const privateFieldFilterRuntimeRunner = `const mod = require("./main.cjs");
|
|
204
|
+
|
|
205
|
+
class Box {
|
|
206
|
+
#secret;
|
|
207
|
+
label;
|
|
208
|
+
constructor(label, secret) {
|
|
209
|
+
this.label = label;
|
|
210
|
+
this.#secret = secret;
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
class SubBox extends Box {
|
|
214
|
+
#extra;
|
|
215
|
+
tag;
|
|
216
|
+
constructor() {
|
|
217
|
+
super("hi", true);
|
|
218
|
+
this.#extra = 1;
|
|
219
|
+
this.tag = "t";
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
class SoloPrivate {
|
|
223
|
+
#solo;
|
|
224
|
+
constructor() {
|
|
225
|
+
this.#solo = "x";
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
class MethodPrivate {
|
|
229
|
+
label;
|
|
230
|
+
#hidden() {
|
|
231
|
+
return 1;
|
|
232
|
+
}
|
|
233
|
+
get #view() {
|
|
234
|
+
return 2;
|
|
235
|
+
}
|
|
236
|
+
set #view(_next) {}
|
|
237
|
+
constructor(label) {
|
|
238
|
+
this.label = label;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
const expect = (label, actual, expected) => {
|
|
243
|
+
if (actual !== expected) {
|
|
244
|
+
throw new Error(label + ": expected " + expected + " but got " + actual);
|
|
245
|
+
}
|
|
246
|
+
};
|
|
247
|
+
|
|
248
|
+
// A real instance carrying #private members passes its own guard.
|
|
249
|
+
expect("is real Box instance", mod.isBox(new Box("hi", true)), true);
|
|
250
|
+
expect("is real SubBox instance", mod.isSubBox(new SubBox()), true);
|
|
251
|
+
expect("is real SoloPrivate instance", mod.isSolo(new SoloPrivate()), true);
|
|
252
|
+
expect("is real MethodPrivate instance", mod.isMethod(new MethodPrivate("hi")), true);
|
|
253
|
+
|
|
254
|
+
// The #private field is not part of the structural shape: a plain object with
|
|
255
|
+
// only the public members is accepted, exactly like a keyword-private class.
|
|
256
|
+
expect("is plain public Box shape", mod.isBox({ label: "hi" }), true);
|
|
257
|
+
expect("is plain public SubBox shape", mod.isSubBox({ label: "hi", tag: "t" }), true);
|
|
258
|
+
expect("is empty SoloPrivate shape", mod.isSolo({}), true);
|
|
259
|
+
expect("is plain public MethodPrivate shape", mod.isMethod({ label: "hi" }), true);
|
|
260
|
+
expect("is plain public KeywordBox shape", mod.isKeyword({ label: "hi" }), true);
|
|
261
|
+
|
|
262
|
+
// The public shape is still validated structurally.
|
|
263
|
+
expect("reject wrong public label type", mod.isBox({ label: 123 }), false);
|
|
264
|
+
expect("reject missing public label", mod.isBox({}), false);
|
|
265
|
+
|
|
266
|
+
// assert / validate accept a real instance without touching a mangled key.
|
|
267
|
+
expect("assert real Box returns input", mod.assertBox(new Box("hi", true)) instanceof Box, true);
|
|
268
|
+
expect("validate real Box succeeds", mod.validateBox(new Box("hi", true)).success, true);
|
|
269
|
+
expect("validate plain public Box succeeds", mod.validateBox({ label: "hi" }).success, true);
|
|
270
|
+
|
|
271
|
+
let threw = false;
|
|
272
|
+
try {
|
|
273
|
+
mod.assertBox({ label: 123 });
|
|
274
|
+
} catch (_exp) {
|
|
275
|
+
threw = true;
|
|
276
|
+
}
|
|
277
|
+
expect("assert rejects wrong public label", threw, true);
|
|
278
|
+
`
|
|
@@ -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
|
+
`
|