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,216 @@
|
|
|
1
|
+
package main
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"fmt"
|
|
5
|
+
"os"
|
|
6
|
+
"os/exec"
|
|
7
|
+
"path/filepath"
|
|
8
|
+
"strings"
|
|
9
|
+
"testing"
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
// TestDefaultLibrarySpoofNativeIdentityTransform keeps a declaration package out
|
|
13
|
+
// of the runtime-native authority even when its file is named like a TypeScript
|
|
14
|
+
// default library (#2200).
|
|
15
|
+
//
|
|
16
|
+
// Runtime-native identity admits a global whose constructor a default library
|
|
17
|
+
// provides, so how "default library" is decided is the whole boundary. `lib.d.ts`
|
|
18
|
+
// is an ordinary published file name, so a base-name test makes that authority
|
|
19
|
+
// claimable by any package a project pulls in through `typeRoots` — the forged
|
|
20
|
+
// declarations below are a full-member copy of the DOM `File` and `Blob`,
|
|
21
|
+
// including their `declare var` constructor bindings, and nothing but the
|
|
22
|
+
// containing directory distinguishes them from the real thing.
|
|
23
|
+
//
|
|
24
|
+
// 1. Publish `lib.dom.d.ts` and `lib.es5.d.ts` from a fixture `@types` package
|
|
25
|
+
// that declares global File and Blob with their constructors.
|
|
26
|
+
// 2. Transform validators for those globals with no DOM library and no Node
|
|
27
|
+
// types loaded, so the forged package is their only declaration source.
|
|
28
|
+
// 3. Require the emit to keep the forged members instead of an `instanceof`.
|
|
29
|
+
// 4. Execute the validators in Node against the forged structural values and
|
|
30
|
+
// against the real runtime instances, requiring an exact case count.
|
|
31
|
+
func TestDefaultLibrarySpoofNativeIdentityTransform(t *testing.T) {
|
|
32
|
+
project := defaultLibrarySpoofNativeIdentityProject(t)
|
|
33
|
+
js, errText, code := ttscTypiaTestCapture(func() int {
|
|
34
|
+
return runTransform([]string{
|
|
35
|
+
"--cwd", project,
|
|
36
|
+
"--tsconfig", "tsconfig.json",
|
|
37
|
+
"--file", "src/input.ts",
|
|
38
|
+
"--output", "js",
|
|
39
|
+
})
|
|
40
|
+
})
|
|
41
|
+
if code != 0 {
|
|
42
|
+
t.Fatalf("default library spoof transform failed: code=%d stderr=\n%s", code, errText)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
failures := []string{}
|
|
46
|
+
for _, native := range []string{"instanceof File", "instanceof Blob"} {
|
|
47
|
+
if strings.Contains(js, native) {
|
|
48
|
+
failures = append(failures, fmt.Sprintf("a lib.*.d.ts named package declaration was promoted to %q", native))
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
for _, member := range []string{"spoofBlobBrand", "spoofFileBrand"} {
|
|
52
|
+
if !strings.Contains(js, member) {
|
|
53
|
+
failures = append(failures, fmt.Sprintf("emit dropped forged declaration member %q", member))
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
output, runtimeErr := defaultLibrarySpoofNativeIdentityRun(t, project, js)
|
|
58
|
+
if runtimeErr != nil {
|
|
59
|
+
failures = append(failures, fmt.Sprintf("runtime matrix failed: %v\n%s", runtimeErr, output))
|
|
60
|
+
}
|
|
61
|
+
if expected := "RAN 6 SPOOF CASES"; !strings.Contains(output, expected) {
|
|
62
|
+
failures = append(failures, fmt.Sprintf("spoof runner did not report %q; got:\n%s", expected, output))
|
|
63
|
+
}
|
|
64
|
+
if len(failures) != 0 {
|
|
65
|
+
t.Fatalf("default library spoof mismatches:\n%s\n\nemit:\n%s", strings.Join(failures, "\n"), js)
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
func defaultLibrarySpoofNativeIdentityProject(t *testing.T) string {
|
|
70
|
+
t.Helper()
|
|
71
|
+
root := ttscTypiaTestRepoRoot(t)
|
|
72
|
+
base := filepath.Join(root, "packages", "typia", "native", ".tmp-ttsc-typia-tests")
|
|
73
|
+
if err := os.MkdirAll(base, 0o755); err != nil {
|
|
74
|
+
t.Fatalf("mkdir temp base: %v", err)
|
|
75
|
+
}
|
|
76
|
+
dir, err := os.MkdirTemp(base, "default-library-spoof-native-identity-")
|
|
77
|
+
if err != nil {
|
|
78
|
+
t.Fatalf("create temp fixture: %v", err)
|
|
79
|
+
}
|
|
80
|
+
t.Cleanup(func() {
|
|
81
|
+
_ = os.RemoveAll(dir)
|
|
82
|
+
})
|
|
83
|
+
for name, content := range map[string]string{
|
|
84
|
+
"tsconfig.json": defaultLibrarySpoofNativeIdentityTSConfig,
|
|
85
|
+
"node_modules/@types/spoof-lib/package.json": defaultLibrarySpoofNativeIdentityPackageJSON,
|
|
86
|
+
"node_modules/@types/spoof-lib/lib.dom.d.ts": defaultLibrarySpoofNativeIdentityDeclarations,
|
|
87
|
+
"node_modules/@types/spoof-lib/lib.es5.d.ts": defaultLibrarySpoofNativeIdentityExtraDeclarations,
|
|
88
|
+
"src/input.ts": defaultLibrarySpoofNativeIdentitySource,
|
|
89
|
+
} {
|
|
90
|
+
path := filepath.Join(dir, filepath.FromSlash(name))
|
|
91
|
+
if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil {
|
|
92
|
+
t.Fatalf("mkdir fixture path %s: %v", filepath.Dir(path), err)
|
|
93
|
+
}
|
|
94
|
+
if err := os.WriteFile(path, []byte(content), 0o644); err != nil {
|
|
95
|
+
t.Fatalf("write fixture file %s: %v", path, err)
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return dir
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
func defaultLibrarySpoofNativeIdentityRun(t *testing.T, project string, js string) (string, error) {
|
|
102
|
+
t.Helper()
|
|
103
|
+
node, err := exec.LookPath("node")
|
|
104
|
+
if err != nil {
|
|
105
|
+
t.Skip("node executable not found")
|
|
106
|
+
return "", nil
|
|
107
|
+
}
|
|
108
|
+
runtimeDir := filepath.Join(project, "runtime")
|
|
109
|
+
if err := os.MkdirAll(runtimeDir, 0o755); err != nil {
|
|
110
|
+
t.Fatalf("mkdir runtime dir: %v", err)
|
|
111
|
+
}
|
|
112
|
+
ttscTypiaTestWriteCommonRuntimeStubs(t, runtimeDir)
|
|
113
|
+
for name, content := range map[string]string{
|
|
114
|
+
"input.cjs": ttscTypiaTestRewriteCommonJS(t, js),
|
|
115
|
+
"run.cjs": defaultLibrarySpoofNativeIdentityRuntimeRunner,
|
|
116
|
+
} {
|
|
117
|
+
if err := os.WriteFile(filepath.Join(runtimeDir, name), []byte(content), 0o644); err != nil {
|
|
118
|
+
t.Fatalf("write runtime file %s: %v", name, err)
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
cmd := exec.Command(node, filepath.Join(runtimeDir, "run.cjs"))
|
|
122
|
+
cmd.Dir = runtimeDir
|
|
123
|
+
output, err := cmd.CombinedOutput()
|
|
124
|
+
return string(output), err
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
const defaultLibrarySpoofNativeIdentityTSConfig = `{
|
|
128
|
+
"compilerOptions": {
|
|
129
|
+
"target": "ES2022",
|
|
130
|
+
"module": "commonjs",
|
|
131
|
+
"moduleResolution": "bundler",
|
|
132
|
+
"ignoreDeprecations": "6.0",
|
|
133
|
+
"lib": ["ES2022"],
|
|
134
|
+
"types": ["spoof-lib"],
|
|
135
|
+
"esModuleInterop": true,
|
|
136
|
+
"strict": true,
|
|
137
|
+
"skipLibCheck": true
|
|
138
|
+
},
|
|
139
|
+
"include": ["src"]
|
|
140
|
+
}
|
|
141
|
+
`
|
|
142
|
+
|
|
143
|
+
const defaultLibrarySpoofNativeIdentityPackageJSON = `{
|
|
144
|
+
"name": "@types/spoof-lib",
|
|
145
|
+
"version": "1.0.0",
|
|
146
|
+
"types": "lib.dom.d.ts"
|
|
147
|
+
}
|
|
148
|
+
`
|
|
149
|
+
|
|
150
|
+
const defaultLibrarySpoofNativeIdentityDeclarations = `/// <reference path="./lib.es5.d.ts" />
|
|
151
|
+
|
|
152
|
+
interface Blob {
|
|
153
|
+
readonly size: number;
|
|
154
|
+
readonly type: string;
|
|
155
|
+
spoofBlobBrand: string;
|
|
156
|
+
}
|
|
157
|
+
declare var Blob: {
|
|
158
|
+
prototype: Blob;
|
|
159
|
+
new (parts?: unknown[], options?: unknown): Blob;
|
|
160
|
+
};
|
|
161
|
+
`
|
|
162
|
+
|
|
163
|
+
const defaultLibrarySpoofNativeIdentityExtraDeclarations = `interface File extends Blob {
|
|
164
|
+
readonly lastModified: number;
|
|
165
|
+
readonly name: string;
|
|
166
|
+
readonly webkitRelativePath: string;
|
|
167
|
+
spoofFileBrand: string;
|
|
168
|
+
}
|
|
169
|
+
declare var File: {
|
|
170
|
+
prototype: File;
|
|
171
|
+
new (parts: unknown[], name: string, options?: unknown): File;
|
|
172
|
+
};
|
|
173
|
+
`
|
|
174
|
+
|
|
175
|
+
const defaultLibrarySpoofNativeIdentitySource = `import typia from "typia";
|
|
176
|
+
|
|
177
|
+
export const createdIsBlob = typia.createIs<Blob>();
|
|
178
|
+
export const createdIsFile = typia.createIs<File>();
|
|
179
|
+
`
|
|
180
|
+
|
|
181
|
+
const defaultLibrarySpoofNativeIdentityRuntimeRunner = `const validators = require("./input.cjs");
|
|
182
|
+
|
|
183
|
+
let ran = 0;
|
|
184
|
+
const failures = [];
|
|
185
|
+
const eq = (name, actual, expected) => {
|
|
186
|
+
ran += 1;
|
|
187
|
+
if (actual !== expected) {
|
|
188
|
+
failures.push(name + ": expected " + expected + " but got " + actual);
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
const spoofBlob = {
|
|
193
|
+
size: 1,
|
|
194
|
+
type: "text/plain",
|
|
195
|
+
spoofBlobBrand: "spoof",
|
|
196
|
+
};
|
|
197
|
+
const spoofFile = {
|
|
198
|
+
...spoofBlob,
|
|
199
|
+
lastModified: 0,
|
|
200
|
+
name: "x.txt",
|
|
201
|
+
webkitRelativePath: "",
|
|
202
|
+
spoofFileBrand: "spoof",
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
eq("spoof Blob structural", validators.createdIsBlob(spoofBlob), true);
|
|
206
|
+
eq("spoof Blob rejects runtime instance", validators.createdIsBlob(new Blob(["x"])), false);
|
|
207
|
+
eq("spoof Blob missing brand", validators.createdIsBlob({ size: 1, type: "text/plain" }), false);
|
|
208
|
+
eq("spoof File structural", validators.createdIsFile(spoofFile), true);
|
|
209
|
+
eq("spoof File rejects runtime instance", validators.createdIsFile(new File(["x"], "x.txt")), false);
|
|
210
|
+
eq("spoof File missing brand", validators.createdIsFile({ ...spoofFile, spoofFileBrand: undefined }), false);
|
|
211
|
+
|
|
212
|
+
console.log("RAN " + ran + " SPOOF CASES");
|
|
213
|
+
if (failures.length !== 0) {
|
|
214
|
+
throw new Error("MISMATCHES:\n" + failures.join("\n"));
|
|
215
|
+
}
|
|
216
|
+
`
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
package main
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"os"
|
|
5
|
+
"os/exec"
|
|
6
|
+
"path/filepath"
|
|
7
|
+
"testing"
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
// TestEscapedPropertyKeyPathTransform verifies emits with hostile keys parse.
|
|
11
|
+
//
|
|
12
|
+
// Sole-literal property keys are folded into the emit as accessor path text, and
|
|
13
|
+
// no build step reads the file back, so a wrongly escaped key shipped as a
|
|
14
|
+
// broken artifact while ttsc still exited 0. A `"` in a key terminated the path
|
|
15
|
+
// string early and the emitted module stopped being JavaScript; a control
|
|
16
|
+
// character stayed raw and the reported path could not be parsed. Only running
|
|
17
|
+
// node against a real emit can catch that, which is why this asserts on the
|
|
18
|
+
// transform output rather than on the factory in isolation.
|
|
19
|
+
//
|
|
20
|
+
// 1. Transform a fixture whose keys carry quotes, backslashes, and control
|
|
21
|
+
// characters.
|
|
22
|
+
// 2. Assert node --check accepts the emitted module as JavaScript.
|
|
23
|
+
// 3. Execute it and assert each reported path is the accessor JSON.stringify
|
|
24
|
+
// defines for that key, which is what the runtime helper produces for
|
|
25
|
+
// dynamic keys.
|
|
26
|
+
func TestEscapedPropertyKeyPathTransform(t *testing.T) {
|
|
27
|
+
project := escapedPropertyKeyPathProject(t)
|
|
28
|
+
js := escapedPropertyKeyPathTransform(t, project)
|
|
29
|
+
escapedPropertyKeyPathCheckSyntax(t, project, js)
|
|
30
|
+
escapedPropertyKeyPathRunRuntimeCases(t, project, js)
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
func escapedPropertyKeyPathProject(t *testing.T) string {
|
|
34
|
+
t.Helper()
|
|
35
|
+
root := ttscTypiaTestRepoRoot(t)
|
|
36
|
+
base := filepath.Join(root, "packages", "typia", "native", ".tmp-ttsc-typia-tests")
|
|
37
|
+
if err := os.MkdirAll(base, 0o755); err != nil {
|
|
38
|
+
t.Fatalf("mkdir temp base: %v", err)
|
|
39
|
+
}
|
|
40
|
+
dir, err := os.MkdirTemp(base, "escaped-property-key-path-")
|
|
41
|
+
if err != nil {
|
|
42
|
+
t.Fatalf("create temp fixture: %v", err)
|
|
43
|
+
}
|
|
44
|
+
t.Cleanup(func() {
|
|
45
|
+
_ = os.RemoveAll(dir)
|
|
46
|
+
})
|
|
47
|
+
src := filepath.Join(dir, "src")
|
|
48
|
+
if err := os.MkdirAll(src, 0o755); err != nil {
|
|
49
|
+
t.Fatalf("mkdir fixture src: %v", err)
|
|
50
|
+
}
|
|
51
|
+
if err := os.WriteFile(filepath.Join(dir, "tsconfig.json"), []byte(escapedPropertyKeyPathTSConfig), 0o644); err != nil {
|
|
52
|
+
t.Fatalf("write tsconfig: %v", err)
|
|
53
|
+
}
|
|
54
|
+
if err := os.WriteFile(filepath.Join(src, "main.ts"), []byte(escapedPropertyKeyPathSource), 0o644); err != nil {
|
|
55
|
+
t.Fatalf("write source: %v", err)
|
|
56
|
+
}
|
|
57
|
+
return dir
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
func escapedPropertyKeyPathTransform(t *testing.T, project string) string {
|
|
61
|
+
t.Helper()
|
|
62
|
+
out, errText, code := ttscTypiaTestCapture(func() int {
|
|
63
|
+
return runTransform([]string{
|
|
64
|
+
"--cwd", project,
|
|
65
|
+
"--tsconfig", "tsconfig.json",
|
|
66
|
+
"--file", "src/main.ts",
|
|
67
|
+
"--output", "js",
|
|
68
|
+
})
|
|
69
|
+
})
|
|
70
|
+
if code != 0 {
|
|
71
|
+
t.Fatalf("escaped property key transform failed: code=%d stderr=\n%s", code, errText)
|
|
72
|
+
}
|
|
73
|
+
return out
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// escapedPropertyKeyPathCheckSyntax runs node against the emit exactly as it
|
|
77
|
+
// would ship. node --check only parses, so the unresolved typia imports in the
|
|
78
|
+
// untouched output do not matter, and that keeps this a check of the real
|
|
79
|
+
// artifact rather than of a rewritten copy.
|
|
80
|
+
func escapedPropertyKeyPathCheckSyntax(t *testing.T, project string, js string) {
|
|
81
|
+
t.Helper()
|
|
82
|
+
node, err := exec.LookPath("node")
|
|
83
|
+
if err != nil {
|
|
84
|
+
t.Skip("node executable not found")
|
|
85
|
+
}
|
|
86
|
+
emitted := filepath.Join(project, "emitted.cjs")
|
|
87
|
+
if err := os.WriteFile(emitted, []byte(js), 0o644); err != nil {
|
|
88
|
+
t.Fatalf("write emitted module: %v", err)
|
|
89
|
+
}
|
|
90
|
+
if output, err := exec.Command(node, "--check", emitted).CombinedOutput(); err != nil {
|
|
91
|
+
t.Fatalf("emitted module is not valid JavaScript: %v\n%s\n--- emit ---\n%s", err, output, js)
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
func escapedPropertyKeyPathRunRuntimeCases(t *testing.T, project string, js string) {
|
|
96
|
+
t.Helper()
|
|
97
|
+
node, err := exec.LookPath("node")
|
|
98
|
+
if err != nil {
|
|
99
|
+
t.Skip("node executable not found")
|
|
100
|
+
}
|
|
101
|
+
runtimeDir := filepath.Join(project, "runtime")
|
|
102
|
+
if err := os.MkdirAll(runtimeDir, 0o755); err != nil {
|
|
103
|
+
t.Fatalf("mkdir runtime dir: %v", err)
|
|
104
|
+
}
|
|
105
|
+
ttscTypiaTestWriteCommonRuntimeStubs(t, runtimeDir)
|
|
106
|
+
runtimeJS := ttscTypiaTestRewriteCommonJS(t, js)
|
|
107
|
+
if err := os.WriteFile(filepath.Join(runtimeDir, "main.cjs"), []byte(runtimeJS), 0o644); err != nil {
|
|
108
|
+
t.Fatalf("write runtime module: %v", err)
|
|
109
|
+
}
|
|
110
|
+
runner := filepath.Join(runtimeDir, "run.cjs")
|
|
111
|
+
if err := os.WriteFile(runner, []byte(escapedPropertyKeyPathRuntimeRunner), 0o644); err != nil {
|
|
112
|
+
t.Fatalf("write runtime runner: %v", err)
|
|
113
|
+
}
|
|
114
|
+
cmd := exec.Command(node, runner)
|
|
115
|
+
cmd.Dir = project
|
|
116
|
+
if output, err := cmd.CombinedOutput(); err != nil {
|
|
117
|
+
t.Fatalf("escaped property key runtime cases failed: %v\n%s", err, output)
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
const escapedPropertyKeyPathTSConfig = `{
|
|
122
|
+
"compilerOptions": {
|
|
123
|
+
"target": "ES2022",
|
|
124
|
+
"module": "commonjs",
|
|
125
|
+
"moduleResolution": "bundler",
|
|
126
|
+
"ignoreDeprecations": "6.0",
|
|
127
|
+
"types": ["*"],
|
|
128
|
+
"esModuleInterop": true,
|
|
129
|
+
"strict": true,
|
|
130
|
+
"skipLibCheck": true
|
|
131
|
+
},
|
|
132
|
+
"include": ["src"]
|
|
133
|
+
}
|
|
134
|
+
`
|
|
135
|
+
|
|
136
|
+
const escapedPropertyKeyPathSource = `import typia from "typia";
|
|
137
|
+
|
|
138
|
+
interface IHostileKeys {
|
|
139
|
+
"quote\"key": number;
|
|
140
|
+
"back\\slash": number;
|
|
141
|
+
"line\nbreak": number;
|
|
142
|
+
"tab\tkey": number;
|
|
143
|
+
"bell\u0007key": number;
|
|
144
|
+
"nul\u0000key": number;
|
|
145
|
+
"sep\u2028key": number;
|
|
146
|
+
"plain-key": number;
|
|
147
|
+
plainIdentifier: number;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
export const KEYS: string[] = [
|
|
151
|
+
"quote\"key",
|
|
152
|
+
"back\\slash",
|
|
153
|
+
"line\nbreak",
|
|
154
|
+
"tab\tkey",
|
|
155
|
+
"bell\u0007key",
|
|
156
|
+
"nul\u0000key",
|
|
157
|
+
"sep\u2028key",
|
|
158
|
+
"plain-key",
|
|
159
|
+
];
|
|
160
|
+
|
|
161
|
+
const validateHostile = typia.createValidate<IHostileKeys>();
|
|
162
|
+
|
|
163
|
+
export const run = () => {
|
|
164
|
+
const input: Record<string, unknown> = { plainIdentifier: 1 };
|
|
165
|
+
for (const key of KEYS) input[key] = "not a number";
|
|
166
|
+
return validateHostile(input);
|
|
167
|
+
};
|
|
168
|
+
`
|
|
169
|
+
|
|
170
|
+
// The expected path is rebuilt with JSON.stringify rather than written out
|
|
171
|
+
// literally, because that is the contract _accessExpressionAsString implements
|
|
172
|
+
// for dynamic keys and the compile-time fold must agree with it.
|
|
173
|
+
const escapedPropertyKeyPathRuntimeRunner = `const mod = require("./main.cjs");
|
|
174
|
+
const result = mod.run();
|
|
175
|
+
|
|
176
|
+
if (result.success !== false) {
|
|
177
|
+
throw new Error("validate accepted non-number values");
|
|
178
|
+
}
|
|
179
|
+
for (const key of mod.KEYS) {
|
|
180
|
+
const expected = "$input[" + JSON.stringify(key) + "]";
|
|
181
|
+
const found = result.errors.find((error) => error.path === expected);
|
|
182
|
+
if (!found) {
|
|
183
|
+
throw new Error(
|
|
184
|
+
"missing path for key " + JSON.stringify(key) +
|
|
185
|
+
": expected " + JSON.stringify(expected) +
|
|
186
|
+
", got " + JSON.stringify(result.errors.map((error) => error.path)),
|
|
187
|
+
);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
if (result.errors.some((error) => error.path === "$input.plainIdentifier")) {
|
|
191
|
+
throw new Error("identifier fast path reported an error for a valid value");
|
|
192
|
+
}
|
|
193
|
+
`
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
package main
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"fmt"
|
|
5
|
+
"os"
|
|
6
|
+
"os/exec"
|
|
7
|
+
"path/filepath"
|
|
8
|
+
"strings"
|
|
9
|
+
"testing"
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
// TestFiniteOptionNumberLeafTransform pins the finite/numeric option matrix for a
|
|
13
|
+
// bare `number` leaf across typia.is, typia.assert, and typia.validate (#2196).
|
|
14
|
+
//
|
|
15
|
+
// The `finite` option is documented as an independent flag that rejects both NaN
|
|
16
|
+
// and Infinity, yet it was inert unless `numeric` was also set: typia.is dropped
|
|
17
|
+
// `finite` when it built its number gate, and assert/validate gate their verdict
|
|
18
|
+
// on that same is-checker, so all three accepted NaN and Infinity under
|
|
19
|
+
// `finite:true` alone. The other three rows are regression guards that must not
|
|
20
|
+
// move:
|
|
21
|
+
//
|
|
22
|
+
// - finite alone -> reject NaN, Infinity, -Infinity (the #2196 red case)
|
|
23
|
+
// - numeric alone -> reject NaN, ACCEPT Infinity/-Infinity (numeric != finite)
|
|
24
|
+
// - finite+numeric -> reject NaN, Infinity, -Infinity (already worked)
|
|
25
|
+
// - neither option -> ACCEPT everything (the documented default)
|
|
26
|
+
//
|
|
27
|
+
// 1. Transform the same `number`-leaf fixture once per option row, injecting the
|
|
28
|
+
// row's options through the resolved --plugins-json payload (the only option
|
|
29
|
+
// source runTransform reads).
|
|
30
|
+
// 2. Execute the emitted validators in Node against a finite value plus NaN,
|
|
31
|
+
// Infinity, and -Infinity, requiring is/assert/validate to agree with the row.
|
|
32
|
+
// 3. Require the runner to report the exact executed case count so a runner that
|
|
33
|
+
// silently exercised nothing cannot pass as green.
|
|
34
|
+
func TestFiniteOptionNumberLeafTransform(t *testing.T) {
|
|
35
|
+
for _, tc := range finiteOptionNumberLeafCases() {
|
|
36
|
+
t.Run(tc.name, func(t *testing.T) {
|
|
37
|
+
project := finiteOptionNumberLeafProject(t)
|
|
38
|
+
js := finiteOptionNumberLeafTransform(t, project, tc.payload())
|
|
39
|
+
finiteOptionNumberLeafRunRuntimeCases(t, project, js, tc)
|
|
40
|
+
})
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
type finiteOptionNumberLeafCase struct {
|
|
45
|
+
name string
|
|
46
|
+
// config is the JSON fragment appended to typia's resolved plugin entry, e.g.
|
|
47
|
+
// `,"finite":true`. Empty means typia's documented defaults.
|
|
48
|
+
config string
|
|
49
|
+
// acceptNaN and acceptInfinity are the expected verdicts for the non-finite
|
|
50
|
+
// inputs; a finite value is always accepted.
|
|
51
|
+
acceptNaN bool
|
|
52
|
+
acceptInfinity bool
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
func (tc finiteOptionNumberLeafCase) payload() string {
|
|
56
|
+
return `[{"config":{"transform":"typia/lib/transform"` + tc.config + `},"name":"typia","stage":"transform"}]`
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
func finiteOptionNumberLeafCases() []finiteOptionNumberLeafCase {
|
|
60
|
+
return []finiteOptionNumberLeafCase{
|
|
61
|
+
{
|
|
62
|
+
name: "finite alone rejects NaN and Infinity",
|
|
63
|
+
config: `,"finite":true`,
|
|
64
|
+
acceptNaN: false,
|
|
65
|
+
acceptInfinity: false,
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
name: "numeric alone rejects NaN but accepts Infinity",
|
|
69
|
+
config: `,"numeric":true`,
|
|
70
|
+
acceptNaN: false,
|
|
71
|
+
acceptInfinity: true,
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
name: "finite and numeric together reject NaN and Infinity",
|
|
75
|
+
config: `,"finite":true,"numeric":true`,
|
|
76
|
+
acceptNaN: false,
|
|
77
|
+
acceptInfinity: false,
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
name: "neither option accepts NaN and Infinity",
|
|
81
|
+
config: ``,
|
|
82
|
+
acceptNaN: true,
|
|
83
|
+
acceptInfinity: true,
|
|
84
|
+
},
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
func finiteOptionNumberLeafProject(t *testing.T) string {
|
|
89
|
+
t.Helper()
|
|
90
|
+
root := ttscTypiaTestRepoRoot(t)
|
|
91
|
+
base := filepath.Join(root, "packages", "typia", "native", ".tmp-ttsc-typia-tests")
|
|
92
|
+
if err := os.MkdirAll(base, 0o755); err != nil {
|
|
93
|
+
t.Fatalf("mkdir temp base: %v", err)
|
|
94
|
+
}
|
|
95
|
+
dir, err := os.MkdirTemp(base, "finite-option-number-leaf-")
|
|
96
|
+
if err != nil {
|
|
97
|
+
t.Fatalf("create temp fixture: %v", err)
|
|
98
|
+
}
|
|
99
|
+
t.Cleanup(func() {
|
|
100
|
+
_ = os.RemoveAll(dir)
|
|
101
|
+
})
|
|
102
|
+
src := filepath.Join(dir, "src")
|
|
103
|
+
if err := os.MkdirAll(src, 0o755); err != nil {
|
|
104
|
+
t.Fatalf("mkdir fixture src: %v", err)
|
|
105
|
+
}
|
|
106
|
+
if err := os.WriteFile(filepath.Join(dir, "tsconfig.json"), []byte(finiteOptionNumberLeafTSConfig), 0o644); err != nil {
|
|
107
|
+
t.Fatalf("write tsconfig: %v", err)
|
|
108
|
+
}
|
|
109
|
+
if err := os.WriteFile(filepath.Join(src, "main.ts"), []byte(finiteOptionNumberLeafSource), 0o644); err != nil {
|
|
110
|
+
t.Fatalf("write source: %v", err)
|
|
111
|
+
}
|
|
112
|
+
return dir
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
func finiteOptionNumberLeafTransform(t *testing.T, project string, payload string) string {
|
|
116
|
+
t.Helper()
|
|
117
|
+
out, errText, code := ttscTypiaTestCapture(func() int {
|
|
118
|
+
return runTransform([]string{
|
|
119
|
+
"--cwd", project,
|
|
120
|
+
"--tsconfig", "tsconfig.json",
|
|
121
|
+
"--file", "src/main.ts",
|
|
122
|
+
"--output", "js",
|
|
123
|
+
"--plugins-json", payload,
|
|
124
|
+
})
|
|
125
|
+
})
|
|
126
|
+
if code != 0 {
|
|
127
|
+
t.Fatalf("finite option transform failed: code=%d stderr=\n%s", code, errText)
|
|
128
|
+
}
|
|
129
|
+
return out
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
func finiteOptionNumberLeafRunRuntimeCases(t *testing.T, project string, js string, tc finiteOptionNumberLeafCase) {
|
|
133
|
+
t.Helper()
|
|
134
|
+
node, err := exec.LookPath("node")
|
|
135
|
+
if err != nil {
|
|
136
|
+
t.Skip("node executable not found")
|
|
137
|
+
}
|
|
138
|
+
runtimeDir := filepath.Join(project, "runtime")
|
|
139
|
+
if err := os.MkdirAll(runtimeDir, 0o755); err != nil {
|
|
140
|
+
t.Fatalf("mkdir runtime dir: %v", err)
|
|
141
|
+
}
|
|
142
|
+
ttscTypiaTestWriteCommonRuntimeStubs(t, runtimeDir)
|
|
143
|
+
runtimeJS := ttscTypiaTestRewriteCommonJS(t, js)
|
|
144
|
+
if err := os.WriteFile(filepath.Join(runtimeDir, "main.cjs"), []byte(runtimeJS), 0o644); err != nil {
|
|
145
|
+
t.Fatalf("write runtime module: %v", err)
|
|
146
|
+
}
|
|
147
|
+
runner := filepath.Join(runtimeDir, "run.cjs")
|
|
148
|
+
if err := os.WriteFile(runner, []byte(finiteOptionNumberLeafRuntimeRunner(tc)), 0o644); err != nil {
|
|
149
|
+
t.Fatalf("write runtime runner: %v", err)
|
|
150
|
+
}
|
|
151
|
+
cmd := exec.Command(node, runner)
|
|
152
|
+
cmd.Dir = project
|
|
153
|
+
output, err := cmd.CombinedOutput()
|
|
154
|
+
if err != nil {
|
|
155
|
+
t.Fatalf("finite option runtime cases failed: %v\n%s", err, output)
|
|
156
|
+
}
|
|
157
|
+
// Every input drives is, validate, and assert, so the runner must report one
|
|
158
|
+
// executed assertion per (input, function) pair. Pinning the count keeps a
|
|
159
|
+
// runner that short-circuited or skipped cases from passing as a false green.
|
|
160
|
+
const expected = "RAN 12 CASES"
|
|
161
|
+
if !strings.Contains(string(output), expected) {
|
|
162
|
+
t.Fatalf("finite option runner did not report %q; got:\n%s", expected, output)
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
func finiteOptionNumberLeafRuntimeRunner(tc finiteOptionNumberLeafCase) string {
|
|
167
|
+
return fmt.Sprintf(`const mod = require("./main.cjs");
|
|
168
|
+
|
|
169
|
+
const cases = [
|
|
170
|
+
{ name: "finite 1", value: 1, accept: true },
|
|
171
|
+
{ name: "NaN", value: Number.NaN, accept: %[1]t },
|
|
172
|
+
{ name: "Infinity", value: Number.POSITIVE_INFINITY, accept: %[2]t },
|
|
173
|
+
{ name: "-Infinity", value: Number.NEGATIVE_INFINITY, accept: %[2]t },
|
|
174
|
+
];
|
|
175
|
+
|
|
176
|
+
let ran = 0;
|
|
177
|
+
for (const c of cases) {
|
|
178
|
+
const result = mod.run(c.value);
|
|
179
|
+
|
|
180
|
+
ran += 1;
|
|
181
|
+
if (result.is !== c.accept) {
|
|
182
|
+
throw new Error(c.name + ": typia.is expected " + c.accept + " but got " + result.is);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
ran += 1;
|
|
186
|
+
if (result.validate !== c.accept) {
|
|
187
|
+
throw new Error(c.name + ": typia.validate.success expected " + c.accept + " but got " + result.validate);
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
ran += 1;
|
|
191
|
+
const assertAccepted = result.assertThrew === false;
|
|
192
|
+
if (assertAccepted !== c.accept) {
|
|
193
|
+
throw new Error(c.name + ": typia.assert accepted=" + assertAccepted + " but expected " + c.accept);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
console.log("RAN " + ran + " CASES");
|
|
198
|
+
`, tc.acceptNaN, tc.acceptInfinity)
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
const finiteOptionNumberLeafTSConfig = `{
|
|
202
|
+
"compilerOptions": {
|
|
203
|
+
"target": "ES2022",
|
|
204
|
+
"module": "commonjs",
|
|
205
|
+
"moduleResolution": "bundler",
|
|
206
|
+
"ignoreDeprecations": "6.0",
|
|
207
|
+
"types": ["*"],
|
|
208
|
+
"esModuleInterop": true,
|
|
209
|
+
"strict": true,
|
|
210
|
+
"skipLibCheck": true
|
|
211
|
+
},
|
|
212
|
+
"include": ["src"]
|
|
213
|
+
}
|
|
214
|
+
`
|
|
215
|
+
|
|
216
|
+
const finiteOptionNumberLeafSource = `import typia from "typia";
|
|
217
|
+
|
|
218
|
+
interface FiniteBox {
|
|
219
|
+
value: number;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
const check = typia.createIs<FiniteBox>();
|
|
223
|
+
const validate = typia.createValidate<FiniteBox>();
|
|
224
|
+
const assert = typia.createAssert<FiniteBox>();
|
|
225
|
+
|
|
226
|
+
const captureThrow = (task: () => void): boolean => {
|
|
227
|
+
try {
|
|
228
|
+
task();
|
|
229
|
+
return false;
|
|
230
|
+
} catch {
|
|
231
|
+
return true;
|
|
232
|
+
}
|
|
233
|
+
};
|
|
234
|
+
|
|
235
|
+
export const run = (value: number) => ({
|
|
236
|
+
is: check({ value }),
|
|
237
|
+
validate: validate({ value }).success,
|
|
238
|
+
assertThrew: captureThrow(() => assert({ value })),
|
|
239
|
+
});
|
|
240
|
+
`
|