typia 13.1.1 → 13.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -0
- package/lib/_virtual/_rolldown/runtime.mjs +1 -5
- package/lib/executable/FileSystemIdentity.d.ts +44 -0
- package/lib/executable/FileSystemIdentity.js +213 -0
- package/lib/executable/FileSystemIdentity.js.map +1 -0
- package/lib/executable/FileSystemIdentity.mjs +133 -0
- package/lib/executable/FileSystemIdentity.mjs.map +1 -0
- package/lib/executable/TypiaGenerateWizard.js +272 -106
- package/lib/executable/TypiaGenerateWizard.js.map +1 -1
- package/lib/executable/TypiaGenerateWizard.mjs +239 -95
- package/lib/executable/TypiaGenerateWizard.mjs.map +1 -1
- package/lib/functional.d.ts +15 -12
- package/lib/functional.js.map +1 -1
- package/lib/functional.mjs.map +1 -1
- package/lib/internal/_ProtobufReader.d.ts +32 -0
- package/lib/internal/_ProtobufReader.js +148 -48
- package/lib/internal/_ProtobufReader.js.map +1 -1
- package/lib/internal/_ProtobufReader.mjs +137 -41
- package/lib/internal/_ProtobufReader.mjs.map +1 -1
- package/lib/internal/_createStandardSchema.js +18 -1
- package/lib/internal/_createStandardSchema.js.map +1 -1
- package/lib/internal/_createStandardSchema.mjs +12 -1
- package/lib/internal/_createStandardSchema.mjs.map +1 -1
- package/lib/internal/_decimal.d.ts +14 -0
- package/lib/internal/_decimal.js +61 -0
- package/lib/internal/_decimal.js.map +1 -0
- package/lib/internal/_decimal.mjs +49 -0
- package/lib/internal/_decimal.mjs.map +1 -0
- package/lib/internal/_httpQueryParseURLSearchParams.js +23 -2
- package/lib/internal/_httpQueryParseURLSearchParams.js.map +1 -1
- package/lib/internal/_httpQueryParseURLSearchParams.mjs +20 -2
- package/lib/internal/_httpQueryParseURLSearchParams.mjs.map +1 -1
- package/lib/internal/_isFormatByte.js +2 -5
- package/lib/internal/_isFormatByte.js.map +1 -1
- package/lib/internal/_isFormatByte.mjs +2 -5
- package/lib/internal/_isFormatByte.mjs.map +1 -1
- package/lib/internal/_isFormatDate.js +15 -2
- package/lib/internal/_isFormatDate.js.map +1 -1
- package/lib/internal/_isFormatDate.mjs +22 -2
- package/lib/internal/_isFormatDate.mjs.map +1 -1
- package/lib/internal/_isFormatDateTime.js +21 -2
- package/lib/internal/_isFormatDateTime.js.map +1 -1
- package/lib/internal/_isFormatDateTime.mjs +13 -2
- package/lib/internal/_isFormatDateTime.mjs.map +1 -1
- package/lib/internal/_isFormatIri.js +3 -2
- package/lib/internal/_isFormatIri.js.map +1 -1
- package/lib/internal/_isFormatIri.mjs +3 -2
- package/lib/internal/_isFormatIri.mjs.map +1 -1
- package/lib/internal/_isFormatIriReference.js +10 -2
- package/lib/internal/_isFormatIriReference.js.map +1 -1
- package/lib/internal/_isFormatIriReference.mjs +9 -2
- package/lib/internal/_isFormatIriReference.mjs.map +1 -1
- package/lib/internal/_isFormatUriReference.js +1 -1
- package/lib/internal/_isFormatUriReference.js.map +1 -1
- package/lib/internal/_isFormatUriReference.mjs +1 -1
- package/lib/internal/_isFormatUriReference.mjs.map +1 -1
- package/lib/internal/_isMultipleOf.d.ts +1 -0
- package/lib/internal/_isMultipleOf.js +13 -0
- package/lib/internal/_isMultipleOf.js.map +1 -0
- package/lib/internal/_isMultipleOf.mjs +12 -0
- package/lib/internal/_isMultipleOf.mjs.map +1 -0
- package/lib/internal/_isTypeFloat.js +1 -1
- package/lib/internal/_isTypeFloat.js.map +1 -1
- package/lib/internal/_isTypeFloat.mjs +1 -1
- package/lib/internal/_isTypeFloat.mjs.map +1 -1
- package/lib/internal/_isTypeInt64.js +1 -0
- package/lib/internal/_isTypeInt64.js.map +1 -1
- package/lib/internal/_isTypeInt64.mjs.map +1 -1
- package/lib/internal/_isTypeInt64Bigint.d.ts +1 -0
- package/lib/internal/_isTypeInt64Bigint.js +15 -0
- package/lib/internal/_isTypeInt64Bigint.js.map +1 -0
- package/lib/internal/_isTypeInt64Bigint.mjs +8 -0
- package/lib/internal/_isTypeInt64Bigint.mjs.map +1 -0
- package/lib/internal/_isTypeUint64.js +1 -0
- package/lib/internal/_isTypeUint64.js.map +1 -1
- package/lib/internal/_isTypeUint64.mjs.map +1 -1
- package/lib/internal/_isTypeUint64Bigint.d.ts +1 -0
- package/lib/internal/_isTypeUint64Bigint.js +10 -0
- package/lib/internal/_isTypeUint64Bigint.js.map +1 -0
- package/lib/internal/_isTypeUint64Bigint.mjs +8 -0
- package/lib/internal/_isTypeUint64Bigint.mjs.map +1 -0
- package/lib/internal/_isUniqueItems.js +96 -109
- package/lib/internal/_isUniqueItems.js.map +1 -1
- package/lib/internal/_isUniqueItems.mjs +62 -50
- package/lib/internal/_isUniqueItems.mjs.map +1 -1
- package/lib/internal/_jsonStringifyArray.d.ts +1 -0
- package/lib/internal/_jsonStringifyArray.js +48 -0
- package/lib/internal/_jsonStringifyArray.js.map +1 -0
- package/lib/internal/_jsonStringifyArray.mjs +40 -0
- package/lib/internal/_jsonStringifyArray.mjs.map +1 -0
- package/lib/internal/_jsonStringifyElement.d.ts +1 -0
- package/lib/internal/_jsonStringifyElement.js +23 -0
- package/lib/internal/_jsonStringifyElement.js.map +1 -0
- package/lib/internal/_jsonStringifyElement.mjs +23 -0
- package/lib/internal/_jsonStringifyElement.mjs.map +1 -0
- package/lib/internal/_jsonStringifyProperty.d.ts +1 -0
- package/lib/internal/_jsonStringifyProperty.js +31 -0
- package/lib/internal/_jsonStringifyProperty.js.map +1 -0
- package/lib/internal/_jsonStringifyProperty.mjs +31 -0
- package/lib/internal/_jsonStringifyProperty.mjs.map +1 -0
- package/lib/internal/_llmApplicationFinalize.js +1 -1
- package/lib/internal/_llmApplicationFinalize.js.map +1 -1
- package/lib/internal/_llmApplicationFinalize.mjs +1 -1
- package/lib/internal/_llmApplicationFinalize.mjs.map +1 -1
- package/lib/internal/_notationAny.js +8 -1
- package/lib/internal/_notationAny.js.map +1 -1
- package/lib/internal/_notationAny.mjs +7 -1
- package/lib/internal/_notationAny.mjs.map +1 -1
- package/lib/internal/_notationAssign.d.ts +1 -0
- package/lib/internal/_notationAssign.js +18 -0
- package/lib/internal/_notationAssign.js.map +1 -0
- package/lib/internal/_notationAssign.mjs +17 -0
- package/lib/internal/_notationAssign.mjs.map +1 -0
- package/lib/internal/_notationCamel.js +30 -9
- package/lib/internal/_notationCamel.js.map +1 -1
- package/lib/internal/_notationCamel.mjs +13 -5
- package/lib/internal/_notationCamel.mjs.map +1 -1
- package/lib/internal/_notationKebab.d.ts +1 -0
- package/lib/internal/_notationKebab.js +15 -0
- package/lib/internal/_notationKebab.js.map +1 -0
- package/lib/internal/_notationKebab.mjs +15 -0
- package/lib/internal/_notationKebab.mjs.map +1 -0
- package/lib/internal/_notationKeyCollision.d.ts +1 -0
- package/lib/internal/_notationKeyCollision.js +8 -0
- package/lib/internal/_notationKeyCollision.js.map +1 -0
- package/lib/internal/_notationKeyCollision.mjs +8 -0
- package/lib/internal/_notationKeyCollision.mjs.map +1 -0
- package/lib/internal/_notationPascal.js +20 -5
- package/lib/internal/_notationPascal.js.map +1 -1
- package/lib/internal/_notationPascal.mjs +10 -5
- package/lib/internal/_notationPascal.mjs.map +1 -1
- package/lib/internal/_notationSnake.js +25 -22
- package/lib/internal/_notationSnake.js.map +1 -1
- package/lib/internal/_notationSnake.mjs +11 -11
- package/lib/internal/_notationSnake.mjs.map +1 -1
- package/lib/internal/_plainCloneAny.js +174 -38
- package/lib/internal/_plainCloneAny.js.map +1 -1
- package/lib/internal/_plainCloneAny.mjs +126 -22
- package/lib/internal/_plainCloneAny.mjs.map +1 -1
- package/lib/internal/_randomArray.d.ts +1 -1
- package/lib/internal/_randomArray.js +11 -4
- package/lib/internal/_randomArray.js.map +1 -1
- package/lib/internal/_randomArray.mjs +9 -3
- package/lib/internal/_randomArray.mjs.map +1 -1
- package/lib/internal/_randomFormatByte.d.ts +2 -1
- package/lib/internal/_randomFormatByte.js +25 -1
- package/lib/internal/_randomFormatByte.js.map +1 -1
- package/lib/internal/_randomFormatByte.mjs +20 -1
- package/lib/internal/_randomFormatByte.mjs.map +1 -1
- package/lib/internal/_randomFormatDate.d.ts +3 -4
- package/lib/internal/_randomFormatDate.js +3 -10
- package/lib/internal/_randomFormatDate.js.map +1 -1
- package/lib/internal/_randomFormatDate.mjs +3 -6
- package/lib/internal/_randomFormatDate.mjs.map +1 -1
- package/lib/internal/_randomFormatDatetime.d.ts +3 -4
- package/lib/internal/_randomFormatDatetime.js +26 -8
- package/lib/internal/_randomFormatDatetime.js.map +1 -1
- package/lib/internal/_randomFormatDatetime.mjs +17 -6
- package/lib/internal/_randomFormatDatetime.mjs.map +1 -1
- package/lib/internal/_randomFormatDuration.d.ts +2 -1
- package/lib/internal/_randomFormatDuration.js +23 -14
- package/lib/internal/_randomFormatDuration.js.map +1 -1
- package/lib/internal/_randomFormatDuration.mjs +22 -13
- package/lib/internal/_randomFormatDuration.mjs.map +1 -1
- package/lib/internal/_randomFormatEmail.d.ts +2 -1
- package/lib/internal/_randomFormatEmail.js +8 -1
- package/lib/internal/_randomFormatEmail.js.map +1 -1
- package/lib/internal/_randomFormatEmail.mjs +5 -1
- package/lib/internal/_randomFormatEmail.mjs.map +1 -1
- package/lib/internal/_randomFormatHostname.d.ts +8 -1
- package/lib/internal/_randomFormatHostname.js +45 -2
- package/lib/internal/_randomFormatHostname.js.map +1 -1
- package/lib/internal/_randomFormatHostname.mjs +38 -2
- package/lib/internal/_randomFormatHostname.mjs.map +1 -1
- package/lib/internal/_randomFormatIdnEmail.d.ts +2 -1
- package/lib/internal/_randomFormatIdnEmail.js +16 -2
- package/lib/internal/_randomFormatIdnEmail.js.map +1 -1
- package/lib/internal/_randomFormatIdnEmail.mjs +11 -2
- package/lib/internal/_randomFormatIdnEmail.mjs.map +1 -1
- package/lib/internal/_randomFormatIdnHostname.d.ts +2 -1
- package/lib/internal/_randomFormatIdnHostname.js +26 -1
- package/lib/internal/_randomFormatIdnHostname.js.map +1 -1
- package/lib/internal/_randomFormatIdnHostname.mjs +25 -2
- package/lib/internal/_randomFormatIdnHostname.mjs.map +1 -1
- package/lib/internal/_randomFormatIpv4.d.ts +2 -1
- package/lib/internal/_randomFormatIpv4.js +32 -1
- package/lib/internal/_randomFormatIpv4.js.map +1 -1
- package/lib/internal/_randomFormatIpv4.mjs +23 -1
- package/lib/internal/_randomFormatIpv4.mjs.map +1 -1
- package/lib/internal/_randomFormatIpv6.d.ts +2 -1
- package/lib/internal/_randomFormatIpv6.js +58 -1
- package/lib/internal/_randomFormatIpv6.js.map +1 -1
- package/lib/internal/_randomFormatIpv6.mjs +45 -1
- package/lib/internal/_randomFormatIpv6.mjs.map +1 -1
- package/lib/internal/_randomFormatIri.d.ts +2 -1
- package/lib/internal/_randomFormatIri.js +1 -1
- package/lib/internal/_randomFormatIri.js.map +1 -1
- package/lib/internal/_randomFormatIri.mjs +1 -1
- package/lib/internal/_randomFormatIri.mjs.map +1 -1
- package/lib/internal/_randomFormatIriReference.d.ts +2 -1
- package/lib/internal/_randomFormatIriReference.js +1 -1
- package/lib/internal/_randomFormatIriReference.js.map +1 -1
- package/lib/internal/_randomFormatIriReference.mjs +1 -1
- package/lib/internal/_randomFormatIriReference.mjs.map +1 -1
- package/lib/internal/_randomFormatJsonPointer.d.ts +2 -1
- package/lib/internal/_randomFormatJsonPointer.js +20 -1
- package/lib/internal/_randomFormatJsonPointer.js.map +1 -1
- package/lib/internal/_randomFormatJsonPointer.mjs +15 -1
- package/lib/internal/_randomFormatJsonPointer.mjs.map +1 -1
- package/lib/internal/_randomFormatPassword.d.ts +2 -1
- package/lib/internal/_randomFormatPassword.js +7 -5
- package/lib/internal/_randomFormatPassword.js.map +1 -1
- package/lib/internal/_randomFormatPassword.mjs +5 -1
- package/lib/internal/_randomFormatPassword.mjs.map +1 -1
- package/lib/internal/_randomFormatRegex.d.ts +2 -1
- package/lib/internal/_randomFormatRegex.js +15 -1
- package/lib/internal/_randomFormatRegex.js.map +1 -1
- package/lib/internal/_randomFormatRegex.mjs +14 -1
- package/lib/internal/_randomFormatRegex.mjs.map +1 -1
- package/lib/internal/_randomFormatRelativeJsonPointer.d.ts +2 -1
- package/lib/internal/_randomFormatRelativeJsonPointer.js +20 -5
- package/lib/internal/_randomFormatRelativeJsonPointer.js.map +1 -1
- package/lib/internal/_randomFormatRelativeJsonPointer.mjs +21 -5
- package/lib/internal/_randomFormatRelativeJsonPointer.mjs.map +1 -1
- package/lib/internal/_randomFormatTime.d.ts +2 -1
- package/lib/internal/_randomFormatTime.js +34 -7
- package/lib/internal/_randomFormatTime.js.map +1 -1
- package/lib/internal/_randomFormatTime.mjs +37 -4
- package/lib/internal/_randomFormatTime.mjs.map +1 -1
- package/lib/internal/_randomFormatUri.d.ts +2 -1
- package/lib/internal/_randomFormatUri.js +1 -1
- package/lib/internal/_randomFormatUri.js.map +1 -1
- package/lib/internal/_randomFormatUri.mjs +1 -1
- package/lib/internal/_randomFormatUri.mjs.map +1 -1
- package/lib/internal/_randomFormatUriReference.d.ts +2 -1
- package/lib/internal/_randomFormatUriReference.js +1 -1
- package/lib/internal/_randomFormatUriReference.js.map +1 -1
- package/lib/internal/_randomFormatUriReference.mjs +1 -1
- package/lib/internal/_randomFormatUriReference.mjs.map +1 -1
- package/lib/internal/_randomFormatUriTemplate.d.ts +2 -1
- package/lib/internal/_randomFormatUriTemplate.js +1 -1
- package/lib/internal/_randomFormatUriTemplate.js.map +1 -1
- package/lib/internal/_randomFormatUriTemplate.mjs +1 -1
- package/lib/internal/_randomFormatUriTemplate.mjs.map +1 -1
- package/lib/internal/_randomFormatUrl.d.ts +2 -1
- package/lib/internal/_randomFormatUrl.js +21 -1
- package/lib/internal/_randomFormatUrl.js.map +1 -1
- package/lib/internal/_randomFormatUrl.mjs +18 -1
- package/lib/internal/_randomFormatUrl.mjs.map +1 -1
- package/lib/internal/_randomFormatUuid.d.ts +2 -1
- package/lib/internal/_randomFormatUuid.js +3 -2
- package/lib/internal/_randomFormatUuid.js.map +1 -1
- package/lib/internal/_randomFormatUuid.mjs +3 -2
- package/lib/internal/_randomFormatUuid.mjs.map +1 -1
- package/lib/internal/_randomInteger.js +59 -28
- package/lib/internal/_randomInteger.js.map +1 -1
- package/lib/internal/_randomInteger.mjs +56 -16
- package/lib/internal/_randomInteger.mjs.map +1 -1
- package/lib/internal/_randomMultiple.d.ts +8 -0
- package/lib/internal/_randomMultiple.js +168 -0
- package/lib/internal/_randomMultiple.js.map +1 -0
- package/lib/internal/_randomMultiple.mjs +158 -0
- package/lib/internal/_randomMultiple.mjs.map +1 -0
- package/lib/internal/_randomNumber.js +42 -42
- package/lib/internal/_randomNumber.js.map +1 -1
- package/lib/internal/_randomNumber.mjs +41 -27
- package/lib/internal/_randomNumber.mjs.map +1 -1
- package/lib/internal/_randomPattern.d.ts +2 -1
- package/lib/internal/_randomPattern.js +19 -4
- package/lib/internal/_randomPattern.js.map +1 -1
- package/lib/internal/_randomPattern.mjs +10 -4
- package/lib/internal/_randomPattern.mjs.map +1 -1
- package/lib/internal/_randomStringLength.d.ts +64 -0
- package/lib/internal/_randomStringLength.js +84 -0
- package/lib/internal/_randomStringLength.js.map +1 -0
- package/lib/internal/_randomStringLength.mjs +79 -0
- package/lib/internal/_randomStringLength.mjs.map +1 -0
- package/lib/internal/_stringLength.d.ts +1 -0
- package/lib/internal/_stringLength.js +11 -0
- package/lib/internal/_stringLength.js.map +1 -0
- package/lib/internal/_stringLength.mjs +10 -0
- package/lib/internal/_stringLength.mjs.map +1 -0
- package/lib/internal/_validateReport.js +4 -1
- package/lib/internal/_validateReport.js.map +1 -1
- package/lib/internal/_validateReport.mjs +2 -1
- package/lib/internal/_validateReport.mjs.map +1 -1
- package/lib/internal/private/__notationRename.d.ts +14 -0
- package/lib/internal/private/__notationRename.js +25 -0
- package/lib/internal/private/__notationRename.js.map +1 -0
- package/lib/internal/private/__notationRename.mjs +24 -0
- package/lib/internal/private/__notationRename.mjs.map +1 -0
- package/lib/internal/private/__randomComposition.d.ts +23 -0
- package/lib/internal/private/__randomComposition.js +48 -0
- package/lib/internal/private/__randomComposition.js.map +1 -0
- package/lib/internal/private/__randomComposition.mjs +54 -0
- package/lib/internal/private/__randomComposition.mjs.map +1 -0
- package/lib/internal/private/__randomEpoch.d.ts +19 -0
- package/lib/internal/private/__randomEpoch.js +31 -0
- package/lib/internal/private/__randomEpoch.js.map +1 -0
- package/lib/internal/private/__randomEpoch.mjs +28 -0
- package/lib/internal/private/__randomEpoch.mjs.map +1 -0
- package/lib/json.d.ts +2 -2
- package/lib/json.mjs.map +1 -1
- package/lib/module.d.ts +2 -2
- package/lib/module.js.map +1 -1
- package/lib/module.mjs.map +1 -1
- package/lib/notations.d.ts +20 -4
- package/lib/notations.js.map +1 -1
- package/lib/notations.mjs.map +1 -1
- package/native/adapter/plugin_options.go +117 -0
- package/native/adapter/plugin_options_payload_matrix_test.go +181 -0
- package/native/cmd/ttsc-typia/any_array_type_tags_transform_test.go +63 -9
- package/native/cmd/ttsc-typia/assert_guard_factory_contract_test.go +152 -0
- package/native/cmd/ttsc-typia/build.go +84 -64
- package/native/cmd/ttsc-typia/build_no_emit_preserves_analysis_options_test.go +67 -0
- package/native/cmd/ttsc-typia/build_no_emit_transform_diagnostics_test.go +138 -0
- package/native/cmd/ttsc-typia/build_plugin_options_come_from_payload_test.go +48 -0
- package/native/cmd/ttsc-typia/build_transactional_emit_success_test.go +81 -0
- package/native/cmd/ttsc-typia/build_transform_failure_atomicity_test.go +138 -0
- package/native/cmd/ttsc-typia/callable_interface_function_semantics_transform_test.go +331 -0
- package/native/cmd/ttsc-typia/callable_type_literal_boundaries_transform_test.go +1184 -0
- package/native/cmd/ttsc-typia/command_routes_and_diagnostics_coverage_test.go +3 -1
- package/native/cmd/ttsc-typia/compare_functional_union_membership_transform_test.go +434 -0
- package/native/cmd/ttsc-typia/compare_less_nan_transform_test.go +98 -0
- package/native/cmd/ttsc-typia/compare_native_object_overmatch_transform_test.go +161 -0
- package/native/cmd/ttsc-typia/compare_nondiscriminable_union_transform_test.go +343 -0
- package/native/cmd/ttsc-typia/compare_template_literal_union_transform_test.go +241 -0
- package/native/cmd/ttsc-typia/compare_union_discrimination_transform_test.go +289 -0
- package/native/cmd/ttsc-typia/default_library_spoof_native_identity_transform_test.go +216 -0
- package/native/cmd/ttsc-typia/escaped_property_key_path_transform_test.go +193 -0
- package/native/cmd/ttsc-typia/finite_option_number_leaf_transform_test.go +240 -0
- package/native/cmd/ttsc-typia/functional_promised_type_transform_test.go +220 -0
- package/native/cmd/ttsc-typia/functional_receiver_transform_test.go +232 -0
- package/native/cmd/ttsc-typia/is_object_function_member_transform_test.go +205 -0
- package/native/cmd/ttsc-typia/json_application_alias_function_validation_transform_test.go +151 -0
- package/native/cmd/ttsc-typia/json_is_stringify_finite_number_transform_test.go +198 -0
- package/native/cmd/ttsc-typia/json_schema_dynamic_key_determinism_transform_test.go +246 -0
- package/native/cmd/ttsc-typia/json_stringify_contextual_undefined_transform_test.go +556 -0
- package/native/cmd/ttsc-typia/json_stringify_special_key_transform_test.go +238 -0
- package/native/cmd/ttsc-typia/lib_replacement_native_identity_transform_test.go +277 -0
- package/native/cmd/ttsc-typia/main_wasm.go +21 -2
- package/native/cmd/ttsc-typia/native_collection_identity_is_transform_test.go +234 -0
- package/native/cmd/ttsc-typia/native_generic_name_guard_is_transform_test.go +194 -0
- package/native/cmd/ttsc-typia/native_name_collision_is_transform_test.go +204 -0
- package/native/cmd/ttsc-typia/native_named_intersection_union_transform_test.go +390 -0
- package/native/cmd/ttsc-typia/node_buffer_native_exports_is_transform_test.go +526 -0
- package/native/cmd/ttsc-typia/non_trailing_rest_tuple_transform_test.go +23 -11
- package/native/cmd/ttsc-typia/notation_dynamic_keys_transform_test.go +286 -0
- package/native/cmd/ttsc-typia/notation_kebab_case_transform_test.go +1 -1
- package/native/cmd/ttsc-typia/notation_literal_collision_transform_test.go +164 -0
- package/native/cmd/ttsc-typia/notation_pascal_case_transform_test.go +230 -0
- package/native/cmd/ttsc-typia/notation_unicode_key_transform_test.go +309 -0
- package/native/cmd/ttsc-typia/package_declaration_native_identity_is_transform_test.go +293 -0
- package/native/cmd/ttsc-typia/pattern_line_terminator_escape_transform_test.go +224 -0
- package/native/cmd/ttsc-typia/plain_prune_union_object_overmatch_transform_test.go +219 -0
- package/native/cmd/ttsc-typia/plugin_options_payload_helpers_test.go +181 -0
- package/native/cmd/ttsc-typia/private_field_filter_is_transform_test.go +278 -0
- package/native/cmd/ttsc-typia/project_catalog_transform_coverage_test.go +73 -27
- package/native/cmd/ttsc-typia/project_dependencies_barrel_reexport_transform_test.go +120 -0
- package/native/cmd/ttsc-typia/project_dependencies_collapsed_alias_transform_test.go +134 -0
- package/native/cmd/ttsc-typia/project_dependencies_custom_lib_name_transform_test.go +135 -0
- package/native/cmd/ttsc-typia/project_dependencies_default_barrel_transform_test.go +114 -0
- package/native/cmd/ttsc-typia/project_dependencies_empty_heritage_transform_test.go +100 -0
- package/native/cmd/ttsc-typia/project_dependencies_envelope_transform_test.go +148 -0
- package/native/cmd/ttsc-typia/project_dependencies_index_signature_alias_transform_test.go +139 -0
- package/native/cmd/ttsc-typia/project_dependencies_local_reexport_transform_test.go +122 -0
- package/native/cmd/ttsc-typia/project_dependencies_signature_alias_transform_test.go +125 -0
- package/native/cmd/ttsc-typia/project_dependencies_star_barrel_transform_test.go +112 -0
- package/native/cmd/ttsc-typia/project_reference_graph_envelope_transform_test.go +190 -0
- package/native/cmd/ttsc-typia/protobuf_diagnostic_code_transform_test.go +167 -0
- package/native/cmd/ttsc-typia/protobuf_is_encode_finite_number_transform_test.go +98 -0
- package/native/cmd/ttsc-typia/protobuf_sequence_field_numbers_transform_test.go +52 -22
- package/native/cmd/ttsc-typia/symbol_index_domain_transform_test.go +316 -0
- package/native/cmd/ttsc-typia/symbol_key_member_filter_transform_test.go +279 -0
- package/native/cmd/ttsc-typia/template_interpolation_type_tags_transform_test.go +86 -23
- package/native/cmd/ttsc-typia/template_literal_type_tags_transform_test.go +3 -1
- package/native/cmd/ttsc-typia/transform.go +251 -39
- package/native/cmd/ttsc-typia/{transform_declaration_source_produces_no_js_test.go → transform_declaration_source_produces_no_javascript_test.go} +10 -2
- package/native/cmd/ttsc-typia/transform_fixtures_emit_coverage_test.go +21 -4
- package/native/cmd/ttsc-typia/transform_helpers_test.go +236 -3
- package/native/cmd/ttsc-typia/transform_plugin_options_come_from_payload_test.go +43 -0
- package/native/cmd/ttsc-typia/transform_single_file_failure_atomicity_test.go +114 -0
- package/native/cmd/ttsc-typia/transform_single_file_failure_writes_no_stdout_test.go +43 -0
- package/native/cmd/ttsc-typia/transform_single_file_js_distinguishes_same_basename_sources_test.go +81 -0
- package/native/cmd/ttsc-typia/transform_single_file_js_empty_emit_reports_no_output_test.go +100 -0
- package/native/cmd/ttsc-typia/transform_single_file_js_locates_output_across_layouts_test.go +160 -0
- package/native/cmd/ttsc-typia/transform_single_file_success_publishes_artifact_test.go +54 -0
- package/native/cmd/ttsc-typia/transform_wasm_host_argv_reports_diagnostics_test.go +39 -0
- package/native/cmd/ttsc-typia/tuple_optional_compare_clone_transform_test.go +227 -0
- package/native/cmd/ttsc-typia/user_global_native_identity_transform_test.go +484 -0
- package/native/core/factories/FormatCheatSheet.go +40 -7
- package/native/core/factories/IdentifierFactory.go +131 -4
- package/native/core/factories/MetadataCommentTagFactory.go +83 -40
- package/native/core/factories/MetadataTypeTagFactory.go +13 -1
- package/native/core/factories/NumericRangeFactory.go +60 -17
- package/native/core/factories/ProtobufFactory.go +13 -5
- package/native/core/factories/factory_utility_coverage_test.go +8 -2
- package/native/core/factories/format_alias_resolves_to_cheat_sheet_test.go +57 -0
- package/native/core/factories/format_alias_table_targets_the_cheat_sheet_test.go +44 -0
- package/native/core/factories/identifier_factory_postfix_escapes_every_key_test.go +147 -0
- package/native/core/factories/identifier_factory_postfix_survives_every_code_point_test.go +86 -0
- package/native/core/factories/internal/metadata/MetadataHelper.go +226 -17
- package/native/core/factories/internal/metadata/emplace_metadata_object.go +141 -8
- package/native/core/factories/internal/metadata/iterate_metadata.go +6 -0
- package/native/core/factories/internal/metadata/iterate_metadata_function.go +5 -12
- package/native/core/factories/internal/metadata/iterate_metadata_intersection.go +111 -29
- package/native/core/factories/internal/metadata/iterate_metadata_map.go +5 -0
- package/native/core/factories/internal/metadata/iterate_metadata_native.go +45 -2
- package/native/core/factories/internal/metadata/iterate_metadata_set.go +5 -0
- package/native/core/factories/internal/metadata/type_arguments_precondition_test.go +70 -0
- package/native/core/factories/metadata_comment_tag_factory_coverage_test.go +39 -0
- package/native/core/factories/metadata_comment_tag_factory_exclusivity_matches_interface_test.go +84 -0
- package/native/core/factories/metadata_type_tag_factory_accepts_legal_tag_combinations_test.go +60 -0
- package/native/core/factories/metadata_type_tag_factory_declarations_test.go +86 -0
- package/native/core/factories/metadata_type_tag_factory_keeps_bool_form_exclusivity_test.go +38 -0
- package/native/core/factories/metadata_type_tag_factory_rejects_cross_kind_exclusive_tags_test.go +65 -0
- package/native/core/factories/metadata_type_tag_factory_rejects_duplicated_array_form_tags_test.go +41 -0
- package/native/core/factories/numeric_range_factory_enforces_64bit_bounds_test.go +69 -0
- package/native/core/factories/protobuf_recovery_ownership_test.go +64 -0
- package/native/core/programmers/IsProgrammer.go +15 -1
- package/native/core/programmers/RandomProgrammer.go +51 -14
- package/native/core/programmers/compare/CompareEqualProgrammer.go +410 -8
- package/native/core/programmers/compare/CompareLessProgrammer.go +4 -2
- package/native/core/programmers/functional/FunctionalAssertFunctionProgrammer.go +4 -6
- package/native/core/programmers/functional/FunctionalAssertParametersProgrammer.go +5 -13
- package/native/core/programmers/functional/FunctionalAssertReturnProgrammer.go +6 -14
- package/native/core/programmers/functional/FunctionalIsFunctionProgrammer.go +4 -6
- package/native/core/programmers/functional/FunctionalIsParametersProgrammer.go +49 -14
- package/native/core/programmers/functional/FunctionalIsReturnProgrammer.go +5 -13
- package/native/core/programmers/functional/FunctionalValidateFunctionProgrammer.go +4 -6
- package/native/core/programmers/functional/FunctionalValidateParametersProgrammer.go +5 -13
- package/native/core/programmers/functional/FunctionalValidateReturnProgrammer.go +5 -13
- package/native/core/programmers/functional/internal/FunctionalGeneralProgrammer.go +4 -17
- package/native/core/programmers/helpers/CloneJoiner.go +32 -0
- package/native/core/programmers/helpers/FunctionProgrammer.go +6 -13
- package/native/core/programmers/helpers/NotationJoiner.go +86 -28
- package/native/core/programmers/helpers/StringifyJoinder.go +161 -51
- package/native/core/programmers/helpers/UnionExplorer.go +203 -61
- package/native/core/programmers/helpers/joiner_branch_coverage_test.go +116 -118
- package/native/core/programmers/helpers/union_explorer_coverage_test.go +1 -1
- package/native/core/programmers/internal/CheckerProgrammer.go +100 -48
- package/native/core/programmers/iterate/check_template.go +344 -32
- package/native/core/programmers/iterate/iterate_check_coverage_test.go +76 -158
- package/native/core/programmers/iterate/iterate_utility_coverage_test.go +231 -270
- package/native/core/programmers/iterate/json_schema_discriminator.go +36 -10
- package/native/core/programmers/iterate/json_schema_discriminator_declaration_syntax_test.go +205 -0
- package/native/core/programmers/iterate/json_schema_object.go +49 -7
- package/native/core/programmers/iterate/json_schema_pattern_property_order_test.go +44 -0
- package/native/core/programmers/iterate/openapi_v3_downgrader.go +674 -0
- package/native/core/programmers/iterate/openapi_v3_downgrader_boolean_default_test.go +95 -0
- package/native/core/programmers/iterate/openapi_v3_downgrader_test.go +123 -0
- package/native/core/programmers/iterate/template_interpolation_tags_test.go +40 -8
- package/native/core/programmers/iterate/template_runtime_pattern.go +63 -7
- package/native/core/programmers/json/JsonApplicationProgrammer.go +45 -11
- package/native/core/programmers/json/JsonSchemasProgrammer.go +12 -2
- package/native/core/programmers/json/JsonStringifyProgrammer.go +47 -6
- package/native/core/programmers/llm/LlmApplicationProgrammer.go +21 -11
- package/native/core/programmers/llm/LlmSchemaProgrammer.go +23 -6
- package/native/core/programmers/llm/llm_reference_codec_test.go +24 -0
- package/native/core/programmers/notations/NotationGeneralProgrammer.go +183 -67
- package/native/core/programmers/notations/notation_general_helpers_test.go +1 -3
- package/native/core/programmers/notations/notation_general_programmer_pascal_multiword_test.go +72 -0
- package/native/core/programmers/notations/notation_general_programmer_underscore_boundary_test.go +68 -0
- package/native/core/programmers/plain/PlainClassifyProgrammer.go +23 -15
- package/native/core/programmers/plain/PlainCloneProgrammer.go +20 -7
- package/native/core/programmers/plain/PlainPruneProgrammer.go +19 -5
- package/native/core/programmers/plain/plain_tuple_seed_recovery_ownership_test.go +25 -0
- package/native/core/programmers/protobuf/ProtobufDecodeProgrammer.go +37 -28
- package/native/core/programmers/protobuf/ProtobufMessageProgrammer.go +41 -22
- package/native/core/programmers/protobuf/protobuf_programmer_helper_coverage_test.go +26 -0
- package/native/core/programmers/random_programmer_length_argument_test.go +53 -0
- package/native/core/schemas/metadata/MetadataCollection.go +266 -25
- package/native/core/schemas/metadata/MetadataDefaultLibrary.go +81 -0
- package/native/core/schemas/metadata/MetadataDependency.go +388 -0
- package/native/core/schemas/metadata/MetadataObjectType.go +24 -22
- package/native/core/schemas/metadata/metadata_collection_generic_argument_dot_test.go +122 -0
- package/native/core/schemas/metadata/metadata_collection_name_allocation_test.go +147 -0
- package/native/core/schemas/metadata/metadata_collection_openapi_name_cascade_test.go +55 -0
- package/native/core/schemas/metadata/metadata_collection_openapi_name_test.go +68 -0
- package/native/core/utils/PatternUtil.go +13 -0
- package/native/core/utils/PromiseTypeFactory.go +59 -0
- package/native/core/utils/ProtobufNameEncoder.go +8 -0
- package/native/core/utils/promise_type_factory_semantics_test.go +118 -0
- package/native/go.mod +9 -1
- package/native/transform/CallExpressionTransformer.go +12 -0
- package/native/transform/features/json/JsonApplicationTransformer.go +1 -1
- package/native/transform/features/json/JsonSchemaTransformer.go +1 -1
- package/native/transform/features/json/JsonSchemasTransformer.go +5 -4
- package/native/transform/features/protobuf/ProtobufMessageTransformer.go +1 -1
- package/package.json +12 -4
- package/src/executable/FileSystemIdentity.ts +222 -0
- package/src/executable/TypiaGenerateWizard.ts +386 -113
- package/src/functional.ts +30 -60
- package/src/internal/_ProtobufReader.ts +161 -46
- package/src/internal/_createStandardSchema.ts +15 -1
- package/src/internal/_decimal.ts +69 -0
- package/src/internal/_httpQueryParseURLSearchParams.ts +24 -2
- package/src/internal/_isFormatByte.ts +2 -5
- package/src/internal/_isFormatDate.ts +15 -2
- package/src/internal/_isFormatDateTime.ts +28 -2
- package/src/internal/_isFormatIri.ts +5 -2
- package/src/internal/_isFormatIriReference.ts +11 -3
- package/src/internal/_isFormatUriReference.ts +1 -1
- package/src/internal/_isMultipleOf.ts +8 -0
- package/src/internal/_isTypeFloat.ts +1 -1
- package/src/internal/_isTypeInt64.ts +1 -0
- package/src/internal/_isTypeInt64Bigint.ts +12 -0
- package/src/internal/_isTypeUint64.ts +1 -0
- package/src/internal/_isTypeUint64Bigint.ts +7 -0
- package/src/internal/_isUniqueItems.ts +134 -132
- package/src/internal/_jsonStringifyArray.ts +50 -0
- package/src/internal/_jsonStringifyElement.ts +19 -0
- package/src/internal/_jsonStringifyProperty.ts +30 -0
- package/src/internal/_llmApplicationFinalize.ts +6 -1
- package/src/internal/_notationAny.ts +9 -4
- package/src/internal/_notationAssign.ts +20 -0
- package/src/internal/_notationCamel.ts +31 -10
- package/src/internal/_notationKebab.ts +11 -0
- package/src/internal/_notationKeyCollision.ts +9 -0
- package/src/internal/_notationPascal.ts +19 -6
- package/src/internal/_notationSnake.ts +24 -21
- package/src/internal/_plainCloneAny.ts +208 -33
- package/src/internal/_randomArray.ts +13 -4
- package/src/internal/_randomFormatByte.ts +31 -1
- package/src/internal/_randomFormatDate.ts +6 -17
- package/src/internal/_randomFormatDatetime.ts +34 -15
- package/src/internal/_randomFormatDuration.ts +30 -13
- package/src/internal/_randomFormatEmail.ts +8 -2
- package/src/internal/_randomFormatHostname.ts +48 -1
- package/src/internal/_randomFormatIdnEmail.ts +18 -2
- package/src/internal/_randomFormatIdnHostname.ts +34 -2
- package/src/internal/_randomFormatIpv4.ts +43 -2
- package/src/internal/_randomFormatIpv6.ts +67 -2
- package/src/internal/_randomFormatIri.ts +3 -1
- package/src/internal/_randomFormatIriReference.ts +3 -1
- package/src/internal/_randomFormatJsonPointer.ts +28 -2
- package/src/internal/_randomFormatPassword.ts +11 -6
- package/src/internal/_randomFormatRegex.ts +22 -1
- package/src/internal/_randomFormatRelativeJsonPointer.ts +26 -6
- package/src/internal/_randomFormatTime.ts +46 -10
- package/src/internal/_randomFormatUri.ts +3 -1
- package/src/internal/_randomFormatUriReference.ts +3 -1
- package/src/internal/_randomFormatUriTemplate.ts +3 -1
- package/src/internal/_randomFormatUrl.ts +25 -2
- package/src/internal/_randomFormatUuid.ts +10 -6
- package/src/internal/_randomInteger.ts +87 -40
- package/src/internal/_randomMultiple.ts +245 -0
- package/src/internal/_randomNumber.ts +72 -55
- package/src/internal/_randomPattern.ts +29 -4
- package/src/internal/_randomStringLength.ts +116 -0
- package/src/internal/_stringLength.ts +5 -0
- package/src/internal/_validateReport.ts +5 -1
- package/src/internal/private/__notationRename.ts +21 -0
- package/src/internal/private/__randomComposition.ts +50 -0
- package/src/internal/private/__randomEpoch.ts +34 -0
- package/src/json.ts +2 -2
- package/src/module.ts +4 -6
- package/src/notations.ts +20 -4
- package/lib/internal/private/__notationCapitalize.d.ts +0 -1
- package/lib/internal/private/__notationCapitalize.js +0 -6
- package/lib/internal/private/__notationCapitalize.js.map +0 -1
- package/lib/internal/private/__notationCapitalize.mjs +0 -6
- package/lib/internal/private/__notationCapitalize.mjs.map +0 -1
- package/lib/internal/private/__notationUnsnake.d.ts +0 -4
- package/lib/internal/private/__notationUnsnake.js +0 -26
- package/lib/internal/private/__notationUnsnake.js.map +0 -1
- package/lib/internal/private/__notationUnsnake.mjs +0 -15
- package/lib/internal/private/__notationUnsnake.mjs.map +0 -1
- package/native/adapter/visit.go +0 -173
- package/native/adapter/visit_property_chain_edges_test.go +0 -129
- package/native/cmd/ttsc-typia/plugin_options_missing_config_test.go +0 -26
- package/native/cmd/ttsc-typia/plugin_options_undefined_false_test.go +0 -36
- package/native/core/programmers/helpers/disable_function_programmer_declare.go +0 -10
- package/native/core/programmers/iterate/check_union_array_like.go +0 -422
- package/native/core/programmers/iterate/prune_object_properties.go +0 -105
- package/native/core/programmers/iterate/stringify_dynamic_properties.go +0 -219
- package/native/core/programmers/iterate/stringify_native.go +0 -14
- package/native/core/programmers/iterate/stringify_regular_properties.go +0 -112
- package/native/core/schemas/metadata/MetadataApplication.go +0 -41
- package/src/internal/private/__notationCapitalize.ts +0 -2
- package/src/internal/private/__notationUnsnake.ts +0 -24
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
package main
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"os"
|
|
5
|
+
"os/exec"
|
|
6
|
+
"path/filepath"
|
|
7
|
+
"strings"
|
|
8
|
+
"testing"
|
|
9
|
+
)
|
|
10
|
+
|
|
11
|
+
// TestJsonStringifySpecialKeyTransform pins json.createStringify (and the
|
|
12
|
+
// guarded isStringify / assertStringify / validateStringify variants) against a
|
|
13
|
+
// static object key that contains a double quote, a backslash, a control
|
|
14
|
+
// character, a `${` interpolation sequence, an empty string, or a backtick
|
|
15
|
+
// (#2201).
|
|
16
|
+
//
|
|
17
|
+
// StringifyJoinder emits each static key by JSON-escaping it with
|
|
18
|
+
// json.Marshal, then splicing the JSON bytes into a *template literal* through
|
|
19
|
+
// TemplateFactory.Generate. JSON escaping and template-literal escaping
|
|
20
|
+
// disagree, so at runtime `\"`->`"`, `\\`->`\`, a control char stays raw, a raw
|
|
21
|
+
// backtick closes the template (a SyntaxError in the emitted module), and `${`
|
|
22
|
+
// starts a live interpolation (a serialize-time ReferenceError / injection).
|
|
23
|
+
// The result is invalid JSON, or a crash, for exactly these keys, while
|
|
24
|
+
// ordinary keys, dynamic Record keys, and all string values stay correct.
|
|
25
|
+
//
|
|
26
|
+
// 1. Transform a fixture that exports json.createStringify (plus the guarded
|
|
27
|
+
// variants) for an object whose keys are `q"k`, `back\slash`, a TAB,
|
|
28
|
+
// `interp${bad}here`, the empty string, and a backtick.
|
|
29
|
+
// 2. Execute the emitted serializer in Node with a faithful
|
|
30
|
+
// _jsonStringifyNumber stub.
|
|
31
|
+
// 3. Require the serialized document to JSON.parse back to the original object
|
|
32
|
+
// for every key, and report the exact executed case count so a runner that
|
|
33
|
+
// silently skipped a key cannot pass as a false green.
|
|
34
|
+
func TestJsonStringifySpecialKeyTransform(t *testing.T) {
|
|
35
|
+
project := jsonStringifySpecialKeyProject(t)
|
|
36
|
+
js := jsonStringifySpecialKeyTransform(t, project)
|
|
37
|
+
jsonStringifySpecialKeyRunRuntime(t, project, js)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
func jsonStringifySpecialKeyProject(t *testing.T) string {
|
|
41
|
+
t.Helper()
|
|
42
|
+
root := ttscTypiaTestRepoRoot(t)
|
|
43
|
+
base := filepath.Join(root, "packages", "typia", "native", ".tmp-ttsc-typia-tests")
|
|
44
|
+
if err := os.MkdirAll(base, 0o755); err != nil {
|
|
45
|
+
t.Fatalf("mkdir temp base: %v", err)
|
|
46
|
+
}
|
|
47
|
+
dir, err := os.MkdirTemp(base, "json-stringify-special-key-")
|
|
48
|
+
if err != nil {
|
|
49
|
+
t.Fatalf("create temp fixture: %v", err)
|
|
50
|
+
}
|
|
51
|
+
t.Cleanup(func() {
|
|
52
|
+
_ = os.RemoveAll(dir)
|
|
53
|
+
})
|
|
54
|
+
src := filepath.Join(dir, "src")
|
|
55
|
+
if err := os.MkdirAll(src, 0o755); err != nil {
|
|
56
|
+
t.Fatalf("mkdir fixture src: %v", err)
|
|
57
|
+
}
|
|
58
|
+
if err := os.WriteFile(filepath.Join(dir, "tsconfig.json"), []byte(jsonStringifySpecialKeyTSConfig), 0o644); err != nil {
|
|
59
|
+
t.Fatalf("write tsconfig: %v", err)
|
|
60
|
+
}
|
|
61
|
+
if err := os.WriteFile(filepath.Join(src, "main.ts"), []byte(jsonStringifySpecialKeySource), 0o644); err != nil {
|
|
62
|
+
t.Fatalf("write source: %v", err)
|
|
63
|
+
}
|
|
64
|
+
return dir
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
func jsonStringifySpecialKeyTransform(t *testing.T, project string) string {
|
|
68
|
+
t.Helper()
|
|
69
|
+
payload := `[{"config":{"transform":"typia/lib/transform"},"name":"typia","stage":"transform"}]`
|
|
70
|
+
out, errText, code := ttscTypiaTestCapture(func() int {
|
|
71
|
+
return runTransform([]string{
|
|
72
|
+
"--cwd", project,
|
|
73
|
+
"--tsconfig", "tsconfig.json",
|
|
74
|
+
"--file", "src/main.ts",
|
|
75
|
+
"--output", "js",
|
|
76
|
+
"--plugins-json", payload,
|
|
77
|
+
})
|
|
78
|
+
})
|
|
79
|
+
if code != 0 {
|
|
80
|
+
t.Fatalf("json stringify special-key transform failed: code=%d stderr=\n%s", code, errText)
|
|
81
|
+
}
|
|
82
|
+
return out
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
func jsonStringifySpecialKeyRunRuntime(t *testing.T, project string, js string) {
|
|
86
|
+
t.Helper()
|
|
87
|
+
node, err := exec.LookPath("node")
|
|
88
|
+
if err != nil {
|
|
89
|
+
t.Skip("node executable not found")
|
|
90
|
+
}
|
|
91
|
+
runtimeDir := filepath.Join(project, "runtime")
|
|
92
|
+
if err := os.MkdirAll(runtimeDir, 0o755); err != nil {
|
|
93
|
+
t.Fatalf("mkdir runtime dir: %v", err)
|
|
94
|
+
}
|
|
95
|
+
ttscTypiaTestWriteCommonRuntimeStubs(t, runtimeDir)
|
|
96
|
+
stubs := map[string]string{
|
|
97
|
+
"json-stringify-number-stub.cjs": jsonStringifySpecialKeyNumberStub,
|
|
98
|
+
"json-stringify-string-stub.cjs": jsonStringifySpecialKeyStringStub,
|
|
99
|
+
"throw-type-guard-error-stub.cjs": jsonStringifySpecialKeyThrowStub,
|
|
100
|
+
}
|
|
101
|
+
for name, content := range stubs {
|
|
102
|
+
if err := os.WriteFile(filepath.Join(runtimeDir, name), []byte(content), 0o644); err != nil {
|
|
103
|
+
t.Fatalf("write %s: %v", name, err)
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
runtimeJS := strings.ReplaceAll(js, `require("typia/lib/internal/_jsonStringifyNumber")`, `require("./json-stringify-number-stub.cjs")`)
|
|
107
|
+
runtimeJS = strings.ReplaceAll(runtimeJS, `require("typia/lib/internal/_jsonStringifyString")`, `require("./json-stringify-string-stub.cjs")`)
|
|
108
|
+
runtimeJS = strings.ReplaceAll(runtimeJS, `require("typia/lib/internal/_throwTypeGuardError")`, `require("./throw-type-guard-error-stub.cjs")`)
|
|
109
|
+
runtimeJS = ttscTypiaTestRewriteCommonJS(t, runtimeJS)
|
|
110
|
+
if err := os.WriteFile(filepath.Join(runtimeDir, "main.cjs"), []byte(runtimeJS), 0o644); err != nil {
|
|
111
|
+
t.Fatalf("write runtime module: %v", err)
|
|
112
|
+
}
|
|
113
|
+
runner := filepath.Join(runtimeDir, "run.cjs")
|
|
114
|
+
if err := os.WriteFile(runner, []byte(jsonStringifySpecialKeyRunner), 0o644); err != nil {
|
|
115
|
+
t.Fatalf("write runtime runner: %v", err)
|
|
116
|
+
}
|
|
117
|
+
cmd := exec.Command(node, runner)
|
|
118
|
+
cmd.Dir = runtimeDir
|
|
119
|
+
output, err := cmd.CombinedOutput()
|
|
120
|
+
if err != nil {
|
|
121
|
+
t.Fatalf("json stringify special-key runtime failed: %v\n%s", err, output)
|
|
122
|
+
}
|
|
123
|
+
const expected = "RAN 24 CASES"
|
|
124
|
+
if !strings.Contains(string(output), expected) {
|
|
125
|
+
t.Fatalf("json stringify special-key runner did not report %q; got:\n%s", expected, output)
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
const jsonStringifySpecialKeyTSConfig = `{
|
|
130
|
+
"compilerOptions": {
|
|
131
|
+
"target": "ES2022",
|
|
132
|
+
"module": "commonjs",
|
|
133
|
+
"moduleResolution": "bundler",
|
|
134
|
+
"ignoreDeprecations": "6.0",
|
|
135
|
+
"types": ["*"],
|
|
136
|
+
"esModuleInterop": true,
|
|
137
|
+
"strict": true,
|
|
138
|
+
"skipLibCheck": true
|
|
139
|
+
},
|
|
140
|
+
"include": ["src"]
|
|
141
|
+
}
|
|
142
|
+
`
|
|
143
|
+
|
|
144
|
+
const jsonStringifySpecialKeySource = `import typia from "typia";
|
|
145
|
+
|
|
146
|
+
interface Special {
|
|
147
|
+
"q\"k": number;
|
|
148
|
+
"back\\slash": number;
|
|
149
|
+
"\t": number;
|
|
150
|
+
"interp${bad}here": number;
|
|
151
|
+
"": number;
|
|
152
|
+
"` + "`" + `": number;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
export const stringifySpecial = typia.json.createStringify<Special>();
|
|
156
|
+
export const isStringifySpecial = typia.json.createIsStringify<Special>();
|
|
157
|
+
export const assertStringifySpecial = typia.json.createAssertStringify<Special>();
|
|
158
|
+
export const validateStringifySpecial = typia.json.createValidateStringify<Special>();
|
|
159
|
+
`
|
|
160
|
+
|
|
161
|
+
const jsonStringifySpecialKeyNumberStub = `module.exports._jsonStringifyNumber = (value) => (Number.isFinite(value) ? String(value) : "null");
|
|
162
|
+
`
|
|
163
|
+
|
|
164
|
+
const jsonStringifySpecialKeyStringStub = `module.exports._jsonStringifyString = (value) => JSON.stringify(value);
|
|
165
|
+
`
|
|
166
|
+
|
|
167
|
+
const jsonStringifySpecialKeyThrowStub = `module.exports._throwTypeGuardError = (props) => {
|
|
168
|
+
const error = new Error(props.expected);
|
|
169
|
+
Object.assign(error, props);
|
|
170
|
+
throw error;
|
|
171
|
+
};
|
|
172
|
+
`
|
|
173
|
+
|
|
174
|
+
const jsonStringifySpecialKeyRunner = `const mod = require("./main.cjs");
|
|
175
|
+
|
|
176
|
+
const TAB = String.fromCharCode(9);
|
|
177
|
+
const BQ = String.fromCharCode(96);
|
|
178
|
+
|
|
179
|
+
const makeInput = () => {
|
|
180
|
+
const input = {};
|
|
181
|
+
input['q"k'] = 1;
|
|
182
|
+
input['back\\slash'] = 2;
|
|
183
|
+
input[TAB] = 3;
|
|
184
|
+
input['interp${bad}here'] = 4;
|
|
185
|
+
input[''] = 5;
|
|
186
|
+
input[BQ] = 6;
|
|
187
|
+
return input;
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
const entries = [
|
|
191
|
+
['q"k', 1],
|
|
192
|
+
['back\\slash', 2],
|
|
193
|
+
[TAB, 3],
|
|
194
|
+
['interp${bad}here', 4],
|
|
195
|
+
['', 5],
|
|
196
|
+
[BQ, 6],
|
|
197
|
+
];
|
|
198
|
+
|
|
199
|
+
let ran = 0;
|
|
200
|
+
|
|
201
|
+
const roundTrip = (label, text) => {
|
|
202
|
+
const parsed = JSON.parse(text);
|
|
203
|
+
for (const [key, expected] of entries) {
|
|
204
|
+
ran += 1;
|
|
205
|
+
if (parsed[key] !== expected) {
|
|
206
|
+
throw new Error(
|
|
207
|
+
label + ": key " + JSON.stringify(key) + " round-trip failed; got " +
|
|
208
|
+
JSON.stringify(parsed[key]) + " in " + text,
|
|
209
|
+
);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
if (Object.keys(parsed).length !== entries.length) {
|
|
213
|
+
throw new Error(label + ": unexpected key count in " + text);
|
|
214
|
+
}
|
|
215
|
+
};
|
|
216
|
+
|
|
217
|
+
// json.createStringify: the raw serializer must emit valid JSON for every key.
|
|
218
|
+
roundTrip("createStringify", mod.stringifySpecial(makeInput()));
|
|
219
|
+
|
|
220
|
+
// json.createIsStringify: valid input serializes; the document must round-trip.
|
|
221
|
+
const isText = mod.isStringifySpecial(makeInput());
|
|
222
|
+
if (isText === null) {
|
|
223
|
+
throw new Error("isStringify rejected a valid special-key object");
|
|
224
|
+
}
|
|
225
|
+
roundTrip("isStringify", isText);
|
|
226
|
+
|
|
227
|
+
// json.createAssertStringify: valid input passes the guard, then serializes.
|
|
228
|
+
roundTrip("assertStringify", mod.assertStringifySpecial(makeInput()));
|
|
229
|
+
|
|
230
|
+
// json.createValidateStringify: success carries the serialized document.
|
|
231
|
+
const validated = mod.validateStringifySpecial(makeInput());
|
|
232
|
+
if (validated.success !== true) {
|
|
233
|
+
throw new Error("validateStringify rejected a valid special-key object: " + JSON.stringify(validated));
|
|
234
|
+
}
|
|
235
|
+
roundTrip("validateStringify", validated.data);
|
|
236
|
+
|
|
237
|
+
console.log("RAN " + ran + " CASES");
|
|
238
|
+
`
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
package main
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"fmt"
|
|
5
|
+
"os"
|
|
6
|
+
"os/exec"
|
|
7
|
+
"path/filepath"
|
|
8
|
+
"strings"
|
|
9
|
+
"testing"
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
// TestLibReplacementNativeIdentityTransform keeps a `libReplacement` project's
|
|
13
|
+
// natives native even though their declaration file lives in node_modules
|
|
14
|
+
// (#2200).
|
|
15
|
+
//
|
|
16
|
+
// Runtime-native identity requires a runtime authority to declare the global, so
|
|
17
|
+
// which files count as a TypeScript default library became load-bearing. Under
|
|
18
|
+
// `libReplacement` the compiler resolves `lib.es2015.collection.d.ts` to
|
|
19
|
+
// `@typescript/lib-es2015/collection`, an ordinary package file whose name does
|
|
20
|
+
// not even begin with `lib.` — so a file-name rule answers "not a default
|
|
21
|
+
// library" and would demote Map, Set, WeakMap, and WeakSet to structural checks
|
|
22
|
+
// that accept any object. Only the program's own classification is right here,
|
|
23
|
+
// and this fixture is what proves the transform consults it.
|
|
24
|
+
//
|
|
25
|
+
// 1. Publish `@typescript/lib-es2015/collection.d.ts` carrying the real
|
|
26
|
+
// Map/Set/WeakMap/WeakSet declarations plus a probe interface that exists
|
|
27
|
+
// nowhere else, and enable `libReplacement`.
|
|
28
|
+
// 2. Transform validators for the four replaced collection natives, for Date
|
|
29
|
+
// and Uint8Array as bundled-library controls, and for the probe.
|
|
30
|
+
// 3. Require the probe to transform at all, which fails unless the replacement
|
|
31
|
+
// file — not the bundled lib — is what the program loaded.
|
|
32
|
+
// 4. Require every native to keep its `instanceof` check and execute all of
|
|
33
|
+
// them in Node against real instances and plain objects.
|
|
34
|
+
func TestLibReplacementNativeIdentityTransform(t *testing.T) {
|
|
35
|
+
project := libReplacementNativeIdentityProject(t)
|
|
36
|
+
js, errText, code := ttscTypiaTestCapture(func() int {
|
|
37
|
+
return runTransform([]string{
|
|
38
|
+
"--cwd", project,
|
|
39
|
+
"--tsconfig", "tsconfig.json",
|
|
40
|
+
"--file", "src/input.ts",
|
|
41
|
+
"--output", "js",
|
|
42
|
+
})
|
|
43
|
+
})
|
|
44
|
+
if code != 0 {
|
|
45
|
+
t.Fatalf("lib replacement transform failed: code=%d stderr=\n%s", code, errText)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
failures := []string{}
|
|
49
|
+
if !strings.Contains(js, "libReplacementMarker") {
|
|
50
|
+
failures = append(failures, "emit lost the replacement-only probe member; the project did not load the replaced lib file")
|
|
51
|
+
}
|
|
52
|
+
for _, kept := range []string{
|
|
53
|
+
"instanceof Map",
|
|
54
|
+
"instanceof Set",
|
|
55
|
+
"instanceof WeakMap",
|
|
56
|
+
"instanceof WeakSet",
|
|
57
|
+
"instanceof Date",
|
|
58
|
+
"instanceof Uint8Array",
|
|
59
|
+
} {
|
|
60
|
+
if !strings.Contains(js, kept) {
|
|
61
|
+
failures = append(failures, fmt.Sprintf("replaced or bundled default library native lost %q", kept))
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
output, runtimeErr := libReplacementNativeIdentityRun(t, project, js)
|
|
66
|
+
if runtimeErr != nil {
|
|
67
|
+
failures = append(failures, fmt.Sprintf("runtime matrix failed: %v\n%s", runtimeErr, output))
|
|
68
|
+
}
|
|
69
|
+
if expected := "RAN 13 REPLACEMENT CASES"; !strings.Contains(output, expected) {
|
|
70
|
+
failures = append(failures, fmt.Sprintf("replacement runner did not report %q; got:\n%s", expected, output))
|
|
71
|
+
}
|
|
72
|
+
if len(failures) != 0 {
|
|
73
|
+
t.Fatalf("lib replacement native identity mismatches:\n%s\n\nemit:\n%s", strings.Join(failures, "\n"), js)
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
func libReplacementNativeIdentityProject(t *testing.T) string {
|
|
78
|
+
t.Helper()
|
|
79
|
+
root := ttscTypiaTestRepoRoot(t)
|
|
80
|
+
base := filepath.Join(root, "packages", "typia", "native", ".tmp-ttsc-typia-tests")
|
|
81
|
+
if err := os.MkdirAll(base, 0o755); err != nil {
|
|
82
|
+
t.Fatalf("mkdir temp base: %v", err)
|
|
83
|
+
}
|
|
84
|
+
dir, err := os.MkdirTemp(base, "lib-replacement-native-identity-")
|
|
85
|
+
if err != nil {
|
|
86
|
+
t.Fatalf("create temp fixture: %v", err)
|
|
87
|
+
}
|
|
88
|
+
t.Cleanup(func() {
|
|
89
|
+
_ = os.RemoveAll(dir)
|
|
90
|
+
})
|
|
91
|
+
for name, content := range map[string]string{
|
|
92
|
+
"tsconfig.json": libReplacementNativeIdentityTSConfig,
|
|
93
|
+
"node_modules/@typescript/lib-es2015/package.json": libReplacementNativeIdentityPackageJSON,
|
|
94
|
+
"node_modules/@typescript/lib-es2015/collection.d.ts": libReplacementNativeIdentityCollectionLib,
|
|
95
|
+
"src/input.ts": libReplacementNativeIdentitySource,
|
|
96
|
+
} {
|
|
97
|
+
path := filepath.Join(dir, filepath.FromSlash(name))
|
|
98
|
+
if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil {
|
|
99
|
+
t.Fatalf("mkdir fixture path %s: %v", filepath.Dir(path), err)
|
|
100
|
+
}
|
|
101
|
+
if err := os.WriteFile(path, []byte(content), 0o644); err != nil {
|
|
102
|
+
t.Fatalf("write fixture file %s: %v", path, err)
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return dir
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
func libReplacementNativeIdentityRun(t *testing.T, project string, js string) (string, error) {
|
|
109
|
+
t.Helper()
|
|
110
|
+
node, err := exec.LookPath("node")
|
|
111
|
+
if err != nil {
|
|
112
|
+
t.Skip("node executable not found")
|
|
113
|
+
return "", nil
|
|
114
|
+
}
|
|
115
|
+
runtimeDir := filepath.Join(project, "runtime")
|
|
116
|
+
if err := os.MkdirAll(runtimeDir, 0o755); err != nil {
|
|
117
|
+
t.Fatalf("mkdir runtime dir: %v", err)
|
|
118
|
+
}
|
|
119
|
+
ttscTypiaTestWriteCommonRuntimeStubs(t, runtimeDir)
|
|
120
|
+
for name, content := range map[string]string{
|
|
121
|
+
"input.cjs": ttscTypiaTestRewriteCommonJS(t, js),
|
|
122
|
+
"run.cjs": libReplacementNativeIdentityRuntimeRunner,
|
|
123
|
+
} {
|
|
124
|
+
if err := os.WriteFile(filepath.Join(runtimeDir, name), []byte(content), 0o644); err != nil {
|
|
125
|
+
t.Fatalf("write runtime file %s: %v", name, err)
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
cmd := exec.Command(node, filepath.Join(runtimeDir, "run.cjs"))
|
|
129
|
+
cmd.Dir = runtimeDir
|
|
130
|
+
output, err := cmd.CombinedOutput()
|
|
131
|
+
return string(output), err
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
const libReplacementNativeIdentityTSConfig = `{
|
|
135
|
+
"compilerOptions": {
|
|
136
|
+
"target": "ES2022",
|
|
137
|
+
"module": "commonjs",
|
|
138
|
+
"moduleResolution": "bundler",
|
|
139
|
+
"ignoreDeprecations": "6.0",
|
|
140
|
+
"lib": ["ES2022"],
|
|
141
|
+
"types": [],
|
|
142
|
+
"libReplacement": true,
|
|
143
|
+
"esModuleInterop": true,
|
|
144
|
+
"strict": true,
|
|
145
|
+
"skipLibCheck": true
|
|
146
|
+
},
|
|
147
|
+
"include": ["src"]
|
|
148
|
+
}
|
|
149
|
+
`
|
|
150
|
+
|
|
151
|
+
const libReplacementNativeIdentityPackageJSON = `{
|
|
152
|
+
"name": "@typescript/lib-es2015",
|
|
153
|
+
"version": "1.0.0"
|
|
154
|
+
}
|
|
155
|
+
`
|
|
156
|
+
|
|
157
|
+
// libReplacementNativeIdentityCollectionLib is the replacement TypeScript loads
|
|
158
|
+
// instead of its bundled `lib.es2015.collection.d.ts`. The collection
|
|
159
|
+
// declarations are transcribed from that file so the rest of the standard
|
|
160
|
+
// library still typechecks against them; `LibReplacementProbe` is the one
|
|
161
|
+
// addition, and it is what proves the program loaded this file.
|
|
162
|
+
const libReplacementNativeIdentityCollectionLib = `interface LibReplacementProbe {
|
|
163
|
+
libReplacementMarker: string;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
interface Map<K, V> {
|
|
167
|
+
clear(): void;
|
|
168
|
+
delete(key: K): boolean;
|
|
169
|
+
forEach(callbackfn: (value: V, key: K, map: Map<K, V>) => void, thisArg?: any): void;
|
|
170
|
+
get(key: K): V | undefined;
|
|
171
|
+
has(key: K): boolean;
|
|
172
|
+
set(key: K, value: V): this;
|
|
173
|
+
readonly size: number;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
interface MapConstructor {
|
|
177
|
+
new (): Map<any, any>;
|
|
178
|
+
new <K, V>(entries?: readonly (readonly [K, V])[] | null): Map<K, V>;
|
|
179
|
+
readonly prototype: Map<any, any>;
|
|
180
|
+
}
|
|
181
|
+
declare var Map: MapConstructor;
|
|
182
|
+
|
|
183
|
+
interface ReadonlyMap<K, V> {
|
|
184
|
+
forEach(callbackfn: (value: V, key: K, map: ReadonlyMap<K, V>) => void, thisArg?: any): void;
|
|
185
|
+
get(key: K): V | undefined;
|
|
186
|
+
has(key: K): boolean;
|
|
187
|
+
readonly size: number;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
interface WeakMap<K extends WeakKey, V> {
|
|
191
|
+
delete(key: K): boolean;
|
|
192
|
+
get(key: K): V | undefined;
|
|
193
|
+
has(key: K): boolean;
|
|
194
|
+
set(key: K, value: V): this;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
interface WeakMapConstructor {
|
|
198
|
+
new <K extends WeakKey = WeakKey, V = any>(entries?: readonly (readonly [K, V])[] | null): WeakMap<K, V>;
|
|
199
|
+
readonly prototype: WeakMap<WeakKey, any>;
|
|
200
|
+
}
|
|
201
|
+
declare var WeakMap: WeakMapConstructor;
|
|
202
|
+
|
|
203
|
+
interface Set<T> {
|
|
204
|
+
add(value: T): this;
|
|
205
|
+
clear(): void;
|
|
206
|
+
delete(value: T): boolean;
|
|
207
|
+
forEach(callbackfn: (value: T, value2: T, set: Set<T>) => void, thisArg?: any): void;
|
|
208
|
+
has(value: T): boolean;
|
|
209
|
+
readonly size: number;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
interface SetConstructor {
|
|
213
|
+
new <T = any>(values?: readonly T[] | null): Set<T>;
|
|
214
|
+
readonly prototype: Set<any>;
|
|
215
|
+
}
|
|
216
|
+
declare var Set: SetConstructor;
|
|
217
|
+
|
|
218
|
+
interface ReadonlySet<T> {
|
|
219
|
+
forEach(callbackfn: (value: T, value2: T, set: ReadonlySet<T>) => void, thisArg?: any): void;
|
|
220
|
+
has(value: T): boolean;
|
|
221
|
+
readonly size: number;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
interface WeakSet<T extends WeakKey> {
|
|
225
|
+
add(value: T): this;
|
|
226
|
+
delete(value: T): boolean;
|
|
227
|
+
has(value: T): boolean;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
interface WeakSetConstructor {
|
|
231
|
+
new <T extends WeakKey = WeakKey>(values?: readonly T[] | null): WeakSet<T>;
|
|
232
|
+
readonly prototype: WeakSet<WeakKey>;
|
|
233
|
+
}
|
|
234
|
+
declare var WeakSet: WeakSetConstructor;
|
|
235
|
+
`
|
|
236
|
+
|
|
237
|
+
const libReplacementNativeIdentitySource = `import typia from "typia";
|
|
238
|
+
|
|
239
|
+
export const createdIsProbe = typia.createIs<LibReplacementProbe>();
|
|
240
|
+
export const createdIsMap = typia.createIs<Map<string, number>>();
|
|
241
|
+
export const createdIsSet = typia.createIs<Set<string>>();
|
|
242
|
+
export const createdIsWeakMap = typia.createIs<WeakMap<object, string>>();
|
|
243
|
+
export const createdIsWeakSet = typia.createIs<WeakSet<object>>();
|
|
244
|
+
export const createdIsDate = typia.createIs<Date>();
|
|
245
|
+
export const createdIsBytes = typia.createIs<Uint8Array>();
|
|
246
|
+
`
|
|
247
|
+
|
|
248
|
+
const libReplacementNativeIdentityRuntimeRunner = `const validators = require("./input.cjs");
|
|
249
|
+
|
|
250
|
+
let ran = 0;
|
|
251
|
+
const failures = [];
|
|
252
|
+
const eq = (name, actual, expected) => {
|
|
253
|
+
ran += 1;
|
|
254
|
+
if (actual !== expected) {
|
|
255
|
+
failures.push(name + ": expected " + expected + " but got " + actual);
|
|
256
|
+
}
|
|
257
|
+
};
|
|
258
|
+
|
|
259
|
+
eq("probe structural", validators.createdIsProbe({ libReplacementMarker: "x" }), true);
|
|
260
|
+
eq("Map real", validators.createdIsMap(new Map([["x", 1]])), true);
|
|
261
|
+
eq("Map plain", validators.createdIsMap({}), false);
|
|
262
|
+
eq("Set real", validators.createdIsSet(new Set(["x"])), true);
|
|
263
|
+
eq("Set plain", validators.createdIsSet({}), false);
|
|
264
|
+
eq("WeakMap real", validators.createdIsWeakMap(new WeakMap()), true);
|
|
265
|
+
eq("WeakMap plain", validators.createdIsWeakMap({}), false);
|
|
266
|
+
eq("WeakSet real", validators.createdIsWeakSet(new WeakSet()), true);
|
|
267
|
+
eq("WeakSet plain", validators.createdIsWeakSet({}), false);
|
|
268
|
+
eq("Date real", validators.createdIsDate(new Date()), true);
|
|
269
|
+
eq("Date plain", validators.createdIsDate({}), false);
|
|
270
|
+
eq("Uint8Array real", validators.createdIsBytes(new Uint8Array(1)), true);
|
|
271
|
+
eq("Uint8Array plain", validators.createdIsBytes({}), false);
|
|
272
|
+
|
|
273
|
+
console.log("RAN " + ran + " REPLACEMENT CASES");
|
|
274
|
+
if (failures.length !== 0) {
|
|
275
|
+
throw new Error("MISMATCHES:\n" + failures.join("\n"));
|
|
276
|
+
}
|
|
277
|
+
`
|
|
@@ -74,6 +74,7 @@ func jsVersion(this js.Value, args []js.Value) any {
|
|
|
74
74
|
// file?: string, // absolute path of the .ts file to rewrite. Omit
|
|
75
75
|
// // for project-wide JSON output.
|
|
76
76
|
// output?: "ts"|"js",
|
|
77
|
+
// "plugins-json"?: string, // ttsc's resolved plugin manifest; see buildArgs
|
|
77
78
|
// }
|
|
78
79
|
//
|
|
79
80
|
// JS output: Promise<{ code: number, stdout: string, stderr: string }>.
|
|
@@ -154,9 +155,11 @@ func transformArgs(opts js.Value) []string {
|
|
|
154
155
|
} else {
|
|
155
156
|
out = append(out, "--output=ts")
|
|
156
157
|
}
|
|
157
|
-
return out
|
|
158
|
+
return append(out, pluginsJSONArgs(opts)...)
|
|
158
159
|
}
|
|
159
160
|
|
|
161
|
+
// buildArgs renders the JS options object into `runBuild`'s argv. Input mirrors
|
|
162
|
+
// jsTransform but carries `outDir`/`emit`/`noEmit` instead of `file`/`output`.
|
|
160
163
|
func buildArgs(opts js.Value) []string {
|
|
161
164
|
out := []string{}
|
|
162
165
|
if v := stringProp(opts, "cwd"); v != "" {
|
|
@@ -176,7 +179,23 @@ func buildArgs(opts js.Value) []string {
|
|
|
176
179
|
if boolProp(opts, "noEmit") {
|
|
177
180
|
out = append(out, "--noEmit")
|
|
178
181
|
}
|
|
179
|
-
return out
|
|
182
|
+
return append(out, pluginsJSONArgs(opts)...)
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// pluginsJSONArgs forwards ttsc's resolved plugin manifest, when the caller
|
|
186
|
+
// supplied one.
|
|
187
|
+
//
|
|
188
|
+
// typia's options come from the entry its host resolved and handed it, never
|
|
189
|
+
// from re-reading tsconfig.json (samchon/typia#1887). A JS host driving this
|
|
190
|
+
// wasm is that host: it owns the virtual filesystem the tsconfig lives in, so it
|
|
191
|
+
// is the one that knows the resolved entry. Without this pass-through the wasm
|
|
192
|
+
// could only ever run typia at its defaults, because there would be no channel
|
|
193
|
+
// left to state anything else.
|
|
194
|
+
func pluginsJSONArgs(opts js.Value) []string {
|
|
195
|
+
if v := stringProp(opts, "plugins-json"); v != "" {
|
|
196
|
+
return []string{"--plugins-json=" + v}
|
|
197
|
+
}
|
|
198
|
+
return nil
|
|
180
199
|
}
|
|
181
200
|
|
|
182
201
|
func runWithCapturedIO(task func() int) any {
|