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.
Files changed (581) hide show
  1. package/README.md +3 -0
  2. package/lib/_virtual/_rolldown/runtime.mjs +1 -5
  3. package/lib/executable/FileSystemIdentity.d.ts +44 -0
  4. package/lib/executable/FileSystemIdentity.js +213 -0
  5. package/lib/executable/FileSystemIdentity.js.map +1 -0
  6. package/lib/executable/FileSystemIdentity.mjs +133 -0
  7. package/lib/executable/FileSystemIdentity.mjs.map +1 -0
  8. package/lib/executable/TypiaGenerateWizard.js +272 -106
  9. package/lib/executable/TypiaGenerateWizard.js.map +1 -1
  10. package/lib/executable/TypiaGenerateWizard.mjs +239 -95
  11. package/lib/executable/TypiaGenerateWizard.mjs.map +1 -1
  12. package/lib/functional.d.ts +15 -12
  13. package/lib/functional.js.map +1 -1
  14. package/lib/functional.mjs.map +1 -1
  15. package/lib/internal/_ProtobufReader.d.ts +32 -0
  16. package/lib/internal/_ProtobufReader.js +148 -48
  17. package/lib/internal/_ProtobufReader.js.map +1 -1
  18. package/lib/internal/_ProtobufReader.mjs +137 -41
  19. package/lib/internal/_ProtobufReader.mjs.map +1 -1
  20. package/lib/internal/_createStandardSchema.js +18 -1
  21. package/lib/internal/_createStandardSchema.js.map +1 -1
  22. package/lib/internal/_createStandardSchema.mjs +12 -1
  23. package/lib/internal/_createStandardSchema.mjs.map +1 -1
  24. package/lib/internal/_decimal.d.ts +14 -0
  25. package/lib/internal/_decimal.js +61 -0
  26. package/lib/internal/_decimal.js.map +1 -0
  27. package/lib/internal/_decimal.mjs +49 -0
  28. package/lib/internal/_decimal.mjs.map +1 -0
  29. package/lib/internal/_httpQueryParseURLSearchParams.js +23 -2
  30. package/lib/internal/_httpQueryParseURLSearchParams.js.map +1 -1
  31. package/lib/internal/_httpQueryParseURLSearchParams.mjs +20 -2
  32. package/lib/internal/_httpQueryParseURLSearchParams.mjs.map +1 -1
  33. package/lib/internal/_isFormatByte.js +2 -5
  34. package/lib/internal/_isFormatByte.js.map +1 -1
  35. package/lib/internal/_isFormatByte.mjs +2 -5
  36. package/lib/internal/_isFormatByte.mjs.map +1 -1
  37. package/lib/internal/_isFormatDate.js +15 -2
  38. package/lib/internal/_isFormatDate.js.map +1 -1
  39. package/lib/internal/_isFormatDate.mjs +22 -2
  40. package/lib/internal/_isFormatDate.mjs.map +1 -1
  41. package/lib/internal/_isFormatDateTime.js +21 -2
  42. package/lib/internal/_isFormatDateTime.js.map +1 -1
  43. package/lib/internal/_isFormatDateTime.mjs +13 -2
  44. package/lib/internal/_isFormatDateTime.mjs.map +1 -1
  45. package/lib/internal/_isFormatIri.js +3 -2
  46. package/lib/internal/_isFormatIri.js.map +1 -1
  47. package/lib/internal/_isFormatIri.mjs +3 -2
  48. package/lib/internal/_isFormatIri.mjs.map +1 -1
  49. package/lib/internal/_isFormatIriReference.js +10 -2
  50. package/lib/internal/_isFormatIriReference.js.map +1 -1
  51. package/lib/internal/_isFormatIriReference.mjs +9 -2
  52. package/lib/internal/_isFormatIriReference.mjs.map +1 -1
  53. package/lib/internal/_isFormatUriReference.js +1 -1
  54. package/lib/internal/_isFormatUriReference.js.map +1 -1
  55. package/lib/internal/_isFormatUriReference.mjs +1 -1
  56. package/lib/internal/_isFormatUriReference.mjs.map +1 -1
  57. package/lib/internal/_isMultipleOf.d.ts +1 -0
  58. package/lib/internal/_isMultipleOf.js +13 -0
  59. package/lib/internal/_isMultipleOf.js.map +1 -0
  60. package/lib/internal/_isMultipleOf.mjs +12 -0
  61. package/lib/internal/_isMultipleOf.mjs.map +1 -0
  62. package/lib/internal/_isTypeFloat.js +1 -1
  63. package/lib/internal/_isTypeFloat.js.map +1 -1
  64. package/lib/internal/_isTypeFloat.mjs +1 -1
  65. package/lib/internal/_isTypeFloat.mjs.map +1 -1
  66. package/lib/internal/_isTypeInt64.js +1 -0
  67. package/lib/internal/_isTypeInt64.js.map +1 -1
  68. package/lib/internal/_isTypeInt64.mjs.map +1 -1
  69. package/lib/internal/_isTypeInt64Bigint.d.ts +1 -0
  70. package/lib/internal/_isTypeInt64Bigint.js +15 -0
  71. package/lib/internal/_isTypeInt64Bigint.js.map +1 -0
  72. package/lib/internal/_isTypeInt64Bigint.mjs +8 -0
  73. package/lib/internal/_isTypeInt64Bigint.mjs.map +1 -0
  74. package/lib/internal/_isTypeUint64.js +1 -0
  75. package/lib/internal/_isTypeUint64.js.map +1 -1
  76. package/lib/internal/_isTypeUint64.mjs.map +1 -1
  77. package/lib/internal/_isTypeUint64Bigint.d.ts +1 -0
  78. package/lib/internal/_isTypeUint64Bigint.js +10 -0
  79. package/lib/internal/_isTypeUint64Bigint.js.map +1 -0
  80. package/lib/internal/_isTypeUint64Bigint.mjs +8 -0
  81. package/lib/internal/_isTypeUint64Bigint.mjs.map +1 -0
  82. package/lib/internal/_isUniqueItems.js +96 -109
  83. package/lib/internal/_isUniqueItems.js.map +1 -1
  84. package/lib/internal/_isUniqueItems.mjs +62 -50
  85. package/lib/internal/_isUniqueItems.mjs.map +1 -1
  86. package/lib/internal/_jsonStringifyArray.d.ts +1 -0
  87. package/lib/internal/_jsonStringifyArray.js +48 -0
  88. package/lib/internal/_jsonStringifyArray.js.map +1 -0
  89. package/lib/internal/_jsonStringifyArray.mjs +40 -0
  90. package/lib/internal/_jsonStringifyArray.mjs.map +1 -0
  91. package/lib/internal/_jsonStringifyElement.d.ts +1 -0
  92. package/lib/internal/_jsonStringifyElement.js +23 -0
  93. package/lib/internal/_jsonStringifyElement.js.map +1 -0
  94. package/lib/internal/_jsonStringifyElement.mjs +23 -0
  95. package/lib/internal/_jsonStringifyElement.mjs.map +1 -0
  96. package/lib/internal/_jsonStringifyProperty.d.ts +1 -0
  97. package/lib/internal/_jsonStringifyProperty.js +31 -0
  98. package/lib/internal/_jsonStringifyProperty.js.map +1 -0
  99. package/lib/internal/_jsonStringifyProperty.mjs +31 -0
  100. package/lib/internal/_jsonStringifyProperty.mjs.map +1 -0
  101. package/lib/internal/_llmApplicationFinalize.js +1 -1
  102. package/lib/internal/_llmApplicationFinalize.js.map +1 -1
  103. package/lib/internal/_llmApplicationFinalize.mjs +1 -1
  104. package/lib/internal/_llmApplicationFinalize.mjs.map +1 -1
  105. package/lib/internal/_notationAny.js +8 -1
  106. package/lib/internal/_notationAny.js.map +1 -1
  107. package/lib/internal/_notationAny.mjs +7 -1
  108. package/lib/internal/_notationAny.mjs.map +1 -1
  109. package/lib/internal/_notationAssign.d.ts +1 -0
  110. package/lib/internal/_notationAssign.js +18 -0
  111. package/lib/internal/_notationAssign.js.map +1 -0
  112. package/lib/internal/_notationAssign.mjs +17 -0
  113. package/lib/internal/_notationAssign.mjs.map +1 -0
  114. package/lib/internal/_notationCamel.js +30 -9
  115. package/lib/internal/_notationCamel.js.map +1 -1
  116. package/lib/internal/_notationCamel.mjs +13 -5
  117. package/lib/internal/_notationCamel.mjs.map +1 -1
  118. package/lib/internal/_notationKebab.d.ts +1 -0
  119. package/lib/internal/_notationKebab.js +15 -0
  120. package/lib/internal/_notationKebab.js.map +1 -0
  121. package/lib/internal/_notationKebab.mjs +15 -0
  122. package/lib/internal/_notationKebab.mjs.map +1 -0
  123. package/lib/internal/_notationKeyCollision.d.ts +1 -0
  124. package/lib/internal/_notationKeyCollision.js +8 -0
  125. package/lib/internal/_notationKeyCollision.js.map +1 -0
  126. package/lib/internal/_notationKeyCollision.mjs +8 -0
  127. package/lib/internal/_notationKeyCollision.mjs.map +1 -0
  128. package/lib/internal/_notationPascal.js +20 -5
  129. package/lib/internal/_notationPascal.js.map +1 -1
  130. package/lib/internal/_notationPascal.mjs +10 -5
  131. package/lib/internal/_notationPascal.mjs.map +1 -1
  132. package/lib/internal/_notationSnake.js +25 -22
  133. package/lib/internal/_notationSnake.js.map +1 -1
  134. package/lib/internal/_notationSnake.mjs +11 -11
  135. package/lib/internal/_notationSnake.mjs.map +1 -1
  136. package/lib/internal/_plainCloneAny.js +174 -38
  137. package/lib/internal/_plainCloneAny.js.map +1 -1
  138. package/lib/internal/_plainCloneAny.mjs +126 -22
  139. package/lib/internal/_plainCloneAny.mjs.map +1 -1
  140. package/lib/internal/_randomArray.d.ts +1 -1
  141. package/lib/internal/_randomArray.js +11 -4
  142. package/lib/internal/_randomArray.js.map +1 -1
  143. package/lib/internal/_randomArray.mjs +9 -3
  144. package/lib/internal/_randomArray.mjs.map +1 -1
  145. package/lib/internal/_randomFormatByte.d.ts +2 -1
  146. package/lib/internal/_randomFormatByte.js +25 -1
  147. package/lib/internal/_randomFormatByte.js.map +1 -1
  148. package/lib/internal/_randomFormatByte.mjs +20 -1
  149. package/lib/internal/_randomFormatByte.mjs.map +1 -1
  150. package/lib/internal/_randomFormatDate.d.ts +3 -4
  151. package/lib/internal/_randomFormatDate.js +3 -10
  152. package/lib/internal/_randomFormatDate.js.map +1 -1
  153. package/lib/internal/_randomFormatDate.mjs +3 -6
  154. package/lib/internal/_randomFormatDate.mjs.map +1 -1
  155. package/lib/internal/_randomFormatDatetime.d.ts +3 -4
  156. package/lib/internal/_randomFormatDatetime.js +26 -8
  157. package/lib/internal/_randomFormatDatetime.js.map +1 -1
  158. package/lib/internal/_randomFormatDatetime.mjs +17 -6
  159. package/lib/internal/_randomFormatDatetime.mjs.map +1 -1
  160. package/lib/internal/_randomFormatDuration.d.ts +2 -1
  161. package/lib/internal/_randomFormatDuration.js +23 -14
  162. package/lib/internal/_randomFormatDuration.js.map +1 -1
  163. package/lib/internal/_randomFormatDuration.mjs +22 -13
  164. package/lib/internal/_randomFormatDuration.mjs.map +1 -1
  165. package/lib/internal/_randomFormatEmail.d.ts +2 -1
  166. package/lib/internal/_randomFormatEmail.js +8 -1
  167. package/lib/internal/_randomFormatEmail.js.map +1 -1
  168. package/lib/internal/_randomFormatEmail.mjs +5 -1
  169. package/lib/internal/_randomFormatEmail.mjs.map +1 -1
  170. package/lib/internal/_randomFormatHostname.d.ts +8 -1
  171. package/lib/internal/_randomFormatHostname.js +45 -2
  172. package/lib/internal/_randomFormatHostname.js.map +1 -1
  173. package/lib/internal/_randomFormatHostname.mjs +38 -2
  174. package/lib/internal/_randomFormatHostname.mjs.map +1 -1
  175. package/lib/internal/_randomFormatIdnEmail.d.ts +2 -1
  176. package/lib/internal/_randomFormatIdnEmail.js +16 -2
  177. package/lib/internal/_randomFormatIdnEmail.js.map +1 -1
  178. package/lib/internal/_randomFormatIdnEmail.mjs +11 -2
  179. package/lib/internal/_randomFormatIdnEmail.mjs.map +1 -1
  180. package/lib/internal/_randomFormatIdnHostname.d.ts +2 -1
  181. package/lib/internal/_randomFormatIdnHostname.js +26 -1
  182. package/lib/internal/_randomFormatIdnHostname.js.map +1 -1
  183. package/lib/internal/_randomFormatIdnHostname.mjs +25 -2
  184. package/lib/internal/_randomFormatIdnHostname.mjs.map +1 -1
  185. package/lib/internal/_randomFormatIpv4.d.ts +2 -1
  186. package/lib/internal/_randomFormatIpv4.js +32 -1
  187. package/lib/internal/_randomFormatIpv4.js.map +1 -1
  188. package/lib/internal/_randomFormatIpv4.mjs +23 -1
  189. package/lib/internal/_randomFormatIpv4.mjs.map +1 -1
  190. package/lib/internal/_randomFormatIpv6.d.ts +2 -1
  191. package/lib/internal/_randomFormatIpv6.js +58 -1
  192. package/lib/internal/_randomFormatIpv6.js.map +1 -1
  193. package/lib/internal/_randomFormatIpv6.mjs +45 -1
  194. package/lib/internal/_randomFormatIpv6.mjs.map +1 -1
  195. package/lib/internal/_randomFormatIri.d.ts +2 -1
  196. package/lib/internal/_randomFormatIri.js +1 -1
  197. package/lib/internal/_randomFormatIri.js.map +1 -1
  198. package/lib/internal/_randomFormatIri.mjs +1 -1
  199. package/lib/internal/_randomFormatIri.mjs.map +1 -1
  200. package/lib/internal/_randomFormatIriReference.d.ts +2 -1
  201. package/lib/internal/_randomFormatIriReference.js +1 -1
  202. package/lib/internal/_randomFormatIriReference.js.map +1 -1
  203. package/lib/internal/_randomFormatIriReference.mjs +1 -1
  204. package/lib/internal/_randomFormatIriReference.mjs.map +1 -1
  205. package/lib/internal/_randomFormatJsonPointer.d.ts +2 -1
  206. package/lib/internal/_randomFormatJsonPointer.js +20 -1
  207. package/lib/internal/_randomFormatJsonPointer.js.map +1 -1
  208. package/lib/internal/_randomFormatJsonPointer.mjs +15 -1
  209. package/lib/internal/_randomFormatJsonPointer.mjs.map +1 -1
  210. package/lib/internal/_randomFormatPassword.d.ts +2 -1
  211. package/lib/internal/_randomFormatPassword.js +7 -5
  212. package/lib/internal/_randomFormatPassword.js.map +1 -1
  213. package/lib/internal/_randomFormatPassword.mjs +5 -1
  214. package/lib/internal/_randomFormatPassword.mjs.map +1 -1
  215. package/lib/internal/_randomFormatRegex.d.ts +2 -1
  216. package/lib/internal/_randomFormatRegex.js +15 -1
  217. package/lib/internal/_randomFormatRegex.js.map +1 -1
  218. package/lib/internal/_randomFormatRegex.mjs +14 -1
  219. package/lib/internal/_randomFormatRegex.mjs.map +1 -1
  220. package/lib/internal/_randomFormatRelativeJsonPointer.d.ts +2 -1
  221. package/lib/internal/_randomFormatRelativeJsonPointer.js +20 -5
  222. package/lib/internal/_randomFormatRelativeJsonPointer.js.map +1 -1
  223. package/lib/internal/_randomFormatRelativeJsonPointer.mjs +21 -5
  224. package/lib/internal/_randomFormatRelativeJsonPointer.mjs.map +1 -1
  225. package/lib/internal/_randomFormatTime.d.ts +2 -1
  226. package/lib/internal/_randomFormatTime.js +34 -7
  227. package/lib/internal/_randomFormatTime.js.map +1 -1
  228. package/lib/internal/_randomFormatTime.mjs +37 -4
  229. package/lib/internal/_randomFormatTime.mjs.map +1 -1
  230. package/lib/internal/_randomFormatUri.d.ts +2 -1
  231. package/lib/internal/_randomFormatUri.js +1 -1
  232. package/lib/internal/_randomFormatUri.js.map +1 -1
  233. package/lib/internal/_randomFormatUri.mjs +1 -1
  234. package/lib/internal/_randomFormatUri.mjs.map +1 -1
  235. package/lib/internal/_randomFormatUriReference.d.ts +2 -1
  236. package/lib/internal/_randomFormatUriReference.js +1 -1
  237. package/lib/internal/_randomFormatUriReference.js.map +1 -1
  238. package/lib/internal/_randomFormatUriReference.mjs +1 -1
  239. package/lib/internal/_randomFormatUriReference.mjs.map +1 -1
  240. package/lib/internal/_randomFormatUriTemplate.d.ts +2 -1
  241. package/lib/internal/_randomFormatUriTemplate.js +1 -1
  242. package/lib/internal/_randomFormatUriTemplate.js.map +1 -1
  243. package/lib/internal/_randomFormatUriTemplate.mjs +1 -1
  244. package/lib/internal/_randomFormatUriTemplate.mjs.map +1 -1
  245. package/lib/internal/_randomFormatUrl.d.ts +2 -1
  246. package/lib/internal/_randomFormatUrl.js +21 -1
  247. package/lib/internal/_randomFormatUrl.js.map +1 -1
  248. package/lib/internal/_randomFormatUrl.mjs +18 -1
  249. package/lib/internal/_randomFormatUrl.mjs.map +1 -1
  250. package/lib/internal/_randomFormatUuid.d.ts +2 -1
  251. package/lib/internal/_randomFormatUuid.js +3 -2
  252. package/lib/internal/_randomFormatUuid.js.map +1 -1
  253. package/lib/internal/_randomFormatUuid.mjs +3 -2
  254. package/lib/internal/_randomFormatUuid.mjs.map +1 -1
  255. package/lib/internal/_randomInteger.js +59 -28
  256. package/lib/internal/_randomInteger.js.map +1 -1
  257. package/lib/internal/_randomInteger.mjs +56 -16
  258. package/lib/internal/_randomInteger.mjs.map +1 -1
  259. package/lib/internal/_randomMultiple.d.ts +8 -0
  260. package/lib/internal/_randomMultiple.js +168 -0
  261. package/lib/internal/_randomMultiple.js.map +1 -0
  262. package/lib/internal/_randomMultiple.mjs +158 -0
  263. package/lib/internal/_randomMultiple.mjs.map +1 -0
  264. package/lib/internal/_randomNumber.js +42 -42
  265. package/lib/internal/_randomNumber.js.map +1 -1
  266. package/lib/internal/_randomNumber.mjs +41 -27
  267. package/lib/internal/_randomNumber.mjs.map +1 -1
  268. package/lib/internal/_randomPattern.d.ts +2 -1
  269. package/lib/internal/_randomPattern.js +19 -4
  270. package/lib/internal/_randomPattern.js.map +1 -1
  271. package/lib/internal/_randomPattern.mjs +10 -4
  272. package/lib/internal/_randomPattern.mjs.map +1 -1
  273. package/lib/internal/_randomStringLength.d.ts +64 -0
  274. package/lib/internal/_randomStringLength.js +84 -0
  275. package/lib/internal/_randomStringLength.js.map +1 -0
  276. package/lib/internal/_randomStringLength.mjs +79 -0
  277. package/lib/internal/_randomStringLength.mjs.map +1 -0
  278. package/lib/internal/_stringLength.d.ts +1 -0
  279. package/lib/internal/_stringLength.js +11 -0
  280. package/lib/internal/_stringLength.js.map +1 -0
  281. package/lib/internal/_stringLength.mjs +10 -0
  282. package/lib/internal/_stringLength.mjs.map +1 -0
  283. package/lib/internal/_validateReport.js +4 -1
  284. package/lib/internal/_validateReport.js.map +1 -1
  285. package/lib/internal/_validateReport.mjs +2 -1
  286. package/lib/internal/_validateReport.mjs.map +1 -1
  287. package/lib/internal/private/__notationRename.d.ts +14 -0
  288. package/lib/internal/private/__notationRename.js +25 -0
  289. package/lib/internal/private/__notationRename.js.map +1 -0
  290. package/lib/internal/private/__notationRename.mjs +24 -0
  291. package/lib/internal/private/__notationRename.mjs.map +1 -0
  292. package/lib/internal/private/__randomComposition.d.ts +23 -0
  293. package/lib/internal/private/__randomComposition.js +48 -0
  294. package/lib/internal/private/__randomComposition.js.map +1 -0
  295. package/lib/internal/private/__randomComposition.mjs +54 -0
  296. package/lib/internal/private/__randomComposition.mjs.map +1 -0
  297. package/lib/internal/private/__randomEpoch.d.ts +19 -0
  298. package/lib/internal/private/__randomEpoch.js +31 -0
  299. package/lib/internal/private/__randomEpoch.js.map +1 -0
  300. package/lib/internal/private/__randomEpoch.mjs +28 -0
  301. package/lib/internal/private/__randomEpoch.mjs.map +1 -0
  302. package/lib/json.d.ts +2 -2
  303. package/lib/json.mjs.map +1 -1
  304. package/lib/module.d.ts +2 -2
  305. package/lib/module.js.map +1 -1
  306. package/lib/module.mjs.map +1 -1
  307. package/lib/notations.d.ts +20 -4
  308. package/lib/notations.js.map +1 -1
  309. package/lib/notations.mjs.map +1 -1
  310. package/native/adapter/plugin_options.go +117 -0
  311. package/native/adapter/plugin_options_payload_matrix_test.go +181 -0
  312. package/native/cmd/ttsc-typia/any_array_type_tags_transform_test.go +63 -9
  313. package/native/cmd/ttsc-typia/assert_guard_factory_contract_test.go +152 -0
  314. package/native/cmd/ttsc-typia/build.go +84 -64
  315. package/native/cmd/ttsc-typia/build_no_emit_preserves_analysis_options_test.go +67 -0
  316. package/native/cmd/ttsc-typia/build_no_emit_transform_diagnostics_test.go +138 -0
  317. package/native/cmd/ttsc-typia/build_plugin_options_come_from_payload_test.go +48 -0
  318. package/native/cmd/ttsc-typia/build_transactional_emit_success_test.go +81 -0
  319. package/native/cmd/ttsc-typia/build_transform_failure_atomicity_test.go +138 -0
  320. package/native/cmd/ttsc-typia/callable_interface_function_semantics_transform_test.go +331 -0
  321. package/native/cmd/ttsc-typia/callable_type_literal_boundaries_transform_test.go +1184 -0
  322. package/native/cmd/ttsc-typia/command_routes_and_diagnostics_coverage_test.go +3 -1
  323. package/native/cmd/ttsc-typia/compare_functional_union_membership_transform_test.go +434 -0
  324. package/native/cmd/ttsc-typia/compare_less_nan_transform_test.go +98 -0
  325. package/native/cmd/ttsc-typia/compare_native_object_overmatch_transform_test.go +161 -0
  326. package/native/cmd/ttsc-typia/compare_nondiscriminable_union_transform_test.go +343 -0
  327. package/native/cmd/ttsc-typia/compare_template_literal_union_transform_test.go +241 -0
  328. package/native/cmd/ttsc-typia/compare_union_discrimination_transform_test.go +289 -0
  329. package/native/cmd/ttsc-typia/default_library_spoof_native_identity_transform_test.go +216 -0
  330. package/native/cmd/ttsc-typia/escaped_property_key_path_transform_test.go +193 -0
  331. package/native/cmd/ttsc-typia/finite_option_number_leaf_transform_test.go +240 -0
  332. package/native/cmd/ttsc-typia/functional_promised_type_transform_test.go +220 -0
  333. package/native/cmd/ttsc-typia/functional_receiver_transform_test.go +232 -0
  334. package/native/cmd/ttsc-typia/is_object_function_member_transform_test.go +205 -0
  335. package/native/cmd/ttsc-typia/json_application_alias_function_validation_transform_test.go +151 -0
  336. package/native/cmd/ttsc-typia/json_is_stringify_finite_number_transform_test.go +198 -0
  337. package/native/cmd/ttsc-typia/json_schema_dynamic_key_determinism_transform_test.go +246 -0
  338. package/native/cmd/ttsc-typia/json_stringify_contextual_undefined_transform_test.go +556 -0
  339. package/native/cmd/ttsc-typia/json_stringify_special_key_transform_test.go +238 -0
  340. package/native/cmd/ttsc-typia/lib_replacement_native_identity_transform_test.go +277 -0
  341. package/native/cmd/ttsc-typia/main_wasm.go +21 -2
  342. package/native/cmd/ttsc-typia/native_collection_identity_is_transform_test.go +234 -0
  343. package/native/cmd/ttsc-typia/native_generic_name_guard_is_transform_test.go +194 -0
  344. package/native/cmd/ttsc-typia/native_name_collision_is_transform_test.go +204 -0
  345. package/native/cmd/ttsc-typia/native_named_intersection_union_transform_test.go +390 -0
  346. package/native/cmd/ttsc-typia/node_buffer_native_exports_is_transform_test.go +526 -0
  347. package/native/cmd/ttsc-typia/non_trailing_rest_tuple_transform_test.go +23 -11
  348. package/native/cmd/ttsc-typia/notation_dynamic_keys_transform_test.go +286 -0
  349. package/native/cmd/ttsc-typia/notation_kebab_case_transform_test.go +1 -1
  350. package/native/cmd/ttsc-typia/notation_literal_collision_transform_test.go +164 -0
  351. package/native/cmd/ttsc-typia/notation_pascal_case_transform_test.go +230 -0
  352. package/native/cmd/ttsc-typia/notation_unicode_key_transform_test.go +309 -0
  353. package/native/cmd/ttsc-typia/package_declaration_native_identity_is_transform_test.go +293 -0
  354. package/native/cmd/ttsc-typia/pattern_line_terminator_escape_transform_test.go +224 -0
  355. package/native/cmd/ttsc-typia/plain_prune_union_object_overmatch_transform_test.go +219 -0
  356. package/native/cmd/ttsc-typia/plugin_options_payload_helpers_test.go +181 -0
  357. package/native/cmd/ttsc-typia/private_field_filter_is_transform_test.go +278 -0
  358. package/native/cmd/ttsc-typia/project_catalog_transform_coverage_test.go +73 -27
  359. package/native/cmd/ttsc-typia/project_dependencies_barrel_reexport_transform_test.go +120 -0
  360. package/native/cmd/ttsc-typia/project_dependencies_collapsed_alias_transform_test.go +134 -0
  361. package/native/cmd/ttsc-typia/project_dependencies_custom_lib_name_transform_test.go +135 -0
  362. package/native/cmd/ttsc-typia/project_dependencies_default_barrel_transform_test.go +114 -0
  363. package/native/cmd/ttsc-typia/project_dependencies_empty_heritage_transform_test.go +100 -0
  364. package/native/cmd/ttsc-typia/project_dependencies_envelope_transform_test.go +148 -0
  365. package/native/cmd/ttsc-typia/project_dependencies_index_signature_alias_transform_test.go +139 -0
  366. package/native/cmd/ttsc-typia/project_dependencies_local_reexport_transform_test.go +122 -0
  367. package/native/cmd/ttsc-typia/project_dependencies_signature_alias_transform_test.go +125 -0
  368. package/native/cmd/ttsc-typia/project_dependencies_star_barrel_transform_test.go +112 -0
  369. package/native/cmd/ttsc-typia/project_reference_graph_envelope_transform_test.go +190 -0
  370. package/native/cmd/ttsc-typia/protobuf_diagnostic_code_transform_test.go +167 -0
  371. package/native/cmd/ttsc-typia/protobuf_is_encode_finite_number_transform_test.go +98 -0
  372. package/native/cmd/ttsc-typia/protobuf_sequence_field_numbers_transform_test.go +52 -22
  373. package/native/cmd/ttsc-typia/symbol_index_domain_transform_test.go +316 -0
  374. package/native/cmd/ttsc-typia/symbol_key_member_filter_transform_test.go +279 -0
  375. package/native/cmd/ttsc-typia/template_interpolation_type_tags_transform_test.go +86 -23
  376. package/native/cmd/ttsc-typia/template_literal_type_tags_transform_test.go +3 -1
  377. package/native/cmd/ttsc-typia/transform.go +251 -39
  378. package/native/cmd/ttsc-typia/{transform_declaration_source_produces_no_js_test.go → transform_declaration_source_produces_no_javascript_test.go} +10 -2
  379. package/native/cmd/ttsc-typia/transform_fixtures_emit_coverage_test.go +21 -4
  380. package/native/cmd/ttsc-typia/transform_helpers_test.go +236 -3
  381. package/native/cmd/ttsc-typia/transform_plugin_options_come_from_payload_test.go +43 -0
  382. package/native/cmd/ttsc-typia/transform_single_file_failure_atomicity_test.go +114 -0
  383. package/native/cmd/ttsc-typia/transform_single_file_failure_writes_no_stdout_test.go +43 -0
  384. package/native/cmd/ttsc-typia/transform_single_file_js_distinguishes_same_basename_sources_test.go +81 -0
  385. package/native/cmd/ttsc-typia/transform_single_file_js_empty_emit_reports_no_output_test.go +100 -0
  386. package/native/cmd/ttsc-typia/transform_single_file_js_locates_output_across_layouts_test.go +160 -0
  387. package/native/cmd/ttsc-typia/transform_single_file_success_publishes_artifact_test.go +54 -0
  388. package/native/cmd/ttsc-typia/transform_wasm_host_argv_reports_diagnostics_test.go +39 -0
  389. package/native/cmd/ttsc-typia/tuple_optional_compare_clone_transform_test.go +227 -0
  390. package/native/cmd/ttsc-typia/user_global_native_identity_transform_test.go +484 -0
  391. package/native/core/factories/FormatCheatSheet.go +40 -7
  392. package/native/core/factories/IdentifierFactory.go +131 -4
  393. package/native/core/factories/MetadataCommentTagFactory.go +83 -40
  394. package/native/core/factories/MetadataTypeTagFactory.go +13 -1
  395. package/native/core/factories/NumericRangeFactory.go +60 -17
  396. package/native/core/factories/ProtobufFactory.go +13 -5
  397. package/native/core/factories/factory_utility_coverage_test.go +8 -2
  398. package/native/core/factories/format_alias_resolves_to_cheat_sheet_test.go +57 -0
  399. package/native/core/factories/format_alias_table_targets_the_cheat_sheet_test.go +44 -0
  400. package/native/core/factories/identifier_factory_postfix_escapes_every_key_test.go +147 -0
  401. package/native/core/factories/identifier_factory_postfix_survives_every_code_point_test.go +86 -0
  402. package/native/core/factories/internal/metadata/MetadataHelper.go +226 -17
  403. package/native/core/factories/internal/metadata/emplace_metadata_object.go +141 -8
  404. package/native/core/factories/internal/metadata/iterate_metadata.go +6 -0
  405. package/native/core/factories/internal/metadata/iterate_metadata_function.go +5 -12
  406. package/native/core/factories/internal/metadata/iterate_metadata_intersection.go +111 -29
  407. package/native/core/factories/internal/metadata/iterate_metadata_map.go +5 -0
  408. package/native/core/factories/internal/metadata/iterate_metadata_native.go +45 -2
  409. package/native/core/factories/internal/metadata/iterate_metadata_set.go +5 -0
  410. package/native/core/factories/internal/metadata/type_arguments_precondition_test.go +70 -0
  411. package/native/core/factories/metadata_comment_tag_factory_coverage_test.go +39 -0
  412. package/native/core/factories/metadata_comment_tag_factory_exclusivity_matches_interface_test.go +84 -0
  413. package/native/core/factories/metadata_type_tag_factory_accepts_legal_tag_combinations_test.go +60 -0
  414. package/native/core/factories/metadata_type_tag_factory_declarations_test.go +86 -0
  415. package/native/core/factories/metadata_type_tag_factory_keeps_bool_form_exclusivity_test.go +38 -0
  416. package/native/core/factories/metadata_type_tag_factory_rejects_cross_kind_exclusive_tags_test.go +65 -0
  417. package/native/core/factories/metadata_type_tag_factory_rejects_duplicated_array_form_tags_test.go +41 -0
  418. package/native/core/factories/numeric_range_factory_enforces_64bit_bounds_test.go +69 -0
  419. package/native/core/factories/protobuf_recovery_ownership_test.go +64 -0
  420. package/native/core/programmers/IsProgrammer.go +15 -1
  421. package/native/core/programmers/RandomProgrammer.go +51 -14
  422. package/native/core/programmers/compare/CompareEqualProgrammer.go +410 -8
  423. package/native/core/programmers/compare/CompareLessProgrammer.go +4 -2
  424. package/native/core/programmers/functional/FunctionalAssertFunctionProgrammer.go +4 -6
  425. package/native/core/programmers/functional/FunctionalAssertParametersProgrammer.go +5 -13
  426. package/native/core/programmers/functional/FunctionalAssertReturnProgrammer.go +6 -14
  427. package/native/core/programmers/functional/FunctionalIsFunctionProgrammer.go +4 -6
  428. package/native/core/programmers/functional/FunctionalIsParametersProgrammer.go +49 -14
  429. package/native/core/programmers/functional/FunctionalIsReturnProgrammer.go +5 -13
  430. package/native/core/programmers/functional/FunctionalValidateFunctionProgrammer.go +4 -6
  431. package/native/core/programmers/functional/FunctionalValidateParametersProgrammer.go +5 -13
  432. package/native/core/programmers/functional/FunctionalValidateReturnProgrammer.go +5 -13
  433. package/native/core/programmers/functional/internal/FunctionalGeneralProgrammer.go +4 -17
  434. package/native/core/programmers/helpers/CloneJoiner.go +32 -0
  435. package/native/core/programmers/helpers/FunctionProgrammer.go +6 -13
  436. package/native/core/programmers/helpers/NotationJoiner.go +86 -28
  437. package/native/core/programmers/helpers/StringifyJoinder.go +161 -51
  438. package/native/core/programmers/helpers/UnionExplorer.go +203 -61
  439. package/native/core/programmers/helpers/joiner_branch_coverage_test.go +116 -118
  440. package/native/core/programmers/helpers/union_explorer_coverage_test.go +1 -1
  441. package/native/core/programmers/internal/CheckerProgrammer.go +100 -48
  442. package/native/core/programmers/iterate/check_template.go +344 -32
  443. package/native/core/programmers/iterate/iterate_check_coverage_test.go +76 -158
  444. package/native/core/programmers/iterate/iterate_utility_coverage_test.go +231 -270
  445. package/native/core/programmers/iterate/json_schema_discriminator.go +36 -10
  446. package/native/core/programmers/iterate/json_schema_discriminator_declaration_syntax_test.go +205 -0
  447. package/native/core/programmers/iterate/json_schema_object.go +49 -7
  448. package/native/core/programmers/iterate/json_schema_pattern_property_order_test.go +44 -0
  449. package/native/core/programmers/iterate/openapi_v3_downgrader.go +674 -0
  450. package/native/core/programmers/iterate/openapi_v3_downgrader_boolean_default_test.go +95 -0
  451. package/native/core/programmers/iterate/openapi_v3_downgrader_test.go +123 -0
  452. package/native/core/programmers/iterate/template_interpolation_tags_test.go +40 -8
  453. package/native/core/programmers/iterate/template_runtime_pattern.go +63 -7
  454. package/native/core/programmers/json/JsonApplicationProgrammer.go +45 -11
  455. package/native/core/programmers/json/JsonSchemasProgrammer.go +12 -2
  456. package/native/core/programmers/json/JsonStringifyProgrammer.go +47 -6
  457. package/native/core/programmers/llm/LlmApplicationProgrammer.go +21 -11
  458. package/native/core/programmers/llm/LlmSchemaProgrammer.go +23 -6
  459. package/native/core/programmers/llm/llm_reference_codec_test.go +24 -0
  460. package/native/core/programmers/notations/NotationGeneralProgrammer.go +183 -67
  461. package/native/core/programmers/notations/notation_general_helpers_test.go +1 -3
  462. package/native/core/programmers/notations/notation_general_programmer_pascal_multiword_test.go +72 -0
  463. package/native/core/programmers/notations/notation_general_programmer_underscore_boundary_test.go +68 -0
  464. package/native/core/programmers/plain/PlainClassifyProgrammer.go +23 -15
  465. package/native/core/programmers/plain/PlainCloneProgrammer.go +20 -7
  466. package/native/core/programmers/plain/PlainPruneProgrammer.go +19 -5
  467. package/native/core/programmers/plain/plain_tuple_seed_recovery_ownership_test.go +25 -0
  468. package/native/core/programmers/protobuf/ProtobufDecodeProgrammer.go +37 -28
  469. package/native/core/programmers/protobuf/ProtobufMessageProgrammer.go +41 -22
  470. package/native/core/programmers/protobuf/protobuf_programmer_helper_coverage_test.go +26 -0
  471. package/native/core/programmers/random_programmer_length_argument_test.go +53 -0
  472. package/native/core/schemas/metadata/MetadataCollection.go +266 -25
  473. package/native/core/schemas/metadata/MetadataDefaultLibrary.go +81 -0
  474. package/native/core/schemas/metadata/MetadataDependency.go +388 -0
  475. package/native/core/schemas/metadata/MetadataObjectType.go +24 -22
  476. package/native/core/schemas/metadata/metadata_collection_generic_argument_dot_test.go +122 -0
  477. package/native/core/schemas/metadata/metadata_collection_name_allocation_test.go +147 -0
  478. package/native/core/schemas/metadata/metadata_collection_openapi_name_cascade_test.go +55 -0
  479. package/native/core/schemas/metadata/metadata_collection_openapi_name_test.go +68 -0
  480. package/native/core/utils/PatternUtil.go +13 -0
  481. package/native/core/utils/PromiseTypeFactory.go +59 -0
  482. package/native/core/utils/ProtobufNameEncoder.go +8 -0
  483. package/native/core/utils/promise_type_factory_semantics_test.go +118 -0
  484. package/native/go.mod +9 -1
  485. package/native/transform/CallExpressionTransformer.go +12 -0
  486. package/native/transform/features/json/JsonApplicationTransformer.go +1 -1
  487. package/native/transform/features/json/JsonSchemaTransformer.go +1 -1
  488. package/native/transform/features/json/JsonSchemasTransformer.go +5 -4
  489. package/native/transform/features/protobuf/ProtobufMessageTransformer.go +1 -1
  490. package/package.json +12 -4
  491. package/src/executable/FileSystemIdentity.ts +222 -0
  492. package/src/executable/TypiaGenerateWizard.ts +386 -113
  493. package/src/functional.ts +30 -60
  494. package/src/internal/_ProtobufReader.ts +161 -46
  495. package/src/internal/_createStandardSchema.ts +15 -1
  496. package/src/internal/_decimal.ts +69 -0
  497. package/src/internal/_httpQueryParseURLSearchParams.ts +24 -2
  498. package/src/internal/_isFormatByte.ts +2 -5
  499. package/src/internal/_isFormatDate.ts +15 -2
  500. package/src/internal/_isFormatDateTime.ts +28 -2
  501. package/src/internal/_isFormatIri.ts +5 -2
  502. package/src/internal/_isFormatIriReference.ts +11 -3
  503. package/src/internal/_isFormatUriReference.ts +1 -1
  504. package/src/internal/_isMultipleOf.ts +8 -0
  505. package/src/internal/_isTypeFloat.ts +1 -1
  506. package/src/internal/_isTypeInt64.ts +1 -0
  507. package/src/internal/_isTypeInt64Bigint.ts +12 -0
  508. package/src/internal/_isTypeUint64.ts +1 -0
  509. package/src/internal/_isTypeUint64Bigint.ts +7 -0
  510. package/src/internal/_isUniqueItems.ts +134 -132
  511. package/src/internal/_jsonStringifyArray.ts +50 -0
  512. package/src/internal/_jsonStringifyElement.ts +19 -0
  513. package/src/internal/_jsonStringifyProperty.ts +30 -0
  514. package/src/internal/_llmApplicationFinalize.ts +6 -1
  515. package/src/internal/_notationAny.ts +9 -4
  516. package/src/internal/_notationAssign.ts +20 -0
  517. package/src/internal/_notationCamel.ts +31 -10
  518. package/src/internal/_notationKebab.ts +11 -0
  519. package/src/internal/_notationKeyCollision.ts +9 -0
  520. package/src/internal/_notationPascal.ts +19 -6
  521. package/src/internal/_notationSnake.ts +24 -21
  522. package/src/internal/_plainCloneAny.ts +208 -33
  523. package/src/internal/_randomArray.ts +13 -4
  524. package/src/internal/_randomFormatByte.ts +31 -1
  525. package/src/internal/_randomFormatDate.ts +6 -17
  526. package/src/internal/_randomFormatDatetime.ts +34 -15
  527. package/src/internal/_randomFormatDuration.ts +30 -13
  528. package/src/internal/_randomFormatEmail.ts +8 -2
  529. package/src/internal/_randomFormatHostname.ts +48 -1
  530. package/src/internal/_randomFormatIdnEmail.ts +18 -2
  531. package/src/internal/_randomFormatIdnHostname.ts +34 -2
  532. package/src/internal/_randomFormatIpv4.ts +43 -2
  533. package/src/internal/_randomFormatIpv6.ts +67 -2
  534. package/src/internal/_randomFormatIri.ts +3 -1
  535. package/src/internal/_randomFormatIriReference.ts +3 -1
  536. package/src/internal/_randomFormatJsonPointer.ts +28 -2
  537. package/src/internal/_randomFormatPassword.ts +11 -6
  538. package/src/internal/_randomFormatRegex.ts +22 -1
  539. package/src/internal/_randomFormatRelativeJsonPointer.ts +26 -6
  540. package/src/internal/_randomFormatTime.ts +46 -10
  541. package/src/internal/_randomFormatUri.ts +3 -1
  542. package/src/internal/_randomFormatUriReference.ts +3 -1
  543. package/src/internal/_randomFormatUriTemplate.ts +3 -1
  544. package/src/internal/_randomFormatUrl.ts +25 -2
  545. package/src/internal/_randomFormatUuid.ts +10 -6
  546. package/src/internal/_randomInteger.ts +87 -40
  547. package/src/internal/_randomMultiple.ts +245 -0
  548. package/src/internal/_randomNumber.ts +72 -55
  549. package/src/internal/_randomPattern.ts +29 -4
  550. package/src/internal/_randomStringLength.ts +116 -0
  551. package/src/internal/_stringLength.ts +5 -0
  552. package/src/internal/_validateReport.ts +5 -1
  553. package/src/internal/private/__notationRename.ts +21 -0
  554. package/src/internal/private/__randomComposition.ts +50 -0
  555. package/src/internal/private/__randomEpoch.ts +34 -0
  556. package/src/json.ts +2 -2
  557. package/src/module.ts +4 -6
  558. package/src/notations.ts +20 -4
  559. package/lib/internal/private/__notationCapitalize.d.ts +0 -1
  560. package/lib/internal/private/__notationCapitalize.js +0 -6
  561. package/lib/internal/private/__notationCapitalize.js.map +0 -1
  562. package/lib/internal/private/__notationCapitalize.mjs +0 -6
  563. package/lib/internal/private/__notationCapitalize.mjs.map +0 -1
  564. package/lib/internal/private/__notationUnsnake.d.ts +0 -4
  565. package/lib/internal/private/__notationUnsnake.js +0 -26
  566. package/lib/internal/private/__notationUnsnake.js.map +0 -1
  567. package/lib/internal/private/__notationUnsnake.mjs +0 -15
  568. package/lib/internal/private/__notationUnsnake.mjs.map +0 -1
  569. package/native/adapter/visit.go +0 -173
  570. package/native/adapter/visit_property_chain_edges_test.go +0 -129
  571. package/native/cmd/ttsc-typia/plugin_options_missing_config_test.go +0 -26
  572. package/native/cmd/ttsc-typia/plugin_options_undefined_false_test.go +0 -36
  573. package/native/core/programmers/helpers/disable_function_programmer_declare.go +0 -10
  574. package/native/core/programmers/iterate/check_union_array_like.go +0 -422
  575. package/native/core/programmers/iterate/prune_object_properties.go +0 -105
  576. package/native/core/programmers/iterate/stringify_dynamic_properties.go +0 -219
  577. package/native/core/programmers/iterate/stringify_native.go +0 -14
  578. package/native/core/programmers/iterate/stringify_regular_properties.go +0 -112
  579. package/native/core/schemas/metadata/MetadataApplication.go +0 -41
  580. package/src/internal/private/__notationCapitalize.ts +0 -2
  581. package/src/internal/private/__notationUnsnake.ts +0 -24
