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
|
@@ -1,22 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
if (str.length === 0) return str;
|
|
3
|
-
|
|
4
|
-
// PREFIX
|
|
5
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
6
|
-
let prefix: string = "";
|
|
7
|
-
for (let i: number = 0; i < str.length; i++) {
|
|
8
|
-
if (str[i] === "_") prefix += "_";
|
|
9
|
-
else break;
|
|
10
|
-
}
|
|
11
|
-
if (prefix.length !== 0) str = str.substring(prefix.length);
|
|
12
|
-
|
|
13
|
-
const out = (s: string) => `${prefix}${s}`;
|
|
14
|
-
|
|
15
|
-
// SNAKE CASE
|
|
16
|
-
const items: string[] = str.split("_");
|
|
17
|
-
if (items.length > 1) return out(items.map((s) => s.toLowerCase()).join("_"));
|
|
18
|
-
|
|
19
|
-
// CAMEL OR PASCAL CASE
|
|
1
|
+
const _notationSnakeWord = (str: string): string => {
|
|
20
2
|
const indexes: number[] = [];
|
|
21
3
|
for (let i: number = 0; i < str.length; i++) {
|
|
22
4
|
const code: number = str.charCodeAt(i);
|
|
@@ -28,7 +10,7 @@ export const _notationSnake = (str: string): string => {
|
|
|
28
10
|
if (now - prev === 1) indexes.splice(i, 1);
|
|
29
11
|
}
|
|
30
12
|
if (indexes.length !== 0 && indexes[0] === 0) indexes.splice(0, 1);
|
|
31
|
-
if (indexes.length === 0) return
|
|
13
|
+
if (indexes.length === 0) return str.toLowerCase();
|
|
32
14
|
|
|
33
15
|
let ret: string = "";
|
|
34
16
|
for (let i: number = 0; i < indexes.length; i++) {
|
|
@@ -39,5 +21,26 @@ export const _notationSnake = (str: string): string => {
|
|
|
39
21
|
ret += "_";
|
|
40
22
|
}
|
|
41
23
|
ret += str.substring(indexes[indexes.length - 1]!).toLowerCase();
|
|
42
|
-
return
|
|
24
|
+
return ret;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export const _notationSnake = (str: string): string => {
|
|
28
|
+
if (str.length === 0) return str;
|
|
29
|
+
|
|
30
|
+
// PREFIX
|
|
31
|
+
let prefix: string = "";
|
|
32
|
+
for (let i: number = 0; i < str.length; i++) {
|
|
33
|
+
if (str[i] === "_") prefix += "_";
|
|
34
|
+
else break;
|
|
35
|
+
}
|
|
36
|
+
if (prefix.length !== 0) str = str.substring(prefix.length);
|
|
37
|
+
|
|
38
|
+
// SNAKE CASE
|
|
39
|
+
//
|
|
40
|
+
// Run the case-boundary walk within each underscore-delimited segment, not
|
|
41
|
+
// over the whole segment at once. Lowercasing a segment atomically would drop
|
|
42
|
+
// the camelCase boundary inside it (`["fooBar", "baz"]` -> `["foobar", "baz"]`
|
|
43
|
+
// -> `foobar_baz`), diverging from `SnakeCase<T>`; the per-segment walk keeps
|
|
44
|
+
// it (`["foo_bar", "baz"]` -> `foo_bar_baz`).
|
|
45
|
+
return `${prefix}${str.split("_").map(_notationSnakeWord).join("_")}`;
|
|
43
46
|
};
|
|
@@ -3,44 +3,219 @@ import { Resolved } from "@typia/interface";
|
|
|
3
3
|
export const _plainCloneAny = <T>(value: T): Resolved<T> =>
|
|
4
4
|
cloneMain(value) as Resolved<T>;
|
|
5
5
|
|
|
6
|
+
const NOT_NATIVE = Symbol("not-native");
|
|
7
|
+
const objectToString = Object.prototype.toString;
|
|
8
|
+
const getter = (prototype: object, key: PropertyKey): (() => unknown) =>
|
|
9
|
+
Object.getOwnPropertyDescriptor(prototype, key)!.get!;
|
|
10
|
+
const read = <T>(accessor: () => unknown, value: object): T =>
|
|
11
|
+
Reflect.apply(accessor, value, []) as T;
|
|
12
|
+
const tryRead = <T>(
|
|
13
|
+
accessor: (() => unknown) | undefined,
|
|
14
|
+
value: object,
|
|
15
|
+
): { success: true; value: T } | { success: false } => {
|
|
16
|
+
if (accessor === undefined) return { success: false };
|
|
17
|
+
try {
|
|
18
|
+
return { success: true, value: read<T>(accessor, value) };
|
|
19
|
+
} catch {
|
|
20
|
+
return { success: false };
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const arrayBufferByteLength = getter(ArrayBuffer.prototype, "byteLength");
|
|
25
|
+
const sharedArrayBufferByteLength =
|
|
26
|
+
typeof SharedArrayBuffer === "undefined"
|
|
27
|
+
? undefined
|
|
28
|
+
: getter(SharedArrayBuffer.prototype, "byteLength");
|
|
29
|
+
const dataViewBuffer = getter(DataView.prototype, "buffer");
|
|
30
|
+
const dataViewByteLength = getter(DataView.prototype, "byteLength");
|
|
31
|
+
const dataViewByteOffset = getter(DataView.prototype, "byteOffset");
|
|
32
|
+
const typedArrayName = getter(
|
|
33
|
+
Object.getPrototypeOf(Uint8Array.prototype),
|
|
34
|
+
Symbol.toStringTag,
|
|
35
|
+
);
|
|
36
|
+
const blobSize =
|
|
37
|
+
typeof Blob === "undefined" ? undefined : getter(Blob.prototype, "size");
|
|
38
|
+
const blobType =
|
|
39
|
+
typeof Blob === "undefined" ? undefined : getter(Blob.prototype, "type");
|
|
40
|
+
const fileName =
|
|
41
|
+
typeof File === "undefined" ? undefined : getter(File.prototype, "name");
|
|
42
|
+
const fileLastModified =
|
|
43
|
+
typeof File === "undefined"
|
|
44
|
+
? undefined
|
|
45
|
+
: getter(File.prototype, "lastModified");
|
|
46
|
+
const regexpSource = getter(RegExp.prototype, "source");
|
|
47
|
+
const regexpFlags = getter(RegExp.prototype, "flags");
|
|
48
|
+
|
|
49
|
+
const nativeTag = (value: object): string | undefined => {
|
|
50
|
+
let tagged: boolean;
|
|
51
|
+
try {
|
|
52
|
+
tagged = Symbol.toStringTag in value;
|
|
53
|
+
} catch {
|
|
54
|
+
return undefined;
|
|
55
|
+
}
|
|
56
|
+
if (!tagged)
|
|
57
|
+
try {
|
|
58
|
+
return objectToString.call(value);
|
|
59
|
+
} catch {
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const date = tryRead<number>(Date.prototype.getTime, value);
|
|
64
|
+
if (date.success) return "[object Date]";
|
|
65
|
+
const typed = tryRead<string>(typedArrayName, value);
|
|
66
|
+
if (typed.success && typed.value !== undefined)
|
|
67
|
+
return `[object ${typed.value}]`;
|
|
68
|
+
if (tryRead<number>(arrayBufferByteLength, value).success)
|
|
69
|
+
return "[object ArrayBuffer]";
|
|
70
|
+
if (tryRead<number>(sharedArrayBufferByteLength, value).success)
|
|
71
|
+
return "[object SharedArrayBuffer]";
|
|
72
|
+
if (tryRead<ArrayBufferLike>(dataViewBuffer, value).success)
|
|
73
|
+
return "[object DataView]";
|
|
74
|
+
if (tryRead<string>(fileName, value).success) return "[object File]";
|
|
75
|
+
if (tryRead<number>(blobSize, value).success) return "[object Blob]";
|
|
76
|
+
if (tryRead<string>(regexpSource, value).success) return "[object RegExp]";
|
|
77
|
+
return undefined;
|
|
78
|
+
};
|
|
79
|
+
|
|
6
80
|
const cloneMain = (value: any): any => {
|
|
7
81
|
if (value === undefined) return undefined;
|
|
8
82
|
else if (typeof value === "object")
|
|
9
83
|
if (value === null) return null;
|
|
10
84
|
else if (Array.isArray(value)) return value.map(cloneMain);
|
|
11
|
-
else
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
return new
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
return new Blob([value], { type: value.type });
|
|
32
|
-
else if (value instanceof Set) return new Set([...value].map(cloneMain));
|
|
33
|
-
else if (value instanceof Map)
|
|
34
|
-
return new Map([...value].map(([k, v]) => [cloneMain(k), cloneMain(v)]));
|
|
35
|
-
else if (value instanceof WeakSet || value instanceof WeakMap)
|
|
36
|
-
throw new Error("WeakSet and WeakMap are not supported");
|
|
37
|
-
else if (value.valueOf() !== value) return cloneMain(value.valueOf());
|
|
38
|
-
else
|
|
39
|
-
return Object.fromEntries(
|
|
40
|
-
Object.entries(value)
|
|
41
|
-
.map(([k, v]) => [k, cloneMain(v)])
|
|
42
|
-
.filter(([, v]) => v !== undefined),
|
|
43
|
-
);
|
|
85
|
+
else {
|
|
86
|
+
const native: any | typeof NOT_NATIVE = cloneNative(value);
|
|
87
|
+
if (native !== NOT_NATIVE) return native;
|
|
88
|
+
else if (value instanceof Set) return new Set([...value].map(cloneMain));
|
|
89
|
+
else if (value instanceof Map)
|
|
90
|
+
return new Map(
|
|
91
|
+
[...value].map(([k, v]) => [cloneMain(k), cloneMain(v)]),
|
|
92
|
+
);
|
|
93
|
+
else if (value instanceof WeakSet || value instanceof WeakMap)
|
|
94
|
+
throw new Error("WeakSet and WeakMap are not supported");
|
|
95
|
+
else {
|
|
96
|
+
const primitive: unknown = value.valueOf();
|
|
97
|
+
if (primitive !== value) return cloneMain(primitive);
|
|
98
|
+
return Object.fromEntries(
|
|
99
|
+
Object.entries(value)
|
|
100
|
+
.map(([k, v]) => [k, cloneMain(v)])
|
|
101
|
+
.filter(([, v]) => v !== undefined),
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
44
105
|
else if (typeof value === "function") return undefined;
|
|
45
106
|
return value;
|
|
46
107
|
};
|
|
108
|
+
|
|
109
|
+
const cloneNative = (value: object): any | typeof NOT_NATIVE => {
|
|
110
|
+
const tag: string | undefined = nativeTag(value);
|
|
111
|
+
switch (tag) {
|
|
112
|
+
case "[object Date]": {
|
|
113
|
+
const time = tryRead<number>(Date.prototype.getTime, value);
|
|
114
|
+
return time.success ? new Date(time.value) : NOT_NATIVE;
|
|
115
|
+
}
|
|
116
|
+
case "[object Uint8Array]":
|
|
117
|
+
return new Uint8Array(value as ArrayLike<number>);
|
|
118
|
+
case "[object Uint8ClampedArray]":
|
|
119
|
+
return new Uint8ClampedArray(value as ArrayLike<number>);
|
|
120
|
+
case "[object Uint16Array]":
|
|
121
|
+
return new Uint16Array(value as ArrayLike<number>);
|
|
122
|
+
case "[object Uint32Array]":
|
|
123
|
+
return new Uint32Array(value as ArrayLike<number>);
|
|
124
|
+
case "[object BigUint64Array]":
|
|
125
|
+
return new BigUint64Array(value as ArrayLike<bigint>);
|
|
126
|
+
case "[object Int8Array]":
|
|
127
|
+
return new Int8Array(value as ArrayLike<number>);
|
|
128
|
+
case "[object Int16Array]":
|
|
129
|
+
return new Int16Array(value as ArrayLike<number>);
|
|
130
|
+
case "[object Int32Array]":
|
|
131
|
+
return new Int32Array(value as ArrayLike<number>);
|
|
132
|
+
case "[object BigInt64Array]":
|
|
133
|
+
return new BigInt64Array(value as ArrayLike<bigint>);
|
|
134
|
+
case "[object Float32Array]":
|
|
135
|
+
return new Float32Array(value as ArrayLike<number>);
|
|
136
|
+
case "[object Float64Array]":
|
|
137
|
+
return new Float64Array(value as ArrayLike<number>);
|
|
138
|
+
case "[object ArrayBuffer]": {
|
|
139
|
+
const byteLength = tryRead<number>(arrayBufferByteLength, value);
|
|
140
|
+
return byteLength.success
|
|
141
|
+
? cloneBufferRange(value as ArrayBuffer, 0, byteLength.value, false)
|
|
142
|
+
: NOT_NATIVE;
|
|
143
|
+
}
|
|
144
|
+
case "[object SharedArrayBuffer]": {
|
|
145
|
+
const byteLength = tryRead<number>(sharedArrayBufferByteLength, value);
|
|
146
|
+
return byteLength.success
|
|
147
|
+
? cloneBufferRange(
|
|
148
|
+
value as SharedArrayBuffer,
|
|
149
|
+
0,
|
|
150
|
+
byteLength.value,
|
|
151
|
+
true,
|
|
152
|
+
)
|
|
153
|
+
: NOT_NATIVE;
|
|
154
|
+
}
|
|
155
|
+
case "[object DataView]": {
|
|
156
|
+
const buffer = tryRead<ArrayBufferLike>(dataViewBuffer, value);
|
|
157
|
+
if (!buffer.success) return NOT_NATIVE;
|
|
158
|
+
const byteOffset: number = read(dataViewByteOffset, value);
|
|
159
|
+
const byteLength: number = read(dataViewByteLength, value);
|
|
160
|
+
return new DataView(
|
|
161
|
+
cloneBufferRange(buffer.value, byteOffset, byteLength),
|
|
162
|
+
);
|
|
163
|
+
}
|
|
164
|
+
case "[object File]": {
|
|
165
|
+
const size = tryRead<number>(blobSize, value);
|
|
166
|
+
if (
|
|
167
|
+
typeof File === "undefined" ||
|
|
168
|
+
!size.success ||
|
|
169
|
+
blobType === undefined ||
|
|
170
|
+
fileName === undefined ||
|
|
171
|
+
fileLastModified === undefined
|
|
172
|
+
)
|
|
173
|
+
return NOT_NATIVE;
|
|
174
|
+
return new File([value as Blob], read<string>(fileName, value), {
|
|
175
|
+
type: read<string>(blobType, value),
|
|
176
|
+
lastModified: read<number>(fileLastModified, value),
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
case "[object Blob]": {
|
|
180
|
+
const size = tryRead<number>(blobSize, value);
|
|
181
|
+
if (
|
|
182
|
+
typeof Blob === "undefined" ||
|
|
183
|
+
!size.success ||
|
|
184
|
+
blobType === undefined
|
|
185
|
+
)
|
|
186
|
+
return NOT_NATIVE;
|
|
187
|
+
return new Blob([value as Blob], {
|
|
188
|
+
type: read<string>(blobType, value),
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
case "[object RegExp]": {
|
|
192
|
+
const source = tryRead<string>(regexpSource, value);
|
|
193
|
+
return source.success
|
|
194
|
+
? new RegExp(source.value, read<string>(regexpFlags, value))
|
|
195
|
+
: NOT_NATIVE;
|
|
196
|
+
}
|
|
197
|
+
default:
|
|
198
|
+
return NOT_NATIVE;
|
|
199
|
+
}
|
|
200
|
+
};
|
|
201
|
+
|
|
202
|
+
const cloneBufferRange = (
|
|
203
|
+
input: ArrayBufferLike,
|
|
204
|
+
byteOffset: number,
|
|
205
|
+
byteLength: number,
|
|
206
|
+
shared?: boolean,
|
|
207
|
+
): ArrayBuffer | SharedArrayBuffer => {
|
|
208
|
+
if (shared === undefined)
|
|
209
|
+
shared = tryRead<number>(sharedArrayBufferByteLength, input).success;
|
|
210
|
+
let output: ArrayBuffer | SharedArrayBuffer;
|
|
211
|
+
if (shared) {
|
|
212
|
+
if (typeof SharedArrayBuffer === "undefined")
|
|
213
|
+
throw new TypeError("SharedArrayBuffer is not available");
|
|
214
|
+
output = new SharedArrayBuffer(byteLength);
|
|
215
|
+
} else {
|
|
216
|
+
read<number>(arrayBufferByteLength, input);
|
|
217
|
+
output = new ArrayBuffer(byteLength);
|
|
218
|
+
}
|
|
219
|
+
new Uint8Array(output).set(new Uint8Array(input, byteOffset, byteLength));
|
|
220
|
+
return output;
|
|
221
|
+
};
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { OpenApi } from "@typia/interface";
|
|
2
2
|
|
|
3
|
+
import { _isUniqueItems } from "./_isUniqueItems";
|
|
3
4
|
import { _randomInteger } from "./_randomInteger";
|
|
4
5
|
|
|
5
6
|
const DEFAULT_MIN_ITEMS = 1;
|
|
@@ -27,8 +28,16 @@ export const _randomArray = <T>(
|
|
|
27
28
|
});
|
|
28
29
|
if (props.uniqueItems !== true)
|
|
29
30
|
return new Array(count).fill(null).map((_, i) => props.element(i, count));
|
|
30
|
-
const elements:
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
31
|
+
const elements: T[] = [];
|
|
32
|
+
const maximumAttempts: number = count * 100 + 1000;
|
|
33
|
+
for (let attempts = 0; elements.length !== count; attempts++) {
|
|
34
|
+
if (attempts === maximumAttempts)
|
|
35
|
+
throw new Error(
|
|
36
|
+
"Unable to generate enough unique items; the element domain may be too small.",
|
|
37
|
+
);
|
|
38
|
+
const candidate: T = props.element(elements.length, count);
|
|
39
|
+
if (elements.every((element) => _isUniqueItems([element, candidate])))
|
|
40
|
+
elements.push(candidate);
|
|
41
|
+
}
|
|
42
|
+
return elements;
|
|
34
43
|
};
|
|
@@ -1,3 +1,33 @@
|
|
|
1
|
-
|
|
1
|
+
import { _randomString } from "./_randomString";
|
|
2
|
+
import {
|
|
3
|
+
_ILengthProps,
|
|
4
|
+
_RANDOM_LENGTH_ERROR,
|
|
5
|
+
_randomLengthPick,
|
|
6
|
+
_randomLengthWindow,
|
|
7
|
+
} from "./_randomStringLength";
|
|
8
|
+
|
|
9
|
+
export const _randomFormatByte = (props?: _ILengthProps): string => {
|
|
10
|
+
if (props?.minLength === undefined && props?.maxLength === undefined)
|
|
11
|
+
return FIXED;
|
|
12
|
+
// Base64 encodes three bytes as four characters, so a valid length is always
|
|
13
|
+
// a multiple of four; the window is raised to the first multiple it contains
|
|
14
|
+
// and the draw steps by four from there. Every character `_randomString`
|
|
15
|
+
// emits is in the base64 alphabet, so the result needs no padding.
|
|
16
|
+
const window = _randomLengthWindow(props, { minimum: 0, spread: 16 });
|
|
17
|
+
const low: number = Math.ceil(window.low / 4) * 4;
|
|
18
|
+
if (low > window.high) throw new Error(_RANDOM_LENGTH_ERROR);
|
|
19
|
+
const length: number =
|
|
20
|
+
low +
|
|
21
|
+
4 *
|
|
22
|
+
_randomLengthPick({
|
|
23
|
+
low: 0,
|
|
24
|
+
high: Math.floor((window.high - low) / 4),
|
|
25
|
+
});
|
|
26
|
+
return _randomString({
|
|
27
|
+
type: "string",
|
|
28
|
+
minLength: length,
|
|
29
|
+
maxLength: length,
|
|
30
|
+
});
|
|
31
|
+
};
|
|
2
32
|
|
|
3
33
|
const FIXED = "vt7ekz4lIoNTTS9sDQYdWKharxIFAR54+z/umIxSgUM=";
|
|
@@ -1,18 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { _ILengthProps, _randomFormatLength } from "./_randomStringLength";
|
|
2
|
+
import { __IEpochProps, __randomEpoch } from "./private/__randomEpoch";
|
|
2
3
|
|
|
3
|
-
export const _randomFormatDate = (props?:
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
new Date(
|
|
8
|
-
_randomInteger({
|
|
9
|
-
type: "integer",
|
|
10
|
-
minimum: props?.minimum ?? 0,
|
|
11
|
-
maximum:
|
|
12
|
-
(props?.maximum ?? props?.minimum === undefined)
|
|
13
|
-
? Date.now()
|
|
14
|
-
: props.minimum + 365 * 24 * 60 * 60 * 1_000,
|
|
15
|
-
}),
|
|
16
|
-
)
|
|
17
|
-
.toISOString()
|
|
18
|
-
.substring(0, 10);
|
|
4
|
+
export const _randomFormatDate = (props?: __IEpochProps & _ILengthProps) =>
|
|
5
|
+
_randomFormatLength(props, () =>
|
|
6
|
+
new Date(__randomEpoch(props)).toISOString().substring(0, 10),
|
|
7
|
+
);
|
|
@@ -1,16 +1,35 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
_ILengthProps,
|
|
3
|
+
_RANDOM_LENGTH_ERROR,
|
|
4
|
+
_randomLengthPick,
|
|
5
|
+
_randomLengthWindow,
|
|
6
|
+
} from "./_randomStringLength";
|
|
7
|
+
import { __randomDigits } from "./private/__randomComposition";
|
|
8
|
+
import { __IEpochProps, __randomEpoch } from "./private/__randomEpoch";
|
|
2
9
|
|
|
3
|
-
export const _randomFormatDatetime = (
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
)
|
|
10
|
+
export const _randomFormatDatetime = (
|
|
11
|
+
props?: __IEpochProps & _ILengthProps,
|
|
12
|
+
) => {
|
|
13
|
+
const instant = (): string => new Date(__randomEpoch(props)).toISOString();
|
|
14
|
+
if (props?.minLength === undefined && props?.maxLength === undefined)
|
|
15
|
+
return instant();
|
|
16
|
+
// `YYYY-MM-DDTHH:MM:SS` plus `Z` is the shortest instant, and a fractional
|
|
17
|
+
// second grows it one digit at a time. Because that fraction needs both a dot
|
|
18
|
+
// and at least one digit, 21 is the single length between the two forms that
|
|
19
|
+
// no instant can have.
|
|
20
|
+
const window = _randomLengthWindow(props, {
|
|
21
|
+
minimum: SECONDS + 1,
|
|
22
|
+
spread: 8,
|
|
23
|
+
});
|
|
24
|
+
let length: number = _randomLengthPick(window);
|
|
25
|
+
if (length === SECONDS + 2)
|
|
26
|
+
length = window.high >= SECONDS + 3 ? SECONDS + 3 : SECONDS + 1;
|
|
27
|
+
if (length < window.low || length > window.high)
|
|
28
|
+
throw new Error(_RANDOM_LENGTH_ERROR);
|
|
29
|
+
const base: string = instant().substring(0, SECONDS);
|
|
30
|
+
return length === SECONDS + 1
|
|
31
|
+
? `${base}Z`
|
|
32
|
+
: `${base}.${__randomDigits(length - SECONDS - 2)}Z`;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const SECONDS = "0000-00-00T00:00:00".length;
|
|
@@ -1,19 +1,36 @@
|
|
|
1
1
|
import { _randomInteger } from "./_randomInteger";
|
|
2
|
+
import {
|
|
3
|
+
_ILengthProps,
|
|
4
|
+
_randomLengthPick,
|
|
5
|
+
_randomLengthWindow,
|
|
6
|
+
} from "./_randomStringLength";
|
|
7
|
+
import { __randomNumeric } from "./private/__randomComposition";
|
|
2
8
|
|
|
3
|
-
export const _randomFormatDuration = (): string => {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
9
|
+
export const _randomFormatDuration = (props?: _ILengthProps): string => {
|
|
10
|
+
if (props?.minLength === undefined && props?.maxLength === undefined) {
|
|
11
|
+
const period: string = durate([
|
|
12
|
+
["Y", random(0, 100)],
|
|
13
|
+
["M", random(0, 12)],
|
|
14
|
+
["D", random(0, 31)],
|
|
15
|
+
]);
|
|
16
|
+
const time: string = durate([
|
|
17
|
+
["H", random(0, 24)],
|
|
18
|
+
["M", random(0, 60)],
|
|
19
|
+
["S", random(0, 60)],
|
|
20
|
+
]);
|
|
21
|
+
if (period.length + time.length === 0) return "PT0S";
|
|
22
|
+
return `P${period}${time.length ? "T" : ""}${time}`;
|
|
23
|
+
}
|
|
24
|
+
// A single designator carries an unbounded digit count, so `P<n>Y` expresses
|
|
25
|
+
// every length from three upward and `P1Y` is the shortest duration there is.
|
|
26
|
+
const length: number = _randomLengthPick(
|
|
27
|
+
_randomLengthWindow(props, { minimum: MINIMUM, spread: 6 }),
|
|
28
|
+
);
|
|
29
|
+
return `P${__randomNumeric(length - MINIMUM + 1)}Y`;
|
|
16
30
|
};
|
|
31
|
+
|
|
32
|
+
const MINIMUM = "P1Y".length;
|
|
33
|
+
|
|
17
34
|
const durate = (elements: [string, number][]) =>
|
|
18
35
|
elements
|
|
19
36
|
.filter(([_unit, value]) => value !== 0)
|
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
import { _randomString } from "./_randomString";
|
|
2
|
+
import { _ILengthProps, _randomSegmentLength } from "./_randomStringLength";
|
|
2
3
|
|
|
3
|
-
export const _randomFormatEmail = (): string =>
|
|
4
|
-
|
|
4
|
+
export const _randomFormatEmail = (props?: _ILengthProps): string => {
|
|
5
|
+
if (props?.minLength === undefined && props?.maxLength === undefined)
|
|
6
|
+
return `${random(10)}@${random(10)}.${random(3)}`;
|
|
7
|
+
// `<local>@<domain>.<tld>`: the local part absorbs the requested length while
|
|
8
|
+
// a one-character domain and tld keep the fixed overhead (`@`, `.`) minimal.
|
|
9
|
+
return `${_randomSegmentLength(props, 4, 10, 1)}@${random(1)}.${random(1)}`;
|
|
10
|
+
};
|
|
5
11
|
|
|
6
12
|
const random = (length: number) =>
|
|
7
13
|
_randomString({
|
|
@@ -1,6 +1,53 @@
|
|
|
1
|
+
import { _randomInteger } from "./_randomInteger";
|
|
1
2
|
import { _randomString } from "./_randomString";
|
|
3
|
+
import { _ILengthProps } from "./_randomStringLength";
|
|
2
4
|
|
|
3
|
-
export const _randomFormatHostname = (): string =>
|
|
5
|
+
export const _randomFormatHostname = (props?: _ILengthProps): string => {
|
|
6
|
+
if (props?.minLength === undefined && props?.maxLength === undefined)
|
|
7
|
+
return `${random(10)}.${random(3)}`;
|
|
8
|
+
// A hostname is dot-joined labels of 1..63 chars whose total is capped at 253,
|
|
9
|
+
// so the requested length is realized by splitting it across enough labels.
|
|
10
|
+
return _randomHostnameLabels(pickLength(props));
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
const MAX_TOTAL = 253;
|
|
14
|
+
const MAX_LABEL = 63;
|
|
15
|
+
|
|
16
|
+
const pickLength = (props: _ILengthProps): number => {
|
|
17
|
+
let low: number = props.minLength === undefined ? 1 : props.minLength;
|
|
18
|
+
if (low < 1) low = 1;
|
|
19
|
+
const high: number =
|
|
20
|
+
props.maxLength === undefined
|
|
21
|
+
? Math.min(MAX_TOTAL, low + 14)
|
|
22
|
+
: Math.min(MAX_TOTAL, props.maxLength);
|
|
23
|
+
if (high < low)
|
|
24
|
+
throw new Error(
|
|
25
|
+
"unable to generate a random hostname satisfying both the format and the length constraints.",
|
|
26
|
+
);
|
|
27
|
+
return _randomInteger({ type: "integer", minimum: low, maximum: high });
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Builds dot-joined hostname labels totaling exactly `length` characters, each
|
|
32
|
+
* label within 63 chars. Shared with the idn-hostname generator, which reserves
|
|
33
|
+
* a fixed `.<tld>` suffix and realizes the rest as these leading labels.
|
|
34
|
+
*/
|
|
35
|
+
export const _randomHostnameLabels = (length: number): string => {
|
|
36
|
+
const parts: string[] = [];
|
|
37
|
+
let remaining: number = length;
|
|
38
|
+
while (remaining > MAX_LABEL + 1) {
|
|
39
|
+
// one full label plus its joining dot
|
|
40
|
+
parts.push(random(MAX_LABEL));
|
|
41
|
+
remaining -= MAX_LABEL + 1;
|
|
42
|
+
}
|
|
43
|
+
if (remaining <= MAX_LABEL) parts.push(random(remaining));
|
|
44
|
+
else {
|
|
45
|
+
// remaining === MAX_LABEL + 1: two labels keep every label within 63 chars
|
|
46
|
+
parts.push(random(MAX_LABEL - 1));
|
|
47
|
+
parts.push(random(1));
|
|
48
|
+
}
|
|
49
|
+
return parts.join(".");
|
|
50
|
+
};
|
|
4
51
|
|
|
5
52
|
const random = (length: number) =>
|
|
6
53
|
_randomString({ type: "string", minLength: length, maxLength: length });
|
|
@@ -1,3 +1,19 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { _randomString } from "./_randomString";
|
|
2
|
+
import { _ILengthProps, _randomSegmentLength } from "./_randomStringLength";
|
|
2
3
|
|
|
3
|
-
export const _randomFormatIdnEmail = (): string =>
|
|
4
|
+
export const _randomFormatIdnEmail = (props?: _ILengthProps): string => {
|
|
5
|
+
if (props?.minLength === undefined && props?.maxLength === undefined)
|
|
6
|
+
return `${random(10)}@${random(10)}.${random(3)}`;
|
|
7
|
+
// `_isFormatIdnEmail` requires a >=2-char TLD (`(…\.)+[^…]{2,}`), so the fixed
|
|
8
|
+
// overhead is `@` + domain(1) + `.` + tld(2) = 5 and the local part absorbs the
|
|
9
|
+
// requested length; a one-character TLD (the non-idn generator's length path)
|
|
10
|
+
// would be rejected by the idn checker on every draw.
|
|
11
|
+
return `${_randomSegmentLength(props, 5, 10, 1)}@${random(1)}.${random(2)}`;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
const random = (length: number) =>
|
|
15
|
+
_randomString({
|
|
16
|
+
type: "string",
|
|
17
|
+
minLength: length,
|
|
18
|
+
maxLength: length,
|
|
19
|
+
});
|
|
@@ -1,3 +1,35 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { _randomHostnameLabels } from "./_randomFormatHostname";
|
|
2
|
+
import { _randomInteger } from "./_randomInteger";
|
|
3
|
+
import { _randomString } from "./_randomString";
|
|
4
|
+
import { _ILengthProps } from "./_randomStringLength";
|
|
2
5
|
|
|
3
|
-
export const _randomFormatIdnHostname = (): string =>
|
|
6
|
+
export const _randomFormatIdnHostname = (props?: _ILengthProps): string => {
|
|
7
|
+
if (props?.minLength === undefined && props?.maxLength === undefined)
|
|
8
|
+
return `${random(10)}.${random(3)}`;
|
|
9
|
+
// `_isFormatIdnHostname` requires at least one label, a dot, and a >=2-char
|
|
10
|
+
// TLD (`(…\.)+[a-z¡-]{2,}`), none of which the non-idn hostname generator
|
|
11
|
+
// guarantees on its length path (it can emit a single dotless label). Reserve
|
|
12
|
+
// a fixed `.<2-char TLD>` and realize the rest as dot-joined leading labels.
|
|
13
|
+
const length: number = pickLength(props);
|
|
14
|
+
return `${_randomHostnameLabels(length - 3)}.${random(2)}`;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
const MAX_TOTAL = 253;
|
|
18
|
+
const MIN_TOTAL = 4; // the shortest idn hostname, `x.yy`: label(1) + `.` + tld(2)
|
|
19
|
+
|
|
20
|
+
const pickLength = (props: _ILengthProps): number => {
|
|
21
|
+
let low: number = props.minLength === undefined ? MIN_TOTAL : props.minLength;
|
|
22
|
+
if (low < MIN_TOTAL) low = MIN_TOTAL;
|
|
23
|
+
const high: number =
|
|
24
|
+
props.maxLength === undefined
|
|
25
|
+
? Math.min(MAX_TOTAL, low + 14)
|
|
26
|
+
: Math.min(MAX_TOTAL, props.maxLength);
|
|
27
|
+
if (high < low)
|
|
28
|
+
throw new Error(
|
|
29
|
+
"unable to generate a random idn hostname satisfying both the format and the length constraints.",
|
|
30
|
+
);
|
|
31
|
+
return _randomInteger({ type: "integer", minimum: low, maximum: high });
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
const random = (length: number) =>
|
|
35
|
+
_randomString({ type: "string", minLength: length, maxLength: length });
|