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
|
@@ -7,7 +7,6 @@ import (
|
|
|
7
7
|
"io"
|
|
8
8
|
"os"
|
|
9
9
|
"path/filepath"
|
|
10
|
-
"regexp"
|
|
11
10
|
|
|
12
11
|
shimast "github.com/microsoft/typescript-go/shim/ast"
|
|
13
12
|
shimcompiler "github.com/microsoft/typescript-go/shim/compiler"
|
|
@@ -30,7 +29,7 @@ func runBuild(args []string) int {
|
|
|
30
29
|
outDir := fs.String("outDir", "", "override compilerOptions.outDir")
|
|
31
30
|
manifestPath := fs.String("manifest", "", "write emitted file list as JSON")
|
|
32
31
|
rewriteMode := fs.String("rewrite-mode", "typia", "native rewrite backend id")
|
|
33
|
-
|
|
32
|
+
pluginsJSON := fs.String("plugins-json", "", "ordered ttsc plugin payload")
|
|
34
33
|
if err := fs.Parse(args); err != nil {
|
|
35
34
|
return 2
|
|
36
35
|
}
|
|
@@ -45,38 +44,71 @@ func runBuild(args []string) int {
|
|
|
45
44
|
fmt.Fprintf(stderr, "ttsc-typia build: unknown --rewrite-mode value %q\n", *rewriteMode)
|
|
46
45
|
return 2
|
|
47
46
|
}
|
|
47
|
+
// Resolve the options before loading the program: they come from the payload
|
|
48
|
+
// alone, so an unreadable manifest is a usage error to report now rather than
|
|
49
|
+
// after a full compile has already run under the wrong configuration.
|
|
50
|
+
pluginOptions, err := typiaadapter.ReadPluginOptions(*pluginsJSON)
|
|
51
|
+
if err != nil {
|
|
52
|
+
fmt.Fprintf(stderr, "ttsc-typia build: %v\n", err)
|
|
53
|
+
return 2
|
|
54
|
+
}
|
|
48
55
|
|
|
49
56
|
cwd := *cwdOverride
|
|
50
57
|
if cwd == "" {
|
|
51
|
-
|
|
52
|
-
cwd, err = os.Getwd()
|
|
53
|
-
if err != nil {
|
|
58
|
+
if cwd, err = os.Getwd(); err != nil {
|
|
54
59
|
fmt.Fprintf(stderr, "ttsc-typia build: cwd: %v\n", err)
|
|
55
60
|
return 2
|
|
56
61
|
}
|
|
57
62
|
}
|
|
58
|
-
|
|
63
|
+
loadProgram := func(options driver.LoadProgramOptions, diagnose bool) (*driver.Program, int) {
|
|
64
|
+
prog, diags, err := driver.LoadProgram(cwd, *tsconfigPath, options)
|
|
65
|
+
if err != nil {
|
|
66
|
+
fmt.Fprintf(stderr, "ttsc-typia build: %v\n", err)
|
|
67
|
+
return nil, 2
|
|
68
|
+
}
|
|
69
|
+
if len(diags) > 0 {
|
|
70
|
+
if prog != nil {
|
|
71
|
+
prog.Close()
|
|
72
|
+
}
|
|
73
|
+
driver.WritePrettyDiagnostics(stderr, diags, cwd)
|
|
74
|
+
return nil, 2
|
|
75
|
+
}
|
|
76
|
+
if diagnose {
|
|
77
|
+
if diags := prog.Diagnostics(); len(diags) > 0 {
|
|
78
|
+
prog.Close()
|
|
79
|
+
driver.WritePrettyDiagnostics(stderr, diags, cwd)
|
|
80
|
+
return nil, 2
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return prog, 0
|
|
84
|
+
}
|
|
85
|
+
prog, code := loadProgram(driver.LoadProgramOptions{
|
|
59
86
|
ForceEmit: *emit,
|
|
60
87
|
ForceNoEmit: *noEmit,
|
|
61
88
|
OutDir: *outDir,
|
|
62
|
-
})
|
|
63
|
-
if
|
|
64
|
-
|
|
65
|
-
return 2
|
|
89
|
+
}, true)
|
|
90
|
+
if code != 0 {
|
|
91
|
+
return code
|
|
66
92
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
93
|
+
shouldEmit := !prog.ParsedConfig.ParsedConfig.CompilerOptions.NoEmit.IsTrue()
|
|
94
|
+
if !shouldEmit {
|
|
95
|
+
// The plugin transformer is part of tsgo's emit pipeline. Reload with emit
|
|
96
|
+
// enabled so check/noEmit traverses the exact same source set, then discard
|
|
97
|
+
// every generated output below. The original program already proved the
|
|
98
|
+
// project's diagnostics; diagnosing the private reload would reject valid
|
|
99
|
+
// analysis-only options such as allowImportingTsExtensions.
|
|
100
|
+
prog.Close()
|
|
101
|
+
prog, code = loadProgram(driver.LoadProgramOptions{
|
|
102
|
+
ForceEmit: true,
|
|
103
|
+
OutDir: *outDir,
|
|
104
|
+
}, false)
|
|
105
|
+
if code != 0 {
|
|
106
|
+
return code
|
|
107
|
+
}
|
|
70
108
|
}
|
|
71
109
|
defer prog.Close()
|
|
72
|
-
if diags := prog.Diagnostics(); len(diags) > 0 {
|
|
73
|
-
driver.WritePrettyDiagnostics(stderr, diags, cwd)
|
|
74
|
-
return 2
|
|
75
|
-
}
|
|
76
110
|
|
|
77
|
-
shouldEmit := !prog.ParsedConfig.ParsedConfig.CompilerOptions.NoEmit.IsTrue()
|
|
78
111
|
transformDiags := []typiaTransformDiagnostic{}
|
|
79
|
-
pluginOptions := readTypiaPluginOptions(cwd, *tsconfigPath)
|
|
80
112
|
transformOptions := pluginOptions.TransformOptions()
|
|
81
113
|
extras := nativecontext.ITypiaContext_Extras{
|
|
82
114
|
AddDiagnostic: func(diag *nativecontext.ITypiaDiagnostic) int {
|
|
@@ -96,19 +128,33 @@ func runBuild(args []string) int {
|
|
|
96
128
|
if !*quiet {
|
|
97
129
|
fmt.Fprintf(stdout, "// ttsc-typia build: tsconfig=%s cwd=%s emit=%v rewrite=%s\n", *tsconfigPath, cwd, shouldEmit, *rewriteMode)
|
|
98
130
|
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
131
|
+
emitted := []string{}
|
|
132
|
+
pending := []buildPendingOutput{}
|
|
133
|
+
writeFile := shimcompiler.WriteFile(func(fileName, text string, data *shimcompiler.WriteFileData) error {
|
|
134
|
+
if shouldEmit {
|
|
102
135
|
emitted = append(emitted, fileName)
|
|
103
|
-
|
|
104
|
-
})
|
|
105
|
-
eDiags, err := prog.EmitWithPluginTransformers([]driver.PluginTransform{typiaTransform}, writeFile)
|
|
106
|
-
if err != nil {
|
|
107
|
-
fmt.Fprintf(stderr, "ttsc-typia build: emit failed: %v\n", err)
|
|
108
|
-
return 3
|
|
136
|
+
pending = append(pending, buildPendingOutput{FileName: fileName, Text: text})
|
|
109
137
|
}
|
|
110
|
-
|
|
111
|
-
|
|
138
|
+
return nil
|
|
139
|
+
})
|
|
140
|
+
eDiags, err := prog.EmitWithPluginTransformers([]driver.PluginTransform{typiaTransform}, writeFile)
|
|
141
|
+
if err != nil {
|
|
142
|
+
fmt.Fprintf(stderr, "ttsc-typia build: emit failed: %v\n", err)
|
|
143
|
+
return 3
|
|
144
|
+
}
|
|
145
|
+
for _, d := range eDiags {
|
|
146
|
+
fmt.Fprintln(stderr, " -", d.String())
|
|
147
|
+
}
|
|
148
|
+
if len(transformDiags) > 0 {
|
|
149
|
+
writeTypiaTransformDiagnostics(stderr, transformDiags, cwd)
|
|
150
|
+
return 3
|
|
151
|
+
}
|
|
152
|
+
if shouldEmit {
|
|
153
|
+
for _, output := range pending {
|
|
154
|
+
if err := driver.DefaultWriteFile(output.FileName, output.Text); err != nil {
|
|
155
|
+
fmt.Fprintf(stderr, "ttsc-typia build: emit write failed: %v\n", err)
|
|
156
|
+
return 3
|
|
157
|
+
}
|
|
112
158
|
}
|
|
113
159
|
if !*quiet {
|
|
114
160
|
fmt.Fprintf(stdout, "// ttsc-typia build: emitted=%d files\n", len(emitted))
|
|
@@ -136,13 +182,14 @@ func runBuild(args []string) int {
|
|
|
136
182
|
}
|
|
137
183
|
}
|
|
138
184
|
}
|
|
139
|
-
if len(transformDiags) > 0 {
|
|
140
|
-
writeTypiaTransformDiagnostics(stderr, transformDiags, cwd)
|
|
141
|
-
return 3
|
|
142
|
-
}
|
|
143
185
|
return 0
|
|
144
186
|
}
|
|
145
187
|
|
|
188
|
+
type buildPendingOutput struct {
|
|
189
|
+
FileName string
|
|
190
|
+
Text string
|
|
191
|
+
}
|
|
192
|
+
|
|
146
193
|
type typiaTransformDiagnostic struct {
|
|
147
194
|
File string
|
|
148
195
|
Line int
|
|
@@ -156,33 +203,3 @@ func writeTypiaTransformDiagnostics(out io.Writer, diagnostics []typiaTransformD
|
|
|
156
203
|
fmt.Fprintln(out, diag.String(cwd))
|
|
157
204
|
}
|
|
158
205
|
}
|
|
159
|
-
|
|
160
|
-
func readTypiaPluginOptions(cwd, tsconfigPath string) typiaadapter.PluginOptions {
|
|
161
|
-
path := tsconfigPath
|
|
162
|
-
if !filepath.IsAbs(path) {
|
|
163
|
-
path = filepath.Join(cwd, path)
|
|
164
|
-
}
|
|
165
|
-
data, err := os.ReadFile(path)
|
|
166
|
-
if err != nil {
|
|
167
|
-
return typiaadapter.PluginOptions{}
|
|
168
|
-
}
|
|
169
|
-
text := string(data)
|
|
170
|
-
if !regexp.MustCompile(`(?s)"transform"\s*:\s*"typia/lib/transform"`).MatchString(text) {
|
|
171
|
-
return typiaadapter.PluginOptions{}
|
|
172
|
-
}
|
|
173
|
-
return typiaadapter.PluginOptions{
|
|
174
|
-
Functional: regexp.MustCompile(`(?s)"functional"\s*:\s*true`).MatchString(text),
|
|
175
|
-
Numeric: regexp.MustCompile(`(?s)"numeric"\s*:\s*true`).MatchString(text),
|
|
176
|
-
Finite: regexp.MustCompile(`(?s)"finite"\s*:\s*true`).MatchString(text),
|
|
177
|
-
Undefined: readBooleanPluginOption(text, "undefined"),
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
func readBooleanPluginOption(text string, name string) *bool {
|
|
182
|
-
matched := regexp.MustCompile(`(?s)"` + regexp.QuoteMeta(name) + `"\s*:\s*(true|false)`).FindStringSubmatch(text)
|
|
183
|
-
if matched == nil {
|
|
184
|
-
return nil
|
|
185
|
-
}
|
|
186
|
-
value := matched[1] == "true"
|
|
187
|
-
return &value
|
|
188
|
-
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
package main
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"os"
|
|
5
|
+
"path/filepath"
|
|
6
|
+
"strings"
|
|
7
|
+
"testing"
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
// TestBuildNoEmitPreservesAnalysisOnlyOptions verifies forced traversal does
|
|
11
|
+
// not invalidate options that are legal precisely because the project emits
|
|
12
|
+
// nothing.
|
|
13
|
+
//
|
|
14
|
+
// `allowImportingTsExtensions` is valid with `noEmit`, but invalid in an
|
|
15
|
+
// emitting program. The private emit-enabled traversal must therefore reuse
|
|
16
|
+
// the already-proven TypeScript analysis instead of reporting diagnostics
|
|
17
|
+
// introduced only by its internal override.
|
|
18
|
+
//
|
|
19
|
+
// 1. Create a valid no-emit typia project with allowImportingTsExtensions.
|
|
20
|
+
// 2. Run the native build command through its configured no-emit path.
|
|
21
|
+
// 3. Require success and prove the private traversal publishes no output.
|
|
22
|
+
func TestBuildNoEmitPreservesAnalysisOnlyOptions(t *testing.T) {
|
|
23
|
+
project := buildNoEmitDiagnosticProject(t, true)
|
|
24
|
+
configPath := filepath.Join(project, "tsconfig.json")
|
|
25
|
+
config, err := os.ReadFile(configPath)
|
|
26
|
+
if err != nil {
|
|
27
|
+
t.Fatalf("read tsconfig: %v", err)
|
|
28
|
+
}
|
|
29
|
+
configured := strings.Replace(
|
|
30
|
+
string(config),
|
|
31
|
+
`"noEmit": true`,
|
|
32
|
+
`"noEmit": true,
|
|
33
|
+
"allowImportingTsExtensions": true`,
|
|
34
|
+
1,
|
|
35
|
+
)
|
|
36
|
+
if err := os.WriteFile(configPath, []byte(configured), 0o644); err != nil {
|
|
37
|
+
t.Fatalf("write tsconfig: %v", err)
|
|
38
|
+
}
|
|
39
|
+
source := `import typia from "typia";
|
|
40
|
+
export const isValue = (input: unknown): input is { value: number } =>
|
|
41
|
+
typia.is<{ value: number }>(input);
|
|
42
|
+
`
|
|
43
|
+
if err := os.WriteFile(filepath.Join(project, "src", "main.ts"), []byte(source), 0o644); err != nil {
|
|
44
|
+
t.Fatalf("write source: %v", err)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
out, errText, code := ttscTypiaTestCapture(func() int {
|
|
48
|
+
return runBuild([]string{
|
|
49
|
+
"--cwd", project,
|
|
50
|
+
"--tsconfig", "tsconfig.json",
|
|
51
|
+
})
|
|
52
|
+
})
|
|
53
|
+
if code != 0 {
|
|
54
|
+
t.Fatalf("valid analysis-only project failed with code %d\nstdout=%s\nstderr=%s", code, out, errText)
|
|
55
|
+
}
|
|
56
|
+
if strings.TrimSpace(errText) != "" {
|
|
57
|
+
t.Fatalf("valid analysis-only project reported private emit diagnostics:\n%s", errText)
|
|
58
|
+
}
|
|
59
|
+
for _, path := range []string{
|
|
60
|
+
filepath.Join(project, "dist"),
|
|
61
|
+
filepath.Join(project, "cache.tsbuildinfo"),
|
|
62
|
+
} {
|
|
63
|
+
if _, err := os.Stat(path); !os.IsNotExist(err) {
|
|
64
|
+
t.Fatalf("analysis-only traversal published %s: %v", path, err)
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
package main
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"os"
|
|
5
|
+
"path/filepath"
|
|
6
|
+
"strings"
|
|
7
|
+
"testing"
|
|
8
|
+
)
|
|
9
|
+
|
|
10
|
+
// TestBuildNoEmitReportsTransformDiagnostics verifies analysis-only transforms.
|
|
11
|
+
//
|
|
12
|
+
// TypeScript-clean source can still be invalid for typia. Check mode, an
|
|
13
|
+
// explicit --noEmit flag, and tsconfig-owned noEmit must all run the same typia
|
|
14
|
+
// analysis as emit mode without publishing any compiler artifact.
|
|
15
|
+
//
|
|
16
|
+
// 1. Create equivalent invalid projects for all three no-emit entry paths.
|
|
17
|
+
// 2. Require the preserved typia source location, code, and message.
|
|
18
|
+
// 3. Prove quiet/verbose reporting while every output path stays absent.
|
|
19
|
+
func TestBuildNoEmitReportsTransformDiagnostics(t *testing.T) {
|
|
20
|
+
cases := []struct {
|
|
21
|
+
name string
|
|
22
|
+
configured bool
|
|
23
|
+
verbose bool
|
|
24
|
+
run func(project, manifest string) int
|
|
25
|
+
}{
|
|
26
|
+
{
|
|
27
|
+
name: "check-command",
|
|
28
|
+
run: func(project, manifest string) int {
|
|
29
|
+
return run([]string{
|
|
30
|
+
"check",
|
|
31
|
+
"--cwd", project,
|
|
32
|
+
"--tsconfig", "tsconfig.json",
|
|
33
|
+
"--manifest", manifest,
|
|
34
|
+
})
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: "explicit-no-emit",
|
|
39
|
+
verbose: true,
|
|
40
|
+
run: func(project, manifest string) int {
|
|
41
|
+
return runBuild([]string{
|
|
42
|
+
"--cwd", project,
|
|
43
|
+
"--tsconfig", "tsconfig.json",
|
|
44
|
+
"--noEmit",
|
|
45
|
+
"--manifest", manifest,
|
|
46
|
+
"--verbose",
|
|
47
|
+
})
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
name: "configured-no-emit",
|
|
52
|
+
configured: true,
|
|
53
|
+
run: func(project, manifest string) int {
|
|
54
|
+
return runBuild([]string{
|
|
55
|
+
"--cwd", project,
|
|
56
|
+
"--tsconfig", "tsconfig.json",
|
|
57
|
+
"--manifest", manifest,
|
|
58
|
+
})
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
}
|
|
62
|
+
for _, tc := range cases {
|
|
63
|
+
t.Run(tc.name, func(t *testing.T) {
|
|
64
|
+
project := buildNoEmitDiagnosticProject(t, tc.configured)
|
|
65
|
+
manifest := filepath.Join(project, "artifacts", "manifest.json")
|
|
66
|
+
out, errText, code := ttscTypiaTestCapture(func() int {
|
|
67
|
+
return tc.run(project, manifest)
|
|
68
|
+
})
|
|
69
|
+
if code != 3 {
|
|
70
|
+
t.Fatalf("analysis-only transform should fail with code 3, got %d\nstdout=%s\nstderr=%s", code, out, errText)
|
|
71
|
+
}
|
|
72
|
+
normalized := filepath.ToSlash(errText)
|
|
73
|
+
if !strings.Contains(normalized, "src/main.ts:3:9 - error TS(typia.is):") ||
|
|
74
|
+
!strings.Contains(normalized, "non-specified generic argument") {
|
|
75
|
+
t.Fatalf("analysis-only diagnostic lost detail:\n%s", errText)
|
|
76
|
+
}
|
|
77
|
+
if tc.verbose {
|
|
78
|
+
if !strings.Contains(out, "emit=false") {
|
|
79
|
+
t.Fatalf("verbose no-emit summary missing:\n%s", out)
|
|
80
|
+
}
|
|
81
|
+
} else if strings.TrimSpace(out) != "" {
|
|
82
|
+
t.Fatalf("quiet no-emit run wrote stdout:\n%s", out)
|
|
83
|
+
}
|
|
84
|
+
for _, path := range []string{
|
|
85
|
+
filepath.Join(project, "dist"),
|
|
86
|
+
filepath.Join(project, "cache.tsbuildinfo"),
|
|
87
|
+
manifest,
|
|
88
|
+
} {
|
|
89
|
+
if _, err := os.Stat(path); !os.IsNotExist(err) {
|
|
90
|
+
t.Fatalf("analysis-only run published %s: %v", path, err)
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
})
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
func buildNoEmitDiagnosticProject(t *testing.T, noEmit bool) string {
|
|
98
|
+
t.Helper()
|
|
99
|
+
project := t.TempDir()
|
|
100
|
+
src := filepath.Join(project, "src")
|
|
101
|
+
if err := os.MkdirAll(src, 0o755); err != nil {
|
|
102
|
+
t.Fatalf("mkdir fixture src: %v", err)
|
|
103
|
+
}
|
|
104
|
+
configuredNoEmit := ""
|
|
105
|
+
if noEmit {
|
|
106
|
+
configuredNoEmit = `,
|
|
107
|
+
"noEmit": true`
|
|
108
|
+
}
|
|
109
|
+
config := `{
|
|
110
|
+
"compilerOptions": {
|
|
111
|
+
"target": "ES2022",
|
|
112
|
+
"module": "commonjs",
|
|
113
|
+
"moduleResolution": "bundler",
|
|
114
|
+
"ignoreDeprecations": "6.0",
|
|
115
|
+
"types": ["*"],
|
|
116
|
+
"esModuleInterop": true,
|
|
117
|
+
"strict": true,
|
|
118
|
+
"skipLibCheck": true,
|
|
119
|
+
"rootDir": "src",
|
|
120
|
+
"outDir": "dist",
|
|
121
|
+
"declaration": true,
|
|
122
|
+
"declarationMap": true,
|
|
123
|
+
"sourceMap": true,
|
|
124
|
+
"incremental": true,
|
|
125
|
+
"tsBuildInfoFile": "cache.tsbuildinfo"` + configuredNoEmit + `
|
|
126
|
+
},
|
|
127
|
+
"include": ["src"]
|
|
128
|
+
}
|
|
129
|
+
`
|
|
130
|
+
if err := os.WriteFile(filepath.Join(project, "tsconfig.json"), []byte(config), 0o644); err != nil {
|
|
131
|
+
t.Fatalf("write tsconfig: %v", err)
|
|
132
|
+
}
|
|
133
|
+
transformDiagnosticWriteTypiaStub(t, project)
|
|
134
|
+
if err := os.WriteFile(filepath.Join(src, "main.ts"), []byte(transformDiagnosticSource), 0o644); err != nil {
|
|
135
|
+
t.Fatalf("write source: %v", err)
|
|
136
|
+
}
|
|
137
|
+
return project
|
|
138
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
package main
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"os"
|
|
5
|
+
"path/filepath"
|
|
6
|
+
"testing"
|
|
7
|
+
)
|
|
8
|
+
|
|
9
|
+
// TestBuildPluginOptionsComeFromPayload verifies the build host takes typia's
|
|
10
|
+
// options from ttsc's resolved plugin entry, not from tsconfig text.
|
|
11
|
+
//
|
|
12
|
+
// The build host declares its own `--plugins-json` flag and performs its own
|
|
13
|
+
// option read, so the transform host's coverage does not speak for it: reverting
|
|
14
|
+
// this host alone would leave the transform tests green. The rows write a
|
|
15
|
+
// tsconfig whose raw text disagrees with the resolved entry -- the distinction
|
|
16
|
+
// samchon/typia#1887's regex scrape could not make -- and the assertion reads
|
|
17
|
+
// the JavaScript this host actually wrote to disk.
|
|
18
|
+
//
|
|
19
|
+
// 1. Materialize each matrix row as a project plus the payload ttsc resolves it into.
|
|
20
|
+
// 2. Run the build host with emit forced into the project's outDir.
|
|
21
|
+
// 3. Assert the emitted validator honors the entry, not the file text.
|
|
22
|
+
func TestBuildPluginOptionsComeFromPayload(t *testing.T) {
|
|
23
|
+
for _, tc := range pluginOptionsPayloadCases() {
|
|
24
|
+
t.Run(tc.name, func(t *testing.T) {
|
|
25
|
+
project := pluginOptionsPayloadProject(t, tc)
|
|
26
|
+
dist := filepath.Join(project, "dist")
|
|
27
|
+
out, errText, code := ttscTypiaTestCapture(func() int {
|
|
28
|
+
return runBuild([]string{
|
|
29
|
+
"--cwd", project,
|
|
30
|
+
"--tsconfig", "tsconfig.json",
|
|
31
|
+
"--emit",
|
|
32
|
+
"--outDir", dist,
|
|
33
|
+
// `=`-joined, the exact shape ttsc's createNativeBuildArgs and the
|
|
34
|
+
// wasm hosts put on the wire.
|
|
35
|
+
"--plugins-json=" + tc.payload,
|
|
36
|
+
})
|
|
37
|
+
})
|
|
38
|
+
if code != 0 {
|
|
39
|
+
t.Fatalf("build failed with code %d\nstdout=%s\nstderr=%s", code, out, errText)
|
|
40
|
+
}
|
|
41
|
+
emitted, err := os.ReadFile(filepath.Join(dist, "main.js"))
|
|
42
|
+
if err != nil {
|
|
43
|
+
t.Fatalf("read emitted javascript: %v", err)
|
|
44
|
+
}
|
|
45
|
+
pluginOptionsPayloadAssert(t, tc, string(emitted))
|
|
46
|
+
})
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
package main
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"encoding/json"
|
|
5
|
+
"os"
|
|
6
|
+
"path/filepath"
|
|
7
|
+
"reflect"
|
|
8
|
+
"strings"
|
|
9
|
+
"testing"
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
// TestBuildTransactionalEmitPublishesCleanProject verifies the commit path.
|
|
13
|
+
//
|
|
14
|
+
// Buffering failed transforms must not suppress or alter successful JavaScript,
|
|
15
|
+
// declarations, maps, or manifest entries. A clean multi-file build publishes
|
|
16
|
+
// every compiler output only after the shared transform phase succeeds.
|
|
17
|
+
//
|
|
18
|
+
// 1. Build two valid typia sources with declarations and source maps enabled.
|
|
19
|
+
// 2. Read the emitted manifest and require every recorded file to exist.
|
|
20
|
+
// 3. Check each output family and prove JavaScript no longer calls typia.is.
|
|
21
|
+
func TestBuildTransactionalEmitPublishesCleanProject(t *testing.T) {
|
|
22
|
+
project := buildAtomicityProject(t, false)
|
|
23
|
+
manifest := filepath.Join(project, "artifacts", "manifest.json")
|
|
24
|
+
out, errText, code := ttscTypiaTestCapture(func() int {
|
|
25
|
+
return runBuild([]string{
|
|
26
|
+
"--cwd", project,
|
|
27
|
+
"--tsconfig", "tsconfig.json",
|
|
28
|
+
"--emit",
|
|
29
|
+
"--manifest", manifest,
|
|
30
|
+
"--verbose",
|
|
31
|
+
})
|
|
32
|
+
})
|
|
33
|
+
if code != 0 {
|
|
34
|
+
t.Fatalf("clean transactional build failed with code %d\nstdout=%s\nstderr=%s", code, out, errText)
|
|
35
|
+
}
|
|
36
|
+
data, err := os.ReadFile(manifest)
|
|
37
|
+
if err != nil {
|
|
38
|
+
t.Fatalf("read manifest: %v", err)
|
|
39
|
+
}
|
|
40
|
+
var emitted []string
|
|
41
|
+
if err := json.Unmarshal(data, &emitted); err != nil {
|
|
42
|
+
t.Fatalf("decode manifest: %v\n%s", err, data)
|
|
43
|
+
}
|
|
44
|
+
if len(emitted) == 0 || !strings.Contains(out, "emitted=") {
|
|
45
|
+
t.Fatalf("successful build did not report emitted outputs: %v\n%s", emitted, out)
|
|
46
|
+
}
|
|
47
|
+
expected := map[string]bool{
|
|
48
|
+
"dist/invalid.d.ts": true,
|
|
49
|
+
"dist/invalid.d.ts.map": true,
|
|
50
|
+
"dist/invalid.js": true,
|
|
51
|
+
"dist/invalid.js.map": true,
|
|
52
|
+
"dist/valid.d.ts": true,
|
|
53
|
+
"dist/valid.d.ts.map": true,
|
|
54
|
+
"dist/valid.js": true,
|
|
55
|
+
"dist/valid.js.map": true,
|
|
56
|
+
}
|
|
57
|
+
actual := map[string]bool{}
|
|
58
|
+
for _, path := range emitted {
|
|
59
|
+
if _, err := os.Stat(path); err != nil {
|
|
60
|
+
t.Fatalf("manifest advertised missing output %s: %v", path, err)
|
|
61
|
+
}
|
|
62
|
+
relative, err := filepath.Rel(project, path)
|
|
63
|
+
if err != nil {
|
|
64
|
+
t.Fatalf("relativize emitted output %s: %v", path, err)
|
|
65
|
+
}
|
|
66
|
+
slash := filepath.ToSlash(relative)
|
|
67
|
+
actual[slash] = true
|
|
68
|
+
if strings.HasSuffix(slash, ".js") {
|
|
69
|
+
js, err := os.ReadFile(path)
|
|
70
|
+
if err != nil {
|
|
71
|
+
t.Fatalf("read emitted JavaScript: %v", err)
|
|
72
|
+
}
|
|
73
|
+
if strings.Contains(string(js), "typia.is(") {
|
|
74
|
+
t.Fatalf("emitted JavaScript retained typia runtime stub:\n%s", js)
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if !reflect.DeepEqual(actual, expected) {
|
|
79
|
+
t.Fatalf("manifest output set changed:\nexpected=%v\nactual=%v", expected, actual)
|
|
80
|
+
}
|
|
81
|
+
}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
package main
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"os"
|
|
5
|
+
"path/filepath"
|
|
6
|
+
"reflect"
|
|
7
|
+
"strings"
|
|
8
|
+
"testing"
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
// TestBuildTransformFailurePreservesArtifacts verifies failed-build atomicity.
|
|
12
|
+
//
|
|
13
|
+
// A transform failure can arrive after valid siblings have already produced
|
|
14
|
+
// JavaScript, declarations, maps, and a manifest candidate. None of those
|
|
15
|
+
// buffered results may replace prior artifacts or escape as new files.
|
|
16
|
+
//
|
|
17
|
+
// 1. Seed output and manifest trees with byte-sensitive prior artifacts.
|
|
18
|
+
// 2. Build one valid source beside one typia-invalid generic source.
|
|
19
|
+
// 3. Require the diagnostic and compare both trees byte-for-byte.
|
|
20
|
+
func TestBuildTransformFailurePreservesArtifacts(t *testing.T) {
|
|
21
|
+
project := buildAtomicityProject(t, true)
|
|
22
|
+
dist := filepath.Join(project, "dist")
|
|
23
|
+
manifest := filepath.Join(project, "artifacts", "manifest.json")
|
|
24
|
+
seeds := map[string]string{
|
|
25
|
+
filepath.Join(dist, "valid.js"): "previous javascript\n",
|
|
26
|
+
filepath.Join(dist, "existing.d.ts"): "previous declaration\n",
|
|
27
|
+
filepath.Join(dist, "keep.txt"): "unrelated output\n",
|
|
28
|
+
manifest: `["previous.js"]`,
|
|
29
|
+
}
|
|
30
|
+
for path, body := range seeds {
|
|
31
|
+
if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil {
|
|
32
|
+
t.Fatalf("mkdir seed parent: %v", err)
|
|
33
|
+
}
|
|
34
|
+
if err := os.WriteFile(path, []byte(body), 0o644); err != nil {
|
|
35
|
+
t.Fatalf("write seed %s: %v", path, err)
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
beforeDist := buildReadTree(t, dist)
|
|
39
|
+
beforeArtifacts := buildReadTree(t, filepath.Dir(manifest))
|
|
40
|
+
|
|
41
|
+
_, errText, code := ttscTypiaTestCapture(func() int {
|
|
42
|
+
return runBuild([]string{
|
|
43
|
+
"--cwd", project,
|
|
44
|
+
"--tsconfig", "tsconfig.json",
|
|
45
|
+
"--emit",
|
|
46
|
+
"--manifest", manifest,
|
|
47
|
+
})
|
|
48
|
+
})
|
|
49
|
+
if code != 3 {
|
|
50
|
+
t.Fatalf("invalid multi-file transform should fail with code 3, got %d\nstderr=%s", code, errText)
|
|
51
|
+
}
|
|
52
|
+
normalized := filepath.ToSlash(errText)
|
|
53
|
+
if !strings.Contains(normalized, "src/invalid.ts:3:9 - error TS(typia.is):") {
|
|
54
|
+
t.Fatalf("transform diagnostic missing invalid source location:\n%s", errText)
|
|
55
|
+
}
|
|
56
|
+
if after := buildReadTree(t, dist); !reflect.DeepEqual(after, beforeDist) {
|
|
57
|
+
t.Fatalf("failed transform mutated output tree:\nbefore=%q\nafter=%q", beforeDist, after)
|
|
58
|
+
}
|
|
59
|
+
if after := buildReadTree(t, filepath.Dir(manifest)); !reflect.DeepEqual(after, beforeArtifacts) {
|
|
60
|
+
t.Fatalf("failed transform mutated manifest tree:\nbefore=%q\nafter=%q", beforeArtifacts, after)
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
func buildReadTree(t *testing.T, root string) map[string]string {
|
|
65
|
+
t.Helper()
|
|
66
|
+
files := map[string]string{}
|
|
67
|
+
if err := filepath.WalkDir(root, func(path string, entry os.DirEntry, err error) error {
|
|
68
|
+
if err != nil {
|
|
69
|
+
return err
|
|
70
|
+
}
|
|
71
|
+
if entry.IsDir() {
|
|
72
|
+
return nil
|
|
73
|
+
}
|
|
74
|
+
data, err := os.ReadFile(path)
|
|
75
|
+
if err != nil {
|
|
76
|
+
return err
|
|
77
|
+
}
|
|
78
|
+
rel, err := filepath.Rel(root, path)
|
|
79
|
+
if err != nil {
|
|
80
|
+
return err
|
|
81
|
+
}
|
|
82
|
+
files[filepath.ToSlash(rel)] = string(data)
|
|
83
|
+
return nil
|
|
84
|
+
}); err != nil {
|
|
85
|
+
t.Fatalf("read tree %s: %v", root, err)
|
|
86
|
+
}
|
|
87
|
+
return files
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
func buildAtomicityProject(t *testing.T, invalid bool) string {
|
|
91
|
+
t.Helper()
|
|
92
|
+
project := t.TempDir()
|
|
93
|
+
src := filepath.Join(project, "src")
|
|
94
|
+
if err := os.MkdirAll(src, 0o755); err != nil {
|
|
95
|
+
t.Fatalf("mkdir fixture src: %v", err)
|
|
96
|
+
}
|
|
97
|
+
config := `{
|
|
98
|
+
"compilerOptions": {
|
|
99
|
+
"target": "ES2022",
|
|
100
|
+
"module": "commonjs",
|
|
101
|
+
"moduleResolution": "bundler",
|
|
102
|
+
"ignoreDeprecations": "6.0",
|
|
103
|
+
"types": ["*"],
|
|
104
|
+
"esModuleInterop": true,
|
|
105
|
+
"strict": true,
|
|
106
|
+
"skipLibCheck": true,
|
|
107
|
+
"rootDir": "src",
|
|
108
|
+
"outDir": "dist",
|
|
109
|
+
"declaration": true,
|
|
110
|
+
"declarationMap": true,
|
|
111
|
+
"sourceMap": true
|
|
112
|
+
},
|
|
113
|
+
"include": ["src"]
|
|
114
|
+
}
|
|
115
|
+
`
|
|
116
|
+
if err := os.WriteFile(filepath.Join(project, "tsconfig.json"), []byte(config), 0o644); err != nil {
|
|
117
|
+
t.Fatalf("write tsconfig: %v", err)
|
|
118
|
+
}
|
|
119
|
+
transformDiagnosticWriteTypiaStub(t, project)
|
|
120
|
+
validSource := `import typia from "typia";
|
|
121
|
+
export const valid = (input: unknown): input is { value: number } =>
|
|
122
|
+
typia.is<{ value: number }>(input);
|
|
123
|
+
`
|
|
124
|
+
if err := os.WriteFile(filepath.Join(src, "valid.ts"), []byte(validSource), 0o644); err != nil {
|
|
125
|
+
t.Fatalf("write valid source: %v", err)
|
|
126
|
+
}
|
|
127
|
+
secondSource := `import typia from "typia";
|
|
128
|
+
export const second = (input: unknown): input is { name: string } =>
|
|
129
|
+
typia.is<{ name: string }>(input);
|
|
130
|
+
`
|
|
131
|
+
if invalid {
|
|
132
|
+
secondSource = transformDiagnosticSource
|
|
133
|
+
}
|
|
134
|
+
if err := os.WriteFile(filepath.Join(src, "invalid.ts"), []byte(secondSource), 0o644); err != nil {
|
|
135
|
+
t.Fatalf("write second source: %v", err)
|
|
136
|
+
}
|
|
137
|
+
return project
|
|
138
|
+
}
|
|
@@ -175,6 +175,8 @@ func TestCommandRoutesAndDiagnosticsCoverage(t *testing.T) {
|
|
|
175
175
|
"--rewrite-mode", "none",
|
|
176
176
|
})
|
|
177
177
|
}, 0},
|
|
178
|
+
// Publishes, rather than the 3 this expected while samchon/typia#2134
|
|
179
|
+
// made `--output js` miss its own artifact under the fixture's `outDir`.
|
|
178
180
|
{"transform_js_out", func(t *testing.T) int {
|
|
179
181
|
return runTransform([]string{
|
|
180
182
|
"--cwd", primitives,
|
|
@@ -184,7 +186,7 @@ func TestCommandRoutesAndDiagnosticsCoverage(t *testing.T) {
|
|
|
184
186
|
"--out", filepath.Join(t.TempDir(), "main.js"),
|
|
185
187
|
"--rewrite-mode", "none",
|
|
186
188
|
})
|
|
187
|
-
},
|
|
189
|
+
}, 0},
|
|
188
190
|
{"transform_ts_stdout_write_error", func(t *testing.T) int {
|
|
189
191
|
return commandRoutesWithFailingStdout(func() int {
|
|
190
192
|
return runTransform([]string{
|