typia 13.0.0-dev.20260501 → 13.0.0-dev.20260506

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 (371) hide show
  1. package/lib/executable/generate/ttsc.js.map +1 -1
  2. package/lib/executable/setup/PluginConfigurator.js.map +1 -1
  3. package/lib/internal/_randomInteger.js.map +1 -1
  4. package/lib/internal/_validateReport.js.map +1 -1
  5. package/lib/transform.js.map +1 -1
  6. package/native/adapter/adapter.go +128 -128
  7. package/native/adapter/cleanup.go +155 -155
  8. package/native/adapter/imports.go +80 -80
  9. package/native/adapter/visit.go +142 -142
  10. package/native/cmd/ttsc-typia/build.go +223 -223
  11. package/native/cmd/ttsc-typia/main.go +57 -57
  12. package/native/cmd/ttsc-typia/transform.go +393 -385
  13. package/native/cmd/ttsc-typia/transform_test.go +40 -0
  14. package/native/core/context/IProgrammerProps.go +7 -7
  15. package/native/core/context/ITransformOptions.go +5 -5
  16. package/native/core/context/ITypiaContext.go +13 -13
  17. package/native/core/context/TransformerError.go +81 -81
  18. package/native/core/factories/CommentFactory.go +9 -9
  19. package/native/core/factories/ExpressionFactory.go +254 -254
  20. package/native/core/factories/FormatCheatSheet.go +23 -23
  21. package/native/core/factories/IdentifierFactory.go +130 -130
  22. package/native/core/factories/JsonMetadataFactory.go +129 -129
  23. package/native/core/factories/LiteralFactory.go +192 -192
  24. package/native/core/factories/MetadataCommentTagFactory.go +379 -379
  25. package/native/core/factories/MetadataFactory.go +462 -462
  26. package/native/core/factories/MetadataTypeTagFactory.go +498 -498
  27. package/native/core/factories/MetadataTypeTagSchemaFactory.go +102 -102
  28. package/native/core/factories/NumericRangeFactory.go +84 -84
  29. package/native/core/factories/ProtobufFactory.go +933 -933
  30. package/native/core/factories/StatementFactory.go +72 -72
  31. package/native/core/factories/TemplateFactory.go +57 -57
  32. package/native/core/factories/TypeFactory.go +125 -125
  33. package/native/core/factories/ValueFactory.go +12 -12
  34. package/native/core/factories/internal/metadata/IMetadataIteratorProps.go +35 -35
  35. package/native/core/factories/internal/metadata/MetadataHelper.go +176 -176
  36. package/native/core/factories/internal/metadata/emend_metadata_atomics.go +69 -69
  37. package/native/core/factories/internal/metadata/emplace_metadata_alias.go +27 -27
  38. package/native/core/factories/internal/metadata/emplace_metadata_array_type.go +33 -33
  39. package/native/core/factories/internal/metadata/emplace_metadata_object.go +209 -209
  40. package/native/core/factories/internal/metadata/emplace_metadata_tuple.go +50 -50
  41. package/native/core/factories/internal/metadata/explore_metadata.go +29 -29
  42. package/native/core/factories/internal/metadata/iterate_metadata.go +46 -46
  43. package/native/core/factories/internal/metadata/iterate_metadata_alias.go +25 -25
  44. package/native/core/factories/internal/metadata/iterate_metadata_array.go +65 -65
  45. package/native/core/factories/internal/metadata/iterate_metadata_atomic.go +49 -49
  46. package/native/core/factories/internal/metadata/iterate_metadata_coalesce.go +22 -22
  47. package/native/core/factories/internal/metadata/iterate_metadata_collection.go +228 -228
  48. package/native/core/factories/internal/metadata/iterate_metadata_comment_tags.go +12 -12
  49. package/native/core/factories/internal/metadata/iterate_metadata_constant.go +71 -71
  50. package/native/core/factories/internal/metadata/iterate_metadata_escape.go +48 -48
  51. package/native/core/factories/internal/metadata/iterate_metadata_function.go +82 -82
  52. package/native/core/factories/internal/metadata/iterate_metadata_intersection.go +319 -319
  53. package/native/core/factories/internal/metadata/iterate_metadata_map.go +51 -51
  54. package/native/core/factories/internal/metadata/iterate_metadata_native.go +85 -85
  55. package/native/core/factories/internal/metadata/iterate_metadata_object.go +27 -27
  56. package/native/core/factories/internal/metadata/iterate_metadata_set.go +37 -37
  57. package/native/core/factories/internal/metadata/iterate_metadata_sort.go +137 -137
  58. package/native/core/factories/internal/metadata/iterate_metadata_template.go +33 -33
  59. package/native/core/factories/internal/metadata/iterate_metadata_tuple.go +16 -16
  60. package/native/core/factories/internal/metadata/iterate_metadata_union.go +18 -18
  61. package/native/core/programmers/AssertProgrammer.go +389 -389
  62. package/native/core/programmers/ImportProgrammer.go +196 -196
  63. package/native/core/programmers/IsProgrammer.go +293 -293
  64. package/native/core/programmers/RandomProgrammer.go +1094 -1094
  65. package/native/core/programmers/ValidateProgrammer.go +369 -369
  66. package/native/core/programmers/functional/FunctionalAssertFunctionProgrammer.go +133 -133
  67. package/native/core/programmers/functional/FunctionalAssertParametersProgrammer.go +104 -104
  68. package/native/core/programmers/functional/FunctionalAssertReturnProgrammer.go +100 -100
  69. package/native/core/programmers/functional/FunctionalIsFunctionProgrammer.go +79 -79
  70. package/native/core/programmers/functional/FunctionalIsParametersProgrammer.go +159 -159
  71. package/native/core/programmers/functional/FunctionalIsReturnProgrammer.go +99 -99
  72. package/native/core/programmers/functional/FunctionalValidateFunctionProgrammer.go +138 -138
  73. package/native/core/programmers/functional/FunctionalValidateParametersProgrammer.go +222 -222
  74. package/native/core/programmers/functional/FunctionalValidateReturnProgrammer.go +116 -116
  75. package/native/core/programmers/functional/internal/FunctionalGeneralProgrammer.go +36 -36
  76. package/native/core/programmers/helpers/AtomicPredicator.go +35 -35
  77. package/native/core/programmers/helpers/CloneJoiner.go +217 -217
  78. package/native/core/programmers/helpers/FunctionProgrammer.go +79 -79
  79. package/native/core/programmers/helpers/HttpMetadataUtil.go +17 -17
  80. package/native/core/programmers/helpers/ICheckEntry.go +5 -5
  81. package/native/core/programmers/helpers/IExpressionEntry.go +6 -6
  82. package/native/core/programmers/helpers/NotationJoiner.go +159 -159
  83. package/native/core/programmers/helpers/OptionPredicator.go +4 -4
  84. package/native/core/programmers/helpers/ProtobufUtil.go +231 -231
  85. package/native/core/programmers/helpers/ProtobufWire.go +6 -6
  86. package/native/core/programmers/helpers/PruneJoiner.go +227 -227
  87. package/native/core/programmers/helpers/RandomJoiner.go +155 -155
  88. package/native/core/programmers/helpers/StringifyJoinder.go +331 -331
  89. package/native/core/programmers/helpers/StringifyPredicator.go +10 -10
  90. package/native/core/programmers/helpers/UnionExplorer.go +835 -835
  91. package/native/core/programmers/helpers/UnionPredicator.go +78 -78
  92. package/native/core/programmers/helpers/disable_function_programmer_declare.go +6 -6
  93. package/native/core/programmers/http/HttpAssertFormDataProgrammer.go +93 -93
  94. package/native/core/programmers/http/HttpAssertHeadersProgrammer.go +42 -42
  95. package/native/core/programmers/http/HttpAssertQueryProgrammer.go +51 -51
  96. package/native/core/programmers/http/HttpFormDataProgrammer.go +351 -351
  97. package/native/core/programmers/http/HttpHeadersProgrammer.go +370 -370
  98. package/native/core/programmers/http/HttpIsFormDataProgrammer.go +109 -109
  99. package/native/core/programmers/http/HttpIsHeadersProgrammer.go +36 -36
  100. package/native/core/programmers/http/HttpIsQueryProgrammer.go +45 -45
  101. package/native/core/programmers/http/HttpParameterProgrammer.go +158 -158
  102. package/native/core/programmers/http/HttpQueryProgrammer.go +422 -422
  103. package/native/core/programmers/http/HttpValidateFormDataProgrammer.go +87 -87
  104. package/native/core/programmers/http/HttpValidateHeadersProgrammer.go +39 -39
  105. package/native/core/programmers/http/HttpValidateQueryProgrammer.go +48 -48
  106. package/native/core/programmers/internal/CheckerProgrammer.go +1490 -1490
  107. package/native/core/programmers/internal/FeatureProgrammer.go +589 -589
  108. package/native/core/programmers/iterate/check_array_length.go +46 -46
  109. package/native/core/programmers/iterate/check_bigint.go +52 -52
  110. package/native/core/programmers/iterate/check_dynamic_key.go +220 -220
  111. package/native/core/programmers/iterate/check_dynamic_properties.go +245 -245
  112. package/native/core/programmers/iterate/check_everything.go +21 -21
  113. package/native/core/programmers/iterate/check_native.go +25 -25
  114. package/native/core/programmers/iterate/check_number.go +135 -135
  115. package/native/core/programmers/iterate/check_object.go +66 -66
  116. package/native/core/programmers/iterate/check_string.go +52 -52
  117. package/native/core/programmers/iterate/check_template.go +57 -57
  118. package/native/core/programmers/iterate/check_union_array_like.go +372 -372
  119. package/native/core/programmers/iterate/decode_union_object.go +118 -118
  120. package/native/core/programmers/iterate/feature_object_entries.go +134 -134
  121. package/native/core/programmers/iterate/json_schema_alias.go +52 -52
  122. package/native/core/programmers/iterate/json_schema_array.go +52 -52
  123. package/native/core/programmers/iterate/json_schema_bigint.go +8 -8
  124. package/native/core/programmers/iterate/json_schema_boolean.go +8 -8
  125. package/native/core/programmers/iterate/json_schema_constant.go +38 -38
  126. package/native/core/programmers/iterate/json_schema_description.go +12 -12
  127. package/native/core/programmers/iterate/json_schema_discriminator.go +47 -47
  128. package/native/core/programmers/iterate/json_schema_escaped.go +58 -58
  129. package/native/core/programmers/iterate/json_schema_jsDocTags.go +34 -34
  130. package/native/core/programmers/iterate/json_schema_native.go +43 -43
  131. package/native/core/programmers/iterate/json_schema_number.go +8 -8
  132. package/native/core/programmers/iterate/json_schema_object.go +149 -149
  133. package/native/core/programmers/iterate/json_schema_plugin.go +35 -35
  134. package/native/core/programmers/iterate/json_schema_station.go +211 -211
  135. package/native/core/programmers/iterate/json_schema_string.go +8 -8
  136. package/native/core/programmers/iterate/json_schema_template.go +53 -53
  137. package/native/core/programmers/iterate/json_schema_title.go +16 -16
  138. package/native/core/programmers/iterate/json_schema_tuple.go +34 -34
  139. package/native/core/programmers/iterate/metadata_to_pattern.go +53 -53
  140. package/native/core/programmers/iterate/postfix_of_tuple.go +5 -5
  141. package/native/core/programmers/iterate/prune_object_properties.go +85 -85
  142. package/native/core/programmers/iterate/stringify_dynamic_properties.go +193 -193
  143. package/native/core/programmers/iterate/stringify_native.go +1 -1
  144. package/native/core/programmers/iterate/stringify_regular_properties.go +84 -84
  145. package/native/core/programmers/iterate/template_to_pattern.go +20 -20
  146. package/native/core/programmers/iterate/wrap_metadata_rest_tuple.go +13 -13
  147. package/native/core/programmers/json/JsonApplicationProgrammer.go +323 -323
  148. package/native/core/programmers/json/JsonAssertParseProgrammer.go +100 -100
  149. package/native/core/programmers/json/JsonAssertStringifyProgrammer.go +88 -88
  150. package/native/core/programmers/json/JsonIsParseProgrammer.go +130 -130
  151. package/native/core/programmers/json/JsonIsStringifyProgrammer.go +92 -92
  152. package/native/core/programmers/json/JsonSchemaProgrammer.go +65 -65
  153. package/native/core/programmers/json/JsonSchemasProgrammer.go +116 -116
  154. package/native/core/programmers/json/JsonStringifyProgrammer.go +1245 -1245
  155. package/native/core/programmers/json/JsonValidateParseProgrammer.go +89 -89
  156. package/native/core/programmers/json/JsonValidateStringifyProgrammer.go +106 -106
  157. package/native/core/programmers/llm/LlmApplicationProgrammer.go +445 -445
  158. package/native/core/programmers/llm/LlmCoerceProgrammer.go +79 -79
  159. package/native/core/programmers/llm/LlmControllerProgrammer.go +35 -35
  160. package/native/core/programmers/llm/LlmMetadataFactory.go +74 -74
  161. package/native/core/programmers/llm/LlmParametersProgrammer.go +104 -104
  162. package/native/core/programmers/llm/LlmParseProgrammer.go +88 -88
  163. package/native/core/programmers/llm/LlmSchemaProgrammer.go +702 -702
  164. package/native/core/programmers/llm/LlmStructuredOutputProgrammer.go +123 -123
  165. package/native/core/programmers/misc/MiscAssertCloneProgrammer.go +82 -82
  166. package/native/core/programmers/misc/MiscAssertPruneProgrammer.go +97 -97
  167. package/native/core/programmers/misc/MiscCloneProgrammer.go +1056 -1056
  168. package/native/core/programmers/misc/MiscIsCloneProgrammer.go +94 -94
  169. package/native/core/programmers/misc/MiscIsPruneProgrammer.go +86 -86
  170. package/native/core/programmers/misc/MiscLiteralsProgrammer.go +99 -99
  171. package/native/core/programmers/misc/MiscPruneProgrammer.go +700 -700
  172. package/native/core/programmers/misc/MiscValidateCloneProgrammer.go +103 -103
  173. package/native/core/programmers/misc/MiscValidatePruneProgrammer.go +94 -94
  174. package/native/core/programmers/notations/NotationAssertGeneralProgrammer.go +85 -85
  175. package/native/core/programmers/notations/NotationGeneralProgrammer.go +1188 -1188
  176. package/native/core/programmers/notations/NotationIsGeneralProgrammer.go +90 -90
  177. package/native/core/programmers/notations/NotationValidateGeneralProgrammer.go +109 -109
  178. package/native/core/programmers/protobuf/ProtobufAssertDecodeProgrammer.go +99 -99
  179. package/native/core/programmers/protobuf/ProtobufAssertEncodeProgrammer.go +114 -114
  180. package/native/core/programmers/protobuf/ProtobufDecodeProgrammer.go +697 -697
  181. package/native/core/programmers/protobuf/ProtobufEncodeProgrammer.go +1039 -1039
  182. package/native/core/programmers/protobuf/ProtobufIsDecodeProgrammer.go +99 -99
  183. package/native/core/programmers/protobuf/ProtobufIsEncodeProgrammer.go +93 -93
  184. package/native/core/programmers/protobuf/ProtobufMessageProgrammer.go +228 -228
  185. package/native/core/programmers/protobuf/ProtobufValidateDecodeProgrammer.go +88 -88
  186. package/native/core/programmers/protobuf/ProtobufValidateEncodeProgrammer.go +120 -120
  187. package/native/core/schemas/metadata/IMetadataDictionary.go +4 -4
  188. package/native/core/schemas/metadata/MetadataAlias.go +15 -15
  189. package/native/core/schemas/metadata/MetadataAliasType.go +36 -36
  190. package/native/core/schemas/metadata/MetadataApplication.go +25 -25
  191. package/native/core/schemas/metadata/MetadataArray.go +15 -15
  192. package/native/core/schemas/metadata/MetadataArrayType.go +31 -31
  193. package/native/core/schemas/metadata/MetadataAtomic.go +45 -45
  194. package/native/core/schemas/metadata/MetadataCollection.go +380 -380
  195. package/native/core/schemas/metadata/MetadataComponents.go +95 -95
  196. package/native/core/schemas/metadata/MetadataConstant.go +31 -31
  197. package/native/core/schemas/metadata/MetadataConstantValue.go +63 -63
  198. package/native/core/schemas/metadata/MetadataEscaped.go +17 -17
  199. package/native/core/schemas/metadata/MetadataFunction.go +30 -30
  200. package/native/core/schemas/metadata/MetadataMap.go +21 -21
  201. package/native/core/schemas/metadata/MetadataNative.go +48 -48
  202. package/native/core/schemas/metadata/MetadataObject.go +15 -15
  203. package/native/core/schemas/metadata/MetadataObjectType.go +116 -116
  204. package/native/core/schemas/metadata/MetadataParameter.go +28 -28
  205. package/native/core/schemas/metadata/MetadataProperty.go +32 -32
  206. package/native/core/schemas/metadata/MetadataSchema.go +766 -766
  207. package/native/core/schemas/metadata/MetadataSet.go +17 -17
  208. package/native/core/schemas/metadata/MetadataTemplate.go +43 -43
  209. package/native/core/schemas/metadata/MetadataTuple.go +10 -10
  210. package/native/core/schemas/metadata/MetadataTupleType.go +38 -38
  211. package/native/core/schemas/protobuf/IProtobufProperty.go +2 -2
  212. package/native/core/schemas/protobuf/IProtobufPropertyType.go +18 -18
  213. package/native/core/schemas/protobuf/IProtobufSchema.go +17 -17
  214. package/native/core/typings/Writable.go +1 -1
  215. package/native/core/utils/PatternUtil.go +38 -38
  216. package/native/core/utils/ProtobufNameEncoder.go +28 -28
  217. package/native/shim/printer/go.mod +1 -1
  218. package/native/shim/printer/shim.go +213 -213
  219. package/native/third_party/ttsc/driver/host.go +9 -9
  220. package/native/third_party/ttsc/driver/program.go +344 -281
  221. package/native/third_party/ttsc/driver/rewrite.go +247 -221
  222. package/native/third_party/ttsc/go.mod +5 -3
  223. package/native/third_party/ttsc/go.sum +2 -2
  224. package/native/third_party/ttsc/shim/ast/go.mod +1 -1
  225. package/native/third_party/ttsc/shim/ast/lint.go +174 -171
  226. package/native/third_party/ttsc/shim/ast/shim.go +86 -85
  227. package/native/third_party/ttsc/shim/bundled/go.mod +1 -1
  228. package/native/third_party/ttsc/shim/bundled/shim.go +5 -1
  229. package/native/third_party/ttsc/shim/checker/go.mod +1 -1
  230. package/native/third_party/ttsc/shim/checker/shim.go +79 -79
  231. package/native/third_party/ttsc/shim/compiler/go.mod +1 -1
  232. package/native/third_party/ttsc/shim/compiler/shim.go +16 -1
  233. package/native/third_party/ttsc/shim/core/go.mod +1 -1
  234. package/native/third_party/ttsc/shim/core/shim.go +13 -10
  235. package/native/third_party/ttsc/shim/diagnosticwriter/go.mod +1 -1
  236. package/native/third_party/ttsc/shim/diagnosticwriter/lint.go +79 -79
  237. package/native/third_party/ttsc/shim/diagnosticwriter/shim.go +19 -19
  238. package/native/third_party/ttsc/shim/parser/go.mod +1 -1
  239. package/native/third_party/ttsc/shim/parser/shim.go +7 -1
  240. package/native/third_party/ttsc/shim/scanner/go.mod +1 -1
  241. package/native/third_party/ttsc/shim/scanner/shim.go +39 -1
  242. package/native/third_party/ttsc/shim/tsoptions/go.mod +1 -1
  243. package/native/third_party/ttsc/shim/tsoptions/shim.go +51 -1
  244. package/native/third_party/ttsc/shim/tspath/go.mod +1 -1
  245. package/native/third_party/ttsc/shim/tspath/shim.go +72 -1
  246. package/native/third_party/ttsc/shim/vfs/cachedvfs/go.mod +1 -1
  247. package/native/third_party/ttsc/shim/vfs/cachedvfs/shim.go +1 -1
  248. package/native/third_party/ttsc/shim/vfs/go.mod +1 -1
  249. package/native/third_party/ttsc/shim/vfs/osvfs/go.mod +1 -1
  250. package/native/third_party/ttsc/shim/vfs/osvfs/shim.go +1 -1
  251. package/native/third_party/ttsc/shim/vfs/shim.go +4 -1
  252. package/native/transform/CallExpressionTransformer.go +556 -556
  253. package/native/transform/FileTransformer.go +123 -123
  254. package/native/transform/ImportTransformer.go +224 -224
  255. package/native/transform/NodeTransformer.go +11 -11
  256. package/native/transform/TypiaGenerator.go +136 -136
  257. package/native/transform/features/AssertTransformer.go +28 -28
  258. package/native/transform/features/CreateAssertTransformer.go +28 -28
  259. package/native/transform/features/CreateIsTransformer.go +24 -24
  260. package/native/transform/features/CreateRandomTransformer.go +35 -35
  261. package/native/transform/features/CreateValidateTransformer.go +24 -24
  262. package/native/transform/features/IsTransformer.go +24 -24
  263. package/native/transform/features/RandomTransformer.go +37 -37
  264. package/native/transform/features/ValidateTransformer.go +24 -24
  265. package/native/transform/features/functional/FunctionalGenericTransformer.go +48 -48
  266. package/native/transform/features/http/CreateHttpAssertFormDataTransformer.go +11 -11
  267. package/native/transform/features/http/CreateHttpAssertHeadersTransformer.go +11 -11
  268. package/native/transform/features/http/CreateHttpAssertQueryTransformer.go +17 -17
  269. package/native/transform/features/http/CreateHttpFormDataTransformer.go +11 -11
  270. package/native/transform/features/http/CreateHttpHeadersTransformer.go +11 -11
  271. package/native/transform/features/http/CreateHttpIsFormDataTransformer.go +11 -11
  272. package/native/transform/features/http/CreateHttpIsHeadersTransformer.go +11 -11
  273. package/native/transform/features/http/CreateHttpIsQueryTransformer.go +17 -17
  274. package/native/transform/features/http/CreateHttpParameterTransformer.go +11 -11
  275. package/native/transform/features/http/CreateHttpQueryTransformer.go +17 -17
  276. package/native/transform/features/http/CreateHttpValidateFormDataTransformer.go +11 -11
  277. package/native/transform/features/http/CreateHttpValidateHeadersTransformer.go +11 -11
  278. package/native/transform/features/http/CreateHttpValidateQueryTransformer.go +17 -17
  279. package/native/transform/features/http/HttpAssertFormDataTransformer.go +11 -11
  280. package/native/transform/features/http/HttpAssertHeadersTransformer.go +11 -11
  281. package/native/transform/features/http/HttpAssertQueryTransformer.go +17 -17
  282. package/native/transform/features/http/HttpFormDataTransformer.go +11 -11
  283. package/native/transform/features/http/HttpHeadersTransformer.go +11 -11
  284. package/native/transform/features/http/HttpIsFormDataTransformer.go +11 -11
  285. package/native/transform/features/http/HttpIsHeadersTransformer.go +11 -11
  286. package/native/transform/features/http/HttpIsQueryTransformer.go +17 -17
  287. package/native/transform/features/http/HttpParameterTransformer.go +11 -11
  288. package/native/transform/features/http/HttpQueryTransformer.go +17 -17
  289. package/native/transform/features/http/HttpValidateFormDataTransformer.go +11 -11
  290. package/native/transform/features/http/HttpValidateHeadersTransformer.go +11 -11
  291. package/native/transform/features/http/HttpValidateQueryTransformer.go +17 -17
  292. package/native/transform/features/json/JsonApplicationTransformer.go +61 -61
  293. package/native/transform/features/json/JsonAssertParseTransformer.go +11 -11
  294. package/native/transform/features/json/JsonAssertStringifyTransformer.go +11 -11
  295. package/native/transform/features/json/JsonCreateAssertParseTransformer.go +11 -11
  296. package/native/transform/features/json/JsonCreateAssertStringifyTransformer.go +11 -11
  297. package/native/transform/features/json/JsonCreateIsParseTransformer.go +11 -11
  298. package/native/transform/features/json/JsonCreateIsStringifyTransformer.go +11 -11
  299. package/native/transform/features/json/JsonCreateStringifyTransformer.go +11 -11
  300. package/native/transform/features/json/JsonCreateValidateParseTransformer.go +11 -11
  301. package/native/transform/features/json/JsonCreateValidateStringifyProgrammer.go +11 -11
  302. package/native/transform/features/json/JsonIsParseTransformer.go +11 -11
  303. package/native/transform/features/json/JsonIsStringifyTransformer.go +11 -11
  304. package/native/transform/features/json/JsonSchemaTransformer.go +148 -148
  305. package/native/transform/features/json/JsonSchemasTransformer.go +94 -94
  306. package/native/transform/features/json/JsonStringifyTransformer.go +11 -11
  307. package/native/transform/features/json/JsonValidateParseTransformer.go +11 -11
  308. package/native/transform/features/json/JsonValidateStringifyTransformer.go +11 -11
  309. package/native/transform/features/llm/LlmApplicationTransformer.go +43 -43
  310. package/native/transform/features/llm/LlmCoerceTransformer.go +50 -50
  311. package/native/transform/features/llm/LlmControllerTransformer.go +48 -48
  312. package/native/transform/features/llm/LlmCreateCoerceTransformer.go +43 -43
  313. package/native/transform/features/llm/LlmCreateParseTransformer.go +43 -43
  314. package/native/transform/features/llm/LlmParametersTransformer.go +38 -38
  315. package/native/transform/features/llm/LlmParseTransformer.go +50 -50
  316. package/native/transform/features/llm/LlmSchemaTransformer.go +129 -129
  317. package/native/transform/features/llm/LlmStructuredOutputTransformer.go +44 -44
  318. package/native/transform/features/misc/MiscAssertCloneTransformer.go +11 -11
  319. package/native/transform/features/misc/MiscAssertPruneTransformer.go +11 -11
  320. package/native/transform/features/misc/MiscCloneTransformer.go +11 -11
  321. package/native/transform/features/misc/MiscCreateAssertCloneTransformer.go +11 -11
  322. package/native/transform/features/misc/MiscCreateAssertPruneTransformer.go +11 -11
  323. package/native/transform/features/misc/MiscCreateCloneTransformer.go +11 -11
  324. package/native/transform/features/misc/MiscCreateIsCloneTransformer.go +11 -11
  325. package/native/transform/features/misc/MiscCreateIsPruneTransformer.go +11 -11
  326. package/native/transform/features/misc/MiscCreatePruneTransformer.go +11 -11
  327. package/native/transform/features/misc/MiscCreateValidateCloneTransformer.go +11 -11
  328. package/native/transform/features/misc/MiscCreateValidatePruneTransformer.go +11 -11
  329. package/native/transform/features/misc/MiscIsCloneTransformer.go +11 -11
  330. package/native/transform/features/misc/MiscIsPruneTransformer.go +11 -11
  331. package/native/transform/features/misc/MiscLiteralsTransformer.go +21 -21
  332. package/native/transform/features/misc/MiscPruneTransformer.go +11 -11
  333. package/native/transform/features/misc/MiscValidateCloneTransformer.go +11 -11
  334. package/native/transform/features/misc/MiscValidatePruneTransformer.go +11 -11
  335. package/native/transform/features/notations/NotationAssertGeneralTransformer.go +16 -16
  336. package/native/transform/features/notations/NotationCreateAssertGeneralTransformer.go +16 -16
  337. package/native/transform/features/notations/NotationCreateGeneralTransformer.go +16 -16
  338. package/native/transform/features/notations/NotationCreateIsGeneralTransformer.go +16 -16
  339. package/native/transform/features/notations/NotationCreateValidateGeneralTransformer.go +16 -16
  340. package/native/transform/features/notations/NotationGeneralTransformer.go +21 -21
  341. package/native/transform/features/notations/NotationIsGeneralTransformer.go +16 -16
  342. package/native/transform/features/notations/NotationValidateGeneralTransformer.go +16 -16
  343. package/native/transform/features/protobuf/ProtobufAssertDecodeTransformer.go +11 -11
  344. package/native/transform/features/protobuf/ProtobufAssertEncodeTransformer.go +11 -11
  345. package/native/transform/features/protobuf/ProtobufCreateAssertDecodeTransformer.go +11 -11
  346. package/native/transform/features/protobuf/ProtobufCreateAssertEncodeTransformer.go +11 -11
  347. package/native/transform/features/protobuf/ProtobufCreateDecodeTransformer.go +11 -11
  348. package/native/transform/features/protobuf/ProtobufCreateEncodeTransformer.go +11 -11
  349. package/native/transform/features/protobuf/ProtobufCreateIsDecodeTransformer.go +11 -11
  350. package/native/transform/features/protobuf/ProtobufCreateIsEncodeTransformer.go +11 -11
  351. package/native/transform/features/protobuf/ProtobufCreateValidateDecodeTransformer.go +11 -11
  352. package/native/transform/features/protobuf/ProtobufCreateValidateEncodeTransformer.go +11 -11
  353. package/native/transform/features/protobuf/ProtobufDecodeTransformer.go +11 -11
  354. package/native/transform/features/protobuf/ProtobufEncodeTransformer.go +11 -11
  355. package/native/transform/features/protobuf/ProtobufIsDecodeTransformer.go +11 -11
  356. package/native/transform/features/protobuf/ProtobufIsEncodeTransformer.go +11 -11
  357. package/native/transform/features/protobuf/ProtobufMessageTransformer.go +20 -20
  358. package/native/transform/features/protobuf/ProtobufValidateDecodeTransformer.go +11 -11
  359. package/native/transform/features/protobuf/ProtobufValidateEncodeTransformer.go +11 -11
  360. package/native/transform/features/reflect/ReflectMetadataTransformer.go +59 -59
  361. package/native/transform/features/reflect/ReflectNameTransformer.go +78 -78
  362. package/native/transform/features/reflect/ReflectSchemaTransformer.go +121 -121
  363. package/native/transform/features/reflect/ReflectSchemasTransformer.go +55 -55
  364. package/native/transform/internal/GenericTransformer.go +173 -173
  365. package/native/transform/transform.go +32 -32
  366. package/package.json +5 -5
  367. package/src/executable/generate/ttsc.ts +2 -3
  368. package/src/executable/setup/PluginConfigurator.ts +2 -3
  369. package/src/internal/_randomInteger.ts +5 -5
  370. package/src/internal/_validateReport.ts +1 -2
  371. package/src/transform.ts +1 -1