@@ -2,7 +2,7 @@ package helpers
2
2
 
3
3
  import (
4
4
  "encoding/json"
5
- "sort"
5
+ "strings"
6
6
 
7
7
  shimast "github.com/microsoft/typescript-go/shim/ast"
8
8
  shimprinter "github.com/microsoft/typescript-go/shim/printer"
@@ -21,9 +21,10 @@ type StringifyJoiner_ObjectProps struct {
21
21
  }
22
22
 
23
23
  type StringifyJoiner_ArrayProps struct {
24
- Input *shimast.Expression
25
- Arrow *shimast.Expression
26
- Emit *shimprinter.EmitContext
24
+ Context nativecontext.ITypiaContext
25
+ Input *shimast.Expression
26
+ Arrow *shimast.Expression
27
+ Emit *shimprinter.EmitContext
27
28
  }
28
29
 
29
30
  type StringifyJoiner_TupleProps struct {
@@ -48,17 +49,22 @@ func (stringifyJoinerNamespace) Object(props StringifyJoiner_ObjectProps) *shima
48
49
  dynamic = append(dynamic, entry)
49
50
  }
50
51
  }
51
- expressions := stringifyJoiner_regular_properties(regular, dynamic, props.Context.Emit)
52
+ expressions := stringifyJoiner_regular_properties(props.Context, regular, dynamic, props.Context.Emit)
52
53
  if len(dynamic) != 0 {
53
54
  keys := make([]string, 0, len(regular))
54
55
  for _, entry := range regular {
55
56
  keys = append(keys, *entry.Key.GetSoleLiteral())
56
57
  }
57
- expressions = append(expressions, stringifyJoiner_dynamic_properties(dynamic, keys, props.Context.Emit))
58
+ expressions = append(expressions, stringifyJoiner_dynamic_properties(props.Context, dynamic, keys, props.Context.Emit))
58
59
  }
