typia 13.1.0 → 13.1.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (516) hide show
  1. package/README.md +3 -0
  2. package/lib/_virtual/_rolldown/runtime.mjs +1 -5
  3. package/lib/executable/FileSystemIdentity.d.ts +21 -0
  4. package/lib/executable/FileSystemIdentity.js +183 -0
  5. package/lib/executable/FileSystemIdentity.js.map +1 -0
  6. package/lib/executable/FileSystemIdentity.mjs +129 -0
  7. package/lib/executable/FileSystemIdentity.mjs.map +1 -0
  8. package/lib/executable/TypiaGenerateWizard.js +264 -104
  9. package/lib/executable/TypiaGenerateWizard.js.map +1 -1
  10. package/lib/executable/TypiaGenerateWizard.mjs +233 -93
  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 +17 -0
  16. package/lib/internal/_ProtobufReader.js +117 -45
  17. package/lib/internal/_ProtobufReader.js.map +1 -1
  18. package/lib/internal/_ProtobufReader.mjs +108 -39
  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/_notationAny.js +8 -1
  87. package/lib/internal/_notationAny.js.map +1 -1
  88. package/lib/internal/_notationAny.mjs +7 -1
  89. package/lib/internal/_notationAny.mjs.map +1 -1
  90. package/lib/internal/_notationAssign.d.ts +1 -0
  91. package/lib/internal/_notationAssign.js +18 -0
  92. package/lib/internal/_notationAssign.js.map +1 -0
  93. package/lib/internal/_notationAssign.mjs +17 -0
  94. package/lib/internal/_notationAssign.mjs.map +1 -0
  95. package/lib/internal/_notationCamel.js +30 -9
  96. package/lib/internal/_notationCamel.js.map +1 -1
  97. package/lib/internal/_notationCamel.mjs +13 -5
  98. package/lib/internal/_notationCamel.mjs.map +1 -1
  99. package/lib/internal/_notationKebab.d.ts +1 -0
  100. package/lib/internal/_notationKebab.js +15 -0
  101. package/lib/internal/_notationKebab.js.map +1 -0
  102. package/lib/internal/_notationKebab.mjs +15 -0
  103. package/lib/internal/_notationKebab.mjs.map +1 -0
  104. package/lib/internal/_notationKeyCollision.d.ts +1 -0
  105. package/lib/internal/_notationKeyCollision.js +8 -0
  106. package/lib/internal/_notationKeyCollision.js.map +1 -0
  107. package/lib/internal/_notationKeyCollision.mjs +8 -0
  108. package/lib/internal/_notationKeyCollision.mjs.map +1 -0
  109. package/lib/internal/_notationPascal.js +20 -5
  110. package/lib/internal/_notationPascal.js.map +1 -1
  111. package/lib/internal/_notationPascal.mjs +10 -5
  112. package/lib/internal/_notationPascal.mjs.map +1 -1
  113. package/lib/internal/_notationSnake.js +25 -22
  114. package/lib/internal/_notationSnake.js.map +1 -1
  115. package/lib/internal/_notationSnake.mjs +11 -11
  116. package/lib/internal/_notationSnake.mjs.map +1 -1
  117. package/lib/internal/_plainCloneAny.js +174 -38
  118. package/lib/internal/_plainCloneAny.js.map +1 -1
  119. package/lib/internal/_plainCloneAny.mjs +126 -22
  120. package/lib/internal/_plainCloneAny.mjs.map +1 -1
  121. package/lib/internal/_randomArray.d.ts +1 -1
  122. package/lib/internal/_randomArray.js +11 -4
  123. package/lib/internal/_randomArray.js.map +1 -1
  124. package/lib/internal/_randomArray.mjs +9 -3
  125. package/lib/internal/_randomArray.mjs.map +1 -1
  126. package/lib/internal/_randomFormatByte.d.ts +2 -1
  127. package/lib/internal/_randomFormatByte.js +2 -1
  128. package/lib/internal/_randomFormatByte.js.map +1 -1
  129. package/lib/internal/_randomFormatByte.mjs +2 -1
  130. package/lib/internal/_randomFormatByte.mjs.map +1 -1
  131. package/lib/internal/_randomFormatDate.d.ts +2 -0
  132. package/lib/internal/_randomFormatDate.js +3 -2
  133. package/lib/internal/_randomFormatDate.js.map +1 -1
  134. package/lib/internal/_randomFormatDate.mjs +3 -2
  135. package/lib/internal/_randomFormatDate.mjs.map +1 -1
  136. package/lib/internal/_randomFormatDatetime.d.ts +2 -0
  137. package/lib/internal/_randomFormatDatetime.js +3 -2
  138. package/lib/internal/_randomFormatDatetime.js.map +1 -1
  139. package/lib/internal/_randomFormatDatetime.mjs +3 -2
  140. package/lib/internal/_randomFormatDatetime.mjs.map +1 -1
  141. package/lib/internal/_randomFormatDuration.d.ts +2 -1
  142. package/lib/internal/_randomFormatDuration.js +3 -2
  143. package/lib/internal/_randomFormatDuration.js.map +1 -1
  144. package/lib/internal/_randomFormatDuration.mjs +3 -2
  145. package/lib/internal/_randomFormatDuration.mjs.map +1 -1
  146. package/lib/internal/_randomFormatEmail.d.ts +2 -1
  147. package/lib/internal/_randomFormatEmail.js +8 -1
  148. package/lib/internal/_randomFormatEmail.js.map +1 -1
  149. package/lib/internal/_randomFormatEmail.mjs +5 -1
  150. package/lib/internal/_randomFormatEmail.mjs.map +1 -1
  151. package/lib/internal/_randomFormatHostname.d.ts +8 -1
  152. package/lib/internal/_randomFormatHostname.js +45 -2
  153. package/lib/internal/_randomFormatHostname.js.map +1 -1
  154. package/lib/internal/_randomFormatHostname.mjs +38 -2
  155. package/lib/internal/_randomFormatHostname.mjs.map +1 -1
  156. package/lib/internal/_randomFormatIdnEmail.d.ts +2 -1
  157. package/lib/internal/_randomFormatIdnEmail.js +16 -2
  158. package/lib/internal/_randomFormatIdnEmail.js.map +1 -1
  159. package/lib/internal/_randomFormatIdnEmail.mjs +11 -2
  160. package/lib/internal/_randomFormatIdnEmail.mjs.map +1 -1
  161. package/lib/internal/_randomFormatIdnHostname.d.ts +2 -1
  162. package/lib/internal/_randomFormatIdnHostname.js +26 -1
  163. package/lib/internal/_randomFormatIdnHostname.js.map +1 -1
  164. package/lib/internal/_randomFormatIdnHostname.mjs +25 -2
  165. package/lib/internal/_randomFormatIdnHostname.mjs.map +1 -1
  166. package/lib/internal/_randomFormatIpv4.d.ts +2 -1
  167. package/lib/internal/_randomFormatIpv4.js +2 -1
  168. package/lib/internal/_randomFormatIpv4.js.map +1 -1
  169. package/lib/internal/_randomFormatIpv4.mjs +2 -1
  170. package/lib/internal/_randomFormatIpv4.mjs.map +1 -1
  171. package/lib/internal/_randomFormatIpv6.d.ts +2 -1
  172. package/lib/internal/_randomFormatIpv6.js +2 -1
  173. package/lib/internal/_randomFormatIpv6.js.map +1 -1
  174. package/lib/internal/_randomFormatIpv6.mjs +2 -1
  175. package/lib/internal/_randomFormatIpv6.mjs.map +1 -1
  176. package/lib/internal/_randomFormatIri.d.ts +2 -1
  177. package/lib/internal/_randomFormatIri.js +1 -1
  178. package/lib/internal/_randomFormatIri.js.map +1 -1
  179. package/lib/internal/_randomFormatIri.mjs +1 -1
  180. package/lib/internal/_randomFormatIri.mjs.map +1 -1
  181. package/lib/internal/_randomFormatIriReference.d.ts +2 -1
  182. package/lib/internal/_randomFormatIriReference.js +1 -1
  183. package/lib/internal/_randomFormatIriReference.js.map +1 -1
  184. package/lib/internal/_randomFormatIriReference.mjs +1 -1
  185. package/lib/internal/_randomFormatIriReference.mjs.map +1 -1
  186. package/lib/internal/_randomFormatJsonPointer.d.ts +2 -1
  187. package/lib/internal/_randomFormatJsonPointer.js +8 -1
  188. package/lib/internal/_randomFormatJsonPointer.js.map +1 -1
  189. package/lib/internal/_randomFormatJsonPointer.mjs +5 -1
  190. package/lib/internal/_randomFormatJsonPointer.mjs.map +1 -1
  191. package/lib/internal/_randomFormatPassword.d.ts +2 -1
  192. package/lib/internal/_randomFormatPassword.js +7 -5
  193. package/lib/internal/_randomFormatPassword.js.map +1 -1
  194. package/lib/internal/_randomFormatPassword.mjs +5 -1
  195. package/lib/internal/_randomFormatPassword.mjs.map +1 -1
  196. package/lib/internal/_randomFormatRegex.d.ts +2 -1
  197. package/lib/internal/_randomFormatRegex.js +2 -1
  198. package/lib/internal/_randomFormatRegex.js.map +1 -1
  199. package/lib/internal/_randomFormatRegex.mjs +2 -1
  200. package/lib/internal/_randomFormatRegex.mjs.map +1 -1
  201. package/lib/internal/_randomFormatRelativeJsonPointer.d.ts +2 -1
  202. package/lib/internal/_randomFormatRelativeJsonPointer.js +3 -2
  203. package/lib/internal/_randomFormatRelativeJsonPointer.js.map +1 -1
  204. package/lib/internal/_randomFormatRelativeJsonPointer.mjs +3 -2
  205. package/lib/internal/_randomFormatRelativeJsonPointer.mjs.map +1 -1
  206. package/lib/internal/_randomFormatTime.d.ts +2 -1
  207. package/lib/internal/_randomFormatTime.js +3 -2
  208. package/lib/internal/_randomFormatTime.js.map +1 -1
  209. package/lib/internal/_randomFormatTime.mjs +3 -2
  210. package/lib/internal/_randomFormatTime.mjs.map +1 -1
  211. package/lib/internal/_randomFormatUri.d.ts +2 -1
  212. package/lib/internal/_randomFormatUri.js +1 -1
  213. package/lib/internal/_randomFormatUri.js.map +1 -1
  214. package/lib/internal/_randomFormatUri.mjs +1 -1
  215. package/lib/internal/_randomFormatUri.mjs.map +1 -1
  216. package/lib/internal/_randomFormatUriReference.d.ts +2 -1
  217. package/lib/internal/_randomFormatUriReference.js +1 -1
  218. package/lib/internal/_randomFormatUriReference.js.map +1 -1
  219. package/lib/internal/_randomFormatUriReference.mjs +1 -1
  220. package/lib/internal/_randomFormatUriReference.mjs.map +1 -1
  221. package/lib/internal/_randomFormatUriTemplate.d.ts +2 -1
  222. package/lib/internal/_randomFormatUriTemplate.js +1 -1
  223. package/lib/internal/_randomFormatUriTemplate.js.map +1 -1
  224. package/lib/internal/_randomFormatUriTemplate.mjs +1 -1
  225. package/lib/internal/_randomFormatUriTemplate.mjs.map +1 -1
  226. package/lib/internal/_randomFormatUrl.d.ts +2 -1
  227. package/lib/internal/_randomFormatUrl.js +21 -1
  228. package/lib/internal/_randomFormatUrl.js.map +1 -1
  229. package/lib/internal/_randomFormatUrl.mjs +18 -1
  230. package/lib/internal/_randomFormatUrl.mjs.map +1 -1
  231. package/lib/internal/_randomFormatUuid.d.ts +2 -1
  232. package/lib/internal/_randomFormatUuid.js +3 -2
  233. package/lib/internal/_randomFormatUuid.js.map +1 -1
  234. package/lib/internal/_randomFormatUuid.mjs +3 -2
  235. package/lib/internal/_randomFormatUuid.mjs.map +1 -1
  236. package/lib/internal/_randomInteger.js +59 -28
  237. package/lib/internal/_randomInteger.js.map +1 -1
  238. package/lib/internal/_randomInteger.mjs +56 -16
  239. package/lib/internal/_randomInteger.mjs.map +1 -1
  240. package/lib/internal/_randomMultiple.d.ts +8 -0
  241. package/lib/internal/_randomMultiple.js +168 -0
  242. package/lib/internal/_randomMultiple.js.map +1 -0
  243. package/lib/internal/_randomMultiple.mjs +158 -0
  244. package/lib/internal/_randomMultiple.mjs.map +1 -0
  245. package/lib/internal/_randomNumber.js +42 -42
  246. package/lib/internal/_randomNumber.js.map +1 -1
  247. package/lib/internal/_randomNumber.mjs +41 -27
  248. package/lib/internal/_randomNumber.mjs.map +1 -1
  249. package/lib/internal/_randomPattern.d.ts +2 -1
  250. package/lib/internal/_randomPattern.js +19 -4
  251. package/lib/internal/_randomPattern.js.map +1 -1
  252. package/lib/internal/_randomPattern.mjs +10 -4
  253. package/lib/internal/_randomPattern.mjs.map +1 -1
  254. package/lib/internal/_randomStringLength.d.ts +33 -0
  255. package/lib/internal/_randomStringLength.js +48 -0
  256. package/lib/internal/_randomStringLength.js.map +1 -0
  257. package/lib/internal/_randomStringLength.mjs +44 -0
  258. package/lib/internal/_randomStringLength.mjs.map +1 -0
  259. package/lib/internal/_stringLength.d.ts +1 -0
  260. package/lib/internal/_stringLength.js +11 -0
  261. package/lib/internal/_stringLength.js.map +1 -0
  262. package/lib/internal/_stringLength.mjs +10 -0
  263. package/lib/internal/_stringLength.mjs.map +1 -0
  264. package/lib/internal/_validateReport.js +4 -1
  265. package/lib/internal/_validateReport.js.map +1 -1
  266. package/lib/internal/_validateReport.mjs +2 -1
  267. package/lib/internal/_validateReport.mjs.map +1 -1
  268. package/lib/internal/private/__notationRename.d.ts +14 -0
  269. package/lib/internal/private/__notationRename.js +25 -0
  270. package/lib/internal/private/__notationRename.js.map +1 -0
  271. package/lib/internal/private/__notationRename.mjs +24 -0
  272. package/lib/internal/private/__notationRename.mjs.map +1 -0
  273. package/lib/json.d.ts +2 -2
  274. package/lib/json.mjs.map +1 -1
  275. package/lib/module.d.ts +2 -2
  276. package/lib/module.js.map +1 -1
  277. package/lib/module.mjs.map +1 -1
  278. package/lib/notations.d.ts +20 -4
  279. package/lib/notations.js.map +1 -1
  280. package/lib/notations.mjs.map +1 -1
  281. package/native/adapter/plugin_options.go +117 -0
  282. package/native/adapter/plugin_options_payload_matrix_test.go +181 -0
  283. package/native/cmd/ttsc-typia/any_array_type_tags_transform_test.go +63 -9
  284. package/native/cmd/ttsc-typia/assert_guard_factory_contract_test.go +152 -0
  285. package/native/cmd/ttsc-typia/build.go +81 -64
  286. package/native/cmd/ttsc-typia/build_no_emit_preserves_analysis_options_test.go +67 -0
  287. package/native/cmd/ttsc-typia/build_no_emit_transform_diagnostics_test.go +138 -0
  288. package/native/cmd/ttsc-typia/build_plugin_options_come_from_payload_test.go +48 -0
  289. package/native/cmd/ttsc-typia/build_transactional_emit_success_test.go +81 -0
  290. package/native/cmd/ttsc-typia/build_transform_failure_atomicity_test.go +138 -0
  291. package/native/cmd/ttsc-typia/command_routes_and_diagnostics_coverage_test.go +3 -1
  292. package/native/cmd/ttsc-typia/compare_less_nan_transform_test.go +98 -0
  293. package/native/cmd/ttsc-typia/compare_native_object_overmatch_transform_test.go +161 -0
  294. package/native/cmd/ttsc-typia/compare_nondiscriminable_union_transform_test.go +343 -0
  295. package/native/cmd/ttsc-typia/compare_union_discrimination_transform_test.go +289 -0
  296. package/native/cmd/ttsc-typia/escaped_property_key_path_transform_test.go +193 -0
  297. package/native/cmd/ttsc-typia/finite_option_number_leaf_transform_test.go +240 -0
  298. package/native/cmd/ttsc-typia/functional_promised_type_transform_test.go +220 -0
  299. package/native/cmd/ttsc-typia/functional_receiver_transform_test.go +232 -0
  300. package/native/cmd/ttsc-typia/is_object_function_member_transform_test.go +205 -0
  301. package/native/cmd/ttsc-typia/json_application_alias_function_validation_transform_test.go +151 -0
  302. package/native/cmd/ttsc-typia/json_is_stringify_finite_number_transform_test.go +198 -0
  303. package/native/cmd/ttsc-typia/json_stringify_special_key_transform_test.go +238 -0
  304. package/native/cmd/ttsc-typia/main_wasm.go +21 -2
  305. package/native/cmd/ttsc-typia/native_collection_identity_is_transform_test.go +234 -0
  306. package/native/cmd/ttsc-typia/native_generic_name_guard_is_transform_test.go +194 -0
  307. package/native/cmd/ttsc-typia/native_name_collision_is_transform_test.go +204 -0
  308. package/native/cmd/ttsc-typia/non_trailing_rest_tuple_transform_test.go +23 -11
  309. package/native/cmd/ttsc-typia/notation_dynamic_keys_transform_test.go +286 -0
  310. package/native/cmd/ttsc-typia/notation_kebab_case_transform_test.go +1 -1
  311. package/native/cmd/ttsc-typia/notation_literal_collision_transform_test.go +164 -0
  312. package/native/cmd/ttsc-typia/notation_pascal_case_transform_test.go +230 -0
  313. package/native/cmd/ttsc-typia/notation_unicode_key_transform_test.go +309 -0
  314. package/native/cmd/ttsc-typia/pattern_line_terminator_escape_transform_test.go +224 -0
  315. package/native/cmd/ttsc-typia/plain_prune_union_object_overmatch_transform_test.go +219 -0
  316. package/native/cmd/ttsc-typia/plugin_options_payload_helpers_test.go +181 -0
  317. package/native/cmd/ttsc-typia/private_field_filter_is_transform_test.go +278 -0
  318. package/native/cmd/ttsc-typia/project_catalog_transform_coverage_test.go +73 -27
  319. package/native/cmd/ttsc-typia/project_dependencies_barrel_reexport_transform_test.go +120 -0
  320. package/native/cmd/ttsc-typia/project_dependencies_collapsed_alias_transform_test.go +134 -0
  321. package/native/cmd/ttsc-typia/project_dependencies_custom_lib_name_transform_test.go +135 -0
  322. package/native/cmd/ttsc-typia/project_dependencies_default_barrel_transform_test.go +114 -0
  323. package/native/cmd/ttsc-typia/project_dependencies_empty_heritage_transform_test.go +100 -0
  324. package/native/cmd/ttsc-typia/project_dependencies_envelope_transform_test.go +148 -0
  325. package/native/cmd/ttsc-typia/project_dependencies_index_signature_alias_transform_test.go +139 -0
  326. package/native/cmd/ttsc-typia/project_dependencies_local_reexport_transform_test.go +122 -0
  327. package/native/cmd/ttsc-typia/project_dependencies_signature_alias_transform_test.go +125 -0
  328. package/native/cmd/ttsc-typia/project_dependencies_star_barrel_transform_test.go +112 -0
  329. package/native/cmd/ttsc-typia/project_reference_graph_envelope_transform_test.go +190 -0
  330. package/native/cmd/ttsc-typia/protobuf_is_encode_finite_number_transform_test.go +98 -0
  331. package/native/cmd/ttsc-typia/protobuf_sequence_field_numbers_transform_test.go +52 -22
  332. package/native/cmd/ttsc-typia/symbol_key_member_filter_transform_test.go +279 -0
  333. package/native/cmd/ttsc-typia/template_interpolation_type_tags_transform_test.go +86 -23
  334. package/native/cmd/ttsc-typia/template_literal_type_tags_transform_test.go +3 -1
  335. package/native/cmd/ttsc-typia/transform.go +228 -39
  336. package/native/cmd/ttsc-typia/{transform_declaration_source_produces_no_js_test.go → transform_declaration_source_produces_no_javascript_test.go} +10 -2
  337. package/native/cmd/ttsc-typia/transform_fixtures_emit_coverage_test.go +21 -4
  338. package/native/cmd/ttsc-typia/transform_helpers_test.go +159 -1
  339. package/native/cmd/ttsc-typia/transform_plugin_options_come_from_payload_test.go +43 -0
  340. package/native/cmd/ttsc-typia/transform_single_file_failure_atomicity_test.go +114 -0
  341. package/native/cmd/ttsc-typia/transform_single_file_failure_writes_no_stdout_test.go +43 -0
  342. package/native/cmd/ttsc-typia/transform_single_file_js_distinguishes_same_basename_sources_test.go +81 -0
  343. package/native/cmd/ttsc-typia/transform_single_file_js_empty_emit_reports_no_output_test.go +100 -0
  344. package/native/cmd/ttsc-typia/transform_single_file_js_locates_output_across_layouts_test.go +160 -0
  345. package/native/cmd/ttsc-typia/transform_single_file_success_publishes_artifact_test.go +54 -0
  346. package/native/cmd/ttsc-typia/transform_wasm_host_argv_reports_diagnostics_test.go +39 -0
  347. package/native/cmd/ttsc-typia/tuple_optional_compare_clone_transform_test.go +227 -0
  348. package/native/core/factories/FormatCheatSheet.go +40 -7
  349. package/native/core/factories/IdentifierFactory.go +131 -4
  350. package/native/core/factories/MetadataCommentTagFactory.go +83 -40
  351. package/native/core/factories/MetadataTypeTagFactory.go +13 -1
  352. package/native/core/factories/NumericRangeFactory.go +60 -17
  353. package/native/core/factories/ProtobufFactory.go +7 -4
  354. package/native/core/factories/factory_utility_coverage_test.go +8 -2
  355. package/native/core/factories/format_alias_resolves_to_cheat_sheet_test.go +57 -0
  356. package/native/core/factories/format_alias_table_targets_the_cheat_sheet_test.go +44 -0
  357. package/native/core/factories/identifier_factory_postfix_escapes_every_key_test.go +147 -0
  358. package/native/core/factories/identifier_factory_postfix_survives_every_code_point_test.go +86 -0
  359. package/native/core/factories/internal/metadata/MetadataHelper.go +134 -7
  360. package/native/core/factories/internal/metadata/emplace_metadata_object.go +116 -8
  361. package/native/core/factories/internal/metadata/iterate_metadata.go +6 -0
  362. package/native/core/factories/internal/metadata/iterate_metadata_function.go +4 -11
  363. package/native/core/factories/internal/metadata/iterate_metadata_intersection.go +8 -6
  364. package/native/core/factories/internal/metadata/iterate_metadata_map.go +9 -0
  365. package/native/core/factories/internal/metadata/iterate_metadata_native.go +27 -2
  366. package/native/core/factories/internal/metadata/iterate_metadata_set.go +9 -0
  367. package/native/core/factories/internal/metadata/js_doc_link_text_test.go +69 -0
  368. package/native/core/factories/internal/metadata/type_arguments_precondition_test.go +70 -0
  369. package/native/core/factories/metadata_comment_tag_factory_coverage_test.go +39 -0
  370. package/native/core/factories/metadata_comment_tag_factory_exclusivity_matches_interface_test.go +84 -0
  371. package/native/core/factories/metadata_type_tag_factory_accepts_legal_tag_combinations_test.go +60 -0
  372. package/native/core/factories/metadata_type_tag_factory_declarations_test.go +86 -0
  373. package/native/core/factories/metadata_type_tag_factory_keeps_bool_form_exclusivity_test.go +38 -0
  374. package/native/core/factories/metadata_type_tag_factory_rejects_cross_kind_exclusive_tags_test.go +65 -0
  375. package/native/core/factories/metadata_type_tag_factory_rejects_duplicated_array_form_tags_test.go +41 -0
  376. package/native/core/factories/numeric_range_factory_enforces_64bit_bounds_test.go +69 -0
  377. package/native/core/factories/protobuf_recovery_ownership_test.go +64 -0
  378. package/native/core/programmers/IsProgrammer.go +15 -1
  379. package/native/core/programmers/RandomProgrammer.go +51 -14
  380. package/native/core/programmers/compare/CompareEqualProgrammer.go +393 -5
  381. package/native/core/programmers/compare/CompareLessProgrammer.go +4 -2
  382. package/native/core/programmers/functional/FunctionalAssertFunctionProgrammer.go +4 -6
  383. package/native/core/programmers/functional/FunctionalAssertParametersProgrammer.go +5 -13
  384. package/native/core/programmers/functional/FunctionalAssertReturnProgrammer.go +6 -14
  385. package/native/core/programmers/functional/FunctionalIsFunctionProgrammer.go +4 -6
  386. package/native/core/programmers/functional/FunctionalIsParametersProgrammer.go +49 -14
  387. package/native/core/programmers/functional/FunctionalIsReturnProgrammer.go +5 -13
  388. package/native/core/programmers/functional/FunctionalValidateFunctionProgrammer.go +4 -6
  389. package/native/core/programmers/functional/FunctionalValidateParametersProgrammer.go +5 -13
  390. package/native/core/programmers/functional/FunctionalValidateReturnProgrammer.go +5 -13
  391. package/native/core/programmers/functional/internal/FunctionalGeneralProgrammer.go +4 -17
  392. package/native/core/programmers/helpers/CloneJoiner.go +32 -0
  393. package/native/core/programmers/helpers/NotationJoiner.go +86 -28
  394. package/native/core/programmers/helpers/StringifyJoinder.go +32 -1
  395. package/native/core/programmers/helpers/UnionExplorer.go +203 -61
  396. package/native/core/programmers/helpers/joiner_branch_coverage_test.go +5 -3
  397. package/native/core/programmers/helpers/union_explorer_coverage_test.go +1 -1
  398. package/native/core/programmers/internal/CheckerProgrammer.go +100 -48
  399. package/native/core/programmers/iterate/check_template.go +344 -32
  400. package/native/core/programmers/iterate/json_schema_discriminator.go +36 -10
  401. package/native/core/programmers/iterate/json_schema_discriminator_declaration_syntax_test.go +205 -0
  402. package/native/core/programmers/iterate/openapi_v3_downgrader.go +641 -0
  403. package/native/core/programmers/iterate/openapi_v3_downgrader_boolean_default_test.go +95 -0
  404. package/native/core/programmers/iterate/openapi_v3_downgrader_test.go +123 -0
  405. package/native/core/programmers/iterate/template_interpolation_tags_test.go +40 -8
  406. package/native/core/programmers/iterate/template_runtime_pattern.go +52 -7
  407. package/native/core/programmers/json/JsonApplicationProgrammer.go +45 -11
  408. package/native/core/programmers/json/JsonSchemasProgrammer.go +12 -2
  409. package/native/core/programmers/llm/LlmApplicationProgrammer.go +12 -10
  410. package/native/core/programmers/llm/LlmSchemaProgrammer.go +23 -6
  411. package/native/core/programmers/llm/llm_reference_codec_test.go +24 -0
  412. package/native/core/programmers/notations/NotationGeneralProgrammer.go +183 -67
  413. package/native/core/programmers/notations/notation_general_helpers_test.go +1 -3
  414. package/native/core/programmers/notations/notation_general_programmer_pascal_multiword_test.go +72 -0
  415. package/native/core/programmers/notations/notation_general_programmer_underscore_boundary_test.go +68 -0
  416. package/native/core/programmers/plain/PlainClassifyProgrammer.go +23 -15
  417. package/native/core/programmers/plain/PlainCloneProgrammer.go +20 -7
  418. package/native/core/programmers/plain/PlainPruneProgrammer.go +19 -5
  419. package/native/core/programmers/plain/plain_tuple_seed_recovery_ownership_test.go +25 -0
  420. package/native/core/programmers/protobuf/ProtobufDecodeProgrammer.go +37 -28
  421. package/native/core/programmers/protobuf/ProtobufMessageProgrammer.go +40 -21
  422. package/native/core/programmers/protobuf/protobuf_programmer_helper_coverage_test.go +26 -0
  423. package/native/core/programmers/random_programmer_length_argument_test.go +53 -0
  424. package/native/core/schemas/metadata/MetadataCollection.go +270 -20
  425. package/native/core/schemas/metadata/MetadataDependency.go +388 -0
  426. package/native/core/schemas/metadata/MetadataObjectType.go +17 -4
  427. package/native/core/schemas/metadata/metadata_collection_generic_argument_dot_test.go +122 -0
  428. package/native/core/schemas/metadata/metadata_collection_name_allocation_test.go +147 -0
  429. package/native/core/schemas/metadata/metadata_collection_openapi_name_cascade_test.go +55 -0
  430. package/native/core/schemas/metadata/metadata_collection_openapi_name_test.go +68 -0
  431. package/native/core/utils/PatternUtil.go +13 -0
  432. package/native/core/utils/PromiseTypeFactory.go +59 -0
  433. package/native/core/utils/ProtobufNameEncoder.go +8 -0
  434. package/native/core/utils/promise_type_factory_semantics_test.go +118 -0
  435. package/native/go.mod +9 -1
  436. package/native/transform/CallExpressionTransformer.go +12 -0
  437. package/native/transform/features/json/JsonApplicationTransformer.go +1 -1
  438. package/native/transform/features/json/JsonSchemaTransformer.go +1 -1
  439. package/native/transform/features/json/JsonSchemasTransformer.go +5 -4
  440. package/package.json +16 -4
  441. package/src/executable/FileSystemIdentity.ts +189 -0
  442. package/src/executable/TypiaGenerateWizard.ts +377 -110
  443. package/src/functional.ts +30 -60
  444. package/src/internal/_ProtobufReader.ts +129 -43
  445. package/src/internal/_createStandardSchema.ts +15 -1
  446. package/src/internal/_decimal.ts +69 -0
  447. package/src/internal/_httpQueryParseURLSearchParams.ts +24 -2
  448. package/src/internal/_isFormatByte.ts +2 -5
  449. package/src/internal/_isFormatDate.ts +15 -2
  450. package/src/internal/_isFormatDateTime.ts +28 -2
  451. package/src/internal/_isFormatIri.ts +5 -2
  452. package/src/internal/_isFormatIriReference.ts +11 -3
  453. package/src/internal/_isFormatUriReference.ts +1 -1
  454. package/src/internal/_isMultipleOf.ts +8 -0
  455. package/src/internal/_isTypeFloat.ts +1 -1
  456. package/src/internal/_isTypeInt64.ts +1 -0
  457. package/src/internal/_isTypeInt64Bigint.ts +12 -0
  458. package/src/internal/_isTypeUint64.ts +1 -0
  459. package/src/internal/_isTypeUint64Bigint.ts +7 -0
  460. package/src/internal/_isUniqueItems.ts +134 -132
  461. package/src/internal/_notationAny.ts +9 -4
  462. package/src/internal/_notationAssign.ts +20 -0
  463. package/src/internal/_notationCamel.ts +31 -10
  464. package/src/internal/_notationKebab.ts +11 -0
  465. package/src/internal/_notationKeyCollision.ts +9 -0
  466. package/src/internal/_notationPascal.ts +19 -6
  467. package/src/internal/_notationSnake.ts +24 -21
  468. package/src/internal/_plainCloneAny.ts +208 -33
  469. package/src/internal/_randomArray.ts +13 -4
  470. package/src/internal/_randomFormatByte.ts +4 -1
  471. package/src/internal/_randomFormatDate.ts +17 -12
  472. package/src/internal/_randomFormatDatetime.ts +15 -10
  473. package/src/internal/_randomFormatDuration.ts +16 -14
  474. package/src/internal/_randomFormatEmail.ts +8 -2
  475. package/src/internal/_randomFormatHostname.ts +48 -1
  476. package/src/internal/_randomFormatIdnEmail.ts +18 -2
  477. package/src/internal/_randomFormatIdnHostname.ts +34 -2
  478. package/src/internal/_randomFormatIpv4.ts +3 -2
  479. package/src/internal/_randomFormatIpv6.ts +3 -2
  480. package/src/internal/_randomFormatIri.ts +3 -1
  481. package/src/internal/_randomFormatIriReference.ts +3 -1
  482. package/src/internal/_randomFormatJsonPointer.ts +8 -2
  483. package/src/internal/_randomFormatPassword.ts +11 -6
  484. package/src/internal/_randomFormatRegex.ts +4 -1
  485. package/src/internal/_randomFormatRelativeJsonPointer.ts +13 -6
  486. package/src/internal/_randomFormatTime.ts +13 -10
  487. package/src/internal/_randomFormatUri.ts +3 -1
  488. package/src/internal/_randomFormatUriReference.ts +3 -1
  489. package/src/internal/_randomFormatUriTemplate.ts +3 -1
  490. package/src/internal/_randomFormatUrl.ts +25 -2
  491. package/src/internal/_randomFormatUuid.ts +10 -6
  492. package/src/internal/_randomInteger.ts +87 -40
  493. package/src/internal/_randomMultiple.ts +245 -0
  494. package/src/internal/_randomNumber.ts +72 -55
  495. package/src/internal/_randomPattern.ts +26 -4
  496. package/src/internal/_randomStringLength.ts +72 -0
  497. package/src/internal/_stringLength.ts +5 -0
  498. package/src/internal/_validateReport.ts +5 -1
  499. package/src/internal/private/__notationRename.ts +24 -0
  500. package/src/json.ts +2 -2
  501. package/src/module.ts +4 -6
  502. package/src/notations.ts +20 -4
  503. package/lib/internal/private/__notationCapitalize.d.ts +0 -1
  504. package/lib/internal/private/__notationCapitalize.js +0 -6
  505. package/lib/internal/private/__notationCapitalize.js.map +0 -1
  506. package/lib/internal/private/__notationCapitalize.mjs +0 -6
  507. package/lib/internal/private/__notationCapitalize.mjs.map +0 -1
  508. package/lib/internal/private/__notationUnsnake.d.ts +0 -4
  509. package/lib/internal/private/__notationUnsnake.js +0 -26
  510. package/lib/internal/private/__notationUnsnake.js.map +0 -1
  511. package/lib/internal/private/__notationUnsnake.mjs +0 -15
  512. package/lib/internal/private/__notationUnsnake.mjs.map +0 -1
  513. package/native/cmd/ttsc-typia/plugin_options_missing_config_test.go +0 -26
  514. package/native/cmd/ttsc-typia/plugin_options_undefined_false_test.go +0 -36
  515. package/src/internal/private/__notationCapitalize.ts +0 -2
  516. package/src/internal/private/__notationUnsnake.ts +0 -24