@@ -1,449 +1,457 @@
1
1
  package main
2
2
 
3
3
  import (
4
- "bytes"
5
- "encoding/json"
6
- "flag"
7
- "fmt"
8
- "os"
9
- "path/filepath"
10
- "regexp"
11
- "sort"
12
- "strings"
4
+ "bytes"
5
+ "encoding/json"
6
+ "flag"
7
+ "fmt"
8
+ "os"
9
+ "path/filepath"
10
+ "regexp"
11
+ "sort"
12
+ "strings"
13
13
 
14
- shimcompiler "github.com/microsoft/typescript-go/shim/compiler"
15
- "github.com/samchon/ttsc/packages/ttsc/driver"
16
- typiaadapter "github.com/samchon/typia/packages/typia/native/adapter"
14
+ shimcompiler "github.com/microsoft/typescript-go/shim/compiler"
15
+ "github.com/samchon/ttsc/packages/ttsc/driver"
16
+ typiaadapter "github.com/samchon/typia/packages/typia/native/adapter"
17
17
  )
18
18
 
19
19
  func runTransform(args []string) int {
20
- fs := flag.NewFlagSet("transform", flag.ContinueOnError)
21
- fs.SetOutput(stderr)
22
- file := fs.String("file", "", "absolute or cwd-relative path of the .ts file to transform")
23
- tsconfigPath := fs.String("tsconfig", "tsconfig.json", "tsconfig.json owning --file")
24
- cwdOverride := fs.String("cwd", "", "override the working directory")
25
- out := fs.String("out", "", "write output JS to PATH")
26
- rewriteMode := fs.String("rewrite-mode", "typia", "native rewrite backend id")
27
- output := fs.String("output", defaultTransformOutput(), "transform output kind: js or ts")
28
- _ = fs.String("plugins-json", "", "ordered ttsc plugin payload")
29
- if err := fs.Parse(args); err != nil {
30
- return 2
31
- }
32
- if *rewriteMode != "none" && *rewriteMode != "typia" {
33
- fmt.Fprintf(stderr, "ttsc-typia transform: unknown --rewrite-mode value %q\n", *rewriteMode)
34
- return 2
35
- }
36
- if *output != "js" && *output != "ts" {
37
- fmt.Fprintf(stderr, "ttsc-typia transform: unknown --output value %q\n", *output)
38
- return 2
39
- }
40
- cwd := *cwdOverride
41
- if cwd == "" {
42
- var err error
43
- cwd, err = os.Getwd()
44
- if err != nil {
45
- fmt.Fprintf(stderr, "ttsc-typia transform: cwd: %v\n", err)
46
- return 2
47
- }
48
- }
20
+ fs := flag.NewFlagSet("transform", flag.ContinueOnError)
21
+ fs.SetOutput(stderr)
22
+ file := fs.String("file", "", "absolute or cwd-relative path of the .ts file to transform")
23
+ tsconfigPath := fs.String("tsconfig", "tsconfig.json", "tsconfig.json owning --file")
24
+ cwdOverride := fs.String("cwd", "", "override the working directory")
25
+ out := fs.String("out", "", "write output JS to PATH")
26
+ rewriteMode := fs.String("rewrite-mode", "typia", "native rewrite backend id")
27
+ output := fs.String("output", defaultTransformOutput(), "transform output kind: js or ts")
28
+ _ = fs.String("plugins-json", "", "ordered ttsc plugin payload")
29
+ if err := fs.Parse(args); err != nil {
30
+ return 2
31
+ }
32
+ if *rewriteMode != "none" && *rewriteMode != "typia" {
33
+ fmt.Fprintf(stderr, "ttsc-typia transform: unknown --rewrite-mode value %q\n", *rewriteMode)
34
+ return 2
35
+ }
36
+ if *output != "js" && *output != "ts" {
37
+ fmt.Fprintf(stderr, "ttsc-typia transform: unknown --output value %q\n", *output)
38
+ return 2
39
+ }
40
+ cwd := *cwdOverride
41
+ if cwd == "" {
42
+ var err error
43
+ cwd, err = os.Getwd()
44
+ if err != nil {
45
+ fmt.Fprintf(stderr, "ttsc-typia transform: cwd: %v\n", err)
46
+ return 2
47
+ }
48
+ }
49
49
 
50
- prog, diags, err := driver.LoadProgram(cwd, *tsconfigPath, driver.LoadProgramOptions{
51
- ForceEmit: true,
52
- })
53
- if err != nil {
54
- fmt.Fprintf(stderr, "ttsc-typia transform: %v\n", err)
55
- return 2
56
- }
57
- if len(diags) > 0 {
58
- driver.WritePrettyDiagnostics(stderr, diags, cwd)
59
- return 2
60
- }
61
- defer prog.Close()
50
+ prog, diags, err := driver.LoadProgram(cwd, *tsconfigPath, driver.LoadProgramOptions{
51
+ ForceEmit: true,
52
+ })
53
+ if err != nil {
54
+ fmt.Fprintf(stderr, "ttsc-typia transform: %v\n", err)
55
+ return 2
56
+ }
57
+ if len(diags) > 0 {
58
+ driver.WritePrettyDiagnostics(stderr, diags, cwd)
59
+ return 2
60
+ }
61
+ defer prog.Close()
62
62
 
63
- if *file == "" {
64
- if *out != "" {
65
- fmt.Fprintln(stderr, "ttsc-typia transform: --out requires --file")
66
- return 2
67
- }
68
- return runTransformProject(prog, cwd, *rewriteMode, *tsconfigPath)
69
- }
63
+ if *file == "" {
64
+ if *out != "" {
65
+ fmt.Fprintln(stderr, "ttsc-typia transform: --out requires --file")
66
+ return 2
67
+ }
68
+ return runTransformProject(prog, cwd, *rewriteMode, *tsconfigPath)
69
+ }
70
70
 
71
- absFile := *file
72
- if !filepath.IsAbs(absFile) {
73
- absFile = filepath.Join(cwd, absFile)
74
- }
75
- absFile = filepath.ToSlash(absFile)
71
+ absFile := *file
72
+ if !filepath.IsAbs(absFile) {
73
+ absFile = filepath.Join(cwd, absFile)
74
+ }
75
+ absFile = filepath.ToSlash(absFile)
76
76
 
77
- rewrites := driver.NewRewriteSet()
78
- if *rewriteMode == "typia" {
79
- if _, _, diagnostics := collectTypiaRewrites(prog, cwd, true, true, absFile, rewrites, readTypiaPluginOptions(cwd, *tsconfigPath)); len(diagnostics) > 0 {
80
- writeTypiaTransformDiagnostics(stderr, diagnostics, cwd)
81
- return 3
82
- }
83
- }
77
+ rewrites := driver.NewRewriteSet()
78
+ if *rewriteMode == "typia" {
79
+ if _, _, diagnostics := collectTypiaRewrites(prog, cwd, true, true, absFile, rewrites, readTypiaPluginOptions(cwd, *tsconfigPath)); len(diagnostics) > 0 {
80
+ writeTypiaTransformDiagnostics(stderr, diagnostics, cwd)
81
+ return 3
82
+ }
83
+ }
84
84
 
85
- target := prog.SourceFile(absFile)
86
- if target == nil {
87
- fmt.Fprintf(stderr, "ttsc-typia transform: source file is not in program: %s\n", absFile)
88
- return 2
89
- }
90
- if *output == "ts" {
91
- return runTransformTypeScript(prog, cwd, absFile, target, *rewriteMode, *tsconfigPath, *out)
92
- }
85
+ target := prog.SourceFile(absFile)
86
+ if target == nil {
87
+ fmt.Fprintf(stderr, "ttsc-typia transform: source file is not in program: %s\n", absFile)
88
+ return 2
89
+ }
90
+ if *output == "ts" {
91
+ return runTransformTypeScript(prog, cwd, absFile, target, *rewriteMode, *tsconfigPath, *out)
92
+ }
93
93
 
94
- var captured []byte
95
- capture := func(name, text string, data *shimcompiler.WriteFileData) error {
96
- rel := filepath.ToSlash(name)
97
- if !strings.HasSuffix(rel, ".js") {
98
- return nil
99
- }
100
- captured = []byte(typiaadapter.CleanupTransformedText(text))
101
- return nil
102
- }
103
- _, eDiags, err := prog.EmitFile(rewrites, target, capture)
104
- if err != nil {
105
- fmt.Fprintf(stderr, "ttsc-typia transform: emit: %v\n", err)
106
- return 3
107
- }
108
- for _, d := range eDiags {
109
- fmt.Fprintln(stderr, " -", d.String())
110
- }
111
- if captured == nil {
112
- fmt.Fprintf(stderr, "ttsc-typia transform: no output produced for %s\n", absFile)
113
- return 3
114
- }
115
- if *out == "" {
116
- if _, werr := bytes.NewReader(captured).WriteTo(stdout); werr != nil {
117
- fmt.Fprintf(stderr, "ttsc-typia transform: write stdout: %v\n", werr)
118
- return 3
119
- }
120
- return 0
121
- }
122
- if dir := filepath.Dir(*out); dir != "" {
123
- if err := os.MkdirAll(dir, 0o755); err != nil {
124
- fmt.Fprintf(stderr, "ttsc-typia transform: mkdir: %v\n", err)
125
- return 3
126
- }
127
- }
128
- if err := os.WriteFile(*out, captured, 0o644); err != nil {
129
- fmt.Fprintf(stderr, "ttsc-typia transform: write %s: %v\n", *out, err)
130
- return 3
131
- }
132
- return 0
94
+ var captured []byte
95
+ capture := func(name, text string, data *shimcompiler.WriteFileData) error {
96
+ rel := filepath.ToSlash(name)
97
+ if !strings.HasSuffix(rel, ".js") {
98
+ return nil
99
+ }
100
+ captured = []byte(typiaadapter.CleanupTransformedText(text))
101
+ return nil
102
+ }
103
+ _, eDiags, err := prog.EmitFile(rewrites, target, capture)
104
+ if err != nil {
105
+ fmt.Fprintf(stderr, "ttsc-typia transform: emit: %v\n", err)
106
+ return 3
107
+ }
108
+ for _, d := range eDiags {
109
+ fmt.Fprintln(stderr, " -", d.String())
110
+ }
111
+ if captured == nil {
112
+ fmt.Fprintf(stderr, "ttsc-typia transform: no output produced for %s\n", absFile)
113
+ return 3
114
+ }
115
+ if *out == "" {
116
+ if _, werr := bytes.NewReader(captured).WriteTo(stdout); werr != nil {
117
+ fmt.Fprintf(stderr, "ttsc-typia transform: write stdout: %v\n", werr)
118
+ return 3
119
+ }
120
+ return 0
121
+ }
122
+ if dir := filepath.Dir(*out); dir != "" {
123
+ if err := os.MkdirAll(dir, 0o755); err != nil {
124
+ fmt.Fprintf(stderr, "ttsc-typia transform: mkdir: %v\n", err)
125
+ return 3
126
+ }
127
+ }
128
+ if err := os.WriteFile(*out, captured, 0o644); err != nil {
129
+ fmt.Fprintf(stderr, "ttsc-typia transform: write %s: %v\n", *out, err)
130
+ return 3
131
+ }
132
+ return 0
133
133
  }