59
60
 
61
+ // The tail helper removes the separator left behind when the last written
62
+ // member drops out at runtime, so it may only be skipped when the last regular
63
+ // member cannot drop. Required is not the same as cannot-drop: a required
64
+ // `any` member is omitted whenever its value serializes to `undefined`, which
65
+ // without this produced a trailing comma before `}` (#2253).
60
66
  filtered := expressions
61
- if !((len(regular) != 0 && regular[len(regular)-1].Meta.IsRequired() && len(dynamic) == 0) ||
67
+ if !((len(regular) != 0 && !stringifyJoiner_entry_omittable(regular[len(regular)-1]) && len(dynamic) == 0) ||
62
68
  (len(regular) == 0 && len(dynamic) != 0)) {
63
69
  filtered = []*shimast.Node{
64
70
  f.NewCallExpression(
@@ -78,27 +84,26 @@ func (stringifyJoinerNamespace) Object(props StringifyJoiner_ObjectProps) *shima
78
84
  return nativefactories.TemplateFactory.Generate(output, props.Context.Emit)
79
85
  }
80
86
 
87
+ // Array serializes elements through the `_jsonStringifyArray` helper rather than
88
+ // `input.map(...).join(",")`.
89
+ //
90
+ // `map` never visits a hole and leaves one behind, and `join` renders both a
91
+ // hole and a mapped `undefined` as empty text, so the two cases ECMAScript's
92
+ // SerializeJSONArray answers with `null` were emitted as nothing at all: a
93
+ // sparse array produced the malformed text `[,1]`, and an element serializing to
94
+ // `undefined` — a function, a symbol, or a `toJSON` returning nothing in an
95
+ // `any` or `unknown` slot — silently collapsed its position. A hole exists at
96
+ // runtime whatever the element type declares, so this is not confined to `any`
97
+ // (#2253).
81
98
  func (stringifyJoinerNamespace) Array(props StringifyJoiner_ArrayProps) *shimast.Node {
82
99
  f := nativecontext.EmitFactoryOf(stringifyJoiner_factory, props.Emit)
83
100
  return nativefactories.TemplateFactory.Generate([]*shimast.Node{
84
101
  f.NewStringLiteral("[", shimast.TokenFlagsNone),
85
102
  f.NewCallExpression(
86
- nativefactories.IdentifierFactory.Access(
87
- nil,
88
- f.NewCallExpression(
89
- nativefactories.IdentifierFactory.Access(nil, props.Input, "map"),
90
- nil,
91
- nil,
92
- f.NewNodeList([]*shimast.Node{props.Arrow}),
93
- shimast.NodeFlagsNone,
94
- ),
95
- "join",
96
- ),
103
+ stringifyJoiner_internal(props.Context, "jsonStringifyArray"),
97
104
  nil,
98
105
  nil,
99
- f.NewNodeList([]*shimast.Node{
100
- f.NewStringLiteral(",", shimast.TokenFlagsNone),
101
- }),
106
+ f.NewNodeList([]*shimast.Node{props.Input, props.Arrow}),
102
107
  shimast.NodeFlagsNone,
103
108
  ),
104
109
  f.NewStringLiteral("]", shimast.TokenFlagsNone),
@@ -131,31 +136,66 @@ func (stringifyJoinerNamespace) Tuple(props StringifyJoiner_TupleProps) *shimast
131
136
  return nativefactories.TemplateFactory.Generate(expressions, props.Emit)
132
137
  }
133
138
 
134
- func stringifyJoiner_regular_properties(regular []IExpressionEntry, dynamic []IExpressionEntry, emit ...*shimprinter.EmitContext) []*shimast.Node {
139
+ func stringifyJoiner_regular_properties(context nativecontext.ITypiaContext, regular []IExpressionEntry, dynamic []IExpressionEntry, emit ...*shimprinter.EmitContext) []*shimast.Node {
135
140
  f := nativecontext.EmitFactoryOf(stringifyJoiner_factory, emit...)
136
141
  output := []*shimast.Node{}
137
- sort.Slice(regular, func(i int, j int) bool {
138
- return stringifyJoiner_sequence(regular[i].Meta) < stringifyJoiner_sequence(regular[j].Meta)
139
- })
142
+ // Members keep their declaration order, which is what the guide promises and
143
+ // what `JSON.stringify` produces for a value assigned in that order. They used
144
+ // to be sorted so every omissible member sat ahead of the required ones,
145
+ // because the separator is appended to every entry but the last and a last
146
+ // member that drops at runtime would leave a trailing comma. The caller
147
+ // already repairs exactly that with `_jsonStringifyTail`, whose condition
148
+ // reads the last member and now sees the declared one, so the ordering
149
+ // constraint the sort existed for no longer applies (#2295).
140
150
  for index, entry := range regular {
141
151
  key := entry.Key.GetSoleLiteral()
142
152
  encoded, err := json.Marshal(*key)
143
153
  if err != nil {
144
154
  encoded = []byte("\"" + *key + "\"")
145
155
  }
156
+ // encoded is escaped for a JSON string, but the literal becomes a part of a
157
+ // template literal (TemplateFactory.Generate). The two contexts disagree, so
158
+ // re-escape the JSON bytes for the template-literal context: otherwise `\"`
159
+ // decays to `"`, `\\` to `\`, a control-char escape's backslash is dropped, a
160
+ // raw backtick closes the template, and `${` starts a live interpolation.
161
+ separator := ""
162
+ if index != len(regular)-1 || len(dynamic) != 0 {
163
+ separator = ","
164
+ }
146
165
  base := []*shimast.Node{
147
- f.NewStringLiteral(string(encoded)+":", shimast.TokenFlagsNone),
166
+ f.NewStringLiteral(stringifyJoiner_escape_template(string(encoded))+":", shimast.TokenFlagsNone),
148
167
  entry.Expression,
149
168
  }
150
- if index != len(regular)-1 || len(dynamic) != 0 {
151
- base = append(base, f.NewStringLiteral(",", shimast.TokenFlagsNone))
169
+ if separator != "" {
170
+ base = append(base, f.NewStringLiteral(separator, shimast.TokenFlagsNone))
152
171
  }
153
172
  empty := (!entry.Meta.IsRequired() && !entry.Meta.Nullable && entry.Meta.Size() == 0) ||
154
173
  (len(entry.Meta.Functions) != 0 && !entry.Meta.Nullable && entry.Meta.Size() == 1)
155
174
  if empty {
156
175
  continue
157
176
  }
158
- if !entry.Meta.IsRequired() || len(entry.Meta.Functions) != 0 || entry.Meta.Any {
177
+ if stringifyJoiner_result_undefinable(entry.Meta) {
178
+ // An `any` or `unknown` member is serialized by JSON.stringify, which
179
+ // answers `undefined` for a function, a symbol, and a `toJSON` returning
180
+ // nothing while the value itself is present. Only the serialized result
181
+ // distinguishes those from a value that has text, so the member is written
182
+ // through the helper that reads that result — once, because a `toJSON` may
183
+ // answer differently on a second call (#2253). The input tests below stay
184
+ // for members whose serializer must not run on a missing value at all.
185
+ output = append(output, f.NewCallExpression(
186
+ stringifyJoiner_internal(context, "jsonStringifyProperty"),
187
+ nil,
188
+ nil,
189
+ f.NewNodeList([]*shimast.Node{
190
+ f.NewStringLiteral(string(encoded)+":", shimast.TokenFlagsNone),
191
+ entry.Expression,
192
+ f.NewStringLiteral(separator, shimast.TokenFlagsNone),
193
+ }),
194
+ shimast.NodeFlagsNone,
195
+ ))
196
+ continue
197
+ }
198
+ if !entry.Meta.IsRequired() || len(entry.Meta.Functions) != 0 {
159
199
  output = append(output, nativefactories.ExpressionFactory.Conditional(
160
200
  stringifyJoiner_regular_condition(entry, emit...),
161
201
  f.NewStringLiteral("", shimast.TokenFlagsNone),
@@ -169,6 +209,39 @@ func stringifyJoiner_regular_properties(regular []IExpressionEntry, dynamic []IE
169
209
  return output
170
210
  }
171
211
 
212
+ // stringifyJoiner_entry_omittable reports whether a member can be absent from
213
+ // the emitted object at runtime, which is exactly the set of members that are
214
+ // written through a conditional or through the property helper.
215
+ func stringifyJoiner_entry_omittable(entry IExpressionEntry) bool {
216
+ return !entry.Meta.IsRequired() || len(entry.Meta.Functions) != 0 ||
217
+ stringifyJoiner_result_undefinable(entry.Meta)
218
+ }
219
+
220
+ // stringifyJoiner_result_undefinable reports whether a value that is present can
221
+ // still serialize to nothing, which is the case an input test cannot see.
222
+ //
223
+ // `any` and `unknown` are serialized by JSON.stringify, which answers
224
+ // `undefined` for a function, a symbol, and a `toJSON` returning nothing. A
225
+ // declared `toJSON` is the same case without `any`: the member's text is its
226
+ // return value, so a return type that admits `undefined` admits a member with no
227
+ // text (#2253).
228
+ // StringifyJoiner_ResultUndefinable exposes the same question to the element
229
+ // positions the joiner does not build itself, so a tuple slot and an object
230
+ // member classify a value identically.
231
+ func StringifyJoiner_ResultUndefinable(meta *nativemetadata.MetadataSchema) bool {
232
+ return stringifyJoiner_result_undefinable(meta)
233
+ }
234
+
235
+ func stringifyJoiner_result_undefinable(meta *nativemetadata.MetadataSchema) bool {
236
+ if meta == nil {
237
+ return false
238
+ }
239
+ if meta.Any {
240
+ return true
241
+ }
242
+ return meta.Escaped != nil && meta.Escaped.Returns != nil && !meta.Escaped.Returns.IsRequired()
243
+ }
244
+
172
245
  func stringifyJoiner_regular_condition(entry IExpressionEntry, emit ...*shimprinter.EmitContext) *shimast.Node {
173
246
  f := nativecontext.EmitFactoryOf(stringifyJoiner_factory, emit...)
174
247
  conditions := []*shimast.Node{}
@@ -193,7 +266,7 @@ func stringifyJoiner_regular_condition(entry IExpressionEntry, emit ...*shimprin
193
266
  return stringifyJoiner_reduce(conditions, shimast.KindBarBarToken, emit...)
194
267
  }
195
268
 
196
- func stringifyJoiner_dynamic_properties(dynamic []IExpressionEntry, regular []string, emit ...*shimprinter.EmitContext) *shimast.Node {
269
+ func stringifyJoiner_dynamic_properties(context nativecontext.ITypiaContext, dynamic []IExpressionEntry, regular []string, emit ...*shimprinter.EmitContext) *shimast.Node {
197
270
  f := nativecontext.EmitFactoryOf(stringifyJoiner_factory, emit...)
198
271
  statements := []*shimast.Node{
199
272
  f.NewIfStatement(
@@ -292,7 +365,7 @@ func stringifyJoiner_dynamic_properties(dynamic []IExpressionEntry, regular []st
292
365
  }
293
366
  simple := len(dynamic) == 1 && dynamic[0].Key.Size() == 1 && len(dynamic[0].Key.Atomics) != 0 && dynamic[0].Key.Atomics[0].Type == "string"
294
367
  if simple {
295
- statements = append(statements, stringifyJoiner_stringify(dynamic[0], emit...))
368
+ statements = append(statements, stringifyJoiner_stringify(context, dynamic[0], emit...))
296
369
  return output()
297
370
  }
298
371
  for _, entry := range dynamic {
@@ -307,7 +380,7 @@ func stringifyJoiner_dynamic_properties(dynamic []IExpressionEntry, regular []st
307
380
  f.NewNodeList([]*shimast.Node{f.NewIdentifier("key")}),
308
381
  shimast.NodeFlagsNone,
309
382
  ),
310
- stringifyJoiner_stringify(entry, emit...),
383
+ stringifyJoiner_stringify(context, entry, emit...),
311
384
  nil,
312
385
  ))
313
386
  }
@@ -315,20 +388,39 @@ func stringifyJoiner_dynamic_properties(dynamic []IExpressionEntry, regular []st
315
388
  return output()
316
389
  }
317
390
 
318
- func stringifyJoiner_stringify(entry IExpressionEntry, emit ...*shimprinter.EmitContext) *shimast.Node {
391
+ func stringifyJoiner_stringify(context nativecontext.ITypiaContext, entry IExpressionEntry, emit ...*shimprinter.EmitContext) *shimast.Node {
319
392
  f := nativecontext.EmitFactoryOf(stringifyJoiner_factory, emit...)
393
+ head := nativefactories.TemplateFactory.Generate([]*shimast.Node{
394
+ f.NewCallExpression(
395
+ f.NewIdentifier("JSON.stringify"),
396
+ nil,
397
+ f.NewNodeList(nil),
398
+ f.NewNodeList([]*shimast.Node{f.NewIdentifier("key")}),
399
+ shimast.NodeFlagsNone,
400
+ ),
401
+ f.NewStringLiteral(":", shimast.TokenFlagsNone),
402
+ }, emit...)
403
+ if entry.Meta.Any {
404
+ // An index-signature member takes the same contextual decision a static one
405
+ // takes: `any` and `unknown` values are serialized by JSON.stringify, which
406
+ // answers `undefined` for a present function, symbol, or empty `toJSON`.
407
+ // Returning the empty string hands the surrounding filter the same sentinel
408
+ // it already uses for a missing value, so the member and its separator drop
409
+ // together instead of rendering the literal `undefined` (#2253).
410
+ return f.NewReturnStatement(f.NewCallExpression(
411
+ stringifyJoiner_internal(context, "jsonStringifyProperty"),
412
+ nil,
413
+ nil,
414
+ f.NewNodeList([]*shimast.Node{
415
+ head,
416
+ entry.Expression,
417
+ f.NewStringLiteral("", shimast.TokenFlagsNone),
418
+ }),
419
+ shimast.NodeFlagsNone,
420
+ ))
421
+ }
320
422
  return f.NewReturnStatement(
321
- nativefactories.TemplateFactory.Generate([]*shimast.Node{
322
- f.NewCallExpression(
323
- f.NewIdentifier("JSON.stringify"),
324
- nil,
325
- f.NewNodeList(nil),
326
- f.NewNodeList([]*shimast.Node{f.NewIdentifier("key")}),
327
- shimast.NodeFlagsNone,
328
- ),
329
- f.NewStringLiteral(":", shimast.TokenFlagsNone),
330
- entry.Expression,
331
- }, emit...),
423
+ nativefactories.TemplateFactory.Generate([]*shimast.Node{head, entry.Expression}, emit...),
332
424
  )
333
425
  }
334
426
 
@@ -374,13 +466,6 @@ func stringifyJoiner_reduce(expressions []*shimast.Node, operator shimast.Kind,
374
466
  return output
375
467
  }
376
468
 
377
- func stringifyJoiner_sequence(meta *nativemetadata.MetadataSchema) int {
378
- if meta.Any || !meta.IsRequired() || len(meta.Functions) != 0 {
379
- return 0
380
- }
381
- return 1
382
- }
383
-
384
469
  func stringifyJoiner_internal(context nativecontext.ITypiaContext, name string) *shimast.Node {
385
470
  if importer := context.Importer; importer != nil {
386
471
  return importer.Internal(name)
@@ -397,6 +482,31 @@ func stringifyJoiner_all_string_literals(elements []*shimast.Expression) bool {
397
482
  return true
398
483
  }
399
484
 
485
+ // stringifyJoiner_escape_template escapes an already-JSON-encoded key so that,
486
+ // spliced verbatim into a backtick template literal, it reproduces the exact
487
+ // JSON bytes at runtime. It doubles every backslash (so JSON escapes such as
488
+ // `\"`, `\\`, `\t`, `<` survive), escapes a backtick (which would close the
489
+ // template), and escapes the `$` of a `${` pair (which would start a live
490
+ // interpolation). A `$` not followed by `{` and every ordinary character stay
491
+ // byte-identical, so keys that need none of these are unchanged.
492
+ func stringifyJoiner_escape_template(text string) string {
493
+ var builder strings.Builder
494
+ builder.Grow(len(text))
495
+ for i := 0; i < len(text); i++ {
496
+ switch c := text[i]; {
497
+ case c == '\\':
498
+ builder.WriteString("\\\\")
499
+ case c == '`':
500
+ builder.WriteString("\\`")
501
+ case c == '$' && i+1 < len(text) && text[i+1] == '{':
502
+ builder.WriteString("\\$")
503
+ default:
504
+ builder.WriteByte(c)
505
+ }
506
+ }
507
+ return builder.String()
508
+ }
509
+
400
510
  func joinStrings(values []string, sep string) string {
401
511
  if len(values) == 0 {
402
512
  return ""
@@ -79,11 +79,12 @@ type UnionExplorer_ObjectProps struct {
79
79
  }
80
80
 
81
81
  type UnionExplorer_ArrayLikeConfig struct {
82
- Checker func(props UnionExplorer_ArrayLikeCheckerProps) *shimast.Node
83
- Decoder func(props UnionExplorer_ArrayLikeDecoderProps) *shimast.Node
84
- Empty *shimast.Node
85
- Success *shimast.Expression
86
- Failure func(props UnionExplorer_ArrayLikeFailureProps) *shimast.Node
82
+ Checker func(props UnionExplorer_ArrayLikeCheckerProps) *shimast.Node
83
+ Candidate func(props UnionExplorer_ArrayLikeCandidateProps) *shimast.Node
84
+ Decoder func(props UnionExplorer_ArrayLikeDecoderProps) *shimast.Node
85
+ Empty *shimast.Node
86
+ Success *shimast.Expression
87
+ Failure func(props UnionExplorer_ArrayLikeFailureProps) *shimast.Node
87
88
  }
88
89
 
89
90
  type UnionExplorer_ArrayLikeCheckerProps struct {
@@ -99,6 +100,12 @@ type UnionExplorer_ArrayLikeDecoderProps struct {
99
100
  Explore any
100
101
  }
101
102
 
103
+ type UnionExplorer_ArrayLikeCandidateProps struct {
104
+ Input *shimast.Expression
105
+ Definition any
106
+ Explore any
107
+ }
108
+
102
109
  type UnionExplorer_ArrayLikeFailureProps struct {
103
110
  Input *shimast.Expression
104
111
  Expected string
@@ -622,46 +629,69 @@ func unionExplorer_check_union_array_like(props unionExplorer_check_union_array_
622
629
  inputType = nativefactories.TypeFactory.Keyword("any", props.Emit)
623
630
  postfix = "\"[0]\""
624
631
  }
625
- return f.NewAsExpression(
626
- f.NewArrayLiteralExpression(
632
+ entries := []*shimast.Node{
633
+ f.NewArrowFunction(
634
+ nil,
635
+ nil,
627
636
  f.NewNodeList([]*shimast.Node{
628
- f.NewArrowFunction(
629
- nil,
630
- nil,
631
- f.NewNodeList([]*shimast.Node{
632
- nativefactories.IdentifierFactory.Parameter("top", inputType, nil, props.Emit),
633
- }),
634
- nativefactories.TypeFactory.Keyword("any", props.Emit),
637
+ nativefactories.IdentifierFactory.Parameter("top", inputType, nil, props.Emit),
638
+ }),
639
+ nativefactories.TypeFactory.Keyword("any", props.Emit),
640
+ nil,
641
+ f.NewToken(shimast.KindEqualsGreaterThanToken),
642
+ props.Config.Checker(UnionExplorer_ArrayLikeCheckerProps{
643
+ Input: f.NewIdentifier("top"),
644
+ Definition: props.Accessor.Element(meta),
645
+ Explore: unionExplorer_with_postfix(props.Explore, false, postfix),
646
+ Container: array,
647
+ }),
648
+ ),
649
+ f.NewArrowFunction(
650
+ nil,
651
+ nil,
652
+ f.NewNodeList([]*shimast.Node{
653
+ nativefactories.IdentifierFactory.Parameter(
654
+ "entire",
655
+ f.NewTypeReferenceNode(f.NewIdentifier("any[]"), nil),
635
656
  nil,
636
- f.NewToken(shimast.KindEqualsGreaterThanToken),
637
- props.Config.Checker(UnionExplorer_ArrayLikeCheckerProps{
638
- Input: f.NewIdentifier("top"),
639
- Definition: props.Accessor.Element(meta),
640
- Explore: unionExplorer_with_postfix(props.Explore, false, postfix),
641
- Container: array,
642
- }),
657
+ props.Emit,
643
658
  ),
644
- f.NewArrowFunction(
645
- nil,
646
- nil,
647
- f.NewNodeList([]*shimast.Node{
648
- nativefactories.IdentifierFactory.Parameter(
649
- "entire",
650
- f.NewTypeReferenceNode(f.NewIdentifier("any[]"), nil),
651
- nil,
652
- props.Emit,
653
- ),
654
- }),
655
- nativefactories.TypeFactory.Keyword("any", props.Emit),
659
+ }),
660
+ nativefactories.TypeFactory.Keyword("any", props.Emit),
661
+ nil,
662
+ f.NewToken(shimast.KindEqualsGreaterThanToken),
663
+ props.Config.Decoder(UnionExplorer_ArrayLikeDecoderProps{
664
+ Input: f.NewIdentifier("entire"),
665
+ Definition: meta,
666
+ Explore: unionExplorer_with_tracable(props.Explore, true),
667
+ }),
668
+ ),
669
+ }
670
+ if props.Config.Candidate != nil {
671
+ entries = append(entries, f.NewArrowFunction(
672
+ nil,
673
+ nil,
674
+ f.NewNodeList([]*shimast.Node{
675
+ nativefactories.IdentifierFactory.Parameter(
676
+ "entire",
677
+ f.NewTypeReferenceNode(f.NewIdentifier("any[]"), nil),
656
678
  nil,
657
- f.NewToken(shimast.KindEqualsGreaterThanToken),
658
- props.Config.Decoder(UnionExplorer_ArrayLikeDecoderProps{
659
- Input: f.NewIdentifier("entire"),
660
- Definition: meta,
661
- Explore: unionExplorer_with_tracable(props.Explore, true),
662
- }),
679
+ props.Emit,
663
680
  ),
664
681
  }),
682
+ nativefactories.TypeFactory.Keyword("boolean", props.Emit),
683
+ nil,
684
+ f.NewToken(shimast.KindEqualsGreaterThanToken),
685
+ props.Config.Candidate(UnionExplorer_ArrayLikeCandidateProps{
686
+ Input: f.NewIdentifier("entire"),
687
+ Definition: meta,
688
+ Explore: unionExplorer_with_tracable(props.Explore, false),
689
+ }),
690
+ ))
691
+ }
692
+ return f.NewAsExpression(
693
+ f.NewArrayLiteralExpression(
694
+ f.NewNodeList(entries),
665
695
  true,
666
696
  ),
667
697
  f.NewTypeReferenceNode(f.NewIdentifier("const"), nil),
@@ -709,12 +739,17 @@ func unionExplorer_check_union_array_like(props unionExplorer_check_union_array_
709
739
  "pred",
710
740
  f.NewIdentifier("tuplePredicators"),
711
741
  f.NewIfStatement(
712
- f.NewCallExpression(
713
- f.NewIdentifier("pred[0]"),
714
- nil,
715
- nil,
716
- f.NewNodeList([]*shimast.Node{array}),
717
- shimast.NodeFlagsNone,
742
+ unionExplorer_array_candidate_condition(
743
+ f.NewCallExpression(
744
+ f.NewIdentifier("pred[0]"),
745
+ nil,
746
+ nil,
747
+ f.NewNodeList([]*shimast.Node{array}),
748
+ shimast.NodeFlagsNone,
749
+ ),
750
+ props.Config.Candidate != nil,
751
+ array,
752
+ props.Emit,
718
753
  ),
719
754
  f.NewReturnStatement(
720
755
  f.NewCallExpression(
@@ -741,12 +776,12 @@ func unionExplorer_check_union_array_like(props unionExplorer_check_union_array_
741
776
  for _, x := range arrayList {
742
777
  arrayPredicates = append(arrayPredicates, predicate(x))
743
778
  }
744
- statements = append(statements,
745
- nativefactories.StatementFactory.Constant(nativefactories.StatementFactory_ConstantProps{
746
- Name: "top",
747
- Value: props.Accessor.Front(props.Input),
748
- }, props.Emit),
749
- f.NewIfStatement(
779
+ statements = append(statements, nativefactories.StatementFactory.Constant(nativefactories.StatementFactory_ConstantProps{
780
+ Name: "top",
781
+ Value: props.Accessor.Front(props.Input),
782
+ }, props.Emit))
783
+ if props.Config.Candidate == nil {
784
+ statements = append(statements, f.NewIfStatement(
750
785
  f.NewBinaryExpression(
751
786
  nil,
752
787
  nativefactories.ExpressionFactory.Number(0, props.Emit),
@@ -756,7 +791,9 @@ func unionExplorer_check_union_array_like(props unionExplorer_check_union_array_
756
791
  ),
757
792
  unionExplorer_return_or_statement(props.Config.Empty, props.Emit),
758
793
  nil,
759
- ),
794
+ ))
795
+ }
796
+ statements = append(statements,
760
797
  nativefactories.StatementFactory.Constant(nativefactories.StatementFactory_ConstantProps{
761
798
  Name: "arrayPredicators",
762
799
  Value: f.NewArrayLiteralExpression(
@@ -780,19 +817,37 @@ func unionExplorer_check_union_array_like(props unionExplorer_check_union_array_
780
817
  nil,
781
818
  nil,
782
819
  f.NewToken(shimast.KindEqualsGreaterThanToken),
783
- f.NewCallExpression(
784
- f.NewIdentifier("pred[0]"),
785
- nil,
786
- nil,
787
- f.NewNodeList([]*shimast.Node{top}),
788
- shimast.NodeFlagsNone,
789
- ),
820
+ func() *shimast.Node {
821
+ element := f.NewCallExpression(
822
+ f.NewIdentifier("pred[0]"),
823
+ nil,
824
+ nil,
825
+ f.NewNodeList([]*shimast.Node{top}),
826
+ shimast.NodeFlagsNone,
827
+ )
828
+ if props.Config.Candidate == nil {
829
+ return element
830
+ }
831
+ return f.NewBinaryExpression(
832
+ nil,
833
+ f.NewBinaryExpression(
834
+ nil,
835
+ nativefactories.ExpressionFactory.Number(0, props.Emit),
836
+ nil,
837
+ f.NewToken(shimast.KindEqualsEqualsEqualsToken),
838
+ props.Accessor.Size(props.Input),
839
+ ),
840
+ nil,
841
+ f.NewToken(shimast.KindBarBarToken),
842
+ element,
843
+ )
844
+ }(),
790
845
  ),
791
846
  }),
792
847
  shimast.NodeFlagsNone,
793
848
  ),
794
849
  }, props.Emit),
795
- unionExplorer_array_if(iterate, array, top, props.Config.Success, props.Emit),
850
+ unionExplorer_array_if(iterate, array, top, props.Config.Success, props.Config.Candidate != nil, props.Emit),
796
851
  )
797
852
  }
798
853
  names := make([]string, 0, len(targets))
@@ -819,8 +874,75 @@ func unionExplorer_check_union_array_like(props unionExplorer_check_union_array_
819
874
  )
820
875
  }
821
876
 
822
- func unionExplorer_array_if(iterate func(init string, from *shimast.Expression, ifStatement *shimast.Node) *shimast.Node, array *shimast.Node, top *shimast.Node, success *shimast.Expression, emit ...*shimprinter.EmitContext) *shimast.Node {
877
+ func unionExplorer_array_if(iterate func(init string, from *shimast.Expression, ifStatement *shimast.Node) *shimast.Node, array *shimast.Node, top *shimast.Node, success *shimast.Expression, candidate bool, emit ...*shimprinter.EmitContext) *shimast.Node {
823
878
  f := nativecontext.EmitFactoryOf(unionExplorer_factory, emit...)
879
+ if candidate {
880
+ elementCondition := f.NewCallExpression(
881
+ nativefactories.IdentifierFactory.Access(nil, array, "every"),
882
+ nil,
883
+ nil,
884
+ f.NewNodeList([]*shimast.Node{
885
+ f.NewArrowFunction(
886
+ nil,
887
+ nil,
888
+ f.NewNodeList([]*shimast.Node{
889
+ nativefactories.IdentifierFactory.Parameter("value", nativefactories.TypeFactory.Keyword("any", emit...), nil, emit...),
890
+ }),
891
+ nil,
892
+ nil,
893
+ f.NewToken(shimast.KindEqualsGreaterThanToken),
894
+ f.NewBinaryExpression(
895
+ nil,
896
+ success,
897
+ nil,
898
+ f.NewToken(shimast.KindEqualsEqualsEqualsToken),
899
+ f.NewCallExpression(
900
+ f.NewIdentifier("pred[0]"),
901
+ nil,
902
+ nil,
903
+ f.NewNodeList([]*shimast.Node{f.NewIdentifier("value")}),
904
+ shimast.NodeFlagsNone,
905
+ ),
906
+ ),
907
+ ),
908
+ }),
909
+ shimast.NodeFlagsNone,
910
+ )
911
+ return f.NewBlock(f.NewNodeList([]*shimast.Node{
912
+ iterate(
913
+ "pred",
914
+ f.NewIdentifier("passed"),
915
+ f.NewIfStatement(
916
+ unionExplorer_array_candidate_condition(elementCondition, true, array, emit...),
917
+ f.NewReturnStatement(f.NewCallExpression(
918
+ f.NewIdentifier("pred[1]"),
919
+ nil,
920
+ nil,
921
+ f.NewNodeList([]*shimast.Node{array}),
922
+ shimast.NodeFlagsNone,
923
+ )),
924
+ nil,
925
+ ),
926
+ ),
927
+ f.NewIfStatement(
928
+ f.NewBinaryExpression(
929
+ nil,
930
+ nativefactories.ExpressionFactory.Number(0, emit...),
931
+ nil,
932
+ f.NewToken(shimast.KindLessThanToken),
933
+ f.NewIdentifier("passed.length"),
934
+ ),
935
+ f.NewReturnStatement(f.NewCallExpression(
936
+ f.NewIdentifier("passed[0][1]"),
937
+ nil,
938
+ nil,
939
+ f.NewNodeList([]*shimast.Node{array}),
940
+ shimast.NodeFlagsNone,
941
+ )),
942
+ nil,
943
+ ),
944
+ }), true)
945
+ }
824
946
  return f.NewIfStatement(
825
947
  f.NewBinaryExpression(
826
948
  nil,
@@ -910,6 +1032,26 @@ func unionExplorer_array_if(iterate func(init string, from *shimast.Expression,
910
1032
  )
911
1033
  }
912
1034
 
1035
+ func unionExplorer_array_candidate_condition(element *shimast.Node, candidate bool, array *shimast.Node, emit ...*shimprinter.EmitContext) *shimast.Node {
1036
+ if candidate == false {
1037
+ return element
1038
+ }
1039
+ f := nativecontext.EmitFactoryOf(unionExplorer_factory, emit...)
1040
+ return f.NewBinaryExpression(
1041
+ nil,
1042
+ f.NewCallExpression(
1043
+ f.NewIdentifier("pred[2]"),
1044
+ nil,
1045
+ nil,
1046
+ f.NewNodeList([]*shimast.Node{array}),
1047
+ shimast.NodeFlagsNone,
1048
+ ),
1049
+ nil,
1050
+ f.NewToken(shimast.KindAmpersandAmpersandToken),
1051
+ element,
1052
+ )
1053
+ }
1054
+
913
1055
  func unionExplorer_return_or_statement(node *shimast.Node, emit ...*shimprinter.EmitContext) *shimast.Node {
914
1056
  f := nativecontext.EmitFactoryOf(unionExplorer_factory, emit...)
915
1057
  if node == nil || node.Kind == shimast.KindReturnStatement {