typia 13.1.1 → 13.1.19
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 +21 -0
- package/lib/executable/FileSystemIdentity.js +183 -0
- package/lib/executable/FileSystemIdentity.js.map +1 -0
- package/lib/executable/FileSystemIdentity.mjs +129 -0
- package/lib/executable/FileSystemIdentity.mjs.map +1 -0
- package/lib/executable/TypiaGenerateWizard.js +264 -104
- package/lib/executable/TypiaGenerateWizard.js.map +1 -1
- package/lib/executable/TypiaGenerateWizard.mjs +233 -93
- 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 +17 -0
- package/lib/internal/_ProtobufReader.js +117 -45
- package/lib/internal/_ProtobufReader.js.map +1 -1
- package/lib/internal/_ProtobufReader.mjs +108 -39
- 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/_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 +2 -1
- package/lib/internal/_randomFormatByte.js.map +1 -1
- package/lib/internal/_randomFormatByte.mjs +2 -1
- package/lib/internal/_randomFormatByte.mjs.map +1 -1
- package/lib/internal/_randomFormatDate.d.ts +2 -0
- package/lib/internal/_randomFormatDate.js +3 -2
- package/lib/internal/_randomFormatDate.js.map +1 -1
- package/lib/internal/_randomFormatDate.mjs +3 -2
- package/lib/internal/_randomFormatDate.mjs.map +1 -1
- package/lib/internal/_randomFormatDatetime.d.ts +2 -0
- package/lib/internal/_randomFormatDatetime.js +3 -2
- package/lib/internal/_randomFormatDatetime.js.map +1 -1
- package/lib/internal/_randomFormatDatetime.mjs +3 -2
- package/lib/internal/_randomFormatDatetime.mjs.map +1 -1
- package/lib/internal/_randomFormatDuration.d.ts +2 -1
- package/lib/internal/_randomFormatDuration.js +3 -2
- package/lib/internal/_randomFormatDuration.js.map +1 -1
- package/lib/internal/_randomFormatDuration.mjs +3 -2
- 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 +2 -1
- package/lib/internal/_randomFormatIpv4.js.map +1 -1
- package/lib/internal/_randomFormatIpv4.mjs +2 -1
- package/lib/internal/_randomFormatIpv4.mjs.map +1 -1
- package/lib/internal/_randomFormatIpv6.d.ts +2 -1
- package/lib/internal/_randomFormatIpv6.js +2 -1
- package/lib/internal/_randomFormatIpv6.js.map +1 -1
- package/lib/internal/_randomFormatIpv6.mjs +2 -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 +8 -1
- package/lib/internal/_randomFormatJsonPointer.js.map +1 -1
- package/lib/internal/_randomFormatJsonPointer.mjs +5 -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 +2 -1
- package/lib/internal/_randomFormatRegex.js.map +1 -1
- package/lib/internal/_randomFormatRegex.mjs +2 -1
- package/lib/internal/_randomFormatRegex.mjs.map +1 -1
- package/lib/internal/_randomFormatRelativeJsonPointer.d.ts +2 -1
- package/lib/internal/_randomFormatRelativeJsonPointer.js +3 -2
- package/lib/internal/_randomFormatRelativeJsonPointer.js.map +1 -1
- package/lib/internal/_randomFormatRelativeJsonPointer.mjs +3 -2
- package/lib/internal/_randomFormatRelativeJsonPointer.mjs.map +1 -1
- package/lib/internal/_randomFormatTime.d.ts +2 -1
- package/lib/internal/_randomFormatTime.js +3 -2
- package/lib/internal/_randomFormatTime.js.map +1 -1
- package/lib/internal/_randomFormatTime.mjs +3 -2
- 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 +33 -0
- package/lib/internal/_randomStringLength.js +48 -0
- package/lib/internal/_randomStringLength.js.map +1 -0
- package/lib/internal/_randomStringLength.mjs +44 -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/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 +81 -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/command_routes_and_diagnostics_coverage_test.go +3 -1
- 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_union_discrimination_transform_test.go +289 -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_stringify_special_key_transform_test.go +238 -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/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/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_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_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 +228 -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 +159 -1
- 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/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 +7 -4
- 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 +60 -6
- package/native/core/factories/internal/metadata/emplace_metadata_object.go +116 -8
- package/native/core/factories/internal/metadata/iterate_metadata.go +6 -0
- package/native/core/factories/internal/metadata/iterate_metadata_function.go +4 -11
- package/native/core/factories/internal/metadata/iterate_metadata_intersection.go +8 -6
- package/native/core/factories/internal/metadata/iterate_metadata_map.go +9 -0
- package/native/core/factories/internal/metadata/iterate_metadata_native.go +27 -2
- package/native/core/factories/internal/metadata/iterate_metadata_set.go +9 -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 +393 -5
- 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/NotationJoiner.go +86 -28
- package/native/core/programmers/helpers/StringifyJoinder.go +32 -1
- package/native/core/programmers/helpers/UnionExplorer.go +203 -61
- package/native/core/programmers/helpers/joiner_branch_coverage_test.go +5 -3
- 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/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/openapi_v3_downgrader.go +641 -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 +52 -7
- package/native/core/programmers/json/JsonApplicationProgrammer.go +45 -11
- package/native/core/programmers/json/JsonSchemasProgrammer.go +12 -2
- package/native/core/programmers/llm/LlmApplicationProgrammer.go +12 -10
- 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 +40 -21
- 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 +270 -20
- package/native/core/schemas/metadata/MetadataDependency.go +388 -0
- package/native/core/schemas/metadata/MetadataObjectType.go +17 -4
- 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/package.json +16 -4
- package/src/executable/FileSystemIdentity.ts +189 -0
- package/src/executable/TypiaGenerateWizard.ts +377 -110
- package/src/functional.ts +30 -60
- package/src/internal/_ProtobufReader.ts +129 -43
- 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/_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 +4 -1
- package/src/internal/_randomFormatDate.ts +17 -12
- package/src/internal/_randomFormatDatetime.ts +15 -10
- package/src/internal/_randomFormatDuration.ts +16 -14
- 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 +3 -2
- package/src/internal/_randomFormatIpv6.ts +3 -2
- package/src/internal/_randomFormatIri.ts +3 -1
- package/src/internal/_randomFormatIriReference.ts +3 -1
- package/src/internal/_randomFormatJsonPointer.ts +8 -2
- package/src/internal/_randomFormatPassword.ts +11 -6
- package/src/internal/_randomFormatRegex.ts +4 -1
- package/src/internal/_randomFormatRelativeJsonPointer.ts +13 -6
- package/src/internal/_randomFormatTime.ts +13 -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 +26 -4
- package/src/internal/_randomStringLength.ts +72 -0
- package/src/internal/_stringLength.ts +5 -0
- package/src/internal/_validateReport.ts +5 -1
- package/src/internal/private/__notationRename.ts +24 -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/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/src/internal/private/__notationCapitalize.ts +0 -2
- package/src/internal/private/__notationUnsnake.ts +0 -24
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
package metadata
|
|
2
2
|
|
|
3
3
|
import (
|
|
4
|
+
"hash/fnv"
|
|
4
5
|
"maps"
|
|
5
6
|
"slices"
|
|
7
|
+
"strconv"
|
|
6
8
|
"strings"
|
|
9
|
+
"unicode"
|
|
7
10
|
|
|
8
11
|
nativeast "github.com/microsoft/typescript-go/shim/ast"
|
|
9
12
|
nativechecker "github.com/microsoft/typescript-go/shim/checker"
|
|
@@ -28,7 +31,9 @@ type MetadataCollection struct {
|
|
|
28
31
|
arrays_order_ []*nativechecker.Type
|
|
29
32
|
tuples_order_ []*nativechecker.Type
|
|
30
33
|
|
|
31
|
-
names_ map[
|
|
34
|
+
names_ map[*nativechecker.Type]string
|
|
35
|
+
allocated_names_ map[string]bool
|
|
36
|
+
name_counters_ map[string]int
|
|
32
37
|
type_full_names_ map[*nativechecker.Type]string
|
|
33
38
|
full_names_ map[*nativechecker.Type]string
|
|
34
39
|
display_names_ map[*nativechecker.Type]string
|
|
@@ -96,7 +101,9 @@ func NewMetadataCollection(options ...*MetadataCollection_IOptions) *MetadataCol
|
|
|
96
101
|
arrays_order_: []*nativechecker.Type{},
|
|
97
102
|
tuples_order_: []*nativechecker.Type{},
|
|
98
103
|
|
|
99
|
-
names_: map[
|
|
104
|
+
names_: map[*nativechecker.Type]string{},
|
|
105
|
+
allocated_names_: map[string]bool{},
|
|
106
|
+
name_counters_: map[string]int{},
|
|
100
107
|
object_index_: 0,
|
|
101
108
|
recursive_array_index_: 0,
|
|
102
109
|
recursive_tuple_index_: 0,
|
|
@@ -126,7 +133,9 @@ func (collection *MetadataCollection) Clone() *MetadataCollection {
|
|
|
126
133
|
arrays_order_: slices.Clone(collection.arrays_order_),
|
|
127
134
|
tuples_order_: slices.Clone(collection.tuples_order_),
|
|
128
135
|
|
|
129
|
-
names_:
|
|
136
|
+
names_: maps.Clone(collection.names_),
|
|
137
|
+
allocated_names_: maps.Clone(collection.allocated_names_),
|
|
138
|
+
name_counters_: maps.Clone(collection.name_counters_),
|
|
130
139
|
type_full_names_: maps.Clone(collection.type_full_names_),
|
|
131
140
|
full_names_: maps.Clone(collection.full_names_),
|
|
132
141
|
display_names_: maps.Clone(collection.display_names_),
|
|
@@ -142,9 +151,6 @@ func (collection *MetadataCollection) Clone() *MetadataCollection {
|
|
|
142
151
|
for k, v := range collection.object_unions_ {
|
|
143
152
|
output.object_unions_[k] = slices.Clone(v)
|
|
144
153
|
}
|
|
145
|
-
for k, v := range collection.names_ {
|
|
146
|
-
output.names_[k] = maps.Clone(v)
|
|
147
|
-
}
|
|
148
154
|
return output
|
|
149
155
|
}
|
|
150
156
|
|
|
@@ -171,7 +177,7 @@ func (collection *MetadataCollection) StoreExploreCache(key MetadataCollection_E
|
|
|
171
177
|
|
|
172
178
|
func (collection *MetadataCollection) ApparentProperties(checker *nativechecker.Checker, typ *nativechecker.Type) []*nativeast.Symbol {
|
|
173
179
|
if collection == nil {
|
|
174
|
-
return nativechecker.Checker_getApparentProperties(checker, typ)
|
|
180
|
+
return metadataCollection_touchProperties(checker, nativechecker.Checker_getApparentProperties(checker, typ))
|
|
175
181
|
}
|
|
176
182
|
if collection.apparent_properties_ == nil {
|
|
177
183
|
collection.apparent_properties_ = map[*nativechecker.Type][]*nativeast.Symbol{}
|
|
@@ -179,11 +185,22 @@ func (collection *MetadataCollection) ApparentProperties(checker *nativechecker.
|
|
|
179
185
|
if value, ok := collection.apparent_properties_[typ]; ok {
|
|
180
186
|
return value
|
|
181
187
|
}
|
|
182
|
-
value := nativechecker.Checker_getApparentProperties(checker, typ)
|
|
188
|
+
value := metadataCollection_touchProperties(checker, nativechecker.Checker_getApparentProperties(checker, typ))
|
|
183
189
|
collection.apparent_properties_[typ] = value
|
|
184
190
|
return value
|
|
185
191
|
}
|
|
186
192
|
|
|
193
|
+
// metadataCollection_touchProperties reports each enumerated property symbol to
|
|
194
|
+
// the dependency listener. Inherited members keep their declaring symbol, so an
|
|
195
|
+
// object type declared in one file registers the base-interface or base-class
|
|
196
|
+
// files its properties actually come from.
|
|
197
|
+
func metadataCollection_touchProperties(checker *nativechecker.Checker, symbols []*nativeast.Symbol) []*nativeast.Symbol {
|
|
198
|
+
for _, symbol := range symbols {
|
|
199
|
+
MetadataDependency_touchSymbol(checker, symbol)
|
|
200
|
+
}
|
|
201
|
+
return symbols
|
|
202
|
+
}
|
|
203
|
+
|
|
187
204
|
func (collection *MetadataCollection) IndexInfos(checker *nativechecker.Checker, typ *nativechecker.Type) []*nativechecker.IndexInfo {
|
|
188
205
|
if collection == nil {
|
|
189
206
|
return nativechecker.Checker_getIndexInfosOfType(checker, typ)
|
|
@@ -297,22 +314,70 @@ func (collection *MetadataCollection) getName(checker *nativechecker.Checker, ty
|
|
|
297
314
|
if collection.Options != nil && collection.Options.Replace != nil {
|
|
298
315
|
name = collection.Options.Replace(name)
|
|
299
316
|
}
|
|
300
|
-
|
|
301
|
-
if duplicates == nil {
|
|
302
|
-
duplicates = map[*nativechecker.Type]string{}
|
|
303
|
-
collection.names_[name] = duplicates
|
|
304
|
-
}
|
|
305
|
-
if oldbie, ok := duplicates[typ]; ok {
|
|
317
|
+
if oldbie, ok := collection.names_[typ]; ok {
|
|
306
318
|
return oldbie, display
|
|
307
319
|
}
|
|
308
|
-
addicted :=
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
320
|
+
addicted, index := metadataCollection_allocateName(
|
|
321
|
+
collection.allocated_names_,
|
|
322
|
+
name,
|
|
323
|
+
collection.name_counters_[name],
|
|
324
|
+
)
|
|
325
|
+
collection.allocated_names_[addicted] = true
|
|
326
|
+
collection.name_counters_[name] = index + 1
|
|
327
|
+
collection.names_[typ] = addicted
|
|
313
328
|
return addicted, display
|
|
314
329
|
}
|
|
315
330
|
|
|
331
|
+
// metadataCollection_duplicateSuffix separates a duplicated base name from its
|
|
332
|
+
// disambiguating counter.
|
|
333
|
+
//
|
|
334
|
+
// It must not be ".", which is how a qualified name separates a namespace from
|
|
335
|
+
// its member. Two consumers read that meaning back out of an allocated id:
|
|
336
|
+
// `JsonDescriptor.cascade` inherits the prefix component's description into the
|
|
337
|
+
// child, and a reader of `reflect.name` sees a member of a namespace that never
|
|
338
|
+
// declared it. A dotted counter also let an invented id land on the real full
|
|
339
|
+
// name of a `namespace Foo { interface o1 }` member, and the loser was dropped
|
|
340
|
+
// from the document outright. "-" cannot occur in a qualified name, is in the
|
|
341
|
+
// OpenAPI Components Object key alphabet, and needs no JSON Pointer or URI
|
|
342
|
+
// escaping; `metadataCollection_openApiNameSuffix` picks it for the same reason.
|
|
343
|
+
const metadataCollection_duplicateSuffix = "-o"
|
|
344
|
+
|
|
345
|
+
// metadataCollection_allocateName mints the first id at or after `from` that no
|
|
346
|
+
// other type in the collection has already been given, and reports the counter
|
|
347
|
+
// it settled on.
|
|
348
|
+
//
|
|
349
|
+
// `taken` is the whole collection's allocated-id set, not one base name's
|
|
350
|
+
// bucket. Bucketing by base name alone cannot see that another base name
|
|
351
|
+
// already minted, or genuinely owns, the id being handed out, so two distinct
|
|
352
|
+
// types received one id and one of them silently disappeared from every
|
|
353
|
+
// generated document. Consulting the whole set is what makes an id unique; the
|
|
354
|
+
// separator only keeps that id from being *read* as something it is not.
|
|
355
|
+
//
|
|
356
|
+
// `from` is the caller's per-base-name counter and is an optimization, never
|
|
357
|
+
// the uniqueness argument: the set is still checked, so a wrong `from` costs a
|
|
358
|
+
// scan rather than a collision. It exists because every anonymous type shares
|
|
359
|
+
// the name `__type`. Always starting at zero rescans the whole run of previous
|
|
360
|
+
// `__type` ids for each new one, which is quadratic in a program's anonymous
|
|
361
|
+
// type count and cost 87s at 20k where resuming costs milliseconds.
|
|
362
|
+
func metadataCollection_allocateName(taken map[string]bool, name string, from int) (string, int) {
|
|
363
|
+
index := from
|
|
364
|
+
allocated := metadataCollection_composeName(name, index)
|
|
365
|
+
for taken[allocated] {
|
|
366
|
+
index++
|
|
367
|
+
allocated = metadataCollection_composeName(name, index)
|
|
368
|
+
}
|
|
369
|
+
return allocated, index
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
// metadataCollection_composeName renders a base name at a counter. Counter zero
|
|
373
|
+
// is the base name itself, so the first type of a name keeps it unchanged.
|
|
374
|
+
func metadataCollection_composeName(name string, index int) string {
|
|
375
|
+
if index == 0 {
|
|
376
|
+
return name
|
|
377
|
+
}
|
|
378
|
+
return name + metadataCollection_duplicateSuffix + metadataCollection_itoa(index)
|
|
379
|
+
}
|
|
380
|
+
|
|
316
381
|
func (collection *MetadataCollection) getFullName(checker *nativechecker.Checker, typ *nativechecker.Type) string {
|
|
317
382
|
fullName, ok := collection.full_names_[typ]
|
|
318
383
|
if ok == false {
|
|
@@ -330,7 +395,7 @@ func (collection *MetadataCollection) getFullName(checker *nativechecker.Checker
|
|
|
330
395
|
// getDisplayName renders the structural form (checker.TypeToString) of types
|
|
331
396
|
// whose sanitized identifier name carries the anonymous "__type" marker, so
|
|
332
397
|
// human-facing expected strings can show `{ id: string; name: string; }`
|
|
333
|
-
// instead of `__type
|
|
398
|
+
// instead of `__type-o1`. Named types return "": their identifier name is
|
|
334
399
|
// already the best display, and so is the degenerate case where the rendering
|
|
335
400
|
// brings no extra information.
|
|
336
401
|
func (collection *MetadataCollection) getDisplayName(checker *nativechecker.Checker, typ *nativechecker.Type, sanitized string) string {
|
|
@@ -534,6 +599,191 @@ func MetadataCollection_replace(str string) string {
|
|
|
534
599
|
return str
|
|
535
600
|
}
|
|
536
601
|
|
|
602
|
+
// metadataCollection_qualifyOpenApiName keeps the dots of a type's own
|
|
603
|
+
// namespace qualification and rewrites every other dot in a rendered name.
|
|
604
|
+
//
|
|
605
|
+
// A dot in a Components Object key is read back as a namespace boundary:
|
|
606
|
+
// `JsonDescriptor.cascade` looks the dotted prefix up as a component and
|
|
607
|
+
// inherits its description into the child. Deleting a rendered name's angle
|
|
608
|
+
// brackets flattens a nested type into the key and used to leave that nested
|
|
609
|
+
// type's dots behind, so `Gen<Ns.Inner>` became `GenNs.Inner` and claimed the
|
|
610
|
+
// unrelated `GenNs` interface as its parent. The dots of a nested rendering —
|
|
611
|
+
// a type argument, a union member — belong to the nested type, never to the
|
|
612
|
+
// whole.
|
|
613
|
+
//
|
|
614
|
+
// Only the leading run of identifier runes is the type's own name, because
|
|
615
|
+
// `metadataCollection_exploreName` builds exactly that prefix from the
|
|
616
|
+
// declaration's enclosing module blocks. Once a structural rune appears the
|
|
617
|
+
// rendering has descended into another type, so no later dot can be this type's
|
|
618
|
+
// namespace boundary.
|
|
619
|
+
//
|
|
620
|
+
// This owns the OpenAPI key space alone. Deliberately not `MetadataCollection_replace`:
|
|
621
|
+
// the LLM `$defs` and `reflect.name` key spaces carry no namespace meaning, and
|
|
622
|
+
// no consumer reads a parent relation out of them.
|
|
623
|
+
func metadataCollection_qualifyOpenApiName(str string) string {
|
|
624
|
+
var builder strings.Builder
|
|
625
|
+
qualified := true
|
|
626
|
+
for _, ch := range str {
|
|
627
|
+
if ch == '.' {
|
|
628
|
+
if qualified {
|
|
629
|
+
builder.WriteRune('.')
|
|
630
|
+
} else {
|
|
631
|
+
builder.WriteString(metadataCollection_qualifySeparator)
|
|
632
|
+
}
|
|
633
|
+
continue
|
|
634
|
+
}
|
|
635
|
+
if metadataCollection_isIdentifierRune(ch) == false {
|
|
636
|
+
qualified = false
|
|
637
|
+
}
|
|
638
|
+
builder.WriteRune(ch)
|
|
639
|
+
}
|
|
640
|
+
return builder.String()
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
// metadataCollection_qualifySeparator renders a flattened nested type's
|
|
644
|
+
// boundary. "-" is in the OpenAPI key alphabet and cannot occur in a qualified
|
|
645
|
+
// name, so it can never be mistaken for the namespace boundary a dot denotes.
|
|
646
|
+
//
|
|
647
|
+
// A quoted literal argument can contain "-" of its own, so this alone is not
|
|
648
|
+
// injective; `metadataCollection_writeOpenApiQuotedRune` is what keeps a
|
|
649
|
+
// literal dot from colliding with it, and `metadataCollection_allocateName`
|
|
650
|
+
// bounds whatever remains.
|
|
651
|
+
const metadataCollection_qualifySeparator = "-"
|
|
652
|
+
|
|
653
|
+
// metadataCollection_isIdentifierRune reports whether a rune can appear in a
|
|
654
|
+
// TypeScript identifier, and therefore in a qualified name. Unicode letters
|
|
655
|
+
// count: `Café.Member` is a real qualification whose dot must survive, even
|
|
656
|
+
// though the final key escapes the accented rune.
|
|
657
|
+
func metadataCollection_isIdentifierRune(ch rune) bool {
|
|
658
|
+
return unicode.IsLetter(ch) ||
|
|
659
|
+
unicode.IsDigit(ch) ||
|
|
660
|
+
ch == '_' ||
|
|
661
|
+
ch == '$'
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
// MetadataCollection_replaceOpenApi converts a metadata display name into an
|
|
665
|
+
// OpenAPI Components Object key. Keep this separate from the general metadata
|
|
666
|
+
// replacement used by LLM `$defs`, for two reasons. OpenAPI restricts keys to
|
|
667
|
+
// an ASCII grammar, while an LLM definition map can own arbitrary JSON object
|
|
668
|
+
// keys. And an OpenAPI key is structure a consumer reads back — a dot in one is
|
|
669
|
+
// a namespace boundary to `JsonDescriptor.cascade` — so this replacer also owes
|
|
670
|
+
// `metadataCollection_qualifyOpenApiName`'s rule, which an LLM key does not.
|
|
671
|
+
func MetadataCollection_replaceOpenApi(str string) string {
|
|
672
|
+
var escaped strings.Builder
|
|
673
|
+
var quote rune
|
|
674
|
+
quotedContent := false
|
|
675
|
+
quotedEscape := false
|
|
676
|
+
disambiguate := false
|
|
677
|
+
for _, ch := range str {
|
|
678
|
+
if quote != 0 {
|
|
679
|
+
if quotedEscape {
|
|
680
|
+
disambiguate = metadataCollection_writeOpenApiQuotedRune(&escaped, ch) || disambiguate
|
|
681
|
+
quotedContent = true
|
|
682
|
+
quotedEscape = false
|
|
683
|
+
continue
|
|
684
|
+
}
|
|
685
|
+
if ch == '\\' {
|
|
686
|
+
disambiguate = metadataCollection_writeOpenApiQuotedRune(&escaped, ch) || disambiguate
|
|
687
|
+
quotedContent = true
|
|
688
|
+
quotedEscape = true
|
|
689
|
+
continue
|
|
690
|
+
}
|
|
691
|
+
if ch == quote {
|
|
692
|
+
if quotedContent == false {
|
|
693
|
+
disambiguate = true
|
|
694
|
+
}
|
|
695
|
+
quote = 0
|
|
696
|
+
continue
|
|
697
|
+
}
|
|
698
|
+
disambiguate = metadataCollection_writeOpenApiQuotedRune(&escaped, ch) || disambiguate
|
|
699
|
+
quotedContent = true
|
|
700
|
+
continue
|
|
701
|
+
}
|
|
702
|
+
if ch == '\'' || ch == '"' || ch == '`' {
|
|
703
|
+
quote = ch
|
|
704
|
+
quotedContent = false
|
|
705
|
+
continue
|
|
706
|
+
}
|
|
707
|
+
if ch == '$' {
|
|
708
|
+
disambiguate = metadataCollection_writeOpenApiNameRune(&escaped, ch) || disambiguate
|
|
709
|
+
} else {
|
|
710
|
+
escaped.WriteRune(ch)
|
|
711
|
+
}
|
|
712
|
+
}
|
|
713
|
+
normalized := MetadataCollection_replace(metadataCollection_qualifyOpenApiName(escaped.String()))
|
|
714
|
+
if len(normalized) == 0 {
|
|
715
|
+
normalized = "_"
|
|
716
|
+
disambiguate = true
|
|
717
|
+
}
|
|
718
|
+
var builder strings.Builder
|
|
719
|
+
for _, ch := range normalized {
|
|
720
|
+
disambiguate = metadataCollection_writeOpenApiNameRune(&builder, ch) || disambiguate
|
|
721
|
+
}
|
|
722
|
+
if disambiguate {
|
|
723
|
+
builder.WriteString(metadataCollection_openApiNameSuffix)
|
|
724
|
+
builder.WriteString(metadataCollection_openApiNameHash(str))
|
|
725
|
+
}
|
|
726
|
+
return builder.String()
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
// metadataCollection_openApiNameSuffix separates an escaped base name from its
|
|
730
|
+
// disambiguating hash. It must not be ".": JsonDescriptor.cascade reads a dot
|
|
731
|
+
// in a component key as a namespace boundary and inherits the parent
|
|
732
|
+
// component's description, so a dotted suffix would present the escaped base as
|
|
733
|
+
// a fake parent and pull an unrelated type's description into the escaped
|
|
734
|
+
// schema. "-" is in the OpenAPI key alphabet, needs no JSON Pointer or URI
|
|
735
|
+
// escaping, and carries no such meaning.
|
|
736
|
+
const metadataCollection_openApiNameSuffix = "-x"
|
|
737
|
+
|
|
738
|
+
func metadataCollection_writeOpenApiNameRune(builder *strings.Builder, ch rune) bool {
|
|
739
|
+
if metadataCollection_isOpenApiNameRune(ch) {
|
|
740
|
+
builder.WriteRune(ch)
|
|
741
|
+
return false
|
|
742
|
+
}
|
|
743
|
+
metadataCollection_writeOpenApiEscapedRune(builder, ch)
|
|
744
|
+
return true
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
// metadataCollection_writeOpenApiQuotedRune writes one rune of a quoted literal
|
|
748
|
+
// type argument, such as the `A.B` of `Recursive<"A.B">`.
|
|
749
|
+
//
|
|
750
|
+
// A dot inside a quote is literal content, never the namespace boundary a
|
|
751
|
+
// component key's dot denotes, so it is escaped like every other rune the key
|
|
752
|
+
// alphabet cannot carry unaltered. Escaping is also what keeps the rewrite
|
|
753
|
+
// injective: an escaped name earns the disambiguating hash of its original
|
|
754
|
+
// text, so `Recursive<"A.B">` can neither collide with the `Recursive<"A-B">`
|
|
755
|
+
// that `metadataCollection_qualifySeparator` would otherwise have shared, nor
|
|
756
|
+
// squat the name `Recursive<"A_x2E_B">` legally owns.
|
|
757
|
+
func metadataCollection_writeOpenApiQuotedRune(builder *strings.Builder, ch rune) bool {
|
|
758
|
+
if ch == '.' {
|
|
759
|
+
metadataCollection_writeOpenApiEscapedRune(builder, ch)
|
|
760
|
+
return true
|
|
761
|
+
}
|
|
762
|
+
return metadataCollection_writeOpenApiNameRune(builder, ch)
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
func metadataCollection_writeOpenApiEscapedRune(builder *strings.Builder, ch rune) {
|
|
766
|
+
builder.WriteString("_x")
|
|
767
|
+
builder.WriteString(strings.ToUpper(strconv.FormatInt(int64(ch), 16)))
|
|
768
|
+
builder.WriteByte('_')
|
|
769
|
+
}
|
|
770
|
+
|
|
771
|
+
func metadataCollection_openApiNameHash(str string) string {
|
|
772
|
+
hasher := fnv.New64a()
|
|
773
|
+
_, _ = hasher.Write([]byte(str))
|
|
774
|
+
encoded := strings.ToUpper(strconv.FormatUint(hasher.Sum64(), 16))
|
|
775
|
+
return strings.Repeat("0", 16-len(encoded)) + encoded
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
func metadataCollection_isOpenApiNameRune(ch rune) bool {
|
|
779
|
+
return (ch >= 'a' && ch <= 'z') ||
|
|
780
|
+
(ch >= 'A' && ch <= 'Z') ||
|
|
781
|
+
(ch >= '0' && ch <= '9') ||
|
|
782
|
+
ch == '.' ||
|
|
783
|
+
ch == '-' ||
|
|
784
|
+
ch == '_'
|
|
785
|
+
}
|
|
786
|
+
|
|
537
787
|
func MetadataCollection_escape(str string) string {
|
|
538
788
|
for _, pair := range metadataCollection_replacers {
|
|
539
789
|
if pair.After != "" {
|