134
134
 
135
135
  func defaultTransformOutput() string {
136
- if os.Getenv("TYPIA_TTSC_TRANSFORM_OUTPUT") == "ts" {
137
- return "ts"
138
- }
139
- return "js"
136
+ if os.Getenv("TYPIA_TTSC_TRANSFORM_OUTPUT") == "ts" {
137
+ return "ts"
138
+ }
139
+ return "js"
140
140
  }
141
141
 
142
142
  type transformProjectOutput struct {
143
- Diagnostics []transformCompilerDiagnostic `json:"diagnostics,omitempty"`
144
- TypeScript map[string]string `json:"typescript"`
143
+ Diagnostics []transformCompilerDiagnostic `json:"diagnostics,omitempty"`
144
+ TypeScript map[string]string `json:"typescript"`
145
145
  }
146
146
 
147
147
  type transformCompilerDiagnostic struct {
148
- File *string `json:"file"`
149
- Category string `json:"category"`
150
- Code string `json:"code"`
151
- Line int `json:"line,omitempty"`
152
- Character int `json:"character,omitempty"`
153
- MessageText string `json:"messageText"`
148
+ File *string `json:"file"`
149
+ Category string `json:"category"`
150
+ Code string `json:"code"`
151
+ Line int `json:"line,omitempty"`
152
+ Character int `json:"character,omitempty"`
153
+ MessageText string `json:"messageText"`
154
154
  }
