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,57 @@
|
|
|
1
|
+
package factories
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"testing"
|
|
5
|
+
|
|
6
|
+
schemametadata "github.com/samchon/typia/packages/typia/native/core/schemas/metadata"
|
|
7
|
+
)
|
|
8
|
+
|
|
9
|
+
// TestFormatAliasResolvesToCheatSheet verifies every `@format` alias generates the cheat sheet validator it emits.
|
|
10
|
+
//
|
|
11
|
+
// An alias that carries its own validator string is not an alias; it is a
|
|
12
|
+
// second implementation sharing a name, free to drift from the format it
|
|
13
|
+
// claims. `@format datetime` did exactly that: it emitted `format: "date-time"`
|
|
14
|
+
// while validating with `!isNaN(new Date($input).getTime())`, so it accepted
|
|
15
|
+
// February 30th and rejected the RFC 3339 leap second the cheat sheet handles.
|
|
16
|
+
// This pins the alias to the cheat sheet as the single owner of the validator.
|
|
17
|
+
//
|
|
18
|
+
// 1. Parse each alias spelling of the `date-time` format as a JSDoc comment tag.
|
|
19
|
+
// 2. Require the emitted format name, schema, and tag name to be the canonical one.
|
|
20
|
+
// 3. Require the generated validator to be the cheat sheet entry verbatim.
|
|
21
|
+
func TestFormatAliasResolvesToCheatSheet(t *testing.T) {
|
|
22
|
+
canonical := "date-time"
|
|
23
|
+
expected, ok := FormatCheatSheet[canonical]
|
|
24
|
+
if ok == false {
|
|
25
|
+
t.Fatalf("the cheat sheet must own the %s format", canonical)
|
|
26
|
+
}
|
|
27
|
+
for _, alias := range []string{"datetime", "dateTime", "date-time"} {
|
|
28
|
+
record := metadataCommentTagFactory_parse(struct {
|
|
29
|
+
Report func(msg string) any
|
|
30
|
+
Tag schemametadata.IJsDocTagInfo
|
|
31
|
+
}{
|
|
32
|
+
Report: func(msg string) any { return nil },
|
|
33
|
+
Tag: schemametadata.IJsDocTagInfo{
|
|
34
|
+
Name: "format",
|
|
35
|
+
Text: []schemametadata.IJsDocTagInfo_IText{{Text: alias}},
|
|
36
|
+
},
|
|
37
|
+
})
|
|
38
|
+
tags := record["string"]
|
|
39
|
+
if len(tags) != 1 {
|
|
40
|
+
t.Fatalf("@format %s should generate exactly one string tag, generated %d", alias, len(tags))
|
|
41
|
+
}
|
|
42
|
+
tag := tags[0]
|
|
43
|
+
if tag.Value != canonical {
|
|
44
|
+
t.Fatalf("@format %s should carry the canonical %s value, carried %v", alias, canonical, tag.Value)
|
|
45
|
+
}
|
|
46
|
+
if tag.Name != "Format<\""+canonical+"\">" {
|
|
47
|
+
t.Fatalf("@format %s should name the canonical format tag, named %s", alias, tag.Name)
|
|
48
|
+
}
|
|
49
|
+
schema, ok := tag.Schema.(map[string]any)
|
|
50
|
+
if ok == false || schema["format"] != canonical {
|
|
51
|
+
t.Fatalf("@format %s should emit format %s, emitted %v", alias, canonical, tag.Schema)
|
|
52
|
+
}
|
|
53
|
+
if tag.Validate != expected {
|
|
54
|
+
t.Fatalf("@format %s must validate as the cheat sheet %s entry does, validated with %s", alias, canonical, tag.Validate)
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
package factories
|
|
2
|
+
|
|
3
|
+
import "testing"
|
|
4
|
+
|
|
5
|
+
// TestFormatAliasTableTargetsTheCheatSheet verifies every declared `@format` alias names a real cheat sheet format.
|
|
6
|
+
//
|
|
7
|
+
// The original defect was structural, not arithmetic: the aliases were appended
|
|
8
|
+
// after a loop that copied the cheat sheet, so they were invisible to any sweep
|
|
9
|
+
// that enumerated the cheat sheet's entries and could drift from the format they
|
|
10
|
+
// emit without contradicting anything. The alias table now holds only cheat
|
|
11
|
+
// sheet keys, and this pins that shape — an alias pointing nowhere, or shadowing
|
|
12
|
+
// a real format with a different meaning, fails here rather than at a user's
|
|
13
|
+
// call site.
|
|
14
|
+
//
|
|
15
|
+
// 1. Require every alias to resolve to an existing cheat sheet entry.
|
|
16
|
+
// 2. Require no alias to shadow a cheat sheet key of its own name.
|
|
17
|
+
// 3. Require resolution to reject a format the cheat sheet does not own.
|
|
18
|
+
func TestFormatAliasTableTargetsTheCheatSheet(t *testing.T) {
|
|
19
|
+
if len(formatCheatSheet_ALIASES) == 0 {
|
|
20
|
+
t.Fatal("the alias table should stay the enumerable owner of every alternative spelling")
|
|
21
|
+
}
|
|
22
|
+
for alias, canonical := range formatCheatSheet_ALIASES {
|
|
23
|
+
expected, ok := FormatCheatSheet[canonical]
|
|
24
|
+
if ok == false {
|
|
25
|
+
t.Fatalf("the alias %s targets %s, which the cheat sheet does not own", alias, canonical)
|
|
26
|
+
}
|
|
27
|
+
if _, ok := FormatCheatSheet[alias]; ok {
|
|
28
|
+
t.Fatalf("the alias %s shadows a cheat sheet format of the same name", alias)
|
|
29
|
+
}
|
|
30
|
+
name, validate, ok := formatCheatSheet_resolve(alias)
|
|
31
|
+
if ok == false || name != canonical || validate != expected {
|
|
32
|
+
t.Fatalf("the alias %s must resolve to the cheat sheet %s entry, resolved to %s", alias, canonical, name)
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
for name, validate := range FormatCheatSheet {
|
|
36
|
+
resolvedName, resolvedValidate, ok := formatCheatSheet_resolve(name)
|
|
37
|
+
if ok == false || resolvedName != name || resolvedValidate != validate {
|
|
38
|
+
t.Fatalf("the canonical format %s must resolve to itself", name)
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if _, _, ok := formatCheatSheet_resolve("not-a-format"); ok {
|
|
42
|
+
t.Fatal("an unsupported format must not resolve")
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
package factories
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"encoding/json"
|
|
5
|
+
"strings"
|
|
6
|
+
"testing"
|
|
7
|
+
)
|
|
8
|
+
|
|
9
|
+
// TestIdentifierFactoryPostfixEscapesEveryKey verifies emitted accessor paths.
|
|
10
|
+
//
|
|
11
|
+
// Postfix returns JavaScript source that callers splice into the emit as
|
|
12
|
+
// `_path + <postfix>`, so it carries two nested escaping levels: the key becomes
|
|
13
|
+
// a JSON literal, and that literal sits inside the JavaScript literal returned.
|
|
14
|
+
// Escaping one level and not the other emitted a file that does not parse for a
|
|
15
|
+
// `"` key, and a path that JSON.parse rejects inside _createStandardSchema for a
|
|
16
|
+
// control-character key. The expected strings below come from the contract that
|
|
17
|
+
// typia's own runtime helper _accessExpressionAsString implements for dynamic
|
|
18
|
+
// keys, `variable(str) ? ".{str}" : "[{JSON.stringify(str)}]"`, not from what
|
|
19
|
+
// the emitter happens to produce.
|
|
20
|
+
//
|
|
21
|
+
// 1. Assert the exact source text Postfix returns for identifier keys, quoting
|
|
22
|
+
// keys, escape-sensitive keys, control characters, and non-ASCII keys.
|
|
23
|
+
// 2. Decode every result as JSON twice and assert the original key survives.
|
|
24
|
+
// 3. Assert the identifier fast path stays a dotted accessor, so ordinary keys
|
|
25
|
+
// and prototype-shadowing keys keep their existing output.
|
|
26
|
+
func TestIdentifierFactoryPostfixEscapesEveryKey(t *testing.T) {
|
|
27
|
+
for _, item := range []struct {
|
|
28
|
+
name string
|
|
29
|
+
key string
|
|
30
|
+
expected string
|
|
31
|
+
}{
|
|
32
|
+
// Identifier fast path: no escaping is possible, so output is unchanged.
|
|
33
|
+
{"identifier", "field", `".field"`},
|
|
34
|
+
{"underscore", "_private", `"._private"`},
|
|
35
|
+
{"dollar", "$ref", `".$ref"`},
|
|
36
|
+
// A prototype-shadowing key is still a plain property access, because the
|
|
37
|
+
// emitted accessor reads the property and never the prototype.
|
|
38
|
+
{"proto", "__proto__", `".__proto__"`},
|
|
39
|
+
{"constructor", "constructor", `".constructor"`},
|
|
40
|
+
{"toString", "toString", `".toString"`},
|
|
41
|
+
// Ordinary quoted keys: byte-identical to the pre-fix output.
|
|
42
|
+
{"hyphen", "a-b", `"[\"a-b\"]"`},
|
|
43
|
+
{"space", "not valid", `"[\"not valid\"]"`},
|
|
44
|
+
{"empty", "", `"[\"\"]"`},
|
|
45
|
+
{"digit first", "0abc", `"[\"0abc\"]"`},
|
|
46
|
+
{"dotted", "a.b", `"[\"a.b\"]"`},
|
|
47
|
+
{"bracket", "a[0]", `"[\"a[0]\"]"`},
|
|
48
|
+
{"reserved", "for", `"[\"for\"]"`},
|
|
49
|
+
// Neither quote nor backslash, so no escape applies at either level.
|
|
50
|
+
{"single quote", "a'b", `"[\"a'b\"]"`},
|
|
51
|
+
{"backtick", "a`b", "\"[\\\"a`b\\\"]\""},
|
|
52
|
+
{"template hole", "a${b}c", `"[\"a${b}c\"]"`},
|
|
53
|
+
// The double quote is escaped once per level: `"` -> `\"` -> `\\\"`.
|
|
54
|
+
{"double quote", `a"b`, `"[\"a\\\"b\"]"`},
|
|
55
|
+
{"only double quote", `"`, `"[\"\\\"\"]"`},
|
|
56
|
+
// The backslash likewise. Escaping it once left the emitted path saying
|
|
57
|
+
// `["a\b"]`, which JSON.parse reads back as a backspace, not a backslash.
|
|
58
|
+
{"backslash", `a\b`, `"[\"a\\\\b\"]"`},
|
|
59
|
+
{"only backslash", `\`, `"[\"\\\\\"]"`},
|
|
60
|
+
{"quote and backslash", `a"\b`, `"[\"a\\\"\\\\b\"]"`},
|
|
61
|
+
// Control characters need a JSON escape; a raw one makes JSON.parse throw.
|
|
62
|
+
{"newline", "a\nb", `"[\"a\\nb\"]"`},
|
|
63
|
+
{"tab", "a\tb", `"[\"a\\tb\"]"`},
|
|
64
|
+
{"carriage return", "a\rb", `"[\"a\\rb\"]"`},
|
|
65
|
+
{"backspace", "a\bb", `"[\"a\\bb\"]"`},
|
|
66
|
+
{"form feed", "a\fb", `"[\"a\\fb\"]"`},
|
|
67
|
+
{"null", "a\x00b", `"[\"a\\u0000b\"]"`},
|
|
68
|
+
{"unit separator", "a\x1fb", `"[\"a\\u001fb\"]"`},
|
|
69
|
+
// strconv.Quote wrote `\a` and `\v` here. JavaScript has no `\a`, so it
|
|
70
|
+
// decoded to a plain "a" and silently changed the key.
|
|
71
|
+
{"bell", "a\x07b", `"[\"a\\u0007b\"]"`},
|
|
72
|
+
{"vertical tab", "a\x0bb", `"[\"a\\u000bb\"]"`},
|
|
73
|
+
// A line terminator to JavaScript but an ordinary character to JSON, so the
|
|
74
|
+
// escape belongs in the source and must not reach the path itself: the
|
|
75
|
+
// emitted `\u2028` decodes back to the raw character JSON.stringify writes.
|
|
76
|
+
{"line separator", "a\u2028b", `"[\"a\u2028b\"]"`},
|
|
77
|
+
{"paragraph separator", "a\u2029b", `"[\"a\u2029b\"]"`},
|
|
78
|
+
// Printable non-ASCII stays raw, exactly as JSON.stringify leaves it.
|
|
79
|
+
{"non ascii", "한글", `"[\"한글\"]"`},
|
|
80
|
+
{"emoji", "a\U0001F600b", "\"[\\\"a\U0001F600b\\\"]\""},
|
|
81
|
+
// strconv.Quote wrote `\U0001d173` for a non-printable astral rune, and
|
|
82
|
+
// JavaScript has no `\U` escape at all; it read back as "U0001d173".
|
|
83
|
+
{"astral format", "a\U0001D173b", "\"[\\\"a\U0001D173b\\\"]\""},
|
|
84
|
+
// A lone surrogate arrives WTF-8 encoded and has no valid UTF-8 form, so an
|
|
85
|
+
// escape is the only way to carry it.
|
|
86
|
+
{"lone surrogate", "a\xed\xa0\x80b", `"[\"a\\ud800b\"]"`},
|
|
87
|
+
// No escape denotes a byte that is not UTF-8 at all.
|
|
88
|
+
{"invalid utf8", "a\xffb", `"[\"a\\ufffdb\"]"`},
|
|
89
|
+
} {
|
|
90
|
+
t.Run(item.name, func(t *testing.T) {
|
|
91
|
+
output := IdentifierFactory.Postfix(item.key)
|
|
92
|
+
if output != item.expected {
|
|
93
|
+
t.Fatalf("Postfix(%q)\n got: %s\nwant: %s", item.key, output, item.expected)
|
|
94
|
+
}
|
|
95
|
+
identifierFactoryPostfixRoundTrip(t, item.key, output)
|
|
96
|
+
})
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// identifierFactoryPostfixRoundTrip decodes the emitted source the way the
|
|
101
|
+
// runtime does: JavaScript reads the outer literal, then _createStandardSchema
|
|
102
|
+
// hands the bracketed key to JSON.parse. encoding/json stands in for both,
|
|
103
|
+
// which makes this an independent check that the escaping is real rather than a
|
|
104
|
+
// restatement of the emitter's own logic.
|
|
105
|
+
func identifierFactoryPostfixRoundTrip(t *testing.T, key string, output string) {
|
|
106
|
+
t.Helper()
|
|
107
|
+
var path string
|
|
108
|
+
if err := json.Unmarshal([]byte(output), &path); err != nil {
|
|
109
|
+
t.Fatalf("Postfix(%q) is not a JavaScript string literal: %s (%v)", key, output, err)
|
|
110
|
+
}
|
|
111
|
+
if strings.HasPrefix(path, ".") {
|
|
112
|
+
if path[1:] != key {
|
|
113
|
+
t.Fatalf("Postfix(%q) dotted accessor lost the key: %q", key, path)
|
|
114
|
+
}
|
|
115
|
+
return
|
|
116
|
+
}
|
|
117
|
+
if !strings.HasPrefix(path, "[") || !strings.HasSuffix(path, "]") {
|
|
118
|
+
t.Fatalf("Postfix(%q) is neither a dotted nor a bracketed accessor: %q", key, path)
|
|
119
|
+
}
|
|
120
|
+
var decoded string
|
|
121
|
+
if err := json.Unmarshal([]byte(path[1:len(path)-1]), &decoded); err != nil {
|
|
122
|
+
t.Fatalf("Postfix(%q) bracketed key is not JSON: %q (%v)", key, path, err)
|
|
123
|
+
}
|
|
124
|
+
if want := identifierFactoryPostfixDecodable(key); decoded != want {
|
|
125
|
+
t.Fatalf("Postfix(%q) round-tripped to %q, want %q", key, decoded, want)
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// identifierFactoryPostfixDecodable states what a JSON decoder can return for
|
|
130
|
+
// `key`. encoding/json replaces an unpaired surrogate and never yields invalid
|
|
131
|
+
// UTF-8, so those two inputs come back as the replacement character even though
|
|
132
|
+
// the emitted escape itself is exact.
|
|
133
|
+
func identifierFactoryPostfixDecodable(key string) string {
|
|
134
|
+
var builder strings.Builder
|
|
135
|
+
for i := 0; i < len(key); {
|
|
136
|
+
// Detect a WTF-8 surrogate here rather than calling the factory's own
|
|
137
|
+
// helper, so this expectation stays independent of the code under test.
|
|
138
|
+
if len(key)-i >= 3 && key[i] == 0xed && key[i+1] >= 0xa0 && key[i+1] <= 0xbf {
|
|
139
|
+
builder.WriteRune('�')
|
|
140
|
+
i += 3
|
|
141
|
+
continue
|
|
142
|
+
}
|
|
143
|
+
builder.WriteByte(key[i])
|
|
144
|
+
i++
|
|
145
|
+
}
|
|
146
|
+
return strings.ToValidUTF8(builder.String(), "�")
|
|
147
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
package factories
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"encoding/json"
|
|
5
|
+
"fmt"
|
|
6
|
+
"strings"
|
|
7
|
+
"testing"
|
|
8
|
+
"unicode/utf8"
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
// TestIdentifierFactoryPostfixSurvivesEveryCodePoint verifies total escaping.
|
|
12
|
+
//
|
|
13
|
+
// The emitted accessor is spliced into the emit as source text, and nothing
|
|
14
|
+
// downstream parses the file, so a key the escaper mishandles ships as a broken
|
|
15
|
+
// artifact behind a successful build. The table-driven case list pins the
|
|
16
|
+
// characters that actually regressed; this one closes the class by sweeping the
|
|
17
|
+
// whole input space, because the escape decision is per rune and a sampled
|
|
18
|
+
// matrix cannot prove a per-rune rule. encoding/json decodes the result, which
|
|
19
|
+
// is an implementation typia does not own and therefore a real oracle: JSON
|
|
20
|
+
// string syntax is a subset of JavaScript string syntax, so a literal it accepts
|
|
21
|
+
// also parses in the emitted file.
|
|
22
|
+
//
|
|
23
|
+
// 1. Sweep every scalar value and assert the key round-trips exactly.
|
|
24
|
+
// 2. Sweep every surrogate code unit and assert the WTF-8 form survives as an
|
|
25
|
+
// escape rather than corrupting the literal.
|
|
26
|
+
// 3. Sweep every single byte, including the ones that are not UTF-8, and assert
|
|
27
|
+
// the emitted literal still decodes.
|
|
28
|
+
func TestIdentifierFactoryPostfixSurvivesEveryCodePoint(t *testing.T) {
|
|
29
|
+
for code := rune(0); code <= utf8.MaxRune; code++ {
|
|
30
|
+
if code >= 0xd800 && code <= 0xdfff {
|
|
31
|
+
continue // Not a scalar value; covered by the surrogate sweep below.
|
|
32
|
+
}
|
|
33
|
+
key := "a" + string(code) + "b"
|
|
34
|
+
if decoded := identifierFactoryPostfixDecode(t, key); decoded != key {
|
|
35
|
+
t.Fatalf("U+%04X: Postfix round-tripped to %q, want %q", code, decoded, key)
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
for unit := rune(0xd800); unit <= 0xdfff; unit++ {
|
|
40
|
+
key := "a" + string([]byte{
|
|
41
|
+
0xe0 | byte(unit>>12),
|
|
42
|
+
0x80 | byte((unit>>6)&0x3f),
|
|
43
|
+
0x80 | byte(unit&0x3f),
|
|
44
|
+
}) + "b"
|
|
45
|
+
output := IdentifierFactory.Postfix(key)
|
|
46
|
+
// The inner level writes `\ud800` and the outer level escapes that
|
|
47
|
+
// backslash, so the emitted source carries `\\ud800`.
|
|
48
|
+
if want := fmt.Sprintf(`\\u%04x`, unit); !strings.Contains(output, want) {
|
|
49
|
+
t.Fatalf("U+%04X: lone surrogate was not escaped as %s: %s", unit, want, output)
|
|
50
|
+
}
|
|
51
|
+
// The decoder replaces an unpaired surrogate, so assert the literal stays
|
|
52
|
+
// well formed rather than demanding the original bytes back.
|
|
53
|
+
identifierFactoryPostfixDecode(t, key)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
for value := 0; value <= 0xff; value++ {
|
|
57
|
+
key := "a" + string([]byte{byte(value)}) + "b"
|
|
58
|
+
decoded := identifierFactoryPostfixDecode(t, key)
|
|
59
|
+
if utf8.ValidString(key) && decoded != key {
|
|
60
|
+
t.Fatalf("byte 0x%02X: Postfix round-tripped to %q, want %q", value, decoded, key)
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// identifierFactoryPostfixDecode reads the emitted source the way the runtime
|
|
66
|
+
// does and fails the test if any layer rejects it: JavaScript parses the outer
|
|
67
|
+
// literal, then _createStandardSchema hands the bracketed key to JSON.parse.
|
|
68
|
+
func identifierFactoryPostfixDecode(t *testing.T, key string) string {
|
|
69
|
+
t.Helper()
|
|
70
|
+
output := IdentifierFactory.Postfix(key)
|
|
71
|
+
var path string
|
|
72
|
+
if err := json.Unmarshal([]byte(output), &path); err != nil {
|
|
73
|
+
t.Fatalf("Postfix(%q) is not a string literal: %s (%v)", key, output, err)
|
|
74
|
+
}
|
|
75
|
+
if strings.HasPrefix(path, ".") {
|
|
76
|
+
return path[1:]
|
|
77
|
+
}
|
|
78
|
+
if !strings.HasPrefix(path, "[") || !strings.HasSuffix(path, "]") {
|
|
79
|
+
t.Fatalf("Postfix(%q) is not an accessor: %q", key, path)
|
|
80
|
+
}
|
|
81
|
+
var decoded string
|
|
82
|
+
if err := json.Unmarshal([]byte(path[1:len(path)-1]), &decoded); err != nil {
|
|
83
|
+
t.Fatalf("Postfix(%q) bracketed key is not JSON: %q (%v)", key, path, err)
|
|
84
|
+
}
|
|
85
|
+
return decoded
|
|
86
|
+
}
|
|
@@ -129,19 +129,17 @@ func metadata_explore_symbol_name(node *nativeast.Node, name string) string {
|
|
|
129
129
|
return name
|
|
130
130
|
}
|
|
131
131
|
|
|
132
|
-
func metadata_get_type_arguments(checker *nativechecker.Checker, typ *nativechecker.Type)
|
|
132
|
+
func metadata_get_type_arguments(checker *nativechecker.Checker, typ *nativechecker.Type) []*nativechecker.Type {
|
|
133
133
|
if checker == nil || typ == nil {
|
|
134
134
|
return nil
|
|
135
135
|
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
}
|
|
140
|
-
}()
|
|
136
|
+
if typ.Flags()&nativechecker.TypeFlagsObject == 0 || typ.ObjectFlags()&nativechecker.ObjectFlagsReference == 0 {
|
|
137
|
+
return nil
|
|
138
|
+
}
|
|
141
139
|
return checker.GetTypeArguments(typ)
|
|
142
140
|
}
|
|
143
141
|
|
|
144
|
-
func metadata_get_function_node(typ *nativechecker.Type) *nativeast.Node {
|
|
142
|
+
func metadata_get_function_node(checker *nativechecker.Checker, typ *nativechecker.Type) *nativeast.Node {
|
|
145
143
|
if typ == nil {
|
|
146
144
|
return nil
|
|
147
145
|
}
|
|
@@ -153,6 +151,24 @@ func metadata_get_function_node(typ *nativechecker.Type) *nativeast.Node {
|
|
|
153
151
|
if nativeast.IsFunctionLike(node) {
|
|
154
152
|
return node
|
|
155
153
|
}
|
|
154
|
+
// The global `Function` interface (declared in a default `lib.*.d.ts`) is
|
|
155
|
+
// callable and newable at runtime, so a `Function`-typed member is a function,
|
|
156
|
+
// not a structural object: `constructor: Function` on the global `Object`
|
|
157
|
+
// interface, an explicit `x: Function`, or any member inherited through
|
|
158
|
+
// `extends Object`. Its symbol resolves to an `InterfaceDeclaration` rather
|
|
159
|
+
// than a function-like node, so without this branch it is expanded
|
|
160
|
+
// structurally (`{ prototype, length, arguments, caller, name }`) and its
|
|
161
|
+
// `typeof` is checked as `"object"` even though a real function reports
|
|
162
|
+
// `"function"`, making `is<Object>` universally false (#2178). Returning the
|
|
163
|
+
// interface declaration routes the member through the same function path typia
|
|
164
|
+
// already uses for `() => void` members: a lenient pass under default options
|
|
165
|
+
// and a signature-based check under `functional`.
|
|
166
|
+
if metadata_is_global_function_interface(symbol, node) {
|
|
167
|
+
return node
|
|
168
|
+
}
|
|
169
|
+
if metadata_is_pure_function_declaration(checker, typ, node) {
|
|
170
|
+
return node
|
|
171
|
+
}
|
|
156
172
|
if nativeast.IsPropertyAssignment(node) {
|
|
157
173
|
initializer := node.AsPropertyAssignment().Initializer
|
|
158
174
|
if nativeast.IsFunctionLike(initializer) {
|
|
@@ -268,28 +284,221 @@ func metadata_node_type_js_doc_tags(symbol *nativeast.Symbol) []schemametadata.I
|
|
|
268
284
|
return metadata_node_js_doc_tags(symbol)
|
|
269
285
|
}
|
|
270
286
|
|
|
287
|
+
// metadata_is_global_function_interface reports whether the type behind `symbol`
|
|
288
|
+
// is the global `Function` interface from a TypeScript default library. The
|
|
289
|
+
// match is intentionally narrow — the symbol name is exactly `"Function"`, its
|
|
290
|
+
// first declaration is an `InterfaceDeclaration`, and that declaration lives in a
|
|
291
|
+
// `lib.*.d.ts` — so it recognizes only the lib `Function` and never a
|
|
292
|
+
// user-declared `interface Function`, a `function Function()` value, or any
|
|
293
|
+
// other callable object type. See metadata_get_function_node for why the lib
|
|
294
|
+
// `Function` must be treated as a function type (#2178).
|
|
295
|
+
func metadata_is_global_function_interface(symbol *nativeast.Symbol, node *nativeast.Node) bool {
|
|
296
|
+
if symbol == nil || symbol.Name != "Function" {
|
|
297
|
+
return false
|
|
298
|
+
}
|
|
299
|
+
if node == nil || node.Kind != nativeast.KindInterfaceDeclaration {
|
|
300
|
+
return false
|
|
301
|
+
}
|
|
302
|
+
return metadata_symbol_from_default_lib(symbol)
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
// metadata_is_pure_function_declaration reports whether an object-type
|
|
306
|
+
// declaration describes only call and/or construct signatures. TypeScript
|
|
307
|
+
// augments every callable object's apparent properties with the global Function
|
|
308
|
+
// members, so the raw properties and index infos are the boundary: a declaration
|
|
309
|
+
// that carries members of its own keeps its declared data shape, while a
|
|
310
|
+
// member-free callable or constructable one follows the same metadata path as
|
|
311
|
+
// the function type alias it is mutually assignable with (#2238).
|
|
312
|
+
//
|
|
313
|
+
// An interface body and a type literal are the two spellings TypeScript has for
|
|
314
|
+
// one object-type body, and `interface F { (v: number): string }`, `type F = { (v:
|
|
315
|
+
// number): string }`, and the anonymous `{ (v: number): string }` written at a
|
|
316
|
+
// call site are one type. The declaration's node kind is the only thing that
|
|
317
|
+
// separates them, so answering them differently is exactly the
|
|
318
|
+
// declaration-spelling dependency this predicate exists to remove. Both kinds
|
|
319
|
+
// are admitted and nothing else is: a function type or constructor type is
|
|
320
|
+
// already `IsFunctionLike` and never reaches here, and every other declaration
|
|
321
|
+
// kind that can back a callable type carries a runtime value binding whose
|
|
322
|
+
// declared shape is a different question.
|
|
323
|
+
//
|
|
324
|
+
// No member class is admitted, not even one the emitted validator ignores.
|
|
325
|
+
// #2238's invariant is that mutually assignable spellings agree, and a
|
|
326
|
+
// member-carrying callable has no plain function type to be assignable with:
|
|
327
|
+
// `{ (): void; cancel(): void }` accepts no bare `() => void`, so routing it
|
|
328
|
+
// through the function path would answer against no twin while erasing `cancel`
|
|
329
|
+
// from the declaration. It would also split two spellings that are mutually
|
|
330
|
+
// assignable with each other — `cancel(): void` and `cancel: () => void` are the
|
|
331
|
+
// same type, and only the first carries SymbolFlagsMethod — so admitting methods
|
|
332
|
+
// would make the method form a function while the property form stayed
|
|
333
|
+
// structural. Hybrid callables are #2250's merged boundary and #2238's declared
|
|
334
|
+
// negative boundary; both leave them structural.
|
|
335
|
+
func metadata_is_pure_function_declaration(
|
|
336
|
+
checker *nativechecker.Checker,
|
|
337
|
+
typ *nativechecker.Type,
|
|
338
|
+
node *nativeast.Node,
|
|
339
|
+
) bool {
|
|
340
|
+
if checker == nil || typ == nil || node == nil ||
|
|
341
|
+
(node.Kind != nativeast.KindInterfaceDeclaration && node.Kind != nativeast.KindTypeLiteral) {
|
|
342
|
+
return false
|
|
343
|
+
}
|
|
344
|
+
if len(nativechecker.Checker_getPropertiesOfType(checker, typ)) != 0 ||
|
|
345
|
+
len(nativechecker.Checker_getIndexInfosOfType(checker, typ)) != 0 {
|
|
346
|
+
return false
|
|
347
|
+
}
|
|
348
|
+
return len(checker.GetSignaturesOfType(typ, nativechecker.SignatureKindCall)) != 0 ||
|
|
349
|
+
len(checker.GetSignaturesOfType(typ, nativechecker.SignatureKindConstruct)) != 0
|
|
350
|
+
}
|
|
351
|
+
|
|
271
352
|
// metadata_symbol_from_default_lib reports whether the symbol's first locatable
|
|
272
|
-
// declaration lives in a TypeScript default library file
|
|
273
|
-
//
|
|
274
|
-
//
|
|
353
|
+
// declaration lives in a TypeScript default library file, judged by file name
|
|
354
|
+
// alone because its callers answer without a checker. Default library files are
|
|
355
|
+
// conventionally named `lib.<target>.d.ts`, which is enough for the JSDoc and
|
|
356
|
+
// global-`Function` questions that use this: both are about what a library
|
|
357
|
+
// declaration means, and neither grants a type an identity a lookalike could
|
|
358
|
+
// claim. Runtime-native identity does grant one, so it asks the program instead
|
|
359
|
+
// through schemametadata.MetadataDefaultLibrary_is.
|
|
275
360
|
func metadata_symbol_from_default_lib(symbol *nativeast.Symbol) bool {
|
|
276
361
|
for _, node := range metadata_node_declarations(symbol) {
|
|
277
362
|
src := nativeast.GetSourceFileOfNode(node)
|
|
278
363
|
if src == nil {
|
|
279
364
|
continue
|
|
280
365
|
}
|
|
281
|
-
return
|
|
366
|
+
return schemametadata.MetadataDefaultLibrary_isFileNamed(src.FileName())
|
|
367
|
+
}
|
|
368
|
+
return false
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
// metadata_symbol_is_global_type reports whether symbol is the type that the
|
|
372
|
+
// checker resolves from its global symbol table under name. Pointer identity is
|
|
373
|
+
// deliberate: default-library natives and ambient-package globals such as
|
|
374
|
+
// Node's File and Blob resolve to that shared global symbol, while an exported
|
|
375
|
+
// package declaration remains a distinct module symbol even when its name and
|
|
376
|
+
// `.d.ts` source form are identical (#2239).
|
|
377
|
+
func metadata_symbol_is_global_type(checker *nativechecker.Checker, symbol *nativeast.Symbol, name string) bool {
|
|
378
|
+
if checker == nil || symbol == nil || name == "" {
|
|
379
|
+
return false
|
|
380
|
+
}
|
|
381
|
+
return checker.ResolveName(name, nil, nativeast.SymbolFlagsType, false) == symbol
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
// metadata_symbol_is_runtime_global_type reports whether a global name is the
|
|
385
|
+
// runtime built-in rather than a user-authored global of the same name.
|
|
386
|
+
//
|
|
387
|
+
// Global-table resolution alone answers a weaker question than the one native
|
|
388
|
+
// classification asks. `declare global { interface File { ... } }` in a project
|
|
389
|
+
// with neither DOM nor Node declarations also wins that lookup, so a
|
|
390
|
+
// resolution-only gate promotes a purely user-authored type to native identity:
|
|
391
|
+
// its members are erased, `input instanceof File` replaces them, and the check
|
|
392
|
+
// throws `ReferenceError` wherever no runtime provides that constructor (#2200).
|
|
393
|
+
//
|
|
394
|
+
// The added question is therefore provenance of the runtime constructor, not the
|
|
395
|
+
// existence of a declaration: a global qualifies only when one of the two
|
|
396
|
+
// authorities that actually describe a JavaScript runtime — a TypeScript default
|
|
397
|
+
// library, or Node's `node:buffer` / `buffer` core module — puts it in scope.
|
|
398
|
+
func metadata_symbol_is_runtime_global_type(checker *nativechecker.Checker, symbol *nativeast.Symbol, name string) bool {
|
|
399
|
+
return metadata_symbol_is_global_type(checker, symbol, name) &&
|
|
400
|
+
metadata_symbol_has_runtime_provider(checker, symbol)
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
// metadata_symbol_is_runtime_native_type applies the shared identity boundary
|
|
404
|
+
// for simple runtime-native classes. Most natives are the runtime-provided
|
|
405
|
+
// symbol resolved from the checker's global type table. Node's Blob and File
|
|
406
|
+
// module exports are a second symbol for those same runtime constructors, so
|
|
407
|
+
// their declarations qualify through the value-bearing shape shared by the
|
|
408
|
+
// supported Node type definitions (#1568, #2200, #2239).
|
|
409
|
+
func metadata_symbol_is_runtime_native_type(checker *nativechecker.Checker, symbol *nativeast.Symbol, name string) bool {
|
|
410
|
+
return metadata_symbol_is_runtime_global_type(checker, symbol, name) ||
|
|
411
|
+
metadata_symbol_is_node_buffer_native_export(symbol, name)
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
// metadata_symbol_has_runtime_provider reports whether a runtime authority is
|
|
415
|
+
// what puts this symbol's constructor in scope.
|
|
416
|
+
//
|
|
417
|
+
// A provider does not have to declare the interface itself. @types/node bridges
|
|
418
|
+
// its module classes to the bare globals with `interface Blob extends _Blob {}`
|
|
419
|
+
// plus `var Blob: ... typeof buffer.Blob` in an ordinary package `.d.ts`, so the
|
|
420
|
+
// interface declaration carries no runtime provenance at all while the value
|
|
421
|
+
// binding resolves straight into the ambient `node:buffer` module. Reading the
|
|
422
|
+
// constructor binding therefore recognizes that bridge — and every respelling of
|
|
423
|
+
// it, including the 18/20 `typeof NodeBlob` class alias and the 25 `typeof
|
|
424
|
+
// buffer.Blob` variable alias — without matching declaration text or package
|
|
425
|
+
// paths, which node_modules placement, custom typeRoots, symlinks, and
|
|
426
|
+
// virtualized package layouts all make unreliable.
|
|
427
|
+
//
|
|
428
|
+
// A user-authored global fails both halves: its interface lives in the user's
|
|
429
|
+
// own file, and any `declare var` it pairs with resolves to the user's own type
|
|
430
|
+
// literal rather than into a default library or the Node core module.
|
|
431
|
+
func metadata_symbol_has_runtime_provider(checker *nativechecker.Checker, symbol *nativeast.Symbol) bool {
|
|
432
|
+
if symbol == nil {
|
|
433
|
+
return false
|
|
434
|
+
}
|
|
435
|
+
for _, declaration := range metadata_node_declarations(symbol) {
|
|
436
|
+
if metadata_declaration_is_runtime_provided(checker, declaration) {
|
|
437
|
+
return true
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
if checker == nil || symbol.Flags&nativeast.SymbolFlagsValue == 0 {
|
|
441
|
+
return false
|
|
442
|
+
}
|
|
443
|
+
constructor := checker.GetTypeOfSymbol(symbol)
|
|
444
|
+
if constructor == nil {
|
|
445
|
+
return false
|
|
446
|
+
}
|
|
447
|
+
for _, declaration := range metadata_node_declarations(constructor.Symbol()) {
|
|
448
|
+
if metadata_declaration_is_runtime_provided(checker, declaration) {
|
|
449
|
+
return true
|
|
450
|
+
}
|
|
282
451
|
}
|
|
283
452
|
return false
|
|
284
453
|
}
|
|
285
454
|
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
455
|
+
// metadata_declaration_is_runtime_provided reports whether a declaration belongs
|
|
456
|
+
// to one of the two authorities that describe a runtime-native global: a
|
|
457
|
+
// TypeScript default library file, or the `node:buffer` / `buffer` core module
|
|
458
|
+
// that owns Node's Blob and File constructors. The default-library half comes
|
|
459
|
+
// from the program (see schemametadata.MetadataDefaultLibrary) rather than from
|
|
460
|
+
// the declaration's file name, which under `libReplacement` is an ordinary
|
|
461
|
+
// `node_modules/@typescript/lib-*/index.d.ts` and which any dependency may
|
|
462
|
+
// otherwise imitate.
|
|
463
|
+
func metadata_declaration_is_runtime_provided(checker *nativechecker.Checker, declaration *nativeast.Node) bool {
|
|
464
|
+
if declaration == nil {
|
|
465
|
+
return false
|
|
466
|
+
}
|
|
467
|
+
if schemametadata.MetadataDefaultLibrary_is(checker, nativeast.GetSourceFileOfNode(declaration)) {
|
|
468
|
+
return true
|
|
469
|
+
}
|
|
470
|
+
return metadata_node_in_node_buffer_module(declaration)
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
func metadata_node_in_node_buffer_module(node *nativeast.Node) bool {
|
|
474
|
+
for current := node; current != nil; current = current.Parent {
|
|
475
|
+
if current.Kind == nativeast.KindModuleDeclaration && current.Name() != nil {
|
|
476
|
+
module := strings.Trim(current.Name().Text(), "\"'")
|
|
477
|
+
if module == "node:buffer" || module == "buffer" {
|
|
478
|
+
return true
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
if current.Kind == nativeast.KindSourceFile {
|
|
482
|
+
return false
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
return false
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
func metadata_symbol_is_node_buffer_native_export(symbol *nativeast.Symbol, name string) bool {
|
|
489
|
+
if symbol == nil || symbol.ValueDeclaration == nil || (name != "Blob" && name != "File") {
|
|
490
|
+
return false
|
|
491
|
+
}
|
|
492
|
+
declaration := symbol.ValueDeclaration
|
|
493
|
+
if declaration.Kind != nativeast.KindClassDeclaration && declaration.Kind != nativeast.KindVariableDeclaration {
|
|
494
|
+
return false
|
|
291
495
|
}
|
|
292
|
-
|
|
496
|
+
// @types/node 18/20 declare these constructor values as classes and 25
|
|
497
|
+
// declares merged interface/var pairs. The value declaration and exact core
|
|
498
|
+
// module together distinguish those runtime constructors from structural
|
|
499
|
+
// same-name interfaces without depending on node_modules placement, custom
|
|
500
|
+
// typeRoots, symlink targets, or virtualized package paths.
|
|
501
|
+
return metadata_node_in_node_buffer_module(declaration)
|
|
293
502
|
}
|
|
294
503
|
|
|
295
504
|
func metadata_is_internal(symbol *nativeast.Symbol) bool {
|