@nestia/core 11.2.1 → 12.0.0-dev.20260521.1

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 (178) hide show
  1. package/MIGRATION.md +169 -0
  2. package/lib/adaptors/WebSocketAdaptor.js +7 -3
  3. package/lib/adaptors/WebSocketAdaptor.js.map +1 -1
  4. package/lib/decorators/DynamicModule.js.map +1 -1
  5. package/lib/decorators/EncryptedBody.js.map +1 -1
  6. package/lib/decorators/EncryptedController.js.map +1 -1
  7. package/lib/decorators/EncryptedModule.js.map +1 -1
  8. package/lib/decorators/EncryptedRoute.js.map +1 -1
  9. package/lib/decorators/HumanRoute.js.map +1 -1
  10. package/lib/decorators/NoTransformConfigurationError.js +5 -2
  11. package/lib/decorators/NoTransformConfigurationError.js.map +1 -1
  12. package/lib/decorators/PlainBody.js.map +1 -1
  13. package/lib/decorators/SwaggerCustomizer.js.map +1 -1
  14. package/lib/decorators/SwaggerExample.js.map +1 -1
  15. package/lib/decorators/TypedBody.js.map +1 -1
  16. package/lib/decorators/TypedException.js.map +1 -1
  17. package/lib/decorators/TypedFormData.js.map +1 -1
  18. package/lib/decorators/TypedHeaders.js.map +1 -1
  19. package/lib/decorators/TypedParam.js +5 -2
  20. package/lib/decorators/TypedParam.js.map +1 -1
  21. package/lib/decorators/TypedQuery.js.map +1 -1
  22. package/lib/decorators/TypedRoute.js.map +1 -1
  23. package/lib/decorators/WebSocketRoute.js.map +1 -1
  24. package/lib/decorators/doNotThrowTransformError.js.map +1 -1
  25. package/lib/decorators/internal/get_path_and_querify.js +5 -2
  26. package/lib/decorators/internal/get_path_and_querify.js.map +1 -1
  27. package/lib/decorators/internal/get_path_and_stringify.js +5 -2
  28. package/lib/decorators/internal/get_path_and_stringify.js.map +1 -1
  29. package/lib/decorators/internal/get_text_body.js.map +1 -1
  30. package/lib/decorators/internal/headers_to_object.js.map +1 -1
  31. package/lib/decorators/internal/is_request_body_undefined.js.map +1 -1
  32. package/lib/decorators/internal/load_controller.js +48 -16
  33. package/lib/decorators/internal/load_controller.js.map +1 -1
  34. package/lib/decorators/internal/route_error.js +3 -3
  35. package/lib/decorators/internal/route_error.js.map +1 -1
  36. package/lib/decorators/internal/validate_request_body.js +5 -2
  37. package/lib/decorators/internal/validate_request_body.js.map +1 -1
  38. package/lib/decorators/internal/validate_request_form_data.js +5 -2
  39. package/lib/decorators/internal/validate_request_form_data.js.map +1 -1
  40. package/lib/decorators/internal/validate_request_headers.js +5 -2
  41. package/lib/decorators/internal/validate_request_headers.js.map +1 -1
  42. package/lib/decorators/internal/validate_request_query.js +30 -4
  43. package/lib/decorators/internal/validate_request_query.js.map +1 -1
  44. package/lib/index.js.map +1 -1
  45. package/lib/transform.d.ts +10 -5
  46. package/lib/transform.js +64 -28
  47. package/lib/transform.js.map +1 -1
  48. package/lib/utils/ArrayUtil.js.map +1 -1
  49. package/lib/utils/ExceptionManager.js.map +1 -1
  50. package/lib/utils/Singleton.js.map +1 -1
  51. package/lib/utils/SourceFinder.js.map +1 -1
  52. package/lib/utils/VersioningStrategy.js.map +1 -1
  53. package/native/cmd/ttsc-nestia/main.go +11 -0
  54. package/native/go.mod +32 -0
  55. package/native/go.sum +54 -0
  56. package/native/plugin/plan.go +102 -0
  57. package/native/transform/ast.go +32 -0
  58. package/native/transform/build.go +413 -0
  59. package/native/transform/cleanup.go +408 -0
  60. package/native/transform/cleanup_test.go +76 -0
  61. package/native/transform/commonjs_import_alias_test.go +49 -0
  62. package/native/transform/core_dispatch_test.go +127 -0
  63. package/native/transform/core_querify.go +227 -0
  64. package/native/transform/core_transform.go +1713 -0
  65. package/native/transform/core_websocket.go +115 -0
  66. package/native/transform/exports.go +13 -0
  67. package/native/transform/path_rewrite.go +285 -0
  68. package/native/transform/path_rewrite_test.go +243 -0
  69. package/native/transform/printer.go +244 -0
  70. package/native/transform/rewrite.go +662 -0
  71. package/native/transform/rewrite_test.go +118 -0
  72. package/native/transform/rewrite_unique_base_test.go +48 -0
  73. package/native/transform/run.go +72 -0
  74. package/native/transform/transform.go +376 -0
  75. package/native/transform/typia_fast.go +326 -0
  76. package/native/transform/typia_replacement.go +24 -0
  77. package/native/transform.cjs +43 -0
  78. package/package.json +28 -22
  79. package/src/decorators/NoTransformConfigurationError.ts +5 -2
  80. package/src/decorators/internal/load_controller.ts +50 -19
  81. package/src/decorators/internal/validate_request_query.ts +21 -2
  82. package/src/transform.ts +101 -35
  83. package/lib/decorators/internal/NoTransformConfigureError.d.ts +0 -1
  84. package/lib/decorators/internal/NoTransformConfigureError.js +0 -7
  85. package/lib/decorators/internal/NoTransformConfigureError.js.map +0 -1
  86. package/lib/options/INestiaTransformOptions.d.ts +0 -13
  87. package/lib/options/INestiaTransformOptions.js +0 -3
  88. package/lib/options/INestiaTransformOptions.js.map +0 -1
  89. package/lib/options/INestiaTransformProject.d.ts +0 -5
  90. package/lib/options/INestiaTransformProject.js +0 -3
  91. package/lib/options/INestiaTransformProject.js.map +0 -1
  92. package/lib/programmers/PlainBodyProgrammer.d.ts +0 -9
  93. package/lib/programmers/PlainBodyProgrammer.js +0 -58
  94. package/lib/programmers/PlainBodyProgrammer.js.map +0 -1
  95. package/lib/programmers/TypedBodyProgrammer.d.ts +0 -9
  96. package/lib/programmers/TypedBodyProgrammer.js +0 -94
  97. package/lib/programmers/TypedBodyProgrammer.js.map +0 -1
  98. package/lib/programmers/TypedFormDataBodyProgrammer.d.ts +0 -9
  99. package/lib/programmers/TypedFormDataBodyProgrammer.js +0 -65
  100. package/lib/programmers/TypedFormDataBodyProgrammer.js.map +0 -1
  101. package/lib/programmers/TypedHeadersProgrammer.d.ts +0 -9
  102. package/lib/programmers/TypedHeadersProgrammer.js +0 -38
  103. package/lib/programmers/TypedHeadersProgrammer.js.map +0 -1
  104. package/lib/programmers/TypedParamProgrammer.d.ts +0 -10
  105. package/lib/programmers/TypedParamProgrammer.js +0 -32
  106. package/lib/programmers/TypedParamProgrammer.js.map +0 -1
  107. package/lib/programmers/TypedQueryBodyProgrammer.d.ts +0 -9
  108. package/lib/programmers/TypedQueryBodyProgrammer.js +0 -74
  109. package/lib/programmers/TypedQueryBodyProgrammer.js.map +0 -1
  110. package/lib/programmers/TypedQueryProgrammer.d.ts +0 -9
  111. package/lib/programmers/TypedQueryProgrammer.js +0 -75
  112. package/lib/programmers/TypedQueryProgrammer.js.map +0 -1
  113. package/lib/programmers/TypedQueryRouteProgrammer.d.ts +0 -9
  114. package/lib/programmers/TypedQueryRouteProgrammer.js +0 -75
  115. package/lib/programmers/TypedQueryRouteProgrammer.js.map +0 -1
  116. package/lib/programmers/TypedRouteProgrammer.d.ts +0 -9
  117. package/lib/programmers/TypedRouteProgrammer.js +0 -79
  118. package/lib/programmers/TypedRouteProgrammer.js.map +0 -1
  119. package/lib/programmers/http/HttpAssertQuerifyProgrammer.d.ts +0 -9
  120. package/lib/programmers/http/HttpAssertQuerifyProgrammer.js +0 -39
  121. package/lib/programmers/http/HttpAssertQuerifyProgrammer.js.map +0 -1
  122. package/lib/programmers/http/HttpIsQuerifyProgrammer.d.ts +0 -9
  123. package/lib/programmers/http/HttpIsQuerifyProgrammer.js +0 -36
  124. package/lib/programmers/http/HttpIsQuerifyProgrammer.js.map +0 -1
  125. package/lib/programmers/http/HttpQuerifyProgrammer.d.ts +0 -9
  126. package/lib/programmers/http/HttpQuerifyProgrammer.js +0 -50
  127. package/lib/programmers/http/HttpQuerifyProgrammer.js.map +0 -1
  128. package/lib/programmers/http/HttpValidateQuerifyProgrammer.d.ts +0 -9
  129. package/lib/programmers/http/HttpValidateQuerifyProgrammer.js +0 -40
  130. package/lib/programmers/http/HttpValidateQuerifyProgrammer.js.map +0 -1
  131. package/lib/programmers/internal/CoreMetadataUtil.d.ts +0 -5
  132. package/lib/programmers/internal/CoreMetadataUtil.js +0 -19
  133. package/lib/programmers/internal/CoreMetadataUtil.js.map +0 -1
  134. package/lib/transformers/FileTransformer.d.ts +0 -5
  135. package/lib/transformers/FileTransformer.js +0 -80
  136. package/lib/transformers/FileTransformer.js.map +0 -1
  137. package/lib/transformers/MethodTransformer.d.ts +0 -8
  138. package/lib/transformers/MethodTransformer.js +0 -58
  139. package/lib/transformers/MethodTransformer.js.map +0 -1
  140. package/lib/transformers/NodeTransformer.d.ts +0 -8
  141. package/lib/transformers/NodeTransformer.js +0 -24
  142. package/lib/transformers/NodeTransformer.js.map +0 -1
  143. package/lib/transformers/ParameterDecoratorTransformer.d.ts +0 -9
  144. package/lib/transformers/ParameterDecoratorTransformer.js +0 -104
  145. package/lib/transformers/ParameterDecoratorTransformer.js.map +0 -1
  146. package/lib/transformers/ParameterTransformer.d.ts +0 -8
  147. package/lib/transformers/ParameterTransformer.js +0 -37
  148. package/lib/transformers/ParameterTransformer.js.map +0 -1
  149. package/lib/transformers/TypedRouteTransformer.d.ts +0 -9
  150. package/lib/transformers/TypedRouteTransformer.js +0 -68
  151. package/lib/transformers/TypedRouteTransformer.js.map +0 -1
  152. package/lib/transformers/WebSocketRouteTransformer.d.ts +0 -9
  153. package/lib/transformers/WebSocketRouteTransformer.js +0 -72
  154. package/lib/transformers/WebSocketRouteTransformer.js.map +0 -1
  155. package/src/decorators/internal/NoTransformConfigureError.ts +0 -2
  156. package/src/options/INestiaTransformOptions.ts +0 -34
  157. package/src/options/INestiaTransformProject.ts +0 -10
  158. package/src/programmers/PlainBodyProgrammer.ts +0 -72
  159. package/src/programmers/TypedBodyProgrammer.ts +0 -148
  160. package/src/programmers/TypedFormDataBodyProgrammer.ts +0 -118
  161. package/src/programmers/TypedHeadersProgrammer.ts +0 -65
  162. package/src/programmers/TypedParamProgrammer.ts +0 -33
  163. package/src/programmers/TypedQueryBodyProgrammer.ts +0 -113
  164. package/src/programmers/TypedQueryProgrammer.ts +0 -115
  165. package/src/programmers/TypedQueryRouteProgrammer.ts +0 -107
  166. package/src/programmers/TypedRouteProgrammer.ts +0 -103
  167. package/src/programmers/http/HttpAssertQuerifyProgrammer.ts +0 -74
  168. package/src/programmers/http/HttpIsQuerifyProgrammer.ts +0 -77
  169. package/src/programmers/http/HttpQuerifyProgrammer.ts +0 -110
  170. package/src/programmers/http/HttpValidateQuerifyProgrammer.ts +0 -78
  171. package/src/programmers/internal/CoreMetadataUtil.ts +0 -21
  172. package/src/transformers/FileTransformer.ts +0 -109
  173. package/src/transformers/MethodTransformer.ts +0 -103
  174. package/src/transformers/NodeTransformer.ts +0 -23
  175. package/src/transformers/ParameterDecoratorTransformer.ts +0 -143
  176. package/src/transformers/ParameterTransformer.ts +0 -57
  177. package/src/transformers/TypedRouteTransformer.ts +0 -85
  178. package/src/transformers/WebSocketRouteTransformer.ts +0 -120