155
155
 
156
156
  type transformSourceRewrite struct {
157
- start int
158
- end int
159
- replacement string
157
+ start int
158
+ end int
159
+ replacement string
160
160
  }
161
161
 
162
162
  func runTransformProject(
163
- prog *driver.Program,
164
- cwd string,
165
- rewriteMode string,
166
- tsconfigPath string,
163
+ prog *driver.Program,
164
+ cwd string,
165
+ rewriteMode string,
166
+ tsconfigPath string,
167
167
  ) int {
168
- rewrites := map[string][]transformSourceRewrite{}
169
- diagnostics := []transformCompilerDiagnostic{}
170
- if rewriteMode == "typia" {
171
- grouped, diags := collectTypiaSourceRewriteMap(
172
- prog,
173
- readTypiaPluginOptions(cwd, tsconfigPath),
174
- )
175
- rewrites = grouped
176
- for _, diag := range diags {
177
- diagnostics = append(diagnostics, transformDiagnosticToCompilerDiagnostic(diag))
178
- }
179
- }
168
+ rewrites := map[string][]transformSourceRewrite{}
169
+ diagnostics := []transformCompilerDiagnostic{}
170
+ if rewriteMode == "typia" {
171
+ grouped, diags := collectTypiaSourceRewriteMap(
172
+ prog,
173
+ readTypiaPluginOptions(cwd, tsconfigPath),
174
+ )
175
+ rewrites = grouped
176
+ for _, diag := range diags {
177
+ diagnostics = append(diagnostics, transformDiagnosticToCompilerDiagnostic(diag))
178
+ }
179
+ }
180
180
 
181
- output := transformProjectOutput{
182
- Diagnostics: diagnostics,
183
- TypeScript: map[string]string{},
184
- }
185
- for _, file := range prog.SourceFiles() {
186
- filename := filepath.ToSlash(file.FileName())
187
- source, ok := sourceFileText(file)
188
- if !ok {
189
- output.Diagnostics = append(
190
- output.Diagnostics,
191
- newTransformCompilerDiagnostic(
192
- filename,
193
- 0,
194
- 0,
195
- "typia.transform",
196
- "source text is unavailable",
197
- ),
198
- )
199
- continue
200
- }
201
- transformed, err := applySourceRewrites(source, rewrites[filename])
202
- if err != nil {
203
- output.Diagnostics = append(
204
- output.Diagnostics,
205
- newTransformCompilerDiagnostic(
206
- filename,
207
- 0,
208
- 0,
209
- "typia.transform",
210
- err.Error(),
211
- ),
212
- )
213
- continue
214
- }
215
- output.TypeScript[sourceFileKey(cwd, filename)] = cleanupTypeScriptTransformText(transformed)
216
- }
181
+ output := transformProjectOutput{
182
+ Diagnostics: diagnostics,
183
+ TypeScript: map[string]string{},
184
+ }
185
+ for _, file := range prog.SourceFiles() {
186
+ filename := filepath.ToSlash(file.FileName())
187
+ source, ok := sourceFileText(file)
188
+ if !ok {
189
+ output.Diagnostics = append(
190
+ output.Diagnostics,
191
+ newTransformCompilerDiagnostic(
192
+ filename,
193
+ 0,
194
+ 0,
195
+ "typia.transform",
196
+ "source text is unavailable",
197
+ ),
198
+ )
199
+ continue
200
+ }
201
+ transformed, err := applySourceRewrites(source, rewrites[filename])
202
+ if err != nil {
203
+ output.Diagnostics = append(
204
+ output.Diagnostics,
205
+ newTransformCompilerDiagnostic(
206
+ filename,
207
+ 0,
208
+ 0,
209
+ "typia.transform",
210
+ err.Error(),
211
+ ),
212
+ )
213
+ continue
214
+ }
215
+ output.TypeScript[sourceFileKey(cwd, filename)] = cleanupTypeScriptTransformText(transformed)
216
+ }
217
217
 
218
- if err := json.NewEncoder(stdout).Encode(output); err != nil {
219
- fmt.Fprintf(stderr, "ttsc-typia transform: encode output: %v\n", err)
220
- return 3
221
- }
222
- if len(output.Diagnostics) > 0 {
223
- return 3
224
- }
225
- return 0
218
+ if err := json.NewEncoder(stdout).Encode(output); err != nil {
219
+ fmt.Fprintf(stderr, "ttsc-typia transform: encode output: %v\n", err)
220
+ return 3
221
+ }
222
+ if len(output.Diagnostics) > 0 {
223
+ return 3
224
+ }
225
+ return 0
226
226
  }
227
227
 
228
228
  func runTransformTypeScript(
229
- prog *driver.Program,
230
- cwd string,
231
- absFile string,
232
- target any,
233
- rewriteMode string,
234
- tsconfigPath string,
235
- out string,
229
+ prog *driver.Program,
230
+ cwd string,
231
+ absFile string,
232
+ target any,
233
+ rewriteMode string,
234
+ tsconfigPath string,
235
+ out string,
236
236
  ) int {
237
- source, ok := sourceFileText(target)
238
- if !ok {
239
- fmt.Fprintf(stderr, "ttsc-typia transform: source text is unavailable for %s\n", absFile)
240
- return 3
241
- }
242
- rewrites := []transformSourceRewrite{}
243
- if rewriteMode == "typia" {
244
- var diagnostics []typiaTransformDiagnostic
245
- rewrites, diagnostics = collectTypiaSourceRewrites(
246
- prog,
247
- cwd,
248
- absFile,
249
- readTypiaPluginOptions(cwd, tsconfigPath),
250
- )
251
- if len(diagnostics) > 0 {
252
- writeTypiaTransformDiagnostics(stderr, diagnostics, cwd)
253
- return 3
254
- }
255
- }
256
- transformed, err := applySourceRewrites(source, rewrites)
257
- if err != nil {
258
- fmt.Fprintf(stderr, "ttsc-typia transform: source rewrite: %v\n", err)
259
- return 3
260
- }
261
- transformed = cleanupTypeScriptTransformText(transformed)
262
- if out == "" {
263
- if _, werr := bytes.NewBufferString(transformed).WriteTo(stdout); werr != nil {
264
- fmt.Fprintf(stderr, "ttsc-typia transform: write stdout: %v\n", werr)
265
- return 3
266
- }
267
- return 0
268
- }
269
- if dir := filepath.Dir(out); dir != "" {
270
- if err := os.MkdirAll(dir, 0o755); err != nil {
271
- fmt.Fprintf(stderr, "ttsc-typia transform: mkdir: %v\n", err)
272
- return 3
273
- }
274
- }
275
- if err := os.WriteFile(out, []byte(transformed), 0o644); err != nil {
276
- fmt.Fprintf(stderr, "ttsc-typia transform: write %s: %v\n", out, err)
277
- return 3
278
- }
279
- return 0
237
+ source, ok := sourceFileText(target)
238
+ if !ok {
239
+ fmt.Fprintf(stderr, "ttsc-typia transform: source text is unavailable for %s\n", absFile)
240
+ return 3
241
+ }
242
+ rewrites := []transformSourceRewrite{}
243
+ if rewriteMode == "typia" {
244
+ var diagnostics []typiaTransformDiagnostic
245
+ rewrites, diagnostics = collectTypiaSourceRewrites(
246
+ prog,
247
+ cwd,
248
+ absFile,
249
+ readTypiaPluginOptions(cwd, tsconfigPath),
250
+ )
251
+ if len(diagnostics) > 0 {
252
+ writeTypiaTransformDiagnostics(stderr, diagnostics, cwd)
253
+ return 3
254
+ }
255
+ }
256
+ transformed, err := applySourceRewrites(source, rewrites)
257
+ if err != nil {
258
+ fmt.Fprintf(stderr, "ttsc-typia transform: source rewrite: %v\n", err)
259
+ return 3
260
+ }
261
+ transformed = cleanupTypeScriptTransformText(transformed)
262
+ if out == "" {
263
+ if _, werr := bytes.NewBufferString(transformed).WriteTo(stdout); werr != nil {
264
+ fmt.Fprintf(stderr, "ttsc-typia transform: write stdout: %v\n", werr)
265
+ return 3
266
+ }
267
+ return 0
268
+ }
269
+ if dir := filepath.Dir(out); dir != "" {
270
+ if err := os.MkdirAll(dir, 0o755); err != nil {
271
+ fmt.Fprintf(stderr, "ttsc-typia transform: mkdir: %v\n", err)
272
+ return 3
273
+ }
274
+ }
275
+ if err := os.WriteFile(out, []byte(transformed), 0o644); err != nil {
276
+ fmt.Fprintf(stderr, "ttsc-typia transform: write %s: %v\n", out, err)
277
+ return 3
278
+ }
279
+ return 0
280
280
  }
281
281
 
282
282
  func sourceFileText(target any) (string, bool) {
283
- type sourceText interface {
284
- Text() string
285
- }
286
- if file, ok := target.(sourceText); ok {
287
- return file.Text(), true
288
- }
289
- return "", false
283
+ type sourceText interface {
284
+ Text() string
285
+ }
286
+ if file, ok := target.(sourceText); ok {
287
+ return file.Text(), true
288
+ }
289
+ return "", false
290
290
  }
291
291
 
292
292
  func collectTypiaSourceRewrites(
293
- prog *driver.Program,
294
- cwd string,
295
- onlyFile string,
296
- pluginOptions typiaadapter.PluginOptions,
293
+ prog *driver.Program,
294
+ cwd string,
295
+ onlyFile string,
296
+ pluginOptions typiaadapter.PluginOptions,
297
297
  ) ([]transformSourceRewrite, []typiaTransformDiagnostic) {
298
- sites := typiaadapter.CollectCallSites(prog.SourceFiles(), prog.Checker)
299
- rewrites := []transformSourceRewrite{}
300
- diagnostics := []typiaTransformDiagnostic{}
301
- for _, site := range sites {
302
- if filepath.ToSlash(site.FilePath) != filepath.ToSlash(onlyFile) {
303
- continue
304
- }
305
- if reason := typiaadapter.UnsupportedReason(site); reason != "" {
306
- diagnostics = append(diagnostics, newTypiaTransformDiagnostic(site, reason))
307
- continue
308
- }
309
- expr, handled, err := typiaadapter.EmitCallWithOptionsPreservingTypes(prog, site, pluginOptions)
310
- if !handled {
311
- diagnostics = append(diagnostics, newTypiaTransformDiagnostic(site, "method not covered"))
312
- continue
313
- }
314
- if err != nil {
315
- diagnostics = append(diagnostics, newTypiaTransformDiagnostic(site, err.Error()))
316
- continue
317
- }
318
- node := site.Call.AsNode()
319
- rewrites = append(rewrites, transformSourceRewrite{
320
- start: node.Pos(),
321
- end: node.End(),
322
- replacement: expr,
323
- })
324
- _ = cwd
325
- }
326
- return rewrites, diagnostics
298
+ sites := typiaadapter.CollectCallSites(prog.SourceFiles(), prog.Checker)
299
+ rewrites := []transformSourceRewrite{}
300
+ diagnostics := []typiaTransformDiagnostic{}
301
+ for _, site := range sites {
302
+ if filepath.ToSlash(site.FilePath) != filepath.ToSlash(onlyFile) {
303
+ continue
304
+ }
305
+ if reason := typiaadapter.UnsupportedReason(site); reason != "" {
306
+ diagnostics = append(diagnostics, newTypiaTransformDiagnostic(site, reason))
307
+ continue
308
+ }
309
+ expr, handled, err := typiaadapter.EmitCallWithOptionsPreservingTypes(prog, site, pluginOptions)
310
+ if !handled {
311
+ diagnostics = append(diagnostics, newTypiaTransformDiagnostic(site, "method not covered"))
312
+ continue
313
+ }
314
+ if err != nil {
315
+ diagnostics = append(diagnostics, newTypiaTransformDiagnostic(site, err.Error()))
316
+ continue
317
+ }
318
+ node := site.Call.AsNode()
319
+ rewrites = append(rewrites, transformSourceRewrite{
320
+ start: node.Pos(),
321
+ end: node.End(),
322
+ replacement: expr,
323
+ })
324
+ _ = cwd
325
+ }
326
+ return rewrites, diagnostics
327
327
  }
328
328
 
329
329
  func collectTypiaSourceRewriteMap(
330
- prog *driver.Program,
331
- pluginOptions typiaadapter.PluginOptions,
330
+ prog *driver.Program,
331
+ pluginOptions typiaadapter.PluginOptions,
332
332
  ) (map[string][]transformSourceRewrite, []typiaTransformDiagnostic) {
333
- sites := typiaadapter.CollectCallSites(prog.SourceFiles(), prog.Checker)
334
- rewrites := map[string][]transformSourceRewrite{}
335
- diagnostics := []typiaTransformDiagnostic{}
336
- for _, site := range sites {
337
- file := filepath.ToSlash(site.FilePath)
338
- if reason := typiaadapter.UnsupportedReason(site); reason != "" {
339
- diagnostics = append(diagnostics, newTypiaTransformDiagnostic(site, reason))
340
- continue
341
- }
342
- expr, handled, err := typiaadapter.EmitCallWithOptionsPreservingTypes(prog, site, pluginOptions)
343
- if !handled {
344
- diagnostics = append(diagnostics, newTypiaTransformDiagnostic(site, "method not covered"))
345
- continue
346
- }
347
- if err != nil {
348
- diagnostics = append(diagnostics, newTypiaTransformDiagnostic(site, err.Error()))
349
- continue
350
- }
351
- node := site.Call.AsNode()
352
- rewrites[file] = append(rewrites[file], transformSourceRewrite{
353
- start: node.Pos(),
354
- end: node.End(),
355
- replacement: expr,
356
- })
357
- }
358
- return rewrites, diagnostics
333
+ sites := typiaadapter.CollectCallSites(prog.SourceFiles(), prog.Checker)
334
+ rewrites := map[string][]transformSourceRewrite{}
335
+ diagnostics := []typiaTransformDiagnostic{}
336
+ for _, site := range sites {
337
+ file := filepath.ToSlash(site.FilePath)
338
+ if reason := typiaadapter.UnsupportedReason(site); reason != "" {
339
+ diagnostics = append(diagnostics, newTypiaTransformDiagnostic(site, reason))
340
+ continue
341
+ }
342
+ expr, handled, err := typiaadapter.EmitCallWithOptionsPreservingTypes(prog, site, pluginOptions)
343
+ if !handled {
344
+ diagnostics = append(diagnostics, newTypiaTransformDiagnostic(site, "method not covered"))
345
+ continue
346
+ }
347
+ if err != nil {
348
+ diagnostics = append(diagnostics, newTypiaTransformDiagnostic(site, err.Error()))
349
+ continue
350
+ }
351
+ node := site.Call.AsNode()
352
+ rewrites[file] = append(rewrites[file], transformSourceRewrite{
353
+ start: node.Pos(),
354
+ end: node.End(),
355
+ replacement: expr,
356
+ })
357
+ }
358
+ return rewrites, diagnostics
359
359
  }
360
360
 
361
361
  func applySourceRewrites(source string, rewrites []transformSourceRewrite) (string, error) {
362
- sort.SliceStable(rewrites, func(i, j int) bool {
363
- return rewrites[i].start > rewrites[j].start
364
- })
365
- output := source
366
- for _, rewrite := range rewrites {
367
- if rewrite.start < 0 || rewrite.end < rewrite.start || rewrite.end > len(output) {
368
- return "", fmt.Errorf("invalid rewrite range [%d,%d)", rewrite.start, rewrite.end)
369
- }
370
- output = output[:rewrite.start] + rewrite.replacement + output[rewrite.end:]
371
- }
372
- return output, nil
362
+ sort.SliceStable(rewrites, func(i, j int) bool {
363
+ return rewrites[i].start > rewrites[j].start
364
+ })
365
+ output := source
366
+ for _, rewrite := range rewrites {
367
+ if rewrite.start < 0 || rewrite.end < rewrite.start || rewrite.end > len(output) {
368
+ return "", fmt.Errorf("invalid rewrite range [%d,%d)", rewrite.start, rewrite.end)
369
+ }
370
+ output = output[:rewrite.start] + rewrite.replacement + output[rewrite.end:]
371
+ }
372
+ return output, nil
373
373
  }
374
374
 
375
375
  func cleanupTypeScriptTransformText(text string) string {
376
- text = typiaadapter.CleanupTransformedText(text)
377
- text = regexp.MustCompile(`(?m)^import type \{([^{}\n]+)\} from`).ReplaceAllStringFunc(text, func(line string) string {
378
- return regexp.MustCompile(`^import type \{\s*([^{}\n]+?)\s*\} from`).ReplaceAllString(line, "import type { $1 } from")
379
- })
380
- text = regexp.MustCompile(`(?m)(^import [^\n]+;\n)\n+(const |let |var |export )`).ReplaceAllString(text, "$1$2")
381
- text = strings.ReplaceAll(text, "=(() =>", "= (() =>")
382
- text = strings.ReplaceAll(text, ": (any) =>", ": any =>")
383
- text = strings.ReplaceAll(text, ": (boolean) =>", ": boolean =>")
384
- text = regexp.MustCompile(`input is \(([A-Za-z_$][A-Za-z0-9_$.]*)\)`).ReplaceAllString(text, "input is $1")
385
- text = strings.ReplaceAll(text, "return (success ? ", "return success ? ")
386
- text = strings.ReplaceAll(text, "}) as any;", "} as any;")
387
- text = strings.ReplaceAll(text, "(() => {\n const ", "(() => { const ")
388
- text = strings.ReplaceAll(text, "(() => {\n let ", "(() => { let ")
389
- text = strings.ReplaceAll(text, "(() => {\n return ", "(() => { return ")
390
- text = strings.ReplaceAll(text, ";\n const ", "; const ")
391
- text = strings.ReplaceAll(text, ";\n let ", "; let ")
392
- text = strings.ReplaceAll(text, ";\n return ", "; return ")
393
- text = strings.ReplaceAll(text, "\n };\n})()", "\n}; })()")
394
- text = strings.ReplaceAll(text, "\n });\n})()", "\n}); })()")
395
- text = strings.ReplaceAll(text, "\n }); let ", "\n}); let ")
396
- text = strings.ReplaceAll(text, ";\n})()", "; })()")
397
- text = strings.ReplaceAll(text, "\n ", "\n ")
398
- text = regexp.MustCompile(`\n\n([A-Za-z_$][A-Za-z0-9_$]*\([^;\n]*\);?)`).ReplaceAllString(text, "\n$1")
399
- trimmed := strings.TrimRight(text, " \t\r\n")
400
- if strings.HasSuffix(trimmed, ")") && !strings.HasSuffix(trimmed, ";") {
401
- return trimmed + ";\n"
402
- }
403
- if text != "" && !strings.HasSuffix(text, "\n") {
404
- return text + "\n"
405
- }
406
- return text
376
+ text = typiaadapter.CleanupTransformedText(text)
377
+ text = normalizeParenthesizedTypeAnnotations(text)
378
+ text = regexp.MustCompile(`(?m)^import type \{([^{}\n]+)\} from`).ReplaceAllStringFunc(text, func(line string) string {
379
+ return regexp.MustCompile(`^import type \{\s*([^{}\n]+?)\s*\} from`).ReplaceAllString(line, "import type { $1 } from")
380
+ })
381
+ text = regexp.MustCompile(`(?m)(^import [^\n]+;\n)\n+(const |let |var |export )`).ReplaceAllString(text, "$1$2")
382
+ text = strings.ReplaceAll(text, "=(() =>", "= (() =>")
383
+ text = strings.ReplaceAll(text, ": (any) =>", ": any =>")
384
+ text = strings.ReplaceAll(text, ": (boolean) =>", ": boolean =>")
385
+ text = regexp.MustCompile(`input is \(([A-Za-z_$][A-Za-z0-9_$.]*)\)`).ReplaceAllString(text, "input is $1")
386
+ text = strings.ReplaceAll(text, "return (success ? ", "return success ? ")
387
+ text = strings.ReplaceAll(text, "}) as any;", "} as any;")
388
+ text = strings.ReplaceAll(text, "(() => {\n const ", "(() => { const ")
389
+ text = strings.ReplaceAll(text, "(() => {\n let ", "(() => { let ")
390
+ text = strings.ReplaceAll(text, "(() => {\n return ", "(() => { return ")
391
+ text = strings.ReplaceAll(text, ";\n const ", "; const ")
392
+ text = strings.ReplaceAll(text, ";\n let ", "; let ")
393
+ text = strings.ReplaceAll(text, ";\n return ", "; return ")
394
+ text = strings.ReplaceAll(text, "\n };\n})()", "\n}; })()")
395
+ text = strings.ReplaceAll(text, "\n });\n})()", "\n}); })()")
396
+ text = strings.ReplaceAll(text, "\n }); let ", "\n}); let ")
397
+ text = strings.ReplaceAll(text, ";\n})()", "; })()")
398
+ text = strings.ReplaceAll(text, "\n ", "\n ")
399
+ text = regexp.MustCompile(`\n\n([A-Za-z_$][A-Za-z0-9_$]*\([^;\n]*\);?)`).ReplaceAllString(text, "\n$1")
400
+ trimmed := strings.TrimRight(text, " \t\r\n")
401
+ if strings.HasSuffix(trimmed, ")") && !strings.HasSuffix(trimmed, ";") {
402
+ return trimmed + ";\n"
403
+ }
404
+ if text != "" && !strings.HasSuffix(text, "\n") {
405
+ return text + "\n"
406
+ }
407
+ return text
408
+ }
409
+
410
+ func normalizeParenthesizedTypeAnnotations(text string) string {
411
+ typeAtom := `([A-Za-z_$][A-Za-z0-9_$.]*(<[^()\n;{}]*>)?)`
412
+ text = regexp.MustCompile(`: \(`+typeAtom+`\)(\s*=>)`).ReplaceAllString(text, ": $1$3")
413
+ text = regexp.MustCompile(`\| \((null|undefined)\)`).ReplaceAllString(text, "| $1")
414
+ return text
407
415
  }
408
416
 
409
417
  func sourceFileKey(cwd string, file string) string {
410
- rel, err := filepath.Rel(cwd, filepath.FromSlash(file))
411
- if err != nil || rel == ".." || strings.HasPrefix(rel, ".."+string(os.PathSeparator)) {
412
- return filepath.ToSlash(file)
413
- }
414
- return filepath.ToSlash(rel)
418
+ rel, err := filepath.Rel(cwd, filepath.FromSlash(file))
419
+ if err != nil || rel == ".." || strings.HasPrefix(rel, ".."+string(os.PathSeparator)) {
420
+ return filepath.ToSlash(file)
421
+ }
422
+ return filepath.ToSlash(rel)
415
423
  }
416
424
 
417
425
  func transformDiagnosticToCompilerDiagnostic(
418
- diag typiaTransformDiagnostic,
426
+ diag typiaTransformDiagnostic,
419
427
  ) transformCompilerDiagnostic {
420
- return newTransformCompilerDiagnostic(
421
- diag.File,
422
- diag.Line,
423
- diag.Column,
424
- diag.Code,
425
- diag.Message,
426
- )
428
+ return newTransformCompilerDiagnostic(
429
+ diag.File,
430
+ diag.Line,
431
+ diag.Column,
432
+ diag.Code,
433
+ diag.Message,
434
+ )
427
435
  }
428
436
 
429
437
  func newTransformCompilerDiagnostic(
430
- file string,
431
- line int,
432
- character int,
433
- code string,
434
- message string,
438
+ file string,
439
+ line int,
440
+ character int,
441
+ code string,
442
+ message string,
435
443
  ) transformCompilerDiagnostic {
436
- var ptr *string
437
- if file != "" {
438
- normalized := filepath.ToSlash(file)
439
- ptr = &normalized
440
- }
441
- return transformCompilerDiagnostic{
442
- File: ptr,
443
- Category: "error",
444
- Code: code,
445
- Line: line,
446
- Character: character,
447
- MessageText: message,
448
- }
444
+ var ptr *string
445
+ if file != "" {
446
+ normalized := filepath.ToSlash(file)
447
+ ptr = &normalized
448
+ }
449
+ return transformCompilerDiagnostic{
450
+ File: ptr,
451
+ Category: "error",
452
+ Code: code,
453
+ Line: line,
454
+ Character: character,
455
+ MessageText: message,
456
+ }
449
457
  }