@@ -17,8 +17,10 @@ const commander_1 = require("commander");
17
17
  const fs_1 = __importDefault(require("fs"));
18
18
  const inquirer_1 = __importDefault(require("inquirer"));
19
19
  const module_1 = require("module");
20
+ const os_1 = __importDefault(require("os"));
20
21
  const path_1 = __importDefault(require("path"));
21
22
  const tinyglobby_1 = require("tinyglobby");
23
+ const FileSystemIdentity_1 = require("./FileSystemIdentity");
22
24
  var TypiaGenerateWizard;
23
25
  (function (TypiaGenerateWizard) {
24
26
  function generate() {
@@ -94,21 +96,50 @@ var TypiaGenerateWizard;
94
96
  return __awaiter(this, void 0, void 0, function* () {
95
97
  location.output = path_1.default.resolve(location.output);
96
98
  location.project = resolveProjectConfigFile(location.project);
99
+ const policy = new FileSystemIdentity_1.FileSystemIdentity.Policy();
100
+ const outputProbe = yield nearestExistingAncestor(location.output);
101
+ yield ensureExistingDirectoryPath({
102
+ label: "output parent path",
103
+ directory: outputProbe,
104
+ });
105
+ policy.observe(yield FileSystemIdentity_1.FileSystemIdentity.probeDirectory(outputProbe), outputProbe);
106
+ policy.observe(yield FileSystemIdentity_1.FileSystemIdentity.inspectDirectory(path_1.default.dirname(location.project)), path_1.default.dirname(location.project));
97
107
  const entries = location.files.length === 0
98
- ? yield prepareDirectoryInput(location)
99
- : yield prepareFileInputs(location);
108
+ ? yield prepareDirectoryInput(location, policy)
109
+ : yield prepareFileInputs(location, policy);
110
+ const identity = policy.get();
111
+ yield inspectTargetDirectories({
112
+ identity,
113
+ output: location.output,
114
+ targets: entries.map((entry) => entry.target),
115
+ });
100
116
  const binary = resolveTsgoBinary();
101
117
  const cwd = path_1.default.dirname(location.project);
102
- const transformed = transformProject({
103
- binary,
104
- cwd,
105
- tsconfig: location.project,
118
+ const temporaryProject = yield createTemporaryProject({
119
+ entries,
120
+ project: location.project,
106
121
  });
107
- const outputByKey = indexTransformedOutputs(transformed);
122
+ let transformed;
123
+ try {
124
+ transformed = transformProject({
125
+ binary,
126
+ cwd,
127
+ projectRoot: cwd,
128
+ tsconfig: temporaryProject.config,
129
+ });
130
+ }
131
+ finally {
132
+ yield fs_1.default.promises.rm(temporaryProject.directory, {
133
+ force: true,
134
+ recursive: true,
135
+ });
136
+ }
137
+ const outputByKey = indexTransformedOutputs(transformed, identity);
108
138
  const outputs = entries.map((entry) => {
109
139
  const output = getTransformedOutput({
110
140
  cwd,
111
141
  entry,
142
+ identity,
112
143
  outputByKey,
113
144
  });
114
145
  if (output === undefined) {
@@ -118,19 +149,40 @@ var TypiaGenerateWizard;
118
149
  });
119
150
  yield ensureOutputDirectory(location.output);
120
151
  yield ensureTargetDirectories({
152
+ identity,
121
153
  output: location.output,
122
154
  targets: outputs.map(({ entry }) => entry.target),
123
155
  });
124
156
  yield ensurePhysicalTargets({
157
+ identity,
125
158
  output: location.output,
126
159
  entries: outputs.map(({ entry }) => entry),
127
160
  });
128
- yield ensureTargetFiles(outputs.map(({ entry }) => entry));
161
+ yield ensureTargetFiles(outputs.map(({ entry }) => entry), identity);
129
162
  for (const { entry, output } of outputs) {
130
163
  yield fs_1.default.promises.writeFile(entry.target, formatOutput(output), "utf8");
131
164
  }
132
165
  });
133
166
  }
167
+ function createTemporaryProject(props) {
168
+ return __awaiter(this, void 0, void 0, function* () {
169
+ const directory = yield fs_1.default.promises.mkdtemp(path_1.default.join(os_1.default.tmpdir(), "typia-generate-project-"));
170
+ const config = path_1.default.join(directory, "tsconfig.json");
171
+ try {
172
+ yield fs_1.default.promises.writeFile(config, JSON.stringify({
173
+ extends: props.project,
174
+ exclude: [],
175
+ files: props.entries.map((entry) => compilerInputPath(entry.file)),
176
+ include: [],
177
+ }), "utf8");
178
+ return { config, directory };
179
+ }
180
+ catch (error) {
181
+ yield fs_1.default.promises.rm(directory, { force: true, recursive: true });
182
+ throw new URIError(`Error on TypiaGenerateWizard.generate(): unable to prepare the bounded input project: ${formatUnknownError(error)}`);
183
+ }
184
+ });
185
+ }
134
186
  function ensureOutputDirectory(output) {
135
187
  return __awaiter(this, void 0, void 0, function* () {
136
188
  if (fs_1.default.existsSync(output) === false) {
@@ -147,13 +199,28 @@ var TypiaGenerateWizard;
147
199
  }
148
200
  function ensureTargetDirectories(props) {
149
201
  return __awaiter(this, void 0, void 0, function* () {
150
- const directories = new Map();
151
- for (const target of props.targets) {
152
- const directory = path_1.default.dirname(target);
153
- directories.set(filesystemKey(directory), directory);
202
+ yield inspectTargetDirectories(props);
203
+ const directories = targetDirectories(props);
204
+ for (const directory of directories.values()) {
205
+ try {
206
+ yield fs_1.default.promises.mkdir(directory, { recursive: true });
207
+ }
208
+ catch (exp) {
209
+ throw new URIError(`Error on TypiaGenerateWizard.generate(): unable to create output parent directory ${directory}: ${formatUnknownError(exp)}`);
210
+ }
211
+ yield ensureExistingDirectory({
212
+ label: "output parent path",
213
+ directory,
214
+ });
154
215
  }
216
+ });
217
+ }
218
+ function inspectTargetDirectories(props) {
219
+ return __awaiter(this, void 0, void 0, function* () {
220
+ const directories = targetDirectories(props);
155
221
  for (const directory of directories.values()) {
156
222
  yield ensureOutputAncestorDirectories({
223
+ identity: props.identity,
157
224
  output: props.output,
158
225
  directory,
159
226
  });
@@ -164,20 +231,16 @@ var TypiaGenerateWizard;
164
231
  });
165
232
  }
166
233
  }
167
- for (const directory of directories.values()) {
168
- try {
169
- yield fs_1.default.promises.mkdir(directory, { recursive: true });
170
- }
171
- catch (exp) {
172
- throw new URIError(`Error on TypiaGenerateWizard.generate(): unable to create output parent directory ${directory}: ${formatUnknownError(exp)}`);
173
- }
174
- yield ensureExistingDirectory({
175
- label: "output parent path",
176
- directory,
177
- });
178
- }
179
234
  });
180
235
  }
236
+ function targetDirectories(props) {
237
+ const directories = new Map();
238
+ for (const target of props.targets) {
239
+ const directory = path_1.default.dirname(target);
240
+ directories.set(props.identity.filesystemKey(directory), directory);
241
+ }
242
+ return directories;
243
+ }
181
244
  function ensureCreatableDirectory(directory) {
182
245
  return __awaiter(this, void 0, void 0, function* () {
183
246
  const parent = yield nearestExistingAncestor(directory);
@@ -204,7 +267,7 @@ var TypiaGenerateWizard;
204
267
  return __awaiter(this, void 0, void 0, function* () {
205
268
  const output = path_1.default.resolve(props.output);
206
269
  const directory = path_1.default.resolve(props.directory);
207
- if (isSameOrChildPath(directory, output) === false) {
270
+ if (props.identity.contains(directory, output) === false) {
208
271
  throw new URIError(`Error on TypiaGenerateWizard.generate(): output parent path escapes output directory: ${props.directory}`);
209
272
  }
210
273
  const relative = path_1.default.relative(output, directory);
@@ -247,7 +310,7 @@ var TypiaGenerateWizard;
247
310
  for (const segment of relative === "" ? [] : relative.split(path_1.default.sep)) {
248
311
  current = path_1.default.join(current, segment);
249
312
  yield ensureExistingDirectorySegment({
250
- label: filesystemKey(current) === filesystemKey(directory)
313
+ label: path_1.default.normalize(current) === path_1.default.normalize(directory)
251
314
  ? props.label
252
315
  : `${props.label} ancestor`,
253
316
  directory: current,
@@ -271,28 +334,28 @@ var TypiaGenerateWizard;
271
334
  const output = yield fs_1.default.promises.realpath(props.output);
272
335
  const inputs = new Set();
273
336
  for (const entry of props.entries) {
274
- inputs.add(filesystemKey(yield fs_1.default.promises.realpath(entry.file)));
337
+ inputs.add(props.identity.filesystemKey(yield fs_1.default.promises.realpath(entry.file)));
275
338
  }
276
339
  for (const entry of props.entries) {
277
340
  const parent = path_1.default.dirname(entry.target);
278
341
  const directory = yield fs_1.default.promises.realpath(parent);
279
- if (isSameOrChildPath(directory, output) === false) {
342
+ if (props.identity.contains(directory, output) === false) {
280
343
  throw new URIError(`Error on TypiaGenerateWizard.generate(): output parent path escapes output directory through a symbolic link: ${parent}`);
281
344
  }
282
345
  const target = path_1.default.join(directory, path_1.default.basename(entry.target));
283
- if (inputs.has(filesystemKey(target))) {
346
+ if (inputs.has(props.identity.filesystemKey(target))) {
284
347
  throw new URIError(`Error on TypiaGenerateWizard.generate(): output file would overwrite input file through a symbolic link: ${entry.target}`);
285
348
  }
286
349
  }
287
350
  });
288
351
  }
289
- function ensureTargetFiles(entries) {
352
+ function ensureTargetFiles(entries, identity) {
290
353
  return __awaiter(this, void 0, void 0, function* () {
291
354
  const inputs = new Set();
292
355
  const files = new Map();
293
356
  for (const entry of entries) {
294
- inputs.add(fileIdentityKey(yield fs_1.default.promises.stat(entry.file)));
295
- files.set(filesystemKey(entry.target), entry);
357
+ inputs.add(fileIdentityKey(yield fs_1.default.promises.stat(entry.file), yield fs_1.default.promises.realpath(entry.file)));
358
+ files.set(identity.filesystemKey(entry.target), entry);
296
359
  }
297
360
  for (const entry of files.values()) {
298
361
  let stat;
@@ -308,7 +371,7 @@ var TypiaGenerateWizard;
308
371
  if (stat.isFile() === false) {
309
372
  throw new URIError(`Error on TypiaGenerateWizard.generate(): output file path is not a regular file: ${entry.target}`);
310
373
  }
311
- if (inputs.has(fileIdentityKey(stat))) {
374
+ if (inputs.has(fileIdentityKey(stat, yield fs_1.default.promises.realpath(entry.target)))) {
312
375
  throw new URIError(`Error on TypiaGenerateWizard.generate(): output file would overwrite input file through a physical file alias: ${entry.target}`);
313
376
  }
314
377
  if (stat.nlink > 1) {
@@ -317,7 +380,7 @@ var TypiaGenerateWizard;
317
380
  }
318
381
  });
319
382
  }
320
- function prepareDirectoryInput(location) {
383
+ function prepareDirectoryInput(location, policy) {
321
384
  return __awaiter(this, void 0, void 0, function* () {
322
385
  if (location.input === undefined) {
323
386
  throw new URIError("Error on TypiaGenerateWizard.generate(): input path is required.");
@@ -329,15 +392,17 @@ var TypiaGenerateWizard;
329
392
  if ((yield isDirectory(input)) === false) {
330
393
  throw new URIError("Error on TypiaGenerateWizard.generate(): input path is not a directory.");
331
394
  }
395
+ const inputReal = yield fs_1.default.promises.realpath(input);
396
+ const outputReal = yield optionalRealPath(location.output);
332
397
  const files = [];
333
398
  yield gather({
334
- location: {
335
- input,
336
- output: location.output,
337
- },
338
399
  container: files,
339
400
  from: input,
340
- to: location.output,
401
+ inputReal,
402
+ outputReal,
403
+ policy,
404
+ visitedDirectories: new Set(),
405
+ visitedFiles: new Set(),
341
406
  });
342
407
  return files.map((file) => ({
343
408
  file,
@@ -345,29 +410,31 @@ var TypiaGenerateWizard;
345
410
  }));
346
411
  });
347
412
  }
348
- function prepareFileInputs(location) {
413
+ function prepareFileInputs(location, policy) {
349
414
  return __awaiter(this, void 0, void 0, function* () {
350
415
  const targets = new Set();
351
416
  const output = [];
352
- for (const input of yield expandFileInputs(location.files, location.output)) {
417
+ for (const input of yield expandFileInputs(location.files, location.output, policy)) {
353
418
  const file = path_1.default.resolve(input);
419
+ policy.observe(yield FileSystemIdentity_1.FileSystemIdentity.inspectDirectory(path_1.default.dirname(file)), path_1.default.dirname(file));
420
+ const identity = policy.get();
354
421
  if (fs_1.default.existsSync(file) === false) {
355
422
  throw new URIError(`Error on TypiaGenerateWizard.generate(): input file does not exist: ${input}`);
356
423
  }
357
424
  else if ((yield isFile(file)) === false) {
358
425
  throw new URIError(`Error on TypiaGenerateWizard.generate(): input path is not a file: ${input}`);
359
426
  }
360
- else if (isDeclarationFile(file)) {
427
+ else if (identity.isDeclarationFile(file)) {
361
428
  continue;
362
429
  }
363
- else if (isSupportedExtension(file) === false) {
430
+ else if (identity.isSupportedExtension(file) === false) {
364
431
  throw new URIError(`Error on TypiaGenerateWizard.generate(): input file is not a supported TypeScript source: ${input}`);
365
432
  }
366
433
  const target = path_1.default.join(location.output, path_1.default.basename(file));
367
- if (isSamePath(file, target)) {
434
+ if (identity.isSamePath(file, target)) {
368
435
  throw new URIError(`Error on TypiaGenerateWizard.generate(): output file would overwrite input file: ${input}`);
369
436
  }
370
- const key = filesystemKey(target);
437
+ const key = identity.filesystemKey(target);
371
438
  if (targets.has(key)) {
372
439
  throw new URIError(`Error on TypiaGenerateWizard.generate(): duplicate output filename for ${target}`);
373
440
  }
@@ -380,26 +447,34 @@ var TypiaGenerateWizard;
380
447
  return output;
381
448
  });
382
449
  }
383
- function expandFileInputs(inputs, directory) {
450
+ function expandFileInputs(inputs, directory, policy) {
384
451
  return __awaiter(this, void 0, void 0, function* () {
385
452
  const output = [];
386
453
  for (const input of inputs) {
387
454
  const pattern = toGlobPattern(input);
388
455
  if ((0, tinyglobby_1.isDynamicPattern)(pattern, { caseSensitiveMatch: true })) {
456
+ const searchDirectory = yield globSearchDirectory(input);
457
+ const caseSensitive = yield FileSystemIdentity_1.FileSystemIdentity.inspectDirectory(searchDirectory);
458
+ if (caseSensitive === undefined) {
459
+ throw new URIError(`Error on TypiaGenerateWizard.generate(): unable to determine filesystem case behavior for input pattern base ${searchDirectory}.`);
460
+ }
461
+ policy.observe(caseSensitive, searchDirectory);
462
+ const identity = policy.get();
389
463
  const matches = yield (0, tinyglobby_1.glob)(pattern, {
390
464
  absolute: true,
391
- caseSensitiveMatch: isCaseSensitive(),
465
+ caseSensitiveMatch: identity.caseSensitive,
392
466
  cwd: process.cwd(),
393
467
  onlyFiles: true,
394
468
  });
395
469
  if (matches.length === 0) {
396
470
  throw new URIError(`Error on TypiaGenerateWizard.generate(): input pattern does not match any files: ${input}`);
397
471
  }
398
- output.push(...excludeOutputFiles(matches, directory).filter(isSupportedExtension));
472
+ output.push(...excludeOutputFiles(matches, directory, identity).filter((file) => identity.isSupportedExtension(file)));
399
473
  }
400
474
  else {
401
475
  const file = path_1.default.resolve(input);
402
- if (isSameOrChildPath(file, directory) === false) {
476
+ policy.observe(yield FileSystemIdentity_1.FileSystemIdentity.inspectDirectory(path_1.default.dirname(file)), path_1.default.dirname(file));
477
+ if (policy.get().contains(file, directory) === false) {
403
478
  output.push(file);
404
479
  }
405
480
  }
@@ -407,8 +482,22 @@ var TypiaGenerateWizard;
407
482
  return output;
408
483
  });
409
484
  }
410
- function excludeOutputFiles(files, directory) {
411
- return files.filter((file) => isSameOrChildPath(file, directory) === false);
485
+ function excludeOutputFiles(files, directory, identity) {
486
+ return files.filter((file) => identity.contains(file, directory) === false);
487
+ }
488
+ function globSearchDirectory(input) {
489
+ return __awaiter(this, void 0, void 0, function* () {
490
+ let current = path_1.default.resolve(input);
491
+ while ((0, tinyglobby_1.isDynamicPattern)(toGlobPattern(current), { caseSensitiveMatch: true })) {
492
+ const parent = path_1.default.dirname(current);
493
+ if (parent === current)
494
+ break;
495
+ current = parent;
496
+ }
497
+ if (fs_1.default.existsSync(current) && (yield isDirectory(current)))
498
+ return current;
499
+ return nearestExistingAncestor(path_1.default.dirname(current));
500
+ });
412
501
  }
413
502
  function toGlobPattern(input) {
414
503
  return input.replace(/\\/g, "/");
@@ -418,6 +507,7 @@ var TypiaGenerateWizard;
418
507
  const result = new TtscCompiler({
419
508
  binary: props.binary,
420
509
  cwd: props.cwd,
510
+ projectRoot: props.projectRoot,
421
511
  tsconfig: props.tsconfig,
422
512
  }).transform();
423
513
  if (result.type === "success") {
@@ -534,7 +624,7 @@ var TypiaGenerateWizard;
534
624
  function resolveFromRoots(request, roots) {
535
625
  for (const root of roots) {
536
626
  try {
537
- return require.resolve(request, { paths: [root] });
627
+ return (0, module_1.createRequire)(path_1.default.join(root, "package.json")).resolve(request);
538
628
  }
539
629
  catch (_a) {
540
630
  continue;
@@ -556,68 +646,111 @@ var TypiaGenerateWizard;
556
646
  }
557
647
  function gather(props) {
558
648
  return __awaiter(this, void 0, void 0, function* () {
559
- if (isSamePath(props.from, props.location.output))
649
+ const currentReal = yield resolveTraversalPath(props.from);
650
+ if (props.outputReal !== undefined &&
651
+ isPhysicalSameOrChildPath(currentReal, props.outputReal))
652
+ return;
653
+ ensurePhysicalInputContainment({
654
+ file: props.from,
655
+ input: props.inputReal,
656
+ real: currentReal,
657
+ });
658
+ const currentStat = yield fs_1.default.promises.stat(props.from);
659
+ const directoryIdentity = fileIdentityKey(currentStat, currentReal);
660
+ if (props.visitedDirectories.has(directoryIdentity)) {
661
+ const lexicalStat = yield fs_1.default.promises.lstat(props.from);
662
+ if (lexicalStat.isSymbolicLink()) {
663
+ throw new URIError(`Error on TypiaGenerateWizard.generate(): input directory link revisits a physical directory: ${props.from}.`);
664
+ }
560
665
  return;
561
- for (const file of yield fs_1.default.promises.readdir(props.from)) {
562
- const next = path_1.default.join(props.from, file);
563
- const stat = yield fs_1.default.promises.stat(next);
666
+ }
667
+ props.visitedDirectories.add(directoryIdentity);
668
+ props.policy.observe(yield FileSystemIdentity_1.FileSystemIdentity.inspectDirectory(props.from), props.from);
669
+ const identity = props.policy.get();
670
+ const entries = yield Promise.all((yield fs_1.default.promises.readdir(props.from)).map((name) => __awaiter(this, void 0, void 0, function* () {
671
+ const file = path_1.default.join(props.from, name);
672
+ try {
673
+ return { file, name, stat: yield fs_1.default.promises.lstat(file) };
674
+ }
675
+ catch (error) {
676
+ throw new URIError(`Error on TypiaGenerateWizard.generate(): unable to inspect input path ${file}: ${formatUnknownError(error)}`);
677
+ }
678
+ })));
679
+ entries.sort((x, y) => {
680
+ const linkOrder = Number(x.stat.isSymbolicLink()) - Number(y.stat.isSymbolicLink());
681
+ return linkOrder !== 0 ? linkOrder : x.name.localeCompare(y.name);
682
+ });
683
+ for (const entry of entries) {
684
+ let stat;
685
+ let real;
686
+ try {
687
+ stat = yield fs_1.default.promises.stat(entry.file);
688
+ real = yield fs_1.default.promises.realpath(entry.file);
689
+ }
690
+ catch (error) {
691
+ throw new URIError(`Error on TypiaGenerateWizard.generate(): input link target is missing or unreadable: ${entry.file}: ${formatUnknownError(error)}`);
692
+ }
693
+ if (props.outputReal !== undefined &&
694
+ isPhysicalSameOrChildPath(real, props.outputReal))
695
+ continue;
696
+ ensurePhysicalInputContainment({
697
+ file: entry.file,
698
+ input: props.inputReal,
699
+ real,
700
+ });
564
701
  if (stat.isDirectory()) {
565
- yield gather({
566
- location: props.location,
567
- container: props.container,
568
- from: next,
569
- to: path_1.default.join(props.to, file),
570
- });
702
+ yield gather(Object.assign(Object.assign({}, props), { from: entry.file }));
571
703
  continue;
572
704
  }
573
- if (isSupportedExtension(file)) {
574
- props.container.push(next);
575
- }
705
+ if (stat.isFile() === false ||
706
+ identity.isSupportedExtension(entry.name) === false)
707
+ continue;
708
+ const fileIdentity = fileIdentityKey(stat, real);
709
+ if (props.visitedFiles.has(fileIdentity))
710
+ continue;
711
+ props.visitedFiles.add(fileIdentity);
712
+ props.container.push(entry.file);
576
713
  }
577
714
  });
578
715
  }
579
- function isSupportedExtension(filename) {
580
- const normalized = isCaseSensitive()
581
- ? filename
582
- : filename.toLowerCase();
583
- return TS_PATTERN.test(normalized) && !DTS_PATTERN.test(normalized);
584
- }
585
- function isDeclarationFile(filename) {
586
- const normalized = isCaseSensitive()
587
- ? filename
588
- : filename.toLowerCase();
589
- return DTS_PATTERN.test(normalized);
590
- }
591
716
  function formatOutput(output) {
592
717
  return output.startsWith("// @ts-nocheck")
593
718
  ? output
594
719
  : `// @ts-nocheck\n${output}`;
595
720
  }
596
- function indexTransformedOutputs(outputs) {
721
+ function indexTransformedOutputs(outputs, identity) {
597
722
  const map = new Map();
598
723
  for (const [file, output] of Object.entries(outputs)) {
599
- map.set(projectFileKey(file), output);
724
+ const key = identity.projectFileKey(file);
725
+ if (map.has(key)) {
726
+ throw new URIError(`Error on TypiaGenerateWizard.generate(): transformed outputs have ambiguous filesystem identities: ${file}.`);
727
+ }
728
+ map.set(key, output);
600
729
  }
601
730
  return map;
602
731
  }
603
732
  function getTransformedOutput(props) {
604
- const output = props.outputByKey.get(projectFileKey(projectKey(props.cwd, props.entry.file)));
733
+ const output = props.outputByKey.get(props.identity.projectFileKey(projectKey(props.cwd, props.entry.file)));
605
734
  if (output !== undefined) {
606
735
  return output;
607
736
  }
737
+ const compilerFile = compilerInputPath(props.entry.file);
738
+ if (props.identity.isSamePath(compilerFile, props.entry.file) === false &&
739
+ props.identity.contains(compilerFile, props.cwd)) {
740
+ const compiled = props.outputByKey.get(props.identity.projectFileKey(projectKey(props.cwd, compilerFile)));
741
+ if (compiled !== undefined)
742
+ return compiled;
743
+ }
608
744
  const real = resolveRealPath(props.entry.file);
609
- if (isSamePath(real, props.entry.file) ||
610
- isSameOrChildPath(real, props.cwd) === false) {
745
+ if (props.identity.isSamePath(real, props.entry.file) ||
746
+ props.identity.contains(real, props.cwd) === false) {
611
747
  return undefined;
612
748
  }
613
- return props.outputByKey.get(projectFileKey(projectKey(props.cwd, real)));
749
+ return props.outputByKey.get(props.identity.projectFileKey(projectKey(props.cwd, real)));
614
750
  }
615
751
  function projectKey(root, file) {
616
752
  return path_1.default.relative(root, file).replace(/\\/g, "/");
617
753
  }
618
- function projectFileKey(file) {
619
- return isCaseSensitive() ? file : file.toLowerCase();
620
- }
621
754
  function resolveRealPath(file) {
622
755
  try {
623
756
  return fs_1.default.realpathSync(file);
@@ -626,23 +759,50 @@ var TypiaGenerateWizard;
626
759
  return file;
627
760
  }
628
761
  }
629
- function isSamePath(x, y) {
630
- return filesystemKey(x) === filesystemKey(y);
762
+ function compilerInputPath(file) {
763
+ try {
764
+ if (fs_1.default.lstatSync(file).isSymbolicLink()) {
765
+ return path_1.default.join(resolveRealPath(path_1.default.dirname(file)), path_1.default.basename(file));
766
+ }
767
+ }
768
+ catch (_a) {
769
+ return file;
770
+ }
771
+ return resolveRealPath(file);
631
772
  }
632
- function isSameOrChildPath(file, directory) {
633
- const fileKey = filesystemKey(path_1.default.resolve(file));
634
- const directoryKey = filesystemKey(path_1.default.resolve(directory));
635
- const directoryPrefix = directoryKey.endsWith(path_1.default.sep)
636
- ? directoryKey
637
- : `${directoryKey}${path_1.default.sep}`;
638
- return fileKey === directoryKey || fileKey.startsWith(directoryPrefix);
773
+ function optionalRealPath(file) {
774
+ return __awaiter(this, void 0, void 0, function* () {
775
+ try {
776
+ return yield fs_1.default.promises.realpath(file);
777
+ }
778
+ catch (error) {
779
+ if (isMissingFileError(error))
780
+ return undefined;
781
+ throw new URIError(`Error on TypiaGenerateWizard.generate(): unable to resolve path ${file}: ${formatUnknownError(error)}`);
782
+ }
783
+ });
784
+ }
785
+ function resolveTraversalPath(file) {
786
+ return __awaiter(this, void 0, void 0, function* () {
787
+ try {
788
+ return yield fs_1.default.promises.realpath(file);
789
+ }
790
+ catch (error) {
791
+ throw new URIError(`Error on TypiaGenerateWizard.generate(): unable to resolve input path ${file}: ${formatUnknownError(error)}`);
792
+ }
793
+ });
639
794
  }
640
- function filesystemKey(file) {
641
- const normalized = path_1.default.normalize(file);
642
- return isCaseSensitive() ? normalized : normalized.toLowerCase();
795
+ function ensurePhysicalInputContainment(props) {
796
+ if (isPhysicalSameOrChildPath(props.real, props.input))
797
+ return;
798
+ throw new URIError(`Error on TypiaGenerateWizard.generate(): input path resolves outside the input directory: ${props.file}.`);
643
799
  }
644
- function isCaseSensitive() {
645
- return process.platform !== "win32" && process.platform !== "darwin";
800
+ function isPhysicalSameOrChildPath(file, directory) {
801
+ const relative = path_1.default.relative(directory, file);
802
+ return (relative === "" ||
803
+ (relative !== ".." &&
804
+ relative.startsWith(`..${path_1.default.sep}`) === false &&
805
+ path_1.default.isAbsolute(relative) === false));
646
806
  }
647
807
  function isMissingFileError(exp) {
648
808
  return (typeof exp === "object" &&
@@ -650,8 +810,10 @@ var TypiaGenerateWizard;
650
810
  "code" in exp &&
651
811
  exp.code === "ENOENT");
652
812
  }
653
- function fileIdentityKey(stat) {
654
- return `${stat.dev}:${stat.ino}`;
813
+ function fileIdentityKey(stat, realpath) {
814
+ return stat.ino === 0
815
+ ? `path:${path_1.default.normalize(realpath)}`
816
+ : `inode:${stat.dev}:${stat.ino}`;
655
817
  }
656
818
  function formatDiagnostics(diagnostics) {
657
819
  return diagnostics.length === 0
@@ -681,6 +843,4 @@ var TypiaGenerateWizard;
681
843
  return String(error);
682
844
  }
683
845
  })(TypiaGenerateWizard || (exports.TypiaGenerateWizard = TypiaGenerateWizard = {}));
684
- const TS_PATTERN = /\.[cm]?tsx?$/;
685
- const DTS_PATTERN = /\.d\.[cm]?tsx?$/;
686
846
  //# sourceMappingURL=TypiaGenerateWizard.js.map