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,526 @@
|
|
|
1
|
+
package main
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"fmt"
|
|
5
|
+
"os"
|
|
6
|
+
"os/exec"
|
|
7
|
+
"path/filepath"
|
|
8
|
+
"strings"
|
|
9
|
+
"testing"
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
// TestNodeBufferNativeExportsIsTransform preserves runtime-native identity for
|
|
13
|
+
// the authoritative Blob and File exports from Node's buffer modules (#1568).
|
|
14
|
+
//
|
|
15
|
+
// Node's module-exported types and its equivalent bare globals have distinct
|
|
16
|
+
// checker symbols even though they describe the same runtime constructors. A
|
|
17
|
+
// name-only or global-pointer-only classifier can therefore confuse either the
|
|
18
|
+
// authoritative exports or unrelated package declarations with structural
|
|
19
|
+
// lookalikes.
|
|
20
|
+
//
|
|
21
|
+
// 1. Transform validators for Blob and File imported from both Node module
|
|
22
|
+
// spellings, plus their bare-global controls, with DOM libraries excluded.
|
|
23
|
+
// 2. Require every validator to emit a runtime-native identity check rather
|
|
24
|
+
// than structural Blob/File property checks.
|
|
25
|
+
// 3. Execute real instances and full plain lookalikes through all six emitted
|
|
26
|
+
// validators, requiring exactly twelve runtime outcomes.
|
|
27
|
+
// 4. Transform ordinary package and user ambient Blob/File declarations and
|
|
28
|
+
// require their structural members and eight negative-control outcomes.
|
|
29
|
+
// 5. Exclude Node types and prove a user-authored counterfeit of the exact
|
|
30
|
+
// node:buffer/buffer module names remains structural in eight more cases,
|
|
31
|
+
// even when its path mimics node_modules/@types/node without package data.
|
|
32
|
+
func TestNodeBufferNativeExportsIsTransform(t *testing.T) {
|
|
33
|
+
project := nodeBufferNativeExportsProject(t)
|
|
34
|
+
transform := func(file string) string {
|
|
35
|
+
t.Helper()
|
|
36
|
+
js, errText, code := ttscTypiaTestCapture(func() int {
|
|
37
|
+
return runTransform([]string{
|
|
38
|
+
"--cwd", project,
|
|
39
|
+
"--tsconfig", "tsconfig.json",
|
|
40
|
+
"--file", file,
|
|
41
|
+
"--output", "js",
|
|
42
|
+
})
|
|
43
|
+
})
|
|
44
|
+
if code != 0 {
|
|
45
|
+
t.Fatalf("Node buffer native export transform %s failed: code=%d stderr=\n%s", file, code, errText)
|
|
46
|
+
}
|
|
47
|
+
return js
|
|
48
|
+
}
|
|
49
|
+
js := transform("src/input.ts")
|
|
50
|
+
controlsJS := transform("src/controls.ts")
|
|
51
|
+
spoofProject := nodeBufferNativeExportsSpoofProject(t)
|
|
52
|
+
spoofJS, spoofErrText, spoofCode := ttscTypiaTestCapture(func() int {
|
|
53
|
+
return runTransform([]string{
|
|
54
|
+
"--cwd", spoofProject,
|
|
55
|
+
"--tsconfig", "tsconfig.json",
|
|
56
|
+
"--file", "src/input.ts",
|
|
57
|
+
"--output", "js",
|
|
58
|
+
})
|
|
59
|
+
})
|
|
60
|
+
if spoofCode != 0 {
|
|
61
|
+
t.Fatalf("counterfeit Node buffer module transform failed: code=%d stderr=\n%s", spoofCode, spoofErrText)
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
failures := []string{}
|
|
65
|
+
for _, expected := range []struct {
|
|
66
|
+
check string
|
|
67
|
+
count int
|
|
68
|
+
}{
|
|
69
|
+
{check: "instanceof Blob", count: 4},
|
|
70
|
+
{check: "instanceof File", count: 4},
|
|
71
|
+
} {
|
|
72
|
+
if actual := strings.Count(js, expected.check); actual != expected.count {
|
|
73
|
+
failures = append(failures, fmt.Sprintf(
|
|
74
|
+
"emit contains %q %d times; expected %d runtime-native validators",
|
|
75
|
+
expected.check,
|
|
76
|
+
actual,
|
|
77
|
+
expected.count,
|
|
78
|
+
))
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
for _, structural := range []string{"webkitRelativePath", ".lastModified", ".size", ".type"} {
|
|
82
|
+
if strings.Contains(js, structural) {
|
|
83
|
+
failures = append(failures, fmt.Sprintf("emit retained structural Blob/File member %q", structural))
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
for _, retained := range []string{"nodeBlobOk", "nodeFileOk"} {
|
|
87
|
+
if !strings.Contains(js, retained) {
|
|
88
|
+
failures = append(failures, fmt.Sprintf("native intersection union dropped control arm %q", retained))
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
for _, pruned := range []string{"blobLabel", "fileLabel"} {
|
|
92
|
+
if strings.Contains(js, pruned) {
|
|
93
|
+
failures = append(failures, fmt.Sprintf("native intersection union retained pruned member %q", pruned))
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
for _, structural := range []string{"packageBrand", "ambientBrand"} {
|
|
97
|
+
if !strings.Contains(controlsJS, structural) {
|
|
98
|
+
failures = append(failures, fmt.Sprintf("structural package/ambient control dropped member %q", structural))
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
for _, native := range []string{"instanceof Blob", "instanceof File"} {
|
|
102
|
+
if strings.Contains(controlsJS, native) {
|
|
103
|
+
failures = append(failures, fmt.Sprintf("structural package/ambient control was promoted to %q", native))
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
if !strings.Contains(spoofJS, "spoofBrand") {
|
|
107
|
+
failures = append(failures, "counterfeit Node buffer modules dropped their structural brand")
|
|
108
|
+
}
|
|
109
|
+
for _, native := range []string{"instanceof Blob", "instanceof File"} {
|
|
110
|
+
if strings.Contains(spoofJS, native) {
|
|
111
|
+
failures = append(failures, fmt.Sprintf("counterfeit Node buffer module was promoted to %q", native))
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
output, runtimeErr := nodeBufferNativeExportsRun(t, project, js, controlsJS)
|
|
116
|
+
if runtimeErr != nil {
|
|
117
|
+
failures = append(failures, fmt.Sprintf("runtime matrix failed: %v\n%s", runtimeErr, output))
|
|
118
|
+
}
|
|
119
|
+
for _, expectedCases := range []string{"RAN 12 CASES", "RAN 10 INTERSECTION CASES", "RAN 8 CONTROL CASES"} {
|
|
120
|
+
if !strings.Contains(output, expectedCases) {
|
|
121
|
+
failures = append(failures, fmt.Sprintf("runtime runner did not report %q; got:\n%s", expectedCases, output))
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
spoofOutput, spoofRuntimeErr := nodeBufferNativeExportsSpoofRun(t, spoofProject, spoofJS)
|
|
125
|
+
if spoofRuntimeErr != nil {
|
|
126
|
+
failures = append(failures, fmt.Sprintf("counterfeit runtime matrix failed: %v\n%s", spoofRuntimeErr, spoofOutput))
|
|
127
|
+
}
|
|
128
|
+
const expectedSpoofCases = "RAN 8 COUNTERFEIT CASES"
|
|
129
|
+
if !strings.Contains(spoofOutput, expectedSpoofCases) {
|
|
130
|
+
failures = append(failures, fmt.Sprintf("counterfeit runner did not report %q; got:\n%s", expectedSpoofCases, spoofOutput))
|
|
131
|
+
}
|
|
132
|
+
if len(failures) != 0 {
|
|
133
|
+
t.Fatalf(
|
|
134
|
+
"Node buffer native export mismatches:\n%s\n\nnative emit:\n%s\n\ncontrol emit:\n%s\n\ncounterfeit emit:\n%s",
|
|
135
|
+
strings.Join(failures, "\n"),
|
|
136
|
+
js,
|
|
137
|
+
controlsJS,
|
|
138
|
+
spoofJS,
|
|
139
|
+
)
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
func nodeBufferNativeExportsProject(t *testing.T) string {
|
|
144
|
+
t.Helper()
|
|
145
|
+
root := ttscTypiaTestRepoRoot(t)
|
|
146
|
+
base := filepath.Join(root, "packages", "typia", "native", ".tmp-ttsc-typia-tests")
|
|
147
|
+
if err := os.MkdirAll(base, 0o755); err != nil {
|
|
148
|
+
t.Fatalf("mkdir temp base: %v", err)
|
|
149
|
+
}
|
|
150
|
+
dir, err := os.MkdirTemp(base, "node-buffer-native-exports-")
|
|
151
|
+
if err != nil {
|
|
152
|
+
t.Fatalf("create temp fixture: %v", err)
|
|
153
|
+
}
|
|
154
|
+
t.Cleanup(func() {
|
|
155
|
+
_ = os.RemoveAll(dir)
|
|
156
|
+
})
|
|
157
|
+
|
|
158
|
+
src := filepath.Join(dir, "src")
|
|
159
|
+
dependency := filepath.Join(dir, "node_modules", "native-buffer-lookalike")
|
|
160
|
+
for _, path := range []string{src, dependency} {
|
|
161
|
+
if err := os.MkdirAll(path, 0o755); err != nil {
|
|
162
|
+
t.Fatalf("mkdir fixture path %s: %v", path, err)
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
for path, content := range map[string]string{
|
|
166
|
+
filepath.Join(dir, "tsconfig.json"): nodeBufferNativeExportsTSConfig,
|
|
167
|
+
filepath.Join(src, "input.ts"): nodeBufferNativeExportsSource,
|
|
168
|
+
filepath.Join(src, "controls.ts"): nodeBufferNativeExportsControlSource,
|
|
169
|
+
filepath.Join(src, "node-buffer-augmentation.d.ts"): nodeBufferNativeExportsAugmentation,
|
|
170
|
+
filepath.Join(src, "user-ambient.d.ts"): nodeBufferNativeExportsAmbientDeclarations,
|
|
171
|
+
filepath.Join(dependency, "package.json"): nodeBufferNativeExportsPackageJSON,
|
|
172
|
+
filepath.Join(dependency, "index.d.ts"): nodeBufferNativeExportsPackageDeclarations,
|
|
173
|
+
} {
|
|
174
|
+
if err := os.WriteFile(path, []byte(content), 0o644); err != nil {
|
|
175
|
+
t.Fatalf("write fixture file %s: %v", path, err)
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
return dir
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
func nodeBufferNativeExportsSpoofProject(t *testing.T) string {
|
|
182
|
+
t.Helper()
|
|
183
|
+
root := ttscTypiaTestRepoRoot(t)
|
|
184
|
+
base := filepath.Join(root, "packages", "typia", "native", ".tmp-ttsc-typia-tests")
|
|
185
|
+
if err := os.MkdirAll(base, 0o755); err != nil {
|
|
186
|
+
t.Fatalf("mkdir temp base: %v", err)
|
|
187
|
+
}
|
|
188
|
+
dir, err := os.MkdirTemp(base, "node-buffer-native-exports-spoof-")
|
|
189
|
+
if err != nil {
|
|
190
|
+
t.Fatalf("create counterfeit fixture: %v", err)
|
|
191
|
+
}
|
|
192
|
+
t.Cleanup(func() {
|
|
193
|
+
_ = os.RemoveAll(dir)
|
|
194
|
+
})
|
|
195
|
+
|
|
196
|
+
src := filepath.Join(dir, "src")
|
|
197
|
+
fakeNodeRoot := filepath.Join(src, "node_modules", "@types", "node")
|
|
198
|
+
for _, path := range []string{src, fakeNodeRoot} {
|
|
199
|
+
if err := os.MkdirAll(path, 0o755); err != nil {
|
|
200
|
+
t.Fatalf("mkdir counterfeit source %s: %v", path, err)
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
for path, content := range map[string]string{
|
|
204
|
+
filepath.Join(dir, "tsconfig.json"): nodeBufferNativeExportsSpoofTSConfig,
|
|
205
|
+
filepath.Join(fakeNodeRoot, "buffer.d.ts"): nodeBufferNativeExportsSpoofDeclarations,
|
|
206
|
+
filepath.Join(src, "input.ts"): nodeBufferNativeExportsSpoofSource,
|
|
207
|
+
} {
|
|
208
|
+
if err := os.WriteFile(path, []byte(content), 0o644); err != nil {
|
|
209
|
+
t.Fatalf("write counterfeit fixture file %s: %v", path, err)
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return dir
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
func nodeBufferNativeExportsRun(t *testing.T, project string, js string, controlsJS string) (string, error) {
|
|
216
|
+
t.Helper()
|
|
217
|
+
node, err := exec.LookPath("node")
|
|
218
|
+
if err != nil {
|
|
219
|
+
t.Skip("node executable not found")
|
|
220
|
+
return "", nil
|
|
221
|
+
}
|
|
222
|
+
runtimeDir := filepath.Join(project, "runtime")
|
|
223
|
+
if err := os.MkdirAll(runtimeDir, 0o755); err != nil {
|
|
224
|
+
t.Fatalf("mkdir runtime dir: %v", err)
|
|
225
|
+
}
|
|
226
|
+
ttscTypiaTestWriteCommonRuntimeStubs(t, runtimeDir)
|
|
227
|
+
for name, content := range map[string]string{
|
|
228
|
+
"input.cjs": ttscTypiaTestRewriteCommonJS(t, js),
|
|
229
|
+
"controls.cjs": ttscTypiaTestRewriteCommonJS(t, controlsJS),
|
|
230
|
+
"run.cjs": nodeBufferNativeExportsRuntimeRunner,
|
|
231
|
+
} {
|
|
232
|
+
if err := os.WriteFile(filepath.Join(runtimeDir, name), []byte(content), 0o644); err != nil {
|
|
233
|
+
t.Fatalf("write runtime file %s: %v", name, err)
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
cmd := exec.Command(node, filepath.Join(runtimeDir, "run.cjs"))
|
|
237
|
+
cmd.Dir = runtimeDir
|
|
238
|
+
output, err := cmd.CombinedOutput()
|
|
239
|
+
return string(output), err
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
func nodeBufferNativeExportsSpoofRun(t *testing.T, project string, js string) (string, error) {
|
|
243
|
+
t.Helper()
|
|
244
|
+
node, err := exec.LookPath("node")
|
|
245
|
+
if err != nil {
|
|
246
|
+
t.Skip("node executable not found")
|
|
247
|
+
return "", nil
|
|
248
|
+
}
|
|
249
|
+
runtimeDir := filepath.Join(project, "runtime")
|
|
250
|
+
if err := os.MkdirAll(runtimeDir, 0o755); err != nil {
|
|
251
|
+
t.Fatalf("mkdir counterfeit runtime dir: %v", err)
|
|
252
|
+
}
|
|
253
|
+
ttscTypiaTestWriteCommonRuntimeStubs(t, runtimeDir)
|
|
254
|
+
for name, content := range map[string]string{
|
|
255
|
+
"input.cjs": ttscTypiaTestRewriteCommonJS(t, js),
|
|
256
|
+
"run.cjs": nodeBufferNativeExportsSpoofRuntimeRunner,
|
|
257
|
+
} {
|
|
258
|
+
if err := os.WriteFile(filepath.Join(runtimeDir, name), []byte(content), 0o644); err != nil {
|
|
259
|
+
t.Fatalf("write counterfeit runtime file %s: %v", name, err)
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
cmd := exec.Command(node, filepath.Join(runtimeDir, "run.cjs"))
|
|
263
|
+
cmd.Dir = runtimeDir
|
|
264
|
+
output, err := cmd.CombinedOutput()
|
|
265
|
+
return string(output), err
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
const nodeBufferNativeExportsTSConfig = `{
|
|
269
|
+
"compilerOptions": {
|
|
270
|
+
"target": "ES2022",
|
|
271
|
+
"module": "commonjs",
|
|
272
|
+
"moduleResolution": "bundler",
|
|
273
|
+
"ignoreDeprecations": "6.0",
|
|
274
|
+
"lib": ["ES2022"],
|
|
275
|
+
"types": ["node"],
|
|
276
|
+
"esModuleInterop": true,
|
|
277
|
+
"strict": true,
|
|
278
|
+
"skipLibCheck": true
|
|
279
|
+
},
|
|
280
|
+
"include": ["src"]
|
|
281
|
+
}
|
|
282
|
+
`
|
|
283
|
+
|
|
284
|
+
const nodeBufferNativeExportsSource = `import typia from "typia";
|
|
285
|
+
import type { Blob as NodeBlob, File as NodeFile } from "node:buffer";
|
|
286
|
+
import type { Blob as LegacyBlob, File as LegacyFile } from "buffer";
|
|
287
|
+
|
|
288
|
+
declare const nodeBlobBrand: unique symbol;
|
|
289
|
+
declare const nodeFileBrand: unique symbol;
|
|
290
|
+
type BrandedNodeBlob = NodeBlob & { readonly [nodeBlobBrand]?: never };
|
|
291
|
+
type BrandedNodeFile = NodeFile & { readonly [nodeFileBrand]?: never };
|
|
292
|
+
type NodeBlobIntersectionUnion =
|
|
293
|
+
| (NodeBlob & { blobLabel: string })
|
|
294
|
+
| { nodeBlobOk: boolean };
|
|
295
|
+
type NodeFileIntersectionUnion =
|
|
296
|
+
| (NodeFile & { fileLabel: string })
|
|
297
|
+
| { nodeFileOk: boolean };
|
|
298
|
+
|
|
299
|
+
export const isNodeBlob = typia.createIs<NodeBlob>();
|
|
300
|
+
export const isNodeFile = typia.createIs<NodeFile>();
|
|
301
|
+
export const isLegacyBlob = typia.createIs<LegacyBlob>();
|
|
302
|
+
export const isLegacyFile = typia.createIs<LegacyFile>();
|
|
303
|
+
export const isGlobalBlob = typia.createIs<Blob>();
|
|
304
|
+
export const isGlobalFile = typia.createIs<File>();
|
|
305
|
+
export const isBrandedNodeBlob = typia.createIs<BrandedNodeBlob>();
|
|
306
|
+
export const isBrandedNodeFile = typia.createIs<BrandedNodeFile>();
|
|
307
|
+
export const isNodeBlobIntersectionUnion =
|
|
308
|
+
typia.createIs<NodeBlobIntersectionUnion>();
|
|
309
|
+
export const isNodeFileIntersectionUnion =
|
|
310
|
+
typia.createIs<NodeFileIntersectionUnion>();
|
|
311
|
+
`
|
|
312
|
+
|
|
313
|
+
const nodeBufferNativeExportsPackageJSON = `{
|
|
314
|
+
"name": "native-buffer-lookalike",
|
|
315
|
+
"version": "1.0.0",
|
|
316
|
+
"types": "index.d.ts"
|
|
317
|
+
}
|
|
318
|
+
`
|
|
319
|
+
|
|
320
|
+
const nodeBufferNativeExportsSpoofTSConfig = `{
|
|
321
|
+
"compilerOptions": {
|
|
322
|
+
"target": "ES2022",
|
|
323
|
+
"module": "commonjs",
|
|
324
|
+
"moduleResolution": "bundler",
|
|
325
|
+
"ignoreDeprecations": "6.0",
|
|
326
|
+
"lib": ["ES2022"],
|
|
327
|
+
"types": [],
|
|
328
|
+
"esModuleInterop": true,
|
|
329
|
+
"strict": true,
|
|
330
|
+
"skipLibCheck": true
|
|
331
|
+
},
|
|
332
|
+
"files": [
|
|
333
|
+
"src/input.ts",
|
|
334
|
+
"src/node_modules/@types/node/buffer.d.ts"
|
|
335
|
+
]
|
|
336
|
+
}
|
|
337
|
+
`
|
|
338
|
+
|
|
339
|
+
const nodeBufferNativeExportsPackageDeclarations = `export interface Blob {
|
|
340
|
+
packageBrand: string;
|
|
341
|
+
size: number;
|
|
342
|
+
type: string;
|
|
343
|
+
}
|
|
344
|
+
export interface File extends Blob {
|
|
345
|
+
lastModified: number;
|
|
346
|
+
name: string;
|
|
347
|
+
webkitRelativePath: string;
|
|
348
|
+
}
|
|
349
|
+
`
|
|
350
|
+
|
|
351
|
+
const nodeBufferNativeExportsAmbientDeclarations = `declare module "user-buffer-lookalike" {
|
|
352
|
+
export interface Blob {
|
|
353
|
+
ambientBrand: string;
|
|
354
|
+
size: number;
|
|
355
|
+
type: string;
|
|
356
|
+
}
|
|
357
|
+
export interface File extends Blob {
|
|
358
|
+
lastModified: number;
|
|
359
|
+
name: string;
|
|
360
|
+
webkitRelativePath: string;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
`
|
|
364
|
+
|
|
365
|
+
const nodeBufferNativeExportsAugmentation = `import "node:buffer";
|
|
366
|
+
|
|
367
|
+
declare module "node:buffer" {
|
|
368
|
+
interface Blob {
|
|
369
|
+
readonly __typiaNodeBufferAugmentation?: never;
|
|
370
|
+
}
|
|
371
|
+
interface File {
|
|
372
|
+
readonly __typiaNodeBufferAugmentation?: never;
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
`
|
|
376
|
+
|
|
377
|
+
const nodeBufferNativeExportsControlSource = `import typia from "typia";
|
|
378
|
+
import type { Blob as PackageBlob, File as PackageFile } from "native-buffer-lookalike";
|
|
379
|
+
import type { Blob as AmbientBlob, File as AmbientFile } from "user-buffer-lookalike";
|
|
380
|
+
|
|
381
|
+
export const isPackageBlob = typia.createIs<PackageBlob>();
|
|
382
|
+
export const isPackageFile = typia.createIs<PackageFile>();
|
|
383
|
+
export const isAmbientBlob = typia.createIs<AmbientBlob>();
|
|
384
|
+
export const isAmbientFile = typia.createIs<AmbientFile>();
|
|
385
|
+
`
|
|
386
|
+
|
|
387
|
+
const nodeBufferNativeExportsSpoofDeclarations = `declare module "node:buffer" {
|
|
388
|
+
export interface Blob {
|
|
389
|
+
spoofBrand: string;
|
|
390
|
+
size: number;
|
|
391
|
+
type: string;
|
|
392
|
+
}
|
|
393
|
+
export interface File extends Blob {
|
|
394
|
+
lastModified: number;
|
|
395
|
+
name: string;
|
|
396
|
+
webkitRelativePath: string;
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
declare module "buffer" {
|
|
400
|
+
export * from "node:buffer";
|
|
401
|
+
}
|
|
402
|
+
`
|
|
403
|
+
|
|
404
|
+
const nodeBufferNativeExportsSpoofSource = `import typia from "typia";
|
|
405
|
+
import type { Blob as NodeBlob, File as NodeFile } from "node:buffer";
|
|
406
|
+
import type { Blob as LegacyBlob, File as LegacyFile } from "buffer";
|
|
407
|
+
|
|
408
|
+
export const isNodeBlob = typia.createIs<NodeBlob>();
|
|
409
|
+
export const isNodeFile = typia.createIs<NodeFile>();
|
|
410
|
+
export const isLegacyBlob = typia.createIs<LegacyBlob>();
|
|
411
|
+
export const isLegacyFile = typia.createIs<LegacyFile>();
|
|
412
|
+
`
|
|
413
|
+
|
|
414
|
+
const nodeBufferNativeExportsRuntimeRunner = `const validators = require("./input.cjs");
|
|
415
|
+
const controls = require("./controls.cjs");
|
|
416
|
+
const node = require("node:buffer");
|
|
417
|
+
const legacy = require("buffer");
|
|
418
|
+
|
|
419
|
+
const blobPlain = { size: 1, type: "text/plain" };
|
|
420
|
+
const filePlain = {
|
|
421
|
+
lastModified: 0,
|
|
422
|
+
name: "x.txt",
|
|
423
|
+
size: 1,
|
|
424
|
+
type: "text/plain",
|
|
425
|
+
webkitRelativePath: "",
|
|
426
|
+
};
|
|
427
|
+
|
|
428
|
+
const cases = [
|
|
429
|
+
["node:buffer Blob real", validators.isNodeBlob(new node.Blob(["x"], { type: "text/plain" })), true],
|
|
430
|
+
["node:buffer Blob plain", validators.isNodeBlob(blobPlain), false],
|
|
431
|
+
["node:buffer File real", validators.isNodeFile(new node.File(["x"], "x.txt", { lastModified: 0, type: "text/plain" })), true],
|
|
432
|
+
["node:buffer File plain", validators.isNodeFile(filePlain), false],
|
|
433
|
+
["buffer Blob real", validators.isLegacyBlob(new legacy.Blob(["x"], { type: "text/plain" })), true],
|
|
434
|
+
["buffer Blob plain", validators.isLegacyBlob(blobPlain), false],
|
|
435
|
+
["buffer File real", validators.isLegacyFile(new legacy.File(["x"], "x.txt", { lastModified: 0, type: "text/plain" })), true],
|
|
436
|
+
["buffer File plain", validators.isLegacyFile(filePlain), false],
|
|
437
|
+
["global Blob real", validators.isGlobalBlob(new Blob(["x"], { type: "text/plain" })), true],
|
|
438
|
+
["global Blob plain", validators.isGlobalBlob(blobPlain), false],
|
|
439
|
+
["global File real", validators.isGlobalFile(new File(["x"], "x.txt", { lastModified: 0, type: "text/plain" })), true],
|
|
440
|
+
["global File plain", validators.isGlobalFile(filePlain), false],
|
|
441
|
+
];
|
|
442
|
+
|
|
443
|
+
const intersectionCases = [
|
|
444
|
+
["branded Node Blob real", validators.isBrandedNodeBlob(new node.Blob(["x"])), true],
|
|
445
|
+
["branded Node Blob plain", validators.isBrandedNodeBlob(blobPlain), false],
|
|
446
|
+
["branded Node File real", validators.isBrandedNodeFile(new node.File(["x"], "x.txt")), true],
|
|
447
|
+
["branded Node File plain", validators.isBrandedNodeFile(filePlain), false],
|
|
448
|
+
["Node Blob intersection pruned", validators.isNodeBlobIntersectionUnion(Object.assign(new node.Blob(["x"]), { blobLabel: "x" })), false],
|
|
449
|
+
["Node Blob intersection plain", validators.isNodeBlobIntersectionUnion({ ...blobPlain, blobLabel: "x" }), false],
|
|
450
|
+
["Node Blob intersection other", validators.isNodeBlobIntersectionUnion({ nodeBlobOk: true }), true],
|
|
451
|
+
["Node File intersection pruned", validators.isNodeFileIntersectionUnion(Object.assign(new node.File(["x"], "x.txt"), { fileLabel: "x" })), false],
|
|
452
|
+
["Node File intersection plain", validators.isNodeFileIntersectionUnion({ ...filePlain, fileLabel: "x" }), false],
|
|
453
|
+
["Node File intersection other", validators.isNodeFileIntersectionUnion({ nodeFileOk: true }), true],
|
|
454
|
+
];
|
|
455
|
+
|
|
456
|
+
const packageBlob = { packageBrand: "package", size: 1, type: "text/plain" };
|
|
457
|
+
const packageFile = {
|
|
458
|
+
...packageBlob,
|
|
459
|
+
lastModified: 0,
|
|
460
|
+
name: "x.txt",
|
|
461
|
+
webkitRelativePath: "",
|
|
462
|
+
};
|
|
463
|
+
const ambientBlob = { ambientBrand: "ambient", size: 1, type: "text/plain" };
|
|
464
|
+
const ambientFile = {
|
|
465
|
+
...ambientBlob,
|
|
466
|
+
lastModified: 0,
|
|
467
|
+
name: "x.txt",
|
|
468
|
+
webkitRelativePath: "",
|
|
469
|
+
};
|
|
470
|
+
const controlCases = [
|
|
471
|
+
["package Blob structural", controls.isPackageBlob(packageBlob), true],
|
|
472
|
+
["package Blob rejects native", controls.isPackageBlob(new node.Blob(["x"])), false],
|
|
473
|
+
["package File structural", controls.isPackageFile(packageFile), true],
|
|
474
|
+
["package File rejects native", controls.isPackageFile(new node.File(["x"], "x.txt")), false],
|
|
475
|
+
["ambient Blob structural", controls.isAmbientBlob(ambientBlob), true],
|
|
476
|
+
["ambient Blob rejects native", controls.isAmbientBlob(new node.Blob(["x"])), false],
|
|
477
|
+
["ambient File structural", controls.isAmbientFile(ambientFile), true],
|
|
478
|
+
["ambient File rejects native", controls.isAmbientFile(new node.File(["x"], "x.txt")), false],
|
|
479
|
+
];
|
|
480
|
+
|
|
481
|
+
const failures = [];
|
|
482
|
+
for (const [name, actual, expected] of [...cases, ...intersectionCases, ...controlCases]) {
|
|
483
|
+
if (actual !== expected) {
|
|
484
|
+
failures.push(name + ": expected " + expected + " but got " + actual);
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
console.log("RAN " + cases.length + " CASES");
|
|
488
|
+
console.log("RAN " + intersectionCases.length + " INTERSECTION CASES");
|
|
489
|
+
console.log("RAN " + controlCases.length + " CONTROL CASES");
|
|
490
|
+
if (failures.length !== 0) {
|
|
491
|
+
throw new Error("MISMATCHES:\n" + failures.join("\n"));
|
|
492
|
+
}
|
|
493
|
+
`
|
|
494
|
+
|
|
495
|
+
const nodeBufferNativeExportsSpoofRuntimeRunner = `const validators = require("./input.cjs");
|
|
496
|
+
const node = require("node:buffer");
|
|
497
|
+
|
|
498
|
+
const blob = { spoofBrand: "fake", size: 1, type: "text/plain" };
|
|
499
|
+
const file = {
|
|
500
|
+
...blob,
|
|
501
|
+
lastModified: 0,
|
|
502
|
+
name: "x.txt",
|
|
503
|
+
webkitRelativePath: "",
|
|
504
|
+
};
|
|
505
|
+
const cases = [
|
|
506
|
+
["counterfeit node:buffer Blob structural", validators.isNodeBlob(blob), true],
|
|
507
|
+
["counterfeit node:buffer Blob rejects native", validators.isNodeBlob(new node.Blob(["x"])), false],
|
|
508
|
+
["counterfeit node:buffer File structural", validators.isNodeFile(file), true],
|
|
509
|
+
["counterfeit node:buffer File rejects native", validators.isNodeFile(new node.File(["x"], "x.txt")), false],
|
|
510
|
+
["counterfeit buffer Blob structural", validators.isLegacyBlob(blob), true],
|
|
511
|
+
["counterfeit buffer Blob rejects native", validators.isLegacyBlob(new node.Blob(["x"])), false],
|
|
512
|
+
["counterfeit buffer File structural", validators.isLegacyFile(file), true],
|
|
513
|
+
["counterfeit buffer File rejects native", validators.isLegacyFile(new node.File(["x"], "x.txt")), false],
|
|
514
|
+
];
|
|
515
|
+
|
|
516
|
+
const failures = [];
|
|
517
|
+
for (const [name, actual, expected] of cases) {
|
|
518
|
+
if (actual !== expected) {
|
|
519
|
+
failures.push(name + ": expected " + expected + " but got " + actual);
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
console.log("RAN " + cases.length + " COUNTERFEIT CASES");
|
|
523
|
+
if (failures.length !== 0) {
|
|
524
|
+
throw new Error("MISMATCHES:\n" + failures.join("\n"));
|
|
525
|
+
}
|
|
526
|
+
`
|
|
@@ -18,20 +18,22 @@ import (
|
|
|
18
18
|
// addresses tuples by fixed leading positions, so the honest resolution is
|
|
19
19
|
// a compile-time rejection, mirroring the json.schemas bigint precedent.
|
|
20
20
|
//
|
|
21
|
-
// 1. Require leading-rest and middle-rest tuples to be rejected: the
|
|
22
|
-
//
|
|
23
|
-
//
|
|
24
|
-
//
|
|
21
|
+
// 1. Require leading-rest and middle-rest tuples to be rejected: the transform
|
|
22
|
+
// records a diagnostic naming the offending tuple, which every host --
|
|
23
|
+
// single-file included since samchon/typia#2117 -- reports while refusing to
|
|
24
|
+
// publish an artifact.
|
|
25
25
|
// 2. Require trailing-rest tuples to keep compiling and validating
|
|
26
26
|
// correctly at every length.
|
|
27
27
|
func TestNonTrailingRestTupleTransform(t *testing.T) {
|
|
28
28
|
t.Run("leading rest rejected", func(t *testing.T) {
|
|
29
29
|
nonTrailingRestExpectRejection(t, "leading-",
|
|
30
|
-
"export const validate = typia.createValidate<[...unknown[], string]>();"
|
|
30
|
+
"export const validate = typia.createValidate<[...unknown[], string]>();",
|
|
31
|
+
"[...unknown[], string]")
|
|
31
32
|
})
|
|
32
33
|
t.Run("middle rest rejected", func(t *testing.T) {
|
|
33
34
|
nonTrailingRestExpectRejection(t, "middle-",
|
|
34
|
-
"export const validate = typia.createValidate<[number, ...boolean[], string]>();"
|
|
35
|
+
"export const validate = typia.createValidate<[number, ...boolean[], string]>();",
|
|
36
|
+
"[number, ...boolean[], string]")
|
|
35
37
|
})
|
|
36
38
|
t.Run("trailing rest keeps working", func(t *testing.T) {
|
|
37
39
|
nonTrailingRestTrailingControl(t)
|
|
@@ -66,7 +68,12 @@ func nonTrailingRestProject(t *testing.T, prefix string, body string) string {
|
|
|
66
68
|
return dir
|
|
67
69
|
}
|
|
68
70
|
|
|
69
|
-
|
|
71
|
+
// nonTrailingRestExpectRejection requires the rejection to reach the caller as a
|
|
72
|
+
// diagnostic naming `tuple`, with no artifact published. This previously asserted
|
|
73
|
+
// code 0 and inspected the untransformed call in stdout; that success code was
|
|
74
|
+
// the samchon/typia#2117 defect, and in `js` mode the surviving `.createValidate()`
|
|
75
|
+
// was only type erasure, so the diagnostic is the load-bearing evidence anyway.
|
|
76
|
+
func nonTrailingRestExpectRejection(t *testing.T, prefix string, body string, tuple string) {
|
|
70
77
|
t.Helper()
|
|
71
78
|
project := nonTrailingRestProject(t, prefix, body)
|
|
72
79
|
out, errText, code := ttscTypiaTestCapture(func() int {
|
|
@@ -77,11 +84,16 @@ func nonTrailingRestExpectRejection(t *testing.T, prefix string, body string) {
|
|
|
77
84
|
"--output", "js",
|
|
78
85
|
})
|
|
79
86
|
})
|
|
80
|
-
if code !=
|
|
81
|
-
t.Fatalf("
|
|
87
|
+
if code != 3 {
|
|
88
|
+
t.Fatalf("non-trailing rest tuple should be rejected with code 3: code=%d stdout=\n%s\nstderr=\n%s", code, out, errText)
|
|
89
|
+
}
|
|
90
|
+
if !strings.Contains(errText, "error TS(typia.createValidate):") ||
|
|
91
|
+
!strings.Contains(errText, tuple) ||
|
|
92
|
+
!strings.Contains(errText, "non-trailing rest element in tuple type is not supported.") {
|
|
93
|
+
t.Fatalf("rejection diagnostic did not name the tuple and cause:\n%s", errText)
|
|
82
94
|
}
|
|
83
|
-
if
|
|
84
|
-
t.Fatalf("
|
|
95
|
+
if out != "" {
|
|
96
|
+
t.Fatalf("rejected transform published an artifact:\n%s", out)
|
|
85
97
|
}
|
|
86
98
|
}
|
|
87
99
|
|