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,160 @@
|
|
|
1
|
+
package main
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"os"
|
|
5
|
+
"path/filepath"
|
|
6
|
+
"strings"
|
|
7
|
+
"testing"
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
// TestTransformSingleFileJSLocatesOutputAcrossLayouts verifies `--output js`
|
|
11
|
+
// finds its artifact wherever the compiler places the emit.
|
|
12
|
+
//
|
|
13
|
+
// `transformSingleToJavaScript` captures the emit by matching the write callback
|
|
14
|
+
// against the requested source. Comparing whole path stems made that match ask
|
|
15
|
+
// whether `dist/main` equals `src/main`, so every project with an `outDir` --
|
|
16
|
+
// which is every realistic layout -- reported "no output produced" and exited 3
|
|
17
|
+
// over a transform that had in fact succeeded (samchon/typia#2134). `outDir` is
|
|
18
|
+
// only one of the settings that reposition an emit, so this pins the whole class
|
|
19
|
+
// rather than the reported witness: the match must come from the compiler's own
|
|
20
|
+
// output-path resolution, the same one the emitter uses to choose where to
|
|
21
|
+
// write, so no combination of `outDir`, `rootDir`, `rootDirs`, or source nesting
|
|
22
|
+
// can desynchronize the two.
|
|
23
|
+
//
|
|
24
|
+
// 1. Build the same typia-valid source under each output-path layout.
|
|
25
|
+
// 2. Transform it with `--output js --out`.
|
|
26
|
+
// 3. Require exit 0, a silent stderr, and a published artifact carrying the
|
|
27
|
+
// lowered validator rather than the untransformed call.
|
|
28
|
+
func TestTransformSingleFileJSLocatesOutputAcrossLayouts(t *testing.T) {
|
|
29
|
+
for _, layout := range []struct {
|
|
30
|
+
name string
|
|
31
|
+
extra []string
|
|
32
|
+
file string
|
|
33
|
+
}{
|
|
34
|
+
// The reported regression. With no `rootDir` the common source directory is
|
|
35
|
+
// the tsconfig's own directory, so the emit lands at `dist/src/main.js`.
|
|
36
|
+
{
|
|
37
|
+
name: "out_dir",
|
|
38
|
+
extra: []string{`"outDir": "dist"`},
|
|
39
|
+
file: "src/main.ts",
|
|
40
|
+
},
|
|
41
|
+
// `rootDir` re-bases the emit again, to `dist/main.js`, so a fix keyed on
|
|
42
|
+
// `outDir` alone would still put the artifact somewhere else than expected.
|
|
43
|
+
{
|
|
44
|
+
name: "root_dir_and_out_dir",
|
|
45
|
+
extra: []string{`"rootDir": "src"`, `"outDir": "dist"`},
|
|
46
|
+
file: "src/main.ts",
|
|
47
|
+
},
|
|
48
|
+
// Nesting below the root dir carries into the output as `dist/deep/nested/
|
|
49
|
+
// main.js`: the emitted path differs from the source path in more than its
|
|
50
|
+
// leading directory.
|
|
51
|
+
{
|
|
52
|
+
name: "nested_source_directory",
|
|
53
|
+
extra: []string{`"rootDir": "src"`, `"outDir": "dist"`},
|
|
54
|
+
file: "src/deep/nested/main.ts",
|
|
55
|
+
},
|
|
56
|
+
// `rootDirs` is a module-resolution feature and must not reposition the
|
|
57
|
+
// emit. Pin that the resolution agrees instead of assuming it.
|
|
58
|
+
{
|
|
59
|
+
name: "root_dirs_and_out_dir",
|
|
60
|
+
extra: []string{`"rootDirs": ["src", "generated"]`, `"outDir": "dist"`},
|
|
61
|
+
file: "src/main.ts",
|
|
62
|
+
},
|
|
63
|
+
// One source, three writes through the one callback: `dist/main.js`,
|
|
64
|
+
// `dist/main.js.map`, and `dist/main.d.ts`. Finding the artifact is not
|
|
65
|
+
// enough here -- the check has to tell it apart from its own siblings. The
|
|
66
|
+
// map is the trap, since its `sourcesContent` embeds the original
|
|
67
|
+
// TypeScript, so capturing it would publish text still carrying
|
|
68
|
+
// `typia.is<` behind exit 0.
|
|
69
|
+
{
|
|
70
|
+
name: "declaration_and_source_map",
|
|
71
|
+
extra: []string{
|
|
72
|
+
`"rootDir": "src"`,
|
|
73
|
+
`"outDir": "dist"`,
|
|
74
|
+
`"declaration": true`,
|
|
75
|
+
`"sourceMap": true`,
|
|
76
|
+
},
|
|
77
|
+
file: "src/main.ts",
|
|
78
|
+
},
|
|
79
|
+
// The one layout that already worked, because the emit lands beside its
|
|
80
|
+
// source. It must keep working.
|
|
81
|
+
{
|
|
82
|
+
name: "no_out_dir",
|
|
83
|
+
extra: nil,
|
|
84
|
+
file: "src/main.ts",
|
|
85
|
+
},
|
|
86
|
+
} {
|
|
87
|
+
t.Run(layout.name, func(t *testing.T) {
|
|
88
|
+
project := transformSingleFileLayoutProject(t, layout.extra, map[string]string{
|
|
89
|
+
layout.file: transformSingleFileValidSource,
|
|
90
|
+
})
|
|
91
|
+
outPath := filepath.Join(project, "artifact", "main.js")
|
|
92
|
+
_, errText, code := ttscTypiaTestCapture(func() int {
|
|
93
|
+
return runTransform([]string{
|
|
94
|
+
"--cwd", project,
|
|
95
|
+
"--tsconfig", "tsconfig.json",
|
|
96
|
+
"--file", filepath.FromSlash(layout.file),
|
|
97
|
+
"--output", "js",
|
|
98
|
+
"--out", outPath,
|
|
99
|
+
})
|
|
100
|
+
})
|
|
101
|
+
if code != 0 {
|
|
102
|
+
t.Fatalf("`--output js` should publish under this layout, got %d\nstderr=%s", code, errText)
|
|
103
|
+
}
|
|
104
|
+
if errText != "" {
|
|
105
|
+
t.Fatalf("`--output js` reported diagnostics under this layout:\n%s", errText)
|
|
106
|
+
}
|
|
107
|
+
data, err := os.ReadFile(outPath)
|
|
108
|
+
if err != nil {
|
|
109
|
+
t.Fatalf("`--output js` published no artifact: %v", err)
|
|
110
|
+
}
|
|
111
|
+
text := string(data)
|
|
112
|
+
if strings.Contains(text, "typia.is<") {
|
|
113
|
+
t.Fatalf("published artifact still carries the untransformed call:\n%s", text)
|
|
114
|
+
}
|
|
115
|
+
if !strings.Contains(text, `"number"`) {
|
|
116
|
+
t.Fatalf("published artifact does not carry the lowered validator:\n%s", text)
|
|
117
|
+
}
|
|
118
|
+
})
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// transformSingleFileLayoutProject writes a project whose tsconfig carries the
|
|
123
|
+
// given extra `compilerOptions` entries and whose sources are the given
|
|
124
|
+
// project-relative slash paths, sharing the typia stub the other transform
|
|
125
|
+
// fixtures use. It exists so one fixture can vary only the output-path settings.
|
|
126
|
+
func transformSingleFileLayoutProject(
|
|
127
|
+
t *testing.T,
|
|
128
|
+
extra []string,
|
|
129
|
+
sources map[string]string,
|
|
130
|
+
) string {
|
|
131
|
+
t.Helper()
|
|
132
|
+
project := t.TempDir()
|
|
133
|
+
options := append([]string{
|
|
134
|
+
`"target": "ES2022"`,
|
|
135
|
+
`"module": "commonjs"`,
|
|
136
|
+
`"moduleResolution": "bundler"`,
|
|
137
|
+
`"ignoreDeprecations": "6.0"`,
|
|
138
|
+
`"types": ["*"]`,
|
|
139
|
+
`"esModuleInterop": true`,
|
|
140
|
+
`"strict": true`,
|
|
141
|
+
`"skipLibCheck": true`,
|
|
142
|
+
}, extra...)
|
|
143
|
+
tsconfig := "{\n \"compilerOptions\": {\n " +
|
|
144
|
+
strings.Join(options, ",\n ") +
|
|
145
|
+
"\n },\n \"include\": [\"src\"]\n}\n"
|
|
146
|
+
if err := os.WriteFile(filepath.Join(project, "tsconfig.json"), []byte(tsconfig), 0o644); err != nil {
|
|
147
|
+
t.Fatalf("write tsconfig: %v", err)
|
|
148
|
+
}
|
|
149
|
+
transformDiagnosticWriteTypiaStub(t, project)
|
|
150
|
+
for rel, body := range sources {
|
|
151
|
+
path := filepath.Join(project, filepath.FromSlash(rel))
|
|
152
|
+
if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil {
|
|
153
|
+
t.Fatalf("mkdir %s: %v", rel, err)
|
|
154
|
+
}
|
|
155
|
+
if err := os.WriteFile(path, []byte(body), 0o644); err != nil {
|
|
156
|
+
t.Fatalf("write %s: %v", rel, err)
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return project
|
|
160
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
package main
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"os"
|
|
5
|
+
"path/filepath"
|
|
6
|
+
"strings"
|
|
7
|
+
"testing"
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
// TestTransformSingleFileSuccessPublishesArtifact verifies the positive twin.
|
|
11
|
+
//
|
|
12
|
+
// Consulting the diagnostics before publishing must not make a clean transform
|
|
13
|
+
// withhold its artifact: the guard has to key on a reported diagnostic, not on
|
|
14
|
+
// merely having run. This pins the success side of the same decision in both
|
|
15
|
+
// output modes, including that the call was actually rewritten rather than
|
|
16
|
+
// copied through as an untransformed stub.
|
|
17
|
+
//
|
|
18
|
+
// 1. Transform a typia-valid source with `--out` in `ts` and `js`.
|
|
19
|
+
// 2. Require exit 0 and a silent stderr.
|
|
20
|
+
// 3. Require the published artifact to exist and carry the lowered validator.
|
|
21
|
+
func TestTransformSingleFileSuccessPublishesArtifact(t *testing.T) {
|
|
22
|
+
for _, output := range []string{"ts", "js"} {
|
|
23
|
+
t.Run(output, func(t *testing.T) {
|
|
24
|
+
project := transformSingleFileProject(t, transformSingleFileValidSource)
|
|
25
|
+
outPath := filepath.Join(project, "dist", "main."+output)
|
|
26
|
+
_, errText, code := ttscTypiaTestCapture(func() int {
|
|
27
|
+
return runTransform([]string{
|
|
28
|
+
"--cwd", project,
|
|
29
|
+
"--tsconfig", "tsconfig.json",
|
|
30
|
+
"--file", filepath.Join("src", "main.ts"),
|
|
31
|
+
"--output", output,
|
|
32
|
+
"--out", outPath,
|
|
33
|
+
})
|
|
34
|
+
})
|
|
35
|
+
if code != 0 {
|
|
36
|
+
t.Fatalf("valid single-file transform should succeed, got %d\nstderr=%s", code, errText)
|
|
37
|
+
}
|
|
38
|
+
if errText != "" {
|
|
39
|
+
t.Fatalf("valid single-file transform reported diagnostics:\n%s", errText)
|
|
40
|
+
}
|
|
41
|
+
data, err := os.ReadFile(outPath)
|
|
42
|
+
if err != nil {
|
|
43
|
+
t.Fatalf("valid single-file transform published no artifact: %v", err)
|
|
44
|
+
}
|
|
45
|
+
text := string(data)
|
|
46
|
+
if strings.Contains(text, "typia.is<") {
|
|
47
|
+
t.Fatalf("published artifact still carries the untransformed call:\n%s", text)
|
|
48
|
+
}
|
|
49
|
+
if !strings.Contains(text, `"number"`) {
|
|
50
|
+
t.Fatalf("published artifact does not carry the lowered validator:\n%s", text)
|
|
51
|
+
}
|
|
52
|
+
})
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
package main
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"path/filepath"
|
|
5
|
+
"strings"
|
|
6
|
+
"testing"
|
|
7
|
+
)
|
|
8
|
+
|
|
9
|
+
// TestTransformWasmHostArgvReportsDiagnostics verifies the wasm host contract.
|
|
10
|
+
//
|
|
11
|
+
// `main_wasm.go` is `js && wasm` only, so its `jsTransform` cannot be called
|
|
12
|
+
// here. It carries no decision of its own: it renders the JS options object into
|
|
13
|
+
// argv via `transformArgs`, hands that to this same `runTransform`, and returns
|
|
14
|
+
// the resulting `{ code, stdout, stderr }`. Driving the exact argv it builds --
|
|
15
|
+
// `--cwd=`/`--tsconfig=`/`--file=` with its `--output=ts` default -- therefore
|
|
16
|
+
// pins what a playground caller observes: the typia error, not a stub.
|
|
17
|
+
//
|
|
18
|
+
// 1. Build the argv `transformArgs` produces for a single-file request.
|
|
19
|
+
// 2. Run it against a typia-invalid source.
|
|
20
|
+
// 3. Require code 3, the diagnostic in stderr, and no stub in stdout.
|
|
21
|
+
func TestTransformWasmHostArgvReportsDiagnostics(t *testing.T) {
|
|
22
|
+
project := transformSingleFileProject(t, transformDiagnosticSource)
|
|
23
|
+
argv := []string{
|
|
24
|
+
"--cwd=" + project,
|
|
25
|
+
"--tsconfig=tsconfig.json",
|
|
26
|
+
"--file=" + filepath.Join(project, "src", "main.ts"),
|
|
27
|
+
"--output=ts",
|
|
28
|
+
}
|
|
29
|
+
outText, errText, code := ttscTypiaTestCapture(func() int { return runTransform(argv) })
|
|
30
|
+
if code != 3 {
|
|
31
|
+
t.Fatalf("wasm host argv should surface code 3, got %d\nstdout=%s\nstderr=%s", code, outText, errText)
|
|
32
|
+
}
|
|
33
|
+
if !strings.Contains(errText, "non-specified generic argument") {
|
|
34
|
+
t.Fatalf("wasm host argv did not surface the typia diagnostic:\n%s", errText)
|
|
35
|
+
}
|
|
36
|
+
if outText != "" {
|
|
37
|
+
t.Fatalf("wasm host argv returned an untransformed stub as stdout:\n%s", outText)
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
package main
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"os"
|
|
5
|
+
"os/exec"
|
|
6
|
+
"path/filepath"
|
|
7
|
+
"testing"
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
// TestTupleOptionalCompareCloneTransform pins optional-trailing tuple semantics
|
|
11
|
+
// across is / compare.equals / plain.clone / plain.classify.
|
|
12
|
+
//
|
|
13
|
+
// Issue #2202: for a tuple with an omitted optional trailing element, `is`
|
|
14
|
+
// correctly validates with a length range (`1 <= length && 2 >= length`), but
|
|
15
|
+
// `compare.equals` emitted a hard `x.length === 2` gate and `plain.clone` /
|
|
16
|
+
// `plain.classify` materialized the absent element as a phantom `undefined`
|
|
17
|
+
// (`[input[0], input[1]]`). So `equals(["a"], ["a"])` was false (reflexivity
|
|
18
|
+
// broken; disagrees with `is`) and `clone(["a"])` was `["a", undefined]`
|
|
19
|
+
// (length 2), not deep-equal to its input. The three must honor the same
|
|
20
|
+
// optional-trailing semantics as `is`.
|
|
21
|
+
//
|
|
22
|
+
// 1. Transform is / equals / clone / classify over `[string, number?]` and
|
|
23
|
+
// `[string, number?, boolean?]`, plus fully-required and rest controls.
|
|
24
|
+
// 2. Require equals reflexive over omitted-optional values, clone/classify to
|
|
25
|
+
// produce the correct length with no phantom slot, and `equals(x, clone(x))`
|
|
26
|
+
// to hold for every is-valid x.
|
|
27
|
+
// 3. Require fully-populated tuples and rest tuples to be unchanged.
|
|
28
|
+
func TestTupleOptionalCompareCloneTransform(t *testing.T) {
|
|
29
|
+
project := tupleOptionalCompareCloneProject(t)
|
|
30
|
+
out, errText, code := ttscTypiaTestCapture(func() int {
|
|
31
|
+
return runTransform([]string{
|
|
32
|
+
"--cwd", project,
|
|
33
|
+
"--tsconfig", "tsconfig.json",
|
|
34
|
+
"--file", "src/main.ts",
|
|
35
|
+
"--output", "js",
|
|
36
|
+
})
|
|
37
|
+
})
|
|
38
|
+
if code != 0 {
|
|
39
|
+
t.Fatalf("tuple optional compare/clone transform failed: code=%d stderr=\n%s", code, errText)
|
|
40
|
+
}
|
|
41
|
+
tupleOptionalCompareCloneRunRuntimeCases(t, project, out)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
func tupleOptionalCompareCloneProject(t *testing.T) string {
|
|
45
|
+
t.Helper()
|
|
46
|
+
root := ttscTypiaTestRepoRoot(t)
|
|
47
|
+
base := filepath.Join(root, "packages", "typia", "native", ".tmp-ttsc-typia-tests")
|
|
48
|
+
if err := os.MkdirAll(base, 0o755); err != nil {
|
|
49
|
+
t.Fatalf("mkdir temp base: %v", err)
|
|
50
|
+
}
|
|
51
|
+
dir, err := os.MkdirTemp(base, "tuple-optional-")
|
|
52
|
+
if err != nil {
|
|
53
|
+
t.Fatalf("create temp fixture: %v", err)
|
|
54
|
+
}
|
|
55
|
+
t.Cleanup(func() {
|
|
56
|
+
_ = os.RemoveAll(dir)
|
|
57
|
+
})
|
|
58
|
+
src := filepath.Join(dir, "src")
|
|
59
|
+
if err := os.MkdirAll(src, 0o755); err != nil {
|
|
60
|
+
t.Fatalf("mkdir fixture src: %v", err)
|
|
61
|
+
}
|
|
62
|
+
if err := os.WriteFile(filepath.Join(dir, "tsconfig.json"), []byte(tupleOptionalCompareCloneTSConfig), 0o644); err != nil {
|
|
63
|
+
t.Fatalf("write tsconfig: %v", err)
|
|
64
|
+
}
|
|
65
|
+
if err := os.WriteFile(filepath.Join(src, "main.ts"), []byte(tupleOptionalCompareCloneSource), 0o644); err != nil {
|
|
66
|
+
t.Fatalf("write source: %v", err)
|
|
67
|
+
}
|
|
68
|
+
return dir
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
func tupleOptionalCompareCloneRunRuntimeCases(t *testing.T, project string, js string) {
|
|
72
|
+
t.Helper()
|
|
73
|
+
node, err := exec.LookPath("node")
|
|
74
|
+
if err != nil {
|
|
75
|
+
t.Skip("node executable not found")
|
|
76
|
+
}
|
|
77
|
+
runtimeDir := filepath.Join(project, "runtime")
|
|
78
|
+
if err := os.MkdirAll(runtimeDir, 0o755); err != nil {
|
|
79
|
+
t.Fatalf("mkdir runtime dir: %v", err)
|
|
80
|
+
}
|
|
81
|
+
ttscTypiaTestWriteCommonRuntimeStubs(t, runtimeDir)
|
|
82
|
+
runtimeJS := ttscTypiaTestRewriteCommonJS(t, js)
|
|
83
|
+
if err := os.WriteFile(filepath.Join(runtimeDir, "main.cjs"), []byte(runtimeJS), 0o644); err != nil {
|
|
84
|
+
t.Fatalf("write runtime module: %v", err)
|
|
85
|
+
}
|
|
86
|
+
runner := filepath.Join(runtimeDir, "run.cjs")
|
|
87
|
+
if err := os.WriteFile(runner, []byte(tupleOptionalCompareCloneRuntimeRunner), 0o644); err != nil {
|
|
88
|
+
t.Fatalf("write runtime runner: %v", err)
|
|
89
|
+
}
|
|
90
|
+
cmd := exec.Command(node, runner)
|
|
91
|
+
cmd.Dir = runtimeDir
|
|
92
|
+
output, err := cmd.CombinedOutput()
|
|
93
|
+
if err != nil {
|
|
94
|
+
t.Fatalf("tuple optional compare/clone runtime cases failed: %v\n%s", err, output)
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const tupleOptionalCompareCloneTSConfig = `{
|
|
99
|
+
"compilerOptions": {
|
|
100
|
+
"target": "ES2022",
|
|
101
|
+
"module": "commonjs",
|
|
102
|
+
"moduleResolution": "bundler",
|
|
103
|
+
"ignoreDeprecations": "6.0",
|
|
104
|
+
"types": ["*"],
|
|
105
|
+
"esModuleInterop": true,
|
|
106
|
+
"strict": true,
|
|
107
|
+
"skipLibCheck": true
|
|
108
|
+
},
|
|
109
|
+
"include": ["src"]
|
|
110
|
+
}
|
|
111
|
+
`
|
|
112
|
+
|
|
113
|
+
const tupleOptionalCompareCloneSource = `import typia from "typia";
|
|
114
|
+
|
|
115
|
+
export const isPair = typia.createIs<[string, number?]>();
|
|
116
|
+
export const equalsPair = typia.compare.createEquals<[string, number?]>();
|
|
117
|
+
export const clonePair = typia.plain.createClone<[string, number?]>();
|
|
118
|
+
export const classifyPair = typia.plain.createClassify<[string, number?]>();
|
|
119
|
+
|
|
120
|
+
export const isTriple = typia.createIs<[string, number?, boolean?]>();
|
|
121
|
+
export const equalsTriple = typia.compare.createEquals<[string, number?, boolean?]>();
|
|
122
|
+
export const cloneTriple = typia.plain.createClone<[string, number?, boolean?]>();
|
|
123
|
+
export const classifyTriple = typia.plain.createClassify<[string, number?, boolean?]>();
|
|
124
|
+
|
|
125
|
+
// boundary: a tuple whose only element is optional.
|
|
126
|
+
export const equalsSolo = typia.compare.createEquals<[number?]>();
|
|
127
|
+
export const cloneSolo = typia.plain.createClone<[number?]>();
|
|
128
|
+
|
|
129
|
+
// boundary: an optional trailing element that is itself a nested tuple.
|
|
130
|
+
export const equalsNested = typia.compare.createEquals<[string, [number, boolean]?]>();
|
|
131
|
+
export const cloneNested = typia.plain.createClone<[string, [number, boolean]?]>();
|
|
132
|
+
|
|
133
|
+
// control: a fully-required tuple must stay byte-identical.
|
|
134
|
+
export const equalsFixed = typia.compare.createEquals<[string, number]>();
|
|
135
|
+
export const cloneFixed = typia.plain.createClone<[string, number]>();
|
|
136
|
+
|
|
137
|
+
// control: a rest tuple must stay byte-identical.
|
|
138
|
+
export const equalsRest = typia.compare.createEquals<[string, ...number[]]>();
|
|
139
|
+
export const cloneRest = typia.plain.createClone<[string, ...number[]]>();
|
|
140
|
+
`
|
|
141
|
+
|
|
142
|
+
const tupleOptionalCompareCloneRuntimeRunner = `const mod = require("./main.cjs");
|
|
143
|
+
|
|
144
|
+
const expect = (label, actual, expected) => {
|
|
145
|
+
if (actual !== expected) {
|
|
146
|
+
throw new Error(label + ": expected " + expected + ", got " + actual);
|
|
147
|
+
}
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
// A clone must be a distinct array, deep-equal to expected, with no phantom
|
|
151
|
+
// trailing slot (length matches, and the first out-of-range index is absent).
|
|
152
|
+
const expectClone = (label, result, expected) => {
|
|
153
|
+
if (!Array.isArray(result)) throw new Error(label + ": not an array");
|
|
154
|
+
if (result.length !== expected.length)
|
|
155
|
+
throw new Error(label + ": length " + result.length + " !== " + expected.length);
|
|
156
|
+
if (expected.length in result)
|
|
157
|
+
throw new Error(label + ": phantom slot at index " + expected.length);
|
|
158
|
+
for (let i = 0; i < expected.length; ++i)
|
|
159
|
+
if (result[i] !== expected[i])
|
|
160
|
+
throw new Error(label + ": [" + i + "] " + result[i] + " !== " + expected[i]);
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
// --- is: the reference range semantics (unchanged) ---
|
|
164
|
+
expect("is pair omitted", mod.isPair(["a"]), true);
|
|
165
|
+
expect("is pair present", mod.isPair(["a", 1]), true);
|
|
166
|
+
expect("is pair too long", mod.isPair(["a", 1, 2]), false);
|
|
167
|
+
expect("is triple omitted", mod.isTriple(["a"]), true);
|
|
168
|
+
|
|
169
|
+
// --- equals: reflexive over omitted optional; matches is ---
|
|
170
|
+
expect("equals pair omitted reflexive", mod.equalsPair(["a"], ["a"]), true);
|
|
171
|
+
expect("equals pair omitted vs present", mod.equalsPair(["a"], ["a", 1]), false);
|
|
172
|
+
expect("equals pair present reflexive", mod.equalsPair(["a", 1], ["a", 1]), true);
|
|
173
|
+
expect("equals pair present differ", mod.equalsPair(["a", 1], ["a", 2]), false);
|
|
174
|
+
expect("equals triple omitted reflexive", mod.equalsTriple(["a"], ["a"]), true);
|
|
175
|
+
expect("equals triple mid present reflexive", mod.equalsTriple(["a", 1], ["a", 1]), true);
|
|
176
|
+
expect("equals triple full reflexive", mod.equalsTriple(["a", 1, true], ["a", 1, true]), true);
|
|
177
|
+
expect("equals triple omitted vs present", mod.equalsTriple(["a"], ["a", 1]), false);
|
|
178
|
+
|
|
179
|
+
// --- clone: correct length, no phantom undefined ---
|
|
180
|
+
expectClone("clone pair omitted", mod.clonePair(["a"]), ["a"]);
|
|
181
|
+
expectClone("clone pair present", mod.clonePair(["a", 1]), ["a", 1]);
|
|
182
|
+
expectClone("clone triple omitted", mod.cloneTriple(["a"]), ["a"]);
|
|
183
|
+
expectClone("clone triple mid present", mod.cloneTriple(["a", 1]), ["a", 1]);
|
|
184
|
+
expectClone("clone triple full", mod.cloneTriple(["a", 1, true]), ["a", 1, true]);
|
|
185
|
+
|
|
186
|
+
// --- classify: same tuple-inline path as clone ---
|
|
187
|
+
expectClone("classify pair omitted", mod.classifyPair(["a"]), ["a"]);
|
|
188
|
+
expectClone("classify triple omitted", mod.classifyTriple(["a"]), ["a"]);
|
|
189
|
+
|
|
190
|
+
// --- equals(x, clone(x)) holds for every is-valid x ---
|
|
191
|
+
for (const x of [["a"], ["a", 1]]) {
|
|
192
|
+
if (mod.isPair(x)) expect("equals pair (x, clone x) " + JSON.stringify(x), mod.equalsPair(x, mod.clonePair(x)), true);
|
|
193
|
+
}
|
|
194
|
+
for (const x of [["a"], ["a", 1], ["a", 1, true]]) {
|
|
195
|
+
if (mod.isTriple(x)) expect("equals triple (x, clone x) " + JSON.stringify(x), mod.equalsTriple(x, mod.cloneTriple(x)), true);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// --- boundary: only-optional tuple ---
|
|
199
|
+
expect("equals solo empty reflexive", mod.equalsSolo([], []), true);
|
|
200
|
+
expect("equals solo empty vs present", mod.equalsSolo([], [1]), false);
|
|
201
|
+
expect("equals solo present reflexive", mod.equalsSolo([1], [1]), true);
|
|
202
|
+
expectClone("clone solo empty", mod.cloneSolo([]), []);
|
|
203
|
+
expectClone("clone solo present", mod.cloneSolo([1]), [1]);
|
|
204
|
+
|
|
205
|
+
// --- boundary: nested tuple as the optional trailing element ---
|
|
206
|
+
expect("equals nested omitted reflexive", mod.equalsNested(["a"], ["a"]), true);
|
|
207
|
+
expect("equals nested present reflexive", mod.equalsNested(["a", [1, true]], ["a", [1, true]]), true);
|
|
208
|
+
expect("equals nested omitted vs present", mod.equalsNested(["a"], ["a", [1, true]]), false);
|
|
209
|
+
expectClone("clone nested omitted", mod.cloneNested(["a"]), ["a"]);
|
|
210
|
+
{
|
|
211
|
+
const nested = mod.cloneNested(["a", [1, true]]);
|
|
212
|
+
if (nested.length !== 2) throw new Error("clone nested present: outer length " + nested.length);
|
|
213
|
+
if (1 in nested === false) throw new Error("clone nested present: missing inner tuple");
|
|
214
|
+
expectClone("clone nested inner", nested[1], [1, true]);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
// --- controls: fully-required and rest tuples unchanged ---
|
|
218
|
+
expect("equals fixed reflexive", mod.equalsFixed(["a", 1], ["a", 1]), true);
|
|
219
|
+
expect("equals fixed differ", mod.equalsFixed(["a", 1], ["a", 2]), false);
|
|
220
|
+
expectClone("clone fixed", mod.cloneFixed(["a", 1]), ["a", 1]);
|
|
221
|
+
|
|
222
|
+
expect("equals rest solo", mod.equalsRest(["a"], ["a"]), true);
|
|
223
|
+
expect("equals rest multi", mod.equalsRest(["a", 1, 2], ["a", 1, 2]), true);
|
|
224
|
+
expect("equals rest length differ", mod.equalsRest(["a", 1], ["a", 1, 2]), false);
|
|
225
|
+
expectClone("clone rest solo", mod.cloneRest(["a"]), ["a"]);
|
|
226
|
+
expectClone("clone rest multi", mod.cloneRest(["a", 1, 2]), ["a", 1, 2]);
|
|
227
|
+
`
|