package/native/go.sum ADDED
@@ -0,0 +1,54 @@
1
+ github.com/go-json-experiment/json v0.0.0-20260214004413-d219187c3433 h1:vymEbVwYFP/L05h5TKQxvkXoKxNvTpjxYKdF1Nlwuao=
2
+ github.com/go-json-experiment/json v0.0.0-20260214004413-d219187c3433/go.mod h1:tphK2c80bpPhMOI4v6bIc2xWywPfbqi1Z06+RcrMkDg=
3
+ github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
4
+ github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
5
+ github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE=
6
+ github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
7
+ github.com/microsoft/typescript-go v0.0.0-20260429010842-56ab4af42157 h1:llOMPhKDiQ+UEJiAaQuuWaJOTg5V7tNNTEf9JPWoYSY=
8
+ github.com/microsoft/typescript-go v0.0.0-20260429010842-56ab4af42157/go.mod h1:m8YA0PMC7ti0GW0RI05D6fEcjQeu98XVS+FWF+VDW2k=
9
+ github.com/peter-evans/patience v0.3.0 h1:rX0JdJeepqdQl1Sk9c9uvorjYYzL2TfgLX1adqYm9cA=
10
+ github.com/peter-evans/patience v0.3.0/go.mod h1:Kmxu5sY1NmBLFSStvXjX1wS9mIv7wMcP/ubucyMOAu0=
11
+ github.com/samchon/ttsc/packages/ttsc v0.0.0-20260515042402-b1ffbb39cb71 h1:DCe46azidMHWqxewawIjF4x6iqmZGNL+J9zh+2HranQ=
12
+ github.com/samchon/ttsc/packages/ttsc v0.0.0-20260515042402-b1ffbb39cb71/go.mod h1:tNypbkbEMafGwwB+jL8faWHvRMIGjPB+GgJAu81fzEw=
13
+ github.com/samchon/ttsc/packages/ttsc/shim/ast v0.0.0-20260515042402-b1ffbb39cb71 h1:CxxjVG7TqXx/5IBb0sVe/fBiBjwSwo1kQc0qIKrQi4w=
14
+ github.com/samchon/ttsc/packages/ttsc/shim/ast v0.0.0-20260515042402-b1ffbb39cb71/go.mod h1:c+iJv7+oQiCPka/RE4sIxftTBRSzZqPXSqh5LTQwvFE=
15
+ github.com/samchon/ttsc/packages/ttsc/shim/bundled v0.0.0-20260515042402-b1ffbb39cb71 h1:s0l6p1iWpaY/NRuWQT++FwHbgjINkevklQY9LO6SmLk=
16
+ github.com/samchon/ttsc/packages/ttsc/shim/bundled v0.0.0-20260515042402-b1ffbb39cb71/go.mod h1:0tz+Y8szXmEpXWHWVrLrv11ga1z6tQJQErkUyIWJ9RQ=
17
+ github.com/samchon/ttsc/packages/ttsc/shim/checker v0.0.0-20260515042402-b1ffbb39cb71 h1:zRnTM8f8WDhZnZnWbhdlDKSLdbwq2bprkEbFq5hyEyo=
18
+ github.com/samchon/ttsc/packages/ttsc/shim/checker v0.0.0-20260515042402-b1ffbb39cb71/go.mod h1:4xfafgG/qosSp8f0tCf83assFoUKRdGHhvPD1EI9LKg=
19
+ github.com/samchon/ttsc/packages/ttsc/shim/compiler v0.0.0-20260515042402-b1ffbb39cb71 h1:ZTix2jm+SuZ0spjH47CYnVbJ0gI3lqOX4lsYXCZHqsI=
20
+ github.com/samchon/ttsc/packages/ttsc/shim/compiler v0.0.0-20260515042402-b1ffbb39cb71/go.mod h1:e9awlg1eXjc1Hzx9waw6UEV/2qYJbgo8zFPwQ0mpzig=
21
+ github.com/samchon/ttsc/packages/ttsc/shim/core v0.0.0-20260515042402-b1ffbb39cb71 h1:M5nY9yY2Bco5HcuHFJnKToKAi+leC6U5YJh+RXwkxes=
22
+ github.com/samchon/ttsc/packages/ttsc/shim/core v0.0.0-20260515042402-b1ffbb39cb71/go.mod h1:DUewcVNEdXyDveQholE4GAsiqqA3C2+SJYqia3nCf00=
23
+ github.com/samchon/ttsc/packages/ttsc/shim/diagnosticwriter v0.0.0-20260515042402-b1ffbb39cb71 h1:ijTjaHh9VMdE0OpDnI4QOxXYdRTwYDagkY8Q5Zu4/jE=
24
+ github.com/samchon/ttsc/packages/ttsc/shim/diagnosticwriter v0.0.0-20260515042402-b1ffbb39cb71/go.mod h1:v86GtrD7qALo6Xkgz1MDomPMSV2D9NdniQWB5t8eY6k=
25
+ github.com/samchon/ttsc/packages/ttsc/shim/parser v0.0.0-20260515042402-b1ffbb39cb71 h1:FAXhgDlxtelKxeVEwqkr3J2SstfsN+6ujyS6pFixS44=
26
+ github.com/samchon/ttsc/packages/ttsc/shim/parser v0.0.0-20260515042402-b1ffbb39cb71/go.mod h1:inUjC/bNlCkO0zIzHZRXlHR/WgLcK0vi2KLc7tpQ1ek=
27
+ github.com/samchon/ttsc/packages/ttsc/shim/printer v0.0.0-20260515042402-b1ffbb39cb71 h1:159trmIJVjMyZYc6iZi4p+l9RXu9pFcpKw4/GdOVr+0=
28
+ github.com/samchon/ttsc/packages/ttsc/shim/printer v0.0.0-20260515042402-b1ffbb39cb71/go.mod h1:ESjhY+UiPRspef4JcXcUPNgt4ySQQrlVIUCLKaKeyEQ=
29
+ github.com/samchon/ttsc/packages/ttsc/shim/scanner v0.0.0-20260515042402-b1ffbb39cb71 h1:gxlbAixdq3rzum3Kwey1lfCvwr817UJhG+YReS3iVpI=
30
+ github.com/samchon/ttsc/packages/ttsc/shim/scanner v0.0.0-20260515042402-b1ffbb39cb71/go.mod h1:abIC7C28cUA5IQKmLJulsl2qOvmimhkMNOfjJhRm5jM=
31
+ github.com/samchon/ttsc/packages/ttsc/shim/tsoptions v0.0.0-20260515042402-b1ffbb39cb71 h1:dLOJHfKx0hjK92ho/oa6q7kq4MDHQNXNMMng5KsPDXw=
32
+ github.com/samchon/ttsc/packages/ttsc/shim/tsoptions v0.0.0-20260515042402-b1ffbb39cb71/go.mod h1:EQwrCr3nY0U1SZBNyp6cQSogAiXsjFxTuT8NlMit1lc=
33
+ github.com/samchon/ttsc/packages/ttsc/shim/tspath v0.0.0-20260515042402-b1ffbb39cb71 h1:t4up6yGaVQM6pe9m2mbs1Koi63wOwAz99uhKeg9zyAs=
34
+ github.com/samchon/ttsc/packages/ttsc/shim/tspath v0.0.0-20260515042402-b1ffbb39cb71/go.mod h1:hsE2c1bZquSNlDLIkT3SfLH3MrDmMk1BLzWI/KomT1A=
35
+ github.com/samchon/ttsc/packages/ttsc/shim/vfs v0.0.0-20260515042402-b1ffbb39cb71 h1:URGZM8mKDMZwoGbIcQxlB9nkQ5MdS/VtMtmxu+arUHc=
36
+ github.com/samchon/ttsc/packages/ttsc/shim/vfs v0.0.0-20260515042402-b1ffbb39cb71/go.mod h1:HoQcoC0FEG3iMI6zvjg8r6j/ves+RVH6SRn48VSi5H0=
37
+ github.com/samchon/ttsc/packages/ttsc/shim/vfs/cachedvfs v0.0.0-20260515042402-b1ffbb39cb71 h1:ySZlL+F/G2kH8zR2qRfxr2Oo2x3VzseStmZi7xveAs8=
38
+ github.com/samchon/ttsc/packages/ttsc/shim/vfs/cachedvfs v0.0.0-20260515042402-b1ffbb39cb71/go.mod h1:XS3LhXkn5xadyRe3tW+9+suW/7gh7dPdL43Q+s/lUDo=
39
+ github.com/samchon/ttsc/packages/ttsc/shim/vfs/osvfs v0.0.0-20260515042402-b1ffbb39cb71 h1:8sQ6KlE7xUSlh8wPsnRdeHEBJop1qVBpdVqWyGWlj0U=
40
+ github.com/samchon/ttsc/packages/ttsc/shim/vfs/osvfs v0.0.0-20260515042402-b1ffbb39cb71/go.mod h1:otX+qw8aZLNCoBmCwMAn53Nw0RQTPzSoId3DxmE67So=
41
+ github.com/samchon/typia/packages/typia/native v0.0.0-20260510181336-5a7ad21c4d6f h1:0y1cQPDK53apdqBmhaoYY1ceQ6JDAgmKwTdb/V9Rf9E=
42
+ github.com/samchon/typia/packages/typia/native v0.0.0-20260510181336-5a7ad21c4d6f/go.mod h1:SJDrfiCEK5dtObhJeAl0iqelqmmFm/JIjfJ6z0kID60=
43
+ github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ=
44
+ github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0=
45
+ github.com/zeebo/xxh3 v1.1.0 h1:s7DLGDK45Dyfg7++yxI0khrfwq9661w9EN78eP/UZVs=
46
+ github.com/zeebo/xxh3 v1.1.0/go.mod h1:IisAie1LELR4xhVinxWS5+zf1lA4p0MW4T+w+W07F5s=
47
+ golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4=
48
+ golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
49
+ golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI=
50
+ golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
51
+ golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg=
52
+ golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164=
53
+ gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q=
54
+ gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA=
@@ -0,0 +1,102 @@
1
+ package plugin
2
+
3
+ import (
4
+ "encoding/json"
5
+ "fmt"
6
+ "strings"
7
+ )
8
+
9
+ const (
10
+ CoreNativeTransform = "@nestia/core/native/transform.cjs"
11
+ CoreTransform = "@nestia/core/lib/transform"
12
+ SDKNativeTransform = "@nestia/sdk/native/transform.cjs"
13
+ SDKTransform = "@nestia/sdk/lib/transform"
14
+ TypiaTransform = "typia/lib/transform"
15
+ )
16
+
17
+ type Entry struct {
18
+ Name string
19
+ Stage string
20
+ Transform string
21
+ Config map[string]any
22
+ }
23
+
24
+ type Plan struct {
25
+ Core bool
26
+ SDK bool
27
+ Typia bool
28
+ Entries []Entry
29
+ }
30
+
31
+ func (p Plan) UsesNestia() bool {
32
+ return p.Core || p.SDK
33
+ }
34
+
35
+ func ParsePlan(payload string) (Plan, error) {
36
+ payload = strings.TrimSpace(payload)
37
+ if payload == "" {
38
+ return Plan{}, nil
39
+ }
40
+
41
+ var raws []struct {
42
+ Name string `json:"name"`
43
+ Stage string `json:"stage"`
44
+ Config map[string]any `json:"config"`
45
+ }
46
+ if err := json.Unmarshal([]byte(payload), &raws); err != nil {
47
+ return Plan{}, fmt.Errorf("parse plugins-json: %w", err)
48
+ }
49
+
50
+ plan := Plan{
51
+ Entries: make([]Entry, 0, len(raws)),
52
+ }
53
+ for _, raw := range raws {
54
+ stage := raw.Stage
55
+ if stage == "" {
56
+ stage = "transform"
57
+ }
58
+ transform := stringConfig(raw.Config, "transform")
59
+ entry := Entry{
60
+ Name: raw.Name,
61
+ Stage: stage,
62
+ Transform: transform,
63
+ Config: raw.Config,
64
+ }
65
+ plan.Entries = append(plan.Entries, entry)
66
+ kind := classify(entry)
67
+ plan.Core = plan.Core || kind == "core"
68
+ plan.SDK = plan.SDK || kind == "sdk"
69
+ plan.Typia = plan.Typia || kind == "typia"
70
+ }
71
+ return plan, nil
72
+ }
73
+
74
+ func classify(entry Entry) string {
75
+ name := strings.TrimSpace(entry.Name)
76
+ transform := strings.TrimSpace(entry.Transform)
77
+ switch {
78
+ case name == "@nestia/core" || transform == CoreTransform || transform == CoreNativeTransform:
79
+ return "core"
80
+ case name == "@nestia/sdk" || transform == SDKTransform || transform == SDKNativeTransform:
81
+ return "sdk"
82
+ case name == "typia" || transform == TypiaTransform:
83
+ return "typia"
84
+ default:
85
+ return ""
86
+ }
87
+ }
88
+
89
+ func stringConfig(config map[string]any, key string) string {
90
+ if config == nil {
91
+ return ""
92
+ }
93
+ value, ok := config[key]
94
+ if !ok {
95
+ return ""
96
+ }
97
+ text, ok := value.(string)
98
+ if !ok {
99
+ return ""
100
+ }
101
+ return text
102
+ }
@@ -0,0 +1,32 @@
1
+ package transform
2
+
3
+ import (
4
+ "strings"
5
+
6
+ shimast "github.com/microsoft/typescript-go/shim/ast"
7
+ )
8
+
9
+ // NodeName returns the trimmed identifier text of a named AST node
10
+ // (method, parameter, ...). Empty when the node has no name.
11
+ func NodeName(node *shimast.Node) string {
12
+ if node == nil || node.Name() == nil {
13
+ return ""
14
+ }
15
+ return strings.Trim(node.Name().Text(), "\"'")
16
+ }
17
+
18
+ // NodeText returns the verbatim source slice spanned by a node.
19
+ func NodeText(node *shimast.Node) string {
20
+ if node == nil {
21
+ return ""
22
+ }
23
+ source, ok := SourceFileText(shimast.GetSourceFileOfNode(node))
24
+ if ok == false {
25
+ return ""
26
+ }
27
+ start, end := node.Pos(), node.End()
28
+ if start < 0 || end > len(source) || start >= end {
29
+ return ""
30
+ }
31
+ return strings.TrimSpace(source[start:end])
32
+ }
@@ -0,0 +1,413 @@
1
+ package transform
2
+
3
+ import (
4
+ "encoding/json"
5
+ "flag"
6
+ "fmt"
7
+ "io"
8
+ "os"
9
+ "path/filepath"
10
+ "regexp"
11
+ "time"
12
+
13
+ shimast "github.com/microsoft/typescript-go/shim/ast"
14
+ shimcompiler "github.com/microsoft/typescript-go/shim/compiler"
15
+ shimscanner "github.com/microsoft/typescript-go/shim/scanner"
16
+ "github.com/samchon/nestia/packages/core/native/plugin"
17
+ "github.com/samchon/ttsc/packages/ttsc/driver"
18
+ typiaadapter "github.com/samchon/typia/packages/typia/native/adapter"
19
+ )
20
+
21
+ func runBuild(args []string) int {
22
+ profile := os.Getenv("TTSC_NESTIA_PROFILE") != ""
23
+ var totalStarted time.Time
24
+ if profile {
25
+ totalStarted = time.Now()
26
+ }
27
+ fs := flag.NewFlagSet("build", flag.ContinueOnError)
28
+ fs.SetOutput(stderr)
29
+ tsconfigPath := fs.String("tsconfig", "tsconfig.json", "path to tsconfig.json")
30
+ cwdOverride := fs.String("cwd", "", "override the working directory")
31
+ quiet := fs.Bool("quiet", true, "suppress the per-call diagnostic summary")
32
+ verbose := fs.Bool("verbose", false, "print the per-call diagnostic summary")
33
+ emit := fs.Bool("emit", false, "force emitted .js files")
34
+ noEmit := fs.Bool("noEmit", false, "force analysis-only run with no file writes")
35
+ outDir := fs.String("outDir", "", "override compilerOptions.outDir")
36
+ manifestPath := fs.String("manifest", "", "write emitted file list as JSON")
37
+ pluginsJSON := fs.String("plugins-json", "", "ordered ttsc plugin payload")
38
+ if err := fs.Parse(args); err != nil {
39
+ return 2
40
+ }
41
+ if *emit && *noEmit {
42
+ fmt.Fprintln(stderr, "ttsc-nestia build: --emit and --noEmit are mutually exclusive")
43
+ return 2
44
+ }
45
+ if *verbose {
46
+ *quiet = false
47
+ }
48
+ plan, err := plugin.ParsePlan(*pluginsJSON)
49
+ if err != nil {
50
+ fmt.Fprintf(stderr, "ttsc-nestia build: %v\n", err)
51
+ return 2
52
+ }
53
+
54
+ cwd, ok := resolveCWD("ttsc-nestia build", *cwdOverride)
55
+ if !ok {
56
+ return 2
57
+ }
58
+ var started time.Time
59
+ if profile {
60
+ started = time.Now()
61
+ }
62
+ prog, diags, err := driver.LoadProgram(cwd, *tsconfigPath, driver.LoadProgramOptions{
63
+ ForceEmit: *emit,
64
+ ForceNoEmit: *noEmit,
65
+ OutDir: *outDir,
66
+ })
67
+ profileBuildStep(profile, "load-program", started)
68
+ if err != nil {
69
+ fmt.Fprintf(stderr, "ttsc-nestia build: %v\n", err)
70
+ return 2
71
+ }
72
+ if len(diags) > 0 {
73
+ driver.WritePrettyDiagnostics(stderr, diags, cwd)
74
+ return 2
75
+ }
76
+ defer prog.Close()
77
+ if profile {
78
+ started = time.Now()
79
+ }
80
+ if diags := prog.Diagnostics(); len(diags) > 0 {
81
+ profileBuildStep(profile, "diagnostics", started)
82
+ driver.WritePrettyDiagnostics(stderr, diags, cwd)
83
+ return 2
84
+ }
85
+ profileBuildStep(profile, "diagnostics", started)
86
+
87
+ shouldEmit := !prog.ParsedConfig.ParsedConfig.CompilerOptions.NoEmit.IsTrue()
88
+ if !*quiet {
89
+ fmt.Fprintf(
90
+ stdout,
91
+ "// ttsc-nestia build: tsconfig=%s cwd=%s core=%v sdk=%v typia=%v emit=%v\n",
92
+ *tsconfigPath,
93
+ cwd,
94
+ plan.Core,
95
+ plan.SDK,
96
+ plan.Typia,
97
+ shouldEmit,
98
+ )
99
+ }
100
+ if !shouldEmit {
101
+ return 0
102
+ }
103
+
104
+ rewrites := newNativeRewriteSet()
105
+ if profile {
106
+ started = time.Now()
107
+ }
108
+ sites, recognized, transformDiags := collectTypiaRewrites(
109
+ prog,
110
+ cwd,
111
+ shouldEmit,
112
+ *quiet,
113
+ "",
114
+ rewrites,
115
+ readTypiaPluginOptions(cwd, *tsconfigPath),
116
+ )
117
+ profileBuildStepCount(profile, "typia-rewrites", started, rewrites.Len())
118
+ if len(transformDiags) > 0 {
119
+ WriteTypiaTransformDiagnostics(stderr, transformDiags, cwd)
120
+ return 3
121
+ }
122
+ beforeCore := rewrites.Len()
123
+ if profile {
124
+ started = time.Now()
125
+ }
126
+ coreDiags := collectNestiaCoreBuildRewrites(prog, plan, rewrites)
127
+ profileBuildStepCount(profile, "core-rewrites", started, rewrites.Len()-beforeCore)
128
+ if len(coreDiags) > 0 {
129
+ WriteTypiaTransformDiagnostics(stderr, coreDiags, cwd)
130
+ return 3
131
+ }
132
+ if profile {
133
+ started = time.Now()
134
+ }
135
+ newPathsRewriter(prog).applyAll(prog.SourceFiles())
136
+ profileBuildStep(profile, "paths-rewrite", started)
137
+
138
+ cursors := map[string]int{}
139
+ var nativePatchElapsed time.Duration
140
+ var cleanupElapsed time.Duration
141
+ var writeElapsed time.Duration
142
+ writeFile := shimcompiler.WriteFile(func(fileName, text string, data *shimcompiler.WriteFileData) error {
143
+ _ = data
144
+ var patchStarted time.Time
145
+ if profile {
146
+ patchStarted = time.Now()
147
+ }
148
+ patched, err := rewrites.Apply(fileName, text, cursors)
149
+ if profile {
150
+ nativePatchElapsed += time.Since(patchStarted)
151
+ }
152
+ if err != nil {
153
+ return err
154
+ }
155
+ if profile {
156
+ patchStarted = time.Now()
157
+ }
158
+ patched = cleanupTransformedTextWithRuntimeAliases(patched, rewrites.RuntimeAliasesForOutput(fileName))
159
+ if profile {
160
+ cleanupElapsed += time.Since(patchStarted)
161
+ patchStarted = time.Now()
162
+ defer func() {
163
+ writeElapsed += time.Since(patchStarted)
164
+ }()
165
+ }
166
+ return driver.DefaultWriteFile(fileName, patched)
167
+ })
168
+ if profile {
169
+ started = time.Now()
170
+ }
171
+ res, eDiags, err := prog.EmitAllRaw(writeFile)
172
+ profileBuildStep(profile, "emit-total", started)
173
+ profileBuildDuration(profile, "emit-native-patch", nativePatchElapsed)
174
+ profileBuildDuration(profile, "emit-cleanup", cleanupElapsed)
175
+ profileBuildDuration(profile, "emit-write", writeElapsed)
176
+ if err != nil {
177
+ fmt.Fprintf(stderr, "ttsc-nestia build: emit failed: %v\n", err)
178
+ return 3
179
+ }
180
+ emitHasError := false
181
+ for _, d := range eDiags {
182
+ fmt.Fprintln(stderr, " -", d.String())
183
+ if d.IsError() {
184
+ emitHasError = true
185
+ }
186
+ }
187
+ if emitHasError {
188
+ return 3
189
+ }
190
+ if *manifestPath != "" {
191
+ data, err := json.Marshal(res.EmittedFiles)
192
+ if err != nil {
193
+ fmt.Fprintf(stderr, "ttsc-nestia build: manifest marshal failed: %v\n", err)
194
+ return 3
195
+ }
196
+ if err := os.MkdirAll(filepath.Dir(*manifestPath), 0o755); err != nil {
197
+ fmt.Fprintf(stderr, "ttsc-nestia build: manifest mkdir failed: %v\n", err)
198
+ return 3
199
+ }
200
+ if err := os.WriteFile(*manifestPath, data, 0o644); err != nil {
201
+ fmt.Fprintf(stderr, "ttsc-nestia build: manifest write failed: %v\n", err)
202
+ return 3
203
+ }
204
+ }
205
+ if !*quiet {
206
+ fmt.Fprintf(stdout, "// ttsc-nestia build: typia recognized=%d total=%d rewrites=%d\n", recognized, sites, rewrites.Len())
207
+ }
208
+ profileBuildStep(profile, "total", totalStarted)
209
+ return 0
210
+ }
211
+
212
+ func runCheck(args []string) int {
213
+ fs := flag.NewFlagSet("check", flag.ContinueOnError)
214
+ fs.SetOutput(stderr)
215
+ tsconfigPath := fs.String("tsconfig", "tsconfig.json", "path to tsconfig.json")
216
+ cwdOverride := fs.String("cwd", "", "override the working directory")
217
+ pluginsJSON := fs.String("plugins-json", "", "ordered ttsc plugin payload")
218
+ if err := fs.Parse(args); err != nil {
219
+ return 2
220
+ }
221
+ if _, err := plugin.ParsePlan(*pluginsJSON); err != nil {
222
+ fmt.Fprintf(stderr, "ttsc-nestia check: %v\n", err)
223
+ return 2
224
+ }
225
+ cwd, ok := resolveCWD("ttsc-nestia check", *cwdOverride)
226
+ if !ok {
227
+ return 2
228
+ }
229
+ prog, diags, err := driver.LoadProgram(cwd, *tsconfigPath, driver.LoadProgramOptions{
230
+ ForceNoEmit: true,
231
+ })
232
+ if err != nil {
233
+ fmt.Fprintf(stderr, "ttsc-nestia check: %v\n", err)
234
+ return 2
235
+ }
236
+ if len(diags) > 0 {
237
+ driver.WritePrettyDiagnostics(stderr, diags, cwd)
238
+ return 2
239
+ }
240
+ defer prog.Close()
241
+ if diags := prog.Diagnostics(); len(diags) > 0 {
242
+ driver.WritePrettyDiagnostics(stderr, diags, cwd)
243
+ return 2
244
+ }
245
+ return 0
246
+ }
247
+
248
+ type Diagnostic struct {
249
+ File string
250
+ Line int
251
+ Column int
252
+ Code string
253
+ Message string
254
+ }
255
+
256
+ func (d Diagnostic) String(cwd string) string {
257
+ file := d.File
258
+ if rel, err := filepath.Rel(cwd, file); err == nil {
259
+ file = rel
260
+ }
261
+ if d.Line > 0 {
262
+ return fmt.Sprintf("%s:%d:%d - error TS(%s): %s", file, d.Line, d.Column, d.Code, d.Message)
263
+ }
264
+ return fmt.Sprintf("%s - error TS(%s): %s", file, d.Code, d.Message)
265
+ }
266
+
267
+ func WriteTypiaTransformDiagnostics(out io.Writer, diagnostics []Diagnostic, cwd string) {
268
+ for _, diag := range diagnostics {
269
+ fmt.Fprintln(out, diag.String(cwd))
270
+ }
271
+ }
272
+
273
+ func profileBuildStep(enabled bool, name string, started time.Time) {
274
+ if enabled {
275
+ profileBuildDuration(enabled, name, time.Since(started))
276
+ }
277
+ }
278
+
279
+ func profileBuildStepCount(enabled bool, name string, started time.Time, count int) {
280
+ if enabled {
281
+ fmt.Fprintf(stderr, "ttsc-nestia profile: %s=%s count=%d\n", name, time.Since(started), count)
282
+ }
283
+ }
284
+
285
+ func profileBuildDuration(enabled bool, name string, elapsed time.Duration) {
286
+ if enabled {
287
+ fmt.Fprintf(stderr, "ttsc-nestia profile: %s=%s\n", name, elapsed)
288
+ }
289
+ }
290
+
291
+ func NewDiagnostic(site typiaadapter.CallSite, message string) Diagnostic {
292
+ line, column := 0, 0
293
+ if site.File != nil && site.Call != nil {
294
+ pos := site.Call.AsNode().Pos()
295
+ if pos >= 0 {
296
+ l, c := shimscanner.GetECMALineAndByteOffsetOfPosition(site.File, pos)
297
+ line, column = l+1, c+1
298
+ }
299
+ }
300
+ return Diagnostic{
301
+ File: site.FilePath,
302
+ Line: line,
303
+ Column: column,
304
+ Code: "typia." + site.Module + "." + site.Method,
305
+ Message: message,
306
+ }
307
+ }
308
+
309
+ func collectTypiaRewrites(
310
+ prog *driver.Program,
311
+ cwd string,
312
+ emit bool,
313
+ quiet bool,
314
+ onlyFile string,
315
+ rewrites *nativeRewriteSet,
316
+ pluginOptions typiaadapter.PluginOptions,
317
+ ) (int, int, []Diagnostic) {
318
+ sites := collectNestiaTypiaCallSites(prog.SourceFiles(), prog.Checker)
319
+ recognized := 0
320
+ diagnostics := []Diagnostic{}
321
+ for _, site := range sites {
322
+ if onlyFile != "" && filepath.ToSlash(site.FilePath) != filepath.ToSlash(onlyFile) {
323
+ continue
324
+ }
325
+ rel := site.FilePath
326
+ if abs, err := filepath.Rel(cwd, rel); err == nil {
327
+ rel = abs
328
+ }
329
+ if reason := typiaadapter.UnsupportedReason(site); reason != "" {
330
+ diagnostics = append(diagnostics, NewDiagnostic(site, reason))
331
+ continue
332
+ }
333
+ expr, handled, err := typiaadapter.EmitCallWithOptions(prog, site, pluginOptions)
334
+ if !handled {
335
+ diagnostics = append(diagnostics, NewDiagnostic(site, "method not covered"))
336
+ continue
337
+ }
338
+ if err != nil {
339
+ diagnostics = append(diagnostics, NewDiagnostic(site, err.Error()))
340
+ continue
341
+ }
342
+ expr = parenthesizeTypiaReplacement(site, expr)
343
+ rewrites.Add(nativeRewrite{
344
+ FilePath: site.FilePath,
345
+ RootName: site.RootName,
346
+ Namespaces: site.Namespaces,
347
+ Method: site.Method,
348
+ Replacement: expr,
349
+ ConsumeParens: true,
350
+ SourceStart: typiaBuildRewriteSortKey(site),
351
+ })
352
+ if !emit && !quiet {
353
+ fmt.Fprintf(stdout, "%s: typia.%s<T> -> %s\n", rel, site.Method, expr)
354
+ }
355
+ recognized++
356
+ }
357
+ return len(sites), recognized, diagnostics
358
+ }
359
+
360
+ func typiaBuildRewriteSortKey(site typiaadapter.CallSite) int {
361
+ node := site.Call.AsNode()
362
+ if node == nil {
363
+ return 0
364
+ }
365
+ insideDecorator := false
366
+ classEnd := 0
367
+ for current := node.Parent; current != nil; current = current.Parent {
368
+ if current.Kind == NestiaCoreKindDecorator {
369
+ insideDecorator = true
370
+ }
371
+ if current.Kind == shimast.KindClassDeclaration || current.Kind == shimast.KindClassExpression {
372
+ classEnd = current.End()
373
+ break
374
+ }
375
+ }
376
+ if insideDecorator == false {
377
+ return node.Pos()
378
+ }
379
+ if classEnd != 0 {
380
+ return classEnd + node.Pos()
381
+ }
382
+ return node.Pos() + 1_000_000_000
383
+ }
384
+
385
+ func readTypiaPluginOptions(cwd, tsconfigPath string) typiaadapter.PluginOptions {
386
+ path := tsconfigPath
387
+ if !filepath.IsAbs(path) {
388
+ path = filepath.Join(cwd, path)
389
+ }
390
+ data, err := os.ReadFile(path)
391
+ if err != nil {
392
+ return typiaadapter.PluginOptions{}
393
+ }
394
+ text := string(data)
395
+ return typiaadapter.PluginOptions{
396
+ Functional: regexp.MustCompile(`(?s)"functional"\s*:\s*true`).MatchString(text),
397
+ Numeric: regexp.MustCompile(`(?s)"numeric"\s*:\s*true`).MatchString(text),
398
+ Finite: regexp.MustCompile(`(?s)"finite"\s*:\s*true`).MatchString(text),
399
+ Undefined: regexp.MustCompile(`(?s)"undefined"\s*:\s*true`).MatchString(text),
400
+ }
401
+ }
402
+
403
+ func resolveCWD(label string, cwdOverride string) (string, bool) {
404
+ if cwdOverride != "" {
405
+ return cwdOverride, true
406
+ }
407
+ cwd, err := os.Getwd()
408
+ if err != nil {
409
+ fmt.Fprintf(stderr, "%s: cwd: %v\n", label, err)
410
+ return "", false
411
+ }
412
+ return cwd, true
413
+ }