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
|
@@ -154,8 +154,9 @@ func (llmSchemaProgrammerNamespace) Validate(props struct {
|
|
|
154
154
|
}
|
|
155
155
|
}
|
|
156
156
|
}
|
|
157
|
-
//
|
|
158
|
-
// exclude tag compiles to
|
|
157
|
+
// The strict schema subset typia emits has no `not` keyword, which is what
|
|
158
|
+
// the exclude tag compiles to, so an exclude tag has no representation here
|
|
159
|
+
// and is rejected.
|
|
159
160
|
excluded := false
|
|
160
161
|
scan := func(matrix [][]schemametadata.IMetadataTypeTag) {
|
|
161
162
|
for _, row := range matrix {
|
|
@@ -318,7 +319,7 @@ func llmSchemaProgrammer_convert_schema_config(schema nativeiterate.JsonSchema,
|
|
|
318
319
|
defs[key] = llmSchemaProgrammer_convert_schema_config(target, components, defs, config)
|
|
319
320
|
}
|
|
320
321
|
}
|
|
321
|
-
union = append(union, map[string]any{"$ref":
|
|
322
|
+
union = append(union, map[string]any{"$ref": llmSchemaProgrammer_encode_reference(key)})
|
|
322
323
|
return
|
|
323
324
|
}
|
|
324
325
|
if input["type"] == "object" {
|
|
@@ -643,6 +644,23 @@ func llmSchemaProgrammer_ref_key(ref string) string {
|
|
|
643
644
|
return ref[index+1:]
|
|
644
645
|
}
|
|
645
646
|
|
|
647
|
+
func llmSchemaProgrammer_encode_reference(key string) string {
|
|
648
|
+
token := strings.NewReplacer("~", "~0", "/", "~1").Replace(key)
|
|
649
|
+
var output strings.Builder
|
|
650
|
+
output.WriteString("#/$defs/")
|
|
651
|
+
for _, value := range []byte(token) {
|
|
652
|
+
if (value >= 'A' && value <= 'Z') ||
|
|
653
|
+
(value >= 'a' && value <= 'z') ||
|
|
654
|
+
(value >= '0' && value <= '9') ||
|
|
655
|
+
strings.ContainsRune("-_.!~*'()", rune(value)) {
|
|
656
|
+
output.WriteByte(value)
|
|
657
|
+
} else {
|
|
658
|
+
fmt.Fprintf(&output, "%%%02X", value)
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
return output.String()
|
|
662
|
+
}
|
|
663
|
+
|
|
646
664
|
func llmSchemaProgrammer_component(components *nativeiterate.OpenApi_IComponents, key string) (nativeiterate.JsonSchema, bool) {
|
|
647
665
|
if components == nil || components.Schemas == nil {
|
|
648
666
|
return nil, false
|
|
@@ -677,7 +695,7 @@ func llmSchemaProgrammer_discriminator(schema nativeiterate.JsonSchema, union []
|
|
|
677
695
|
if rawMapping, ok := llmSchemaProgrammer_schema_map(discriminator["mapping"]); ok {
|
|
678
696
|
mapping := map[string]any{}
|
|
679
697
|
for key, value := range rawMapping {
|
|
680
|
-
mapping[key] =
|
|
698
|
+
mapping[key] = llmSchemaProgrammer_encode_reference(llmSchemaProgrammer_ref_key(fmt.Sprint(value)))
|
|
681
699
|
}
|
|
682
700
|
output["mapping"] = mapping
|
|
683
701
|
}
|
|
@@ -712,14 +730,13 @@ func llmSchemaProgrammer_shift_numeric(schema map[string]any) map[string]any {
|
|
|
712
730
|
output := llmSchemaProgrammer_clone(schema)
|
|
713
731
|
llmSchemaProgrammer_emend_exclusive(output)
|
|
714
732
|
tags := []string{}
|
|
715
|
-
for _, key := range []string{"minimum", "maximum", "exclusiveMinimum", "exclusiveMaximum", "multipleOf"} {
|
|
733
|
+
for _, key := range []string{"minimum", "maximum", "exclusiveMinimum", "exclusiveMaximum", "multipleOf", "default"} {
|
|
716
734
|
if value, ok := output[key]; ok {
|
|
717
735
|
tags = append(tags, "@"+key+" "+fmt.Sprint(value))
|
|
718
736
|
delete(output, key)
|
|
719
737
|
}
|
|
720
738
|
}
|
|
721
739
|
llmSchemaProgrammer_write_tag_with_description(output, tags)
|
|
722
|
-
delete(output, "default")
|
|
723
740
|
return output
|
|
724
741
|
}
|
|
725
742
|
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
package llm
|
|
2
|
+
|
|
3
|
+
import "testing"
|
|
4
|
+
|
|
5
|
+
// TestLlmReferenceCodec locks JSON Pointer token escaping before URI-fragment encoding.
|
|
6
|
+
func TestLlmReferenceCodec(t *testing.T) {
|
|
7
|
+
t.Parallel()
|
|
8
|
+
cases := map[string]string{
|
|
9
|
+
"Plain": "#/$defs/Plain",
|
|
10
|
+
"": "#/$defs/",
|
|
11
|
+
"A/B": "#/$defs/A~1B",
|
|
12
|
+
"T~N": "#/$defs/T~0N",
|
|
13
|
+
"A~/B": "#/$defs/A~0~1B",
|
|
14
|
+
"~1": "#/$defs/~01",
|
|
15
|
+
"A B": "#/$defs/A%20B",
|
|
16
|
+
"C%D": "#/$defs/C%25D",
|
|
17
|
+
"Café": "#/$defs/Caf%C3%A9",
|
|
18
|
+
}
|
|
19
|
+
for key, expected := range cases {
|
|
20
|
+
if actual := llmSchemaProgrammer_encode_reference(key); actual != expected {
|
|
21
|
+
t.Fatalf("encode %q: expected %q, got %q", key, expected, actual)
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
@@ -3,6 +3,7 @@ package notations
|
|
|
3
3
|
import (
|
|
4
4
|
"fmt"
|
|
5
5
|
"strings"
|
|
6
|
+
"unicode/utf8"
|
|
6
7
|
|
|
7
8
|
shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
8
9
|
shimchecker "github.com/microsoft/typescript-go/shim/checker"
|
|
@@ -14,6 +15,8 @@ import (
|
|
|
14
15
|
nativeinternal "github.com/samchon/typia/packages/typia/native/core/programmers/internal"
|
|
15
16
|
nativeiterate "github.com/samchon/typia/packages/typia/native/core/programmers/iterate"
|
|
16
17
|
schemametadata "github.com/samchon/typia/packages/typia/native/core/schemas/metadata"
|
|
18
|
+
"golang.org/x/text/cases"
|
|
19
|
+
"golang.org/x/text/language"
|
|
17
20
|
)
|
|
18
21
|
|
|
19
22
|
type notationGeneralProgrammerNamespace struct{}
|
|
@@ -1017,7 +1020,26 @@ func notationGeneralProgrammer_configure(props struct {
|
|
|
1017
1020
|
},
|
|
1018
1021
|
Joiner: func(next nativeinternal.FeatureProgrammer_ObjectorJoinerProps) *shimast.Node {
|
|
1019
1022
|
return nativehelpers.NotationJoiner.Object(nativehelpers.NotationJoiner_ObjectProps{
|
|
1020
|
-
Rename:
|
|
1023
|
+
Rename: props.Rename.Func,
|
|
1024
|
+
DynamicRename: func() *shimast.Node {
|
|
1025
|
+
return notationGeneralProgrammer_internal(props.Context, "notation"+notationGeneralProgrammer_capitalize(props.Rename.Name))
|
|
1026
|
+
},
|
|
1027
|
+
DynamicAssign: func() *shimast.Node {
|
|
1028
|
+
return notationGeneralProgrammer_internal(props.Context, "notationAssign")
|
|
1029
|
+
},
|
|
1030
|
+
ThrowCollision: func(first string, second string, destination string) *shimast.Node {
|
|
1031
|
+
return f.NewCallExpression(
|
|
1032
|
+
notationGeneralProgrammer_internal(props.Context, "notationKeyCollision"),
|
|
1033
|
+
nil,
|
|
1034
|
+
nil,
|
|
1035
|
+
f.NewNodeList([]*shimast.Node{
|
|
1036
|
+
f.NewStringLiteral(first, shimast.TokenFlagsNone),
|
|
1037
|
+
f.NewStringLiteral(second, shimast.TokenFlagsNone),
|
|
1038
|
+
f.NewStringLiteral(destination, shimast.TokenFlagsNone),
|
|
1039
|
+
}),
|
|
1040
|
+
shimast.NodeFlagsNone,
|
|
1041
|
+
)
|
|
1042
|
+
},
|
|
1021
1043
|
Input: next.Input,
|
|
1022
1044
|
Entries: next.Entries,
|
|
1023
1045
|
Emit: props.Context.Emit,
|
|
@@ -1320,51 +1342,154 @@ var NotationGeneralProgrammer_Pascal = NotationGeneralProgrammer_IRename{Name: "
|
|
|
1320
1342
|
var NotationGeneralProgrammer_Snake = NotationGeneralProgrammer_IRename{Name: "snake", Func: notationGeneralProgrammer_snake}
|
|
1321
1343
|
var NotationGeneralProgrammer_Kebab = NotationGeneralProgrammer_IRename{Name: "kebab", Func: notationGeneralProgrammer_kebab}
|
|
1322
1344
|
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1345
|
+
// notationGeneralProgrammer_toUpper and notationGeneralProgrammer_toLower
|
|
1346
|
+
// reproduce JavaScript's `String.prototype.toUpperCase` / `toLowerCase`, which
|
|
1347
|
+
// is the case operation the runtime helpers (`_notationCamel`,
|
|
1348
|
+
// `_notationPascal`, `_notationSnake`) and the `CamelCase<T>` / `PascalCase<T>`
|
|
1349
|
+
// typings both apply. JavaScript performs Unicode *full* case conversion, while
|
|
1350
|
+
// `strings.ToUpper` / `strings.ToLower` perform the *simple* per-rune mapping,
|
|
1351
|
+
// so the two disagree wherever a code point maps to a different number of code
|
|
1352
|
+
// points or depends on context: `ß` -> `SS`, `İ` -> `i` + U+0307, `fi` -> `FI`,
|
|
1353
|
+
// and the word-final sigma `ΑΣ` -> `ας`. Emitting a key through the simple
|
|
1354
|
+
// mapping would make the compile-time emit disagree with the runtime helper and
|
|
1355
|
+
// with the declared `*Case<T>` return type. `language.Und` selects the
|
|
1356
|
+
// locale-independent root mapping, matching JavaScript's locale-independent
|
|
1357
|
+
// `toUpperCase` / `toLowerCase` (as opposed to `toLocaleUpperCase`).
|
|
1358
|
+
//
|
|
1359
|
+
// A `cases.Caser` carries mutable state and must not be shared across
|
|
1360
|
+
// goroutines, so each call builds its own; notation renaming runs once per
|
|
1361
|
+
// object key at compile time, not on a hot path.
|
|
1362
|
+
func notationGeneralProgrammer_toUpper(str string) string {
|
|
1363
|
+
return cases.Upper(language.Und).String(str)
|
|
1338
1364
|
}
|
|
1339
1365
|
|
|
1340
|
-
func
|
|
1341
|
-
return
|
|
1342
|
-
if value == "" {
|
|
1343
|
-
return value
|
|
1344
|
-
}
|
|
1345
|
-
return strings.ToUpper(value[:1]) + value[1:]
|
|
1346
|
-
}, func(value string, index int) string {
|
|
1347
|
-
return notationGeneralProgrammer_capitalize(value)
|
|
1348
|
-
})
|
|
1366
|
+
func notationGeneralProgrammer_toLower(str string) string {
|
|
1367
|
+
return cases.Lower(language.Und).String(str)
|
|
1349
1368
|
}
|
|
1350
1369
|
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1370
|
+
// notationGeneralProgrammer_head splits str after the character a JavaScript
|
|
1371
|
+
// `str[0]` expression addresses, returning that head and the remainder.
|
|
1372
|
+
//
|
|
1373
|
+
// The runtime helpers and the `*Case<T>` typings capitalize a key by indexing
|
|
1374
|
+
// its first character, so the emit has to slice at the same boundary. Slicing
|
|
1375
|
+
// by byte (`str[:1]`) instead splits a multi-byte UTF-8 rune and hands a lone
|
|
1376
|
+
// lead byte to the case operation, which cannot decode it and substitutes
|
|
1377
|
+
// U+FFFD — `École` was emitted as `��cole`.
|
|
1378
|
+
func notationGeneralProgrammer_head(str string) (string, string) {
|
|
1379
|
+
_, size := utf8.DecodeRuneInString(str)
|
|
1380
|
+
return str[:size], str[size:]
|
|
1381
|
+
}
|
|
1382
|
+
|
|
1383
|
+
// notationGeneralProgrammer_upperHead and notationGeneralProgrammer_lowerHead
|
|
1384
|
+
// case-convert a head produced by notationGeneralProgrammer_head the way
|
|
1385
|
+
// `str[0].toUpperCase()` / `str[0].toLowerCase()` does.
|
|
1386
|
+
//
|
|
1387
|
+
// JavaScript indexes a string by UTF-16 code unit, so `str[0]` of an astral
|
|
1388
|
+
// character is its lone high surrogate, and no case mapping applies to an
|
|
1389
|
+
// unpaired surrogate. Such a head is therefore returned verbatim rather than
|
|
1390
|
+
// case-mapped, which is what keeps a Deseret or Adlam key stable across the
|
|
1391
|
+
// emit, the runtime helper, and the type.
|
|
1392
|
+
func notationGeneralProgrammer_upperHead(head string) string {
|
|
1393
|
+
if r, _ := utf8.DecodeRuneInString(head); r > 0xFFFF {
|
|
1394
|
+
return head
|
|
1395
|
+
}
|
|
1396
|
+
return notationGeneralProgrammer_toUpper(head)
|
|
1397
|
+
}
|
|
1398
|
+
|
|
1399
|
+
func notationGeneralProgrammer_lowerHead(head string) string {
|
|
1400
|
+
if r, _ := utf8.DecodeRuneInString(head); r > 0xFFFF {
|
|
1401
|
+
return head
|
|
1354
1402
|
}
|
|
1403
|
+
return notationGeneralProgrammer_toLower(head)
|
|
1404
|
+
}
|
|
1405
|
+
|
|
1406
|
+
// notationGeneralProgrammer_rename is the shared outer walk for the
|
|
1407
|
+
// camel/pascal notations. It mirrors the `CamelCase<T>` / `PascalCase<T>`
|
|
1408
|
+
// typings: leading underscores are preserved verbatim, an all-underscore key
|
|
1409
|
+
// stays untouched, and the presence of any remaining underscore — not the
|
|
1410
|
+
// number of non-empty segments — selects the snake conversion. Routing on
|
|
1411
|
+
// underscore presence keeps a trailing or doubled underscore (`fooBar_`) on the
|
|
1412
|
+
// same path the type takes, instead of collapsing it to the plain path.
|
|
1413
|
+
func notationGeneralProgrammer_rename(str string, plain func(string) string, snake func(string) string) string {
|
|
1355
1414
|
prefix := ""
|
|
1356
1415
|
for len(str) != 0 && str[0] == '_' {
|
|
1357
1416
|
prefix += "_"
|
|
1358
1417
|
str = str[1:]
|
|
1359
1418
|
}
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1419
|
+
if str == "" {
|
|
1420
|
+
return prefix
|
|
1421
|
+
}
|
|
1422
|
+
if strings.Contains(str, "_") {
|
|
1423
|
+
return prefix + snake(str)
|
|
1424
|
+
}
|
|
1425
|
+
return prefix + plain(str)
|
|
1426
|
+
}
|
|
1427
|
+
|
|
1428
|
+
func notationGeneralProgrammer_camel(str string) string {
|
|
1429
|
+
return notationGeneralProgrammer_rename(str, func(value string) string {
|
|
1430
|
+
if value == notationGeneralProgrammer_toUpper(value) {
|
|
1431
|
+
return notationGeneralProgrammer_toLower(value)
|
|
1365
1432
|
}
|
|
1366
|
-
|
|
1433
|
+
head, tail := notationGeneralProgrammer_head(value)
|
|
1434
|
+
return notationGeneralProgrammer_lowerHead(head) + tail
|
|
1435
|
+
}, notationGeneralProgrammer_camel_snake)
|
|
1436
|
+
}
|
|
1437
|
+
|
|
1438
|
+
// notationGeneralProgrammer_camel_snake mirrors `CamelizeSnakeString`: the
|
|
1439
|
+
// character after each underscore is uppercased and everything else lowercased.
|
|
1440
|
+
// A trailing underscore leaves no character to uppercase, so the whole key is
|
|
1441
|
+
// lowercased; a doubled underscore collapses to a single one before continuing.
|
|
1442
|
+
func notationGeneralProgrammer_camel_snake(str string) string {
|
|
1443
|
+
for len(str) != 0 && str[0] == '_' {
|
|
1444
|
+
str = str[1:]
|
|
1445
|
+
}
|
|
1446
|
+
if str == "" {
|
|
1447
|
+
return ""
|
|
1367
1448
|
}
|
|
1449
|
+
index := strings.IndexByte(str, '_')
|
|
1450
|
+
if index < 0 || index+1 >= len(str) {
|
|
1451
|
+
return notationGeneralProgrammer_toLower(str)
|
|
1452
|
+
}
|
|
1453
|
+
if str[index+1] == '_' {
|
|
1454
|
+
return notationGeneralProgrammer_camel_snake(str[:index] + "_" + str[index+2:])
|
|
1455
|
+
}
|
|
1456
|
+
// The character after the underscore is one whole rune, not one byte; `_` is
|
|
1457
|
+
// ASCII so it never falls inside a multi-byte sequence and `index` stays a
|
|
1458
|
+
// valid boundary.
|
|
1459
|
+
middle, rest := notationGeneralProgrammer_head(str[index+1:])
|
|
1460
|
+
return notationGeneralProgrammer_toLower(str[:index]) + notationGeneralProgrammer_upperHead(middle) + notationGeneralProgrammer_camel_snake(rest)
|
|
1461
|
+
}
|
|
1462
|
+
|
|
1463
|
+
func notationGeneralProgrammer_pascal(str string) string {
|
|
1464
|
+
return notationGeneralProgrammer_rename(str, func(value string) string {
|
|
1465
|
+
head, tail := notationGeneralProgrammer_head(value)
|
|
1466
|
+
return notationGeneralProgrammer_upperHead(head) + tail
|
|
1467
|
+
}, notationGeneralProgrammer_pascal_snake)
|
|
1468
|
+
}
|
|
1469
|
+
|
|
1470
|
+
// notationGeneralProgrammer_pascal_snake mirrors `PascalizeSnakeString`: each
|
|
1471
|
+
// underscore-delimited segment is capitalized and its tail lowercased
|
|
1472
|
+
// (`MAX_COUNT` -> `MaxCount`), with a trailing underscore dropped.
|
|
1473
|
+
func notationGeneralProgrammer_pascal_snake(str string) string {
|
|
1474
|
+
for len(str) != 0 && str[0] == '_' {
|
|
1475
|
+
str = str[1:]
|
|
1476
|
+
}
|
|
1477
|
+
if str == "" {
|
|
1478
|
+
return ""
|
|
1479
|
+
}
|
|
1480
|
+
head, tail := notationGeneralProgrammer_head(str)
|
|
1481
|
+
index := strings.IndexByte(str, '_')
|
|
1482
|
+
if index < 0 {
|
|
1483
|
+
return notationGeneralProgrammer_upperHead(head) + notationGeneralProgrammer_toLower(tail)
|
|
1484
|
+
}
|
|
1485
|
+
// `index` counts bytes from the start of `str`; the tail it delimits starts
|
|
1486
|
+
// after the whole leading rune, hence the `len(head)` offset.
|
|
1487
|
+
return notationGeneralProgrammer_upperHead(head) + notationGeneralProgrammer_toLower(tail[:index-len(head)]) + notationGeneralProgrammer_pascal_snake(str[index+1:])
|
|
1488
|
+
}
|
|
1489
|
+
|
|
1490
|
+
// notationGeneralProgrammer_snake_word runs the case-boundary walk over one
|
|
1491
|
+
// underscore-free segment, inserting a separator at every camelCase boundary.
|
|
1492
|
+
func notationGeneralProgrammer_snake_word(str string) string {
|
|
1368
1493
|
indexes := []int{}
|
|
1369
1494
|
for i := 0; i < len(str); i++ {
|
|
1370
1495
|
code := str[i]
|
|
@@ -1383,7 +1508,7 @@ func notationGeneralProgrammer_snake(str string) string {
|
|
|
1383
1508
|
indexes = indexes[1:]
|
|
1384
1509
|
}
|
|
1385
1510
|
if len(indexes) == 0 {
|
|
1386
|
-
return
|
|
1511
|
+
return notationGeneralProgrammer_toLower(str)
|
|
1387
1512
|
}
|
|
1388
1513
|
ret := ""
|
|
1389
1514
|
for i, last := range indexes {
|
|
@@ -1391,11 +1516,31 @@ func notationGeneralProgrammer_snake(str string) string {
|
|
|
1391
1516
|
if i != 0 {
|
|
1392
1517
|
first = indexes[i-1]
|
|
1393
1518
|
}
|
|
1394
|
-
ret +=
|
|
1519
|
+
ret += notationGeneralProgrammer_toLower(str[first:last])
|
|
1395
1520
|
ret += "_"
|
|
1396
1521
|
}
|
|
1397
|
-
ret +=
|
|
1398
|
-
return
|
|
1522
|
+
ret += notationGeneralProgrammer_toLower(str[indexes[len(indexes)-1]:])
|
|
1523
|
+
return ret
|
|
1524
|
+
}
|
|
1525
|
+
|
|
1526
|
+
func notationGeneralProgrammer_snake(str string) string {
|
|
1527
|
+
if str == "" {
|
|
1528
|
+
return str
|
|
1529
|
+
}
|
|
1530
|
+
prefix := ""
|
|
1531
|
+
for len(str) != 0 && str[0] == '_' {
|
|
1532
|
+
prefix += "_"
|
|
1533
|
+
str = str[1:]
|
|
1534
|
+
}
|
|
1535
|
+
// Run the case-boundary walk within each underscore-delimited segment, not
|
|
1536
|
+
// over the whole segment at once. Lowercasing a segment atomically would drop
|
|
1537
|
+
// the camelCase boundary inside it (`fooBar_baz` -> `foobar_baz`), diverging
|
|
1538
|
+
// from `SnakeCase<T>`; the per-segment walk keeps it (`foo_bar_baz`).
|
|
1539
|
+
segments := strings.Split(str, "_")
|
|
1540
|
+
for i, segment := range segments {
|
|
1541
|
+
segments[i] = notationGeneralProgrammer_snake_word(segment)
|
|
1542
|
+
}
|
|
1543
|
+
return prefix + strings.Join(segments, "_")
|
|
1399
1544
|
}
|
|
1400
1545
|
|
|
1401
1546
|
// notationGeneralProgrammer_kebab derives the snake_case form first and then
|
|
@@ -1410,32 +1555,3 @@ func notationGeneralProgrammer_kebab(str string) string {
|
|
|
1410
1555
|
}
|
|
1411
1556
|
return prefix + strings.ReplaceAll(snaked, "_", "-")
|
|
1412
1557
|
}
|
|
1413
|
-
|
|
1414
|
-
func notationGeneralProgrammer_unsnake(str string, plain func(string) string, snake func(string, int) string) string {
|
|
1415
|
-
prefix := ""
|
|
1416
|
-
for len(str) != 0 && str[0] == '_' {
|
|
1417
|
-
prefix += "_"
|
|
1418
|
-
str = str[1:]
|
|
1419
|
-
}
|
|
1420
|
-
out := func(value string) string { return prefix + value }
|
|
1421
|
-
if str == "" {
|
|
1422
|
-
return out("")
|
|
1423
|
-
}
|
|
1424
|
-
raw := strings.Split(str, "_")
|
|
1425
|
-
items := []string{}
|
|
1426
|
-
for _, item := range raw {
|
|
1427
|
-
if item != "" {
|
|
1428
|
-
items = append(items, item)
|
|
1429
|
-
}
|
|
1430
|
-
}
|
|
1431
|
-
if len(items) == 0 {
|
|
1432
|
-
return out("")
|
|
1433
|
-
}
|
|
1434
|
-
if len(items) == 1 {
|
|
1435
|
-
return out(plain(items[0]))
|
|
1436
|
-
}
|
|
1437
|
-
for i, item := range items {
|
|
1438
|
-
items[i] = snake(item, i)
|
|
1439
|
-
}
|
|
1440
|
-
return out(strings.Join(items, ""))
|
|
1441
|
-
}
|
|
@@ -43,9 +43,7 @@ func TestNotationGeneralHelpers(t *testing.T) {
|
|
|
43
43
|
{NotationGeneralProgrammer_Snake.Func("helloWorldAgain"), "hello_world_again"},
|
|
44
44
|
{NotationGeneralProgrammer_Snake.Func("XMLHttp"), "xmlhttp"},
|
|
45
45
|
{NotationGeneralProgrammer_Snake.Func("__"), "__"},
|
|
46
|
-
{
|
|
47
|
-
return strings.ToUpper(value)
|
|
48
|
-
}), "__"},
|
|
46
|
+
{notationGeneralProgrammer_rename("__", strings.ToLower, strings.ToUpper), "__"},
|
|
49
47
|
}
|
|
50
48
|
for _, c := range cases {
|
|
51
49
|
if c.actual != c.expected {
|
package/native/core/programmers/notations/notation_general_programmer_pascal_multiword_test.go
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
package notations
|
|
2
|
+
|
|
3
|
+
import "testing"
|
|
4
|
+
|
|
5
|
+
// TestNotationGeneralProgrammerPascalMultiword verifies pascal tail lowercasing.
|
|
6
|
+
//
|
|
7
|
+
// Issue #2183: the pascal multi-word callback capitalized each word without
|
|
8
|
+
// first lowercasing its tail, so a word carrying uppercase inner characters
|
|
9
|
+
// (`MAX`, `HTTP`) kept them and `MAX_COUNT` emitted `MAXCOUNT`. That diverged
|
|
10
|
+
// from the runtime `_notationPascal` helper (`__notationCapitalize` = upper
|
|
11
|
+
// first character, lowercase the rest) and from the declared `PascalCase<T>`
|
|
12
|
+
// type, leaving `.MaxCount` undefined on the compile-time result. The sibling
|
|
13
|
+
// `camel` callback already lowercased the tail, so pascal was the sole outlier.
|
|
14
|
+
// The single-word `plain` path (`userID` -> `UserID`, `ID` -> `ID`, tail kept)
|
|
15
|
+
// must stay untouched, because single words are dispatched to `plain` rather
|
|
16
|
+
// than the multi-word callback.
|
|
17
|
+
//
|
|
18
|
+
// 1. Pascalize multi-word keys whose non-leading words carry uppercase or
|
|
19
|
+
// mixed-case characters, plus digits and a leading underscore, and match
|
|
20
|
+
// the `PascalCase<T>` / `_notationPascal` oracle.
|
|
21
|
+
// 2. Confirm single-word keys still route through `plain` unchanged.
|
|
22
|
+
// 3. Confirm camel, snake, and kebab of the same keys are unaffected.
|
|
23
|
+
func TestNotationGeneralProgrammerPascalMultiword(t *testing.T) {
|
|
24
|
+
pascal := []struct{ input, expected string }{
|
|
25
|
+
// Multi-word: every word becomes upper-first + lower-rest, byte-equal to
|
|
26
|
+
// `_notationPascal` and assignable to `PascalCase<T>`.
|
|
27
|
+
{"MAX_COUNT", "MaxCount"},
|
|
28
|
+
{"HTTP_PORT", "HttpPort"},
|
|
29
|
+
{"USER_ID", "UserId"},
|
|
30
|
+
{"user_name", "UserName"},
|
|
31
|
+
{"fooBar_baz", "FoobarBaz"},
|
|
32
|
+
{"HTTP2_PORT", "Http2Port"},
|
|
33
|
+
{"MAX_COUNT_2", "MaxCount2"},
|
|
34
|
+
{"_MAX_COUNT", "_MaxCount"},
|
|
35
|
+
{"a_b_c", "ABC"},
|
|
36
|
+
// Single word: routed through `plain`, tail preserved — unchanged by the fix.
|
|
37
|
+
{"userID", "UserID"},
|
|
38
|
+
{"ID", "ID"},
|
|
39
|
+
{"MAX", "MAX"},
|
|
40
|
+
{"html5Parser", "Html5Parser"},
|
|
41
|
+
{"FirstName", "FirstName"},
|
|
42
|
+
{"_internal", "_Internal"},
|
|
43
|
+
{"XMLParser", "XMLParser"},
|
|
44
|
+
}
|
|
45
|
+
for _, c := range pascal {
|
|
46
|
+
if actual := NotationGeneralProgrammer_Pascal.Func(c.input); actual != c.expected {
|
|
47
|
+
t.Errorf("pascal(%q) == %q, expected %q", c.input, actual, c.expected)
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// The fix touches pascal only; camel/snake/kebab of the same multi-word
|
|
52
|
+
// witnesses already lowercased the tail and must stay byte-for-byte the same.
|
|
53
|
+
siblings := []struct {
|
|
54
|
+
input, camel, snake, kebab string
|
|
55
|
+
}{
|
|
56
|
+
{"MAX_COUNT", "maxCount", "max_count", "max-count"},
|
|
57
|
+
{"HTTP_PORT", "httpPort", "http_port", "http-port"},
|
|
58
|
+
{"USER_ID", "userId", "user_id", "user-id"},
|
|
59
|
+
{"_MAX_COUNT", "_maxCount", "_max_count", "_max-count"},
|
|
60
|
+
}
|
|
61
|
+
for _, c := range siblings {
|
|
62
|
+
if actual := NotationGeneralProgrammer_Camel.Func(c.input); actual != c.camel {
|
|
63
|
+
t.Errorf("camel(%q) == %q, expected %q", c.input, actual, c.camel)
|
|
64
|
+
}
|
|
65
|
+
if actual := NotationGeneralProgrammer_Snake.Func(c.input); actual != c.snake {
|
|
66
|
+
t.Errorf("snake(%q) == %q, expected %q", c.input, actual, c.snake)
|
|
67
|
+
}
|
|
68
|
+
if actual := NotationGeneralProgrammer_Kebab.Func(c.input); actual != c.kebab {
|
|
69
|
+
t.Errorf("kebab(%q) == %q, expected %q", c.input, actual, c.kebab)
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
package/native/core/programmers/notations/notation_general_programmer_underscore_boundary_test.go
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
package notations
|
|
2
|
+
|
|
3
|
+
import "testing"
|
|
4
|
+
|
|
5
|
+
// TestNotationGeneralProgrammerUnderscoreBoundary pins the snake/kebab/camel/
|
|
6
|
+
// pascal compile-time emit against the `SnakeCase`/`KebabCase`/`CamelCase`/
|
|
7
|
+
// `PascalCase` type oracle on keys that mix an underscore with a case boundary.
|
|
8
|
+
//
|
|
9
|
+
// Issue #2190: when a key combined an internal or trailing underscore with a
|
|
10
|
+
// camelCase boundary, `snake`/`kebab` lowercased each underscore-delimited
|
|
11
|
+
// segment atomically (`fooBar_baz` -> `foobar_baz`) instead of walking the case
|
|
12
|
+
// boundary inside the segment, and `camel`/`pascal` collapsed a trailing
|
|
13
|
+
// underscore onto the underscore-free path (`fooBar_` -> `FooBar`). Both
|
|
14
|
+
// disagreed with the declared `*Case<T>` type, so reading the declared key was
|
|
15
|
+
// `undefined`. The expected values below are the type-oracle output, obtained by
|
|
16
|
+
// revealing `keyof *Case<{ key: 1 }>` through the compiler.
|
|
17
|
+
//
|
|
18
|
+
// 1. Convert the underscore+case-boundary witnesses under every notation.
|
|
19
|
+
// 2. Assert each equals the `*Case<T>` value byte for byte.
|
|
20
|
+
// 3. Re-cover underscore-free and all-caps-segment keys so the boundary walk
|
|
21
|
+
// did not regress them (`userID`, `XMLParser`, `MAX_COUNT`, #2186's pascal).
|
|
22
|
+
func TestNotationGeneralProgrammerUnderscoreBoundary(t *testing.T) {
|
|
23
|
+
type row struct {
|
|
24
|
+
input string
|
|
25
|
+
snake string
|
|
26
|
+
kebab string
|
|
27
|
+
camel string
|
|
28
|
+
pascal string
|
|
29
|
+
}
|
|
30
|
+
rows := []row{
|
|
31
|
+
// issue matrix
|
|
32
|
+
{"fooBar_baz", "foo_bar_baz", "foo-bar-baz", "foobarBaz", "FoobarBaz"},
|
|
33
|
+
{"openAI_key", "open_ai_key", "open-ai-key", "openaiKey", "OpenaiKey"},
|
|
34
|
+
{"HTTP_fooBar", "http_foo_bar", "http-foo-bar", "httpFoobar", "HttpFoobar"},
|
|
35
|
+
{"fooBar", "foo_bar", "foo-bar", "fooBar", "FooBar"},
|
|
36
|
+
{"fooBar_", "foo_bar_", "foo-bar-", "foobar_", "Foobar"},
|
|
37
|
+
{"_fooBar", "_foo_bar", "_foo-bar", "_fooBar", "_FooBar"},
|
|
38
|
+
{"userID", "user_id", "user-id", "userID", "UserID"},
|
|
39
|
+
{"a_b_c", "a_b_c", "a-b-c", "aBc", "ABC"},
|
|
40
|
+
{"MAX_COUNT", "max_count", "max-count", "maxCount", "MaxCount"},
|
|
41
|
+
// boundary edges
|
|
42
|
+
{"_fooBar_", "_foo_bar_", "_foo-bar-", "_foobar_", "_Foobar"},
|
|
43
|
+
{"fooBarBaz_", "foo_bar_baz_", "foo-bar-baz-", "foobarbaz_", "Foobarbaz"},
|
|
44
|
+
{"foo__bar", "foo__bar", "foo--bar", "fooBar", "FooBar"},
|
|
45
|
+
{"userID_", "user_id_", "user-id-", "userid_", "Userid"},
|
|
46
|
+
{"HTTP_", "http_", "http-", "http_", "Http"},
|
|
47
|
+
// regressions that must stay unchanged (no underscore / all-caps segment)
|
|
48
|
+
{"XMLParser", "xmlparser", "xmlparser", "xMLParser", "XMLParser"},
|
|
49
|
+
{"toHTML", "to_html", "to-html", "toHTML", "ToHTML"},
|
|
50
|
+
{"html5Parser", "html5_parser", "html5-parser", "html5Parser", "Html5Parser"},
|
|
51
|
+
{"iOS", "i_os", "i-os", "iOS", "IOS"},
|
|
52
|
+
{"HTTP_PORT", "http_port", "http-port", "httpPort", "HttpPort"},
|
|
53
|
+
}
|
|
54
|
+
for _, c := range rows {
|
|
55
|
+
if actual := NotationGeneralProgrammer_Snake.Func(c.input); actual != c.snake {
|
|
56
|
+
t.Errorf("snake(%q) == %q, expected %q", c.input, actual, c.snake)
|
|
57
|
+
}
|
|
58
|
+
if actual := NotationGeneralProgrammer_Kebab.Func(c.input); actual != c.kebab {
|
|
59
|
+
t.Errorf("kebab(%q) == %q, expected %q", c.input, actual, c.kebab)
|
|
60
|
+
}
|
|
61
|
+
if actual := NotationGeneralProgrammer_Camel.Func(c.input); actual != c.camel {
|
|
62
|
+
t.Errorf("camel(%q) == %q, expected %q", c.input, actual, c.camel)
|
|
63
|
+
}
|
|
64
|
+
if actual := NotationGeneralProgrammer_Pascal.Func(c.input); actual != c.pascal {
|
|
65
|
+
t.Errorf("pascal(%q) == %q, expected %q", c.input, actual, c.pascal)
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
@@ -571,7 +571,7 @@ func plainClassifyProgrammer_decode_tuple_inline(props plainClassifyProgrammer_d
|
|
|
571
571
|
explore := props.Explore
|
|
572
572
|
explore.From = "array"
|
|
573
573
|
explore.Postfix = postfix
|
|
574
|
-
|
|
574
|
+
value := plainClassifyProgrammer_decode(struct {
|
|
575
575
|
Context nativecontext.ITypiaContext
|
|
576
576
|
Config nativeinternal.FeatureProgrammer_IConfig
|
|
577
577
|
Functor *nativehelpers.FunctionProgrammer
|
|
@@ -585,7 +585,18 @@ func plainClassifyProgrammer_decode_tuple_inline(props plainClassifyProgrammer_d
|
|
|
585
585
|
Input: f.NewElementAccessExpression(props.Input, nil, nativefactories.ExpressionFactory.Number(index, props.Context.Emit), shimast.NodeFlagsNone),
|
|
586
586
|
Metadata: elem,
|
|
587
587
|
Explore: explore,
|
|
588
|
-
})
|
|
588
|
+
})
|
|
589
|
+
if elem.Optional {
|
|
590
|
+
// An omitted optional trailing element must not become a phantom
|
|
591
|
+
// `undefined`; gate it on presence so `classify(["a"])` stays `["a"]`.
|
|
592
|
+
value = nativehelpers.CloneJoiner.OptionalTupleElement(nativehelpers.CloneJoiner_OptionalElementProps{
|
|
593
|
+
Input: props.Input,
|
|
594
|
+
Value: value,
|
|
595
|
+
Index: index,
|
|
596
|
+
Emit: props.Context.Emit,
|
|
597
|
+
})
|
|
598
|
+
}
|
|
599
|
+
elements = append(elements, value)
|
|
589
600
|
}
|
|
590
601
|
var rest *shimast.Node
|
|
591
602
|
if len(props.Tuple.Elements) != 0 {
|
|
@@ -631,7 +642,7 @@ func plainClassifyProgrammer_decode_native(props struct {
|
|
|
631
642
|
}) *shimast.Node {
|
|
632
643
|
f := nativecontext.EmitFactoryOf(plainClassifyProgrammer_factory, props.Context.Emit)
|
|
633
644
|
switch props.Type {
|
|
634
|
-
case "Date", "Uint8Array", "Uint8ClampedArray", "Uint16Array", "Uint32Array", "BigUint64Array", "Int8Array", "Int16Array", "Int32Array", "BigInt64Array", "Float32Array", "Float64Array"
|
|
645
|
+
case "Date", "Uint8Array", "Uint8ClampedArray", "Uint16Array", "Uint32Array", "BigUint64Array", "Int8Array", "Int16Array", "Int32Array", "BigInt64Array", "Float32Array", "Float64Array":
|
|
635
646
|
return f.NewNewExpression(
|
|
636
647
|
f.NewIdentifier(props.Type),
|
|
637
648
|
nil,
|
|
@@ -639,11 +650,13 @@ func plainClassifyProgrammer_decode_native(props struct {
|
|
|
639
650
|
)
|
|
640
651
|
case "ArrayBuffer", "SharedArrayBuffer":
|
|
641
652
|
return plainClassifyProgrammer_decode_native_buffer(props.Type, props.Input, props.Context.Emit)
|
|
642
|
-
case "DataView":
|
|
643
|
-
return f.
|
|
644
|
-
|
|
653
|
+
case "DataView", "Blob", "File", "RegExp":
|
|
654
|
+
return f.NewCallExpression(
|
|
655
|
+
plainClassifyProgrammer_internal(props.Context, "plainCloneAny"),
|
|
656
|
+
nil,
|
|
645
657
|
nil,
|
|
646
|
-
f.NewNodeList([]*shimast.Node{
|
|
658
|
+
f.NewNodeList([]*shimast.Node{props.Input}),
|
|
659
|
+
shimast.NodeFlagsNone,
|
|
647
660
|
)
|
|
648
661
|
default:
|
|
649
662
|
return f.NewCallExpression(
|
|
@@ -1571,14 +1584,9 @@ func plainClassifyProgrammer_seed_type(checker *shimchecker.Checker, sig *shimch
|
|
|
1571
1584
|
// the tuple is rejected (nil = field-copy) when it is empty or any element after
|
|
1572
1585
|
// index 0 is REQUIRED — then `[] extends Rest` fails and ClassifiableSeed is
|
|
1573
1586
|
// `never`. GetTypeArguments / TargetTupleType require an object reference; the
|
|
1574
|
-
// IsTupleType caller guarantees that
|
|
1575
|
-
//
|
|
1576
|
-
func plainClassifyProgrammer_tuple_seed(checker *shimchecker.Checker, restParamT *shimchecker.Type)
|
|
1577
|
-
defer func() {
|
|
1578
|
-
if recover() != nil {
|
|
1579
|
-
seed = nil
|
|
1580
|
-
}
|
|
1581
|
-
}()
|
|
1587
|
+
// IsTupleType caller guarantees that capability. Any failure after that
|
|
1588
|
+
// precondition is an internal invariant violation and remains observable.
|
|
1589
|
+
func plainClassifyProgrammer_tuple_seed(checker *shimchecker.Checker, restParamT *shimchecker.Type) *shimchecker.Type {
|
|
1582
1590
|
args := checker.GetTypeArguments(restParamT)
|
|
1583
1591
|
if len(args) == 0 {
|
|
1584
1592
|
return nil // `[]` -> ClassifiableSeed is never -> field-copy
|