@nestia/core 12.0.0-dev.20260601.1 → 12.0.0-dev.20260612.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 (116) hide show
  1. package/LICENSE +21 -21
  2. package/MIGRATION.md +169 -169
  3. package/README.md +93 -93
  4. package/lib/adaptors/McpAdaptor.d.ts +75 -0
  5. package/lib/adaptors/McpAdaptor.js +257 -0
  6. package/lib/adaptors/McpAdaptor.js.map +1 -0
  7. package/lib/adaptors/WebSocketAdaptor.js +4 -4
  8. package/lib/adaptors/WebSocketAdaptor.js.map +1 -1
  9. package/lib/decorators/McpRoute.d.ts +69 -0
  10. package/lib/decorators/McpRoute.js +58 -0
  11. package/lib/decorators/McpRoute.js.map +1 -0
  12. package/lib/decorators/TypedParam.js +4 -4
  13. package/lib/decorators/TypedParam.js.map +1 -1
  14. package/lib/decorators/TypedRoute.js +1 -1
  15. package/lib/decorators/TypedRoute.js.map +1 -1
  16. package/lib/decorators/internal/IMcpRouteReflect.d.ts +2 -0
  17. package/lib/decorators/internal/IMcpRouteReflect.js +3 -0
  18. package/lib/decorators/internal/IMcpRouteReflect.js.map +1 -0
  19. package/lib/decorators/internal/get_path_and_querify.js +4 -4
  20. package/lib/decorators/internal/get_path_and_querify.js.map +1 -1
  21. package/lib/decorators/internal/get_path_and_stringify.js +4 -4
  22. package/lib/decorators/internal/get_path_and_stringify.js.map +1 -1
  23. package/lib/decorators/internal/load_controller.js +34 -65
  24. package/lib/decorators/internal/load_controller.js.map +1 -1
  25. package/lib/decorators/internal/validate_request_body.js +4 -4
  26. package/lib/decorators/internal/validate_request_body.js.map +1 -1
  27. package/lib/decorators/internal/validate_request_form_data.js +4 -4
  28. package/lib/decorators/internal/validate_request_form_data.js.map +1 -1
  29. package/lib/decorators/internal/validate_request_headers.js +4 -4
  30. package/lib/decorators/internal/validate_request_headers.js.map +1 -1
  31. package/lib/decorators/internal/validate_request_query.js +4 -4
  32. package/lib/decorators/internal/validate_request_query.js.map +1 -1
  33. package/lib/module.d.ts +2 -0
  34. package/lib/module.js +2 -0
  35. package/lib/module.js.map +1 -1
  36. package/native/cmd/ttsc-nestia/main.go +11 -11
  37. package/native/go.mod +32 -32
  38. package/native/go.sum +54 -54
  39. package/native/plugin/plan.go +102 -102
  40. package/native/transform/ast.go +32 -32
  41. package/native/transform/build.go +380 -444
  42. package/native/transform/cleanup.go +408 -408
  43. package/native/transform/contributor.go +97 -68
  44. package/native/transform/core_querify.go +231 -227
  45. package/native/transform/core_transform.go +1996 -1713
  46. package/native/transform/core_websocket.go +115 -115
  47. package/native/transform/exports.go +13 -13
  48. package/native/transform/mcp_transform.go +414 -0
  49. package/native/transform/node_transform.go +357 -0
  50. package/native/transform/path_rewrite.go +285 -285
  51. package/native/transform/printer.go +244 -244
  52. package/native/transform/rewrite.go +668 -662
  53. package/native/transform/run.go +73 -73
  54. package/native/transform/transform.go +336 -403
  55. package/native/transform/typia_fast.go +352 -326
  56. package/native/transform/typia_replacement.go +24 -24
  57. package/native/transform.cjs +43 -43
  58. package/package.json +15 -8
  59. package/src/adaptors/McpAdaptor.ts +276 -0
  60. package/src/adaptors/WebSocketAdaptor.ts +429 -429
  61. package/src/decorators/DynamicModule.ts +44 -44
  62. package/src/decorators/EncryptedBody.ts +97 -97
  63. package/src/decorators/EncryptedController.ts +40 -40
  64. package/src/decorators/EncryptedModule.ts +98 -98
  65. package/src/decorators/EncryptedRoute.ts +213 -213
  66. package/src/decorators/HumanRoute.ts +21 -21
  67. package/src/decorators/McpRoute.ts +154 -0
  68. package/src/decorators/NoTransformConfigurationError.ts +40 -40
  69. package/src/decorators/PlainBody.ts +76 -76
  70. package/src/decorators/SwaggerCustomizer.ts +97 -97
  71. package/src/decorators/SwaggerExample.ts +180 -180
  72. package/src/decorators/TypedBody.ts +57 -57
  73. package/src/decorators/TypedException.ts +147 -147
  74. package/src/decorators/TypedFormData.ts +187 -187
  75. package/src/decorators/TypedHeaders.ts +66 -66
  76. package/src/decorators/TypedParam.ts +77 -77
  77. package/src/decorators/TypedQuery.ts +234 -234
  78. package/src/decorators/TypedRoute.ts +198 -196
  79. package/src/decorators/WebSocketRoute.ts +242 -242
  80. package/src/decorators/doNotThrowTransformError.ts +5 -5
  81. package/src/decorators/internal/EncryptedConstant.ts +2 -2
  82. package/src/decorators/internal/IMcpRouteReflect.ts +40 -0
  83. package/src/decorators/internal/IWebSocketRouteReflect.ts +23 -23
  84. package/src/decorators/internal/get_path_and_querify.ts +94 -94
  85. package/src/decorators/internal/get_path_and_stringify.ts +110 -110
  86. package/src/decorators/internal/get_text_body.ts +16 -16
  87. package/src/decorators/internal/headers_to_object.ts +11 -11
  88. package/src/decorators/internal/is_request_body_undefined.ts +12 -12
  89. package/src/decorators/internal/load_controller.ts +91 -76
  90. package/src/decorators/internal/route_error.ts +43 -43
  91. package/src/decorators/internal/validate_request_body.ts +64 -64
  92. package/src/decorators/internal/validate_request_form_data.ts +67 -67
  93. package/src/decorators/internal/validate_request_headers.ts +76 -76
  94. package/src/decorators/internal/validate_request_query.ts +83 -83
  95. package/src/index.ts +5 -5
  96. package/src/module.ts +25 -23
  97. package/src/options/IRequestBodyValidator.ts +20 -20
  98. package/src/options/IRequestFormDataProps.ts +27 -27
  99. package/src/options/IRequestHeadersValidator.ts +22 -22
  100. package/src/options/IRequestQueryValidator.ts +20 -20
  101. package/src/options/IResponseBodyQuerifier.ts +25 -25
  102. package/src/options/IResponseBodyStringifier.ts +30 -30
  103. package/src/transform.ts +101 -101
  104. package/src/typings/Creator.ts +3 -3
  105. package/src/typings/get-function-location.d.ts +7 -7
  106. package/src/utils/ArrayUtil.ts +7 -7
  107. package/src/utils/ExceptionManager.ts +115 -115
  108. package/src/utils/Singleton.ts +16 -16
  109. package/src/utils/SourceFinder.ts +54 -54
  110. package/src/utils/VersioningStrategy.ts +27 -27
  111. package/native/transform/cleanup_test.go +0 -76
  112. package/native/transform/commonjs_import_alias_test.go +0 -49
  113. package/native/transform/core_dispatch_test.go +0 -127
  114. package/native/transform/path_rewrite_test.go +0 -243
  115. package/native/transform/rewrite_test.go +0 -118
  116. package/native/transform/rewrite_unique_base_test.go +0 -48
@@ -1,68 +1,97 @@
1
- package transform
2
-
3
- import (
4
- "github.com/samchon/nestia/packages/core/native/plugin"
5
- "github.com/samchon/ttsc/packages/ttsc/driver"
6
- )
7
-
8
- // BuildOutputRewriter patches emitted JavaScript after the core native
9
- // rewrites have been applied. Contributor packages register these from init().
10
- type BuildOutputRewriter struct {
11
- Len func() int
12
- Apply func(outputName string, text string) (string, error)
13
- }
14
-
15
- type buildOutputRewriteCollector func(*driver.Program, plugin.Plan) (*BuildOutputRewriter, []Diagnostic)
16
- type sourceRewriteCollector func(*driver.Program, plugin.Plan, string) (map[string][]SourceRewrite, []Diagnostic)
17
-
18
- var buildOutputRewriteCollectors []buildOutputRewriteCollector
19
- var sourceRewriteCollectors []sourceRewriteCollector
20
-
21
- // RegisterBuildOutputRewriteCollector registers a statically linked
22
- // contributor's emitted-JavaScript rewrite pass.
23
- func RegisterBuildOutputRewriteCollector(collector buildOutputRewriteCollector) {
24
- if collector != nil {
25
- buildOutputRewriteCollectors = append(buildOutputRewriteCollectors, collector)
26
- }
27
- }
28
-
29
- // RegisterSourceRewriteCollector registers a statically linked contributor's
30
- // TypeScript source-to-source rewrite pass.
31
- func RegisterSourceRewriteCollector(collector sourceRewriteCollector) {
32
- if collector != nil {
33
- sourceRewriteCollectors = append(sourceRewriteCollectors, collector)
34
- }
35
- }
36
-
37
- func collectContributorBuildOutputRewriters(
38
- prog *driver.Program,
39
- plan plugin.Plan,
40
- ) ([]BuildOutputRewriter, []Diagnostic) {
41
- output := []BuildOutputRewriter{}
42
- diagnostics := []Diagnostic{}
43
- for _, collector := range buildOutputRewriteCollectors {
44
- rewriter, diags := collector(prog, plan)
45
- diagnostics = append(diagnostics, diags...)
46
- if rewriter != nil && rewriter.Apply != nil {
47
- output = append(output, *rewriter)
48
- }
49
- }
50
- return output, diagnostics
51
- }
52
-
53
- func collectContributorSourceRewriteMap(
54
- prog *driver.Program,
55
- plan plugin.Plan,
56
- onlyFile string,
57
- ) (map[string][]SourceRewrite, []Diagnostic) {
58
- output := map[string][]SourceRewrite{}
59
- diagnostics := []Diagnostic{}
60
- for _, collector := range sourceRewriteCollectors {
61
- rewrites, diags := collector(prog, plan, onlyFile)
62
- diagnostics = append(diagnostics, diags...)
63
- for file, entries := range rewrites {
64
- output[file] = append(output[file], entries...)
65
- }
66
- }
67
- return output, diagnostics
68
- }
1
+ package transform
2
+
3
+ import (
4
+ "github.com/samchon/nestia/packages/core/native/plugin"
5
+ "github.com/samchon/ttsc/packages/ttsc/driver"
6
+ )
7
+
8
+ // BuildOutputRewriter patches emitted JavaScript after the core native
9
+ // rewrites have been applied. Contributor packages register these from init().
10
+ type BuildOutputRewriter struct {
11
+ Len func() int
12
+ Apply func(outputName string, text string) (string, error)
13
+ }
14
+
15
+ type buildOutputRewriteCollector func(*driver.Program, plugin.Plan) (*BuildOutputRewriter, []Diagnostic)
16
+ type sourceRewriteCollector func(*driver.Program, plugin.Plan, string) (map[string][]SourceRewrite, []Diagnostic)
17
+ type emitTransformCollector func(*driver.Program, plugin.Plan) (driver.PluginTransform, []Diagnostic)
18
+
19
+ var buildOutputRewriteCollectors []buildOutputRewriteCollector
20
+ var sourceRewriteCollectors []sourceRewriteCollector
21
+ var emitTransformCollectors []emitTransformCollector
22
+
23
+ // RegisterBuildOutputRewriteCollector registers a statically linked
24
+ // contributor's emitted-JavaScript rewrite pass.
25
+ func RegisterBuildOutputRewriteCollector(collector buildOutputRewriteCollector) {
26
+ if collector != nil {
27
+ buildOutputRewriteCollectors = append(buildOutputRewriteCollectors, collector)
28
+ }
29
+ }
30
+
31
+ // RegisterSourceRewriteCollector registers a statically linked contributor's
32
+ // TypeScript source-to-source rewrite pass.
33
+ func RegisterSourceRewriteCollector(collector sourceRewriteCollector) {
34
+ if collector != nil {
35
+ sourceRewriteCollectors = append(sourceRewriteCollectors, collector)
36
+ }
37
+ }
38
+
39
+ // RegisterEmitTransformCollector registers a statically linked contributor's
40
+ // emit-phase AST transformer. The `transform` subcommand runs these inside the
41
+ // shared EmitContext alongside the typia and core node transforms, so a linked
42
+ // contributor (e.g. @nestia/sdk) participates in the node-path source-to-source
43
+ // output the same way its source-rewrite collector did on the legacy text path.
44
+ func RegisterEmitTransformCollector(collector emitTransformCollector) {
45
+ if collector != nil {
46
+ emitTransformCollectors = append(emitTransformCollectors, collector)
47
+ }
48
+ }
49
+
50
+ func collectContributorBuildOutputRewriters(
51
+ prog *driver.Program,
52
+ plan plugin.Plan,
53
+ ) ([]BuildOutputRewriter, []Diagnostic) {
54
+ output := []BuildOutputRewriter{}
55
+ diagnostics := []Diagnostic{}
56
+ for _, collector := range buildOutputRewriteCollectors {
57
+ rewriter, diags := collector(prog, plan)
58
+ diagnostics = append(diagnostics, diags...)
59
+ if rewriter != nil && rewriter.Apply != nil {
60
+ output = append(output, *rewriter)
61
+ }
62
+ }
63
+ return output, diagnostics
64
+ }
65
+
66
+ func collectContributorSourceRewriteMap(
67
+ prog *driver.Program,
68
+ plan plugin.Plan,
69
+ onlyFile string,
70
+ ) (map[string][]SourceRewrite, []Diagnostic) {
71
+ output := map[string][]SourceRewrite{}
72
+ diagnostics := []Diagnostic{}
73
+ for _, collector := range sourceRewriteCollectors {
74
+ rewrites, diags := collector(prog, plan, onlyFile)
75
+ diagnostics = append(diagnostics, diags...)
76
+ for file, entries := range rewrites {
77
+ output[file] = append(output[file], entries...)
78
+ }
79
+ }
80
+ return output, diagnostics
81
+ }
82
+
83
+ func collectContributorEmitTransforms(
84
+ prog *driver.Program,
85
+ plan plugin.Plan,
86
+ ) ([]driver.PluginTransform, []Diagnostic) {
87
+ transforms := []driver.PluginTransform{}
88
+ diagnostics := []Diagnostic{}
89
+ for _, collector := range emitTransformCollectors {
90
+ t, diags := collector(prog, plan)
91
+ diagnostics = append(diagnostics, diags...)
92
+ if t != nil {
93
+ transforms = append(transforms, t)
94
+ }
95
+ }
96
+ return transforms, diagnostics
97
+ }
@@ -1,227 +1,231 @@
1
- package transform
2
-
3
- import (
4
- "fmt"
5
-
6
- shimast "github.com/microsoft/typescript-go/shim/ast"
7
- shimchecker "github.com/microsoft/typescript-go/shim/checker"
8
- "github.com/samchon/ttsc/packages/ttsc/driver"
9
- nativefactories "github.com/samchon/typia/packages/typia/native/core/factories"
10
- nativeprogrammers "github.com/samchon/typia/packages/typia/native/core/programmers"
11
- nativehttp "github.com/samchon/typia/packages/typia/native/core/programmers/http"
12
- schemametadata "github.com/samchon/typia/packages/typia/native/core/schemas/metadata"
13
- )
14
-
15
- func nestiaCoreHttpQuerifyProgrammer(prog *driver.Program, typ *shimchecker.Type) *shimast.Node {
16
- collection := schemametadata.NewMetadataCollection()
17
- result := nativefactories.MetadataFactory.Analyze(nativefactories.MetadataFactory_IProps{
18
- Checker: prog.Checker,
19
- Options: nativefactories.MetadataFactory_IOptions{
20
- Escape: false,
21
- Constant: true,
22
- Absorb: true,
23
- Validate: func(next struct {
24
- Metadata *schemametadata.MetadataSchema
25
- Explore nativefactories.MetadataFactory_IExplore
26
- Top *schemametadata.MetadataSchema
27
- }) []string {
28
- return nativehttp.HttpQueryProgrammer.Validate(struct {
29
- Metadata *schemametadata.MetadataSchema
30
- Explore nativefactories.MetadataFactory_IExplore
31
- Top *schemametadata.MetadataSchema
32
- AllowOptional bool
33
- }{
34
- Metadata: next.Metadata,
35
- Explore: next.Explore,
36
- Top: next.Top,
37
- AllowOptional: false,
38
- })
39
- },
40
- },
41
- Components: collection,
42
- Type: typ,
43
- })
44
- if result.Success == false {
45
- panic(fmt.Errorf("failed to analyze query-string metadata: %d error(s)", len(result.Errors)))
46
- }
47
- statements := []*shimast.Node{
48
- nativefactories.StatementFactory.Constant(nativefactories.StatementFactory_ConstantProps{
49
- Name: "output",
50
- Value: nestiaCoreFactory.NewNewExpression(
51
- nestiaCoreFactory.NewIdentifier("URLSearchParams"),
52
- nil,
53
- nestiaCoreFactory.NewNodeList([]*shimast.Node{}),
54
- ),
55
- }),
56
- }
57
- if result.Data != nil && len(result.Data.Objects) != 0 && result.Data.Objects[0] != nil && result.Data.Objects[0].Type != nil {
58
- for _, property := range result.Data.Objects[0].Type.Properties {
59
- key, ok := nestiaCorePropertyStringKey(property)
60
- if ok == false || property == nil || property.Value == nil {
61
- continue
62
- }
63
- statements = append(statements, nestiaCoreFactory.NewExpressionStatement(
64
- nestiaCoreHttpQuerifyDecode(key, property.Value),
65
- ))
66
- }
67
- }
68
- statements = append(statements, nestiaCoreFactory.NewReturnStatement(nestiaCoreFactory.NewIdentifier("output")))
69
- return nestiaCoreFactory.NewArrowFunction(
70
- nil,
71
- nil,
72
- nestiaCoreFactory.NewNodeList([]*shimast.Node{
73
- nativefactories.IdentifierFactory.Parameter("input", nil, nil),
74
- }),
75
- nil,
76
- nil,
77
- nestiaCoreFactory.NewToken(shimast.KindEqualsGreaterThanToken),
78
- nestiaCoreFactory.NewBlock(nestiaCoreFactory.NewNodeList(statements), true),
79
- )
80
- }
81
-
82
- func nestiaCoreHttpAssertQuerifyProgrammer(prog *driver.Program, modulo *shimast.Node, typ *shimchecker.Type) *shimast.Node {
83
- context := nestiaCoreTypiaContext(prog, false, false, false)
84
- name := nestiaCoreTypeName(prog, typ)
85
- return nestiaCoreQueryWrapperArrow([]*shimast.Node{
86
- nativefactories.StatementFactory.Constant(nativefactories.StatementFactory_ConstantProps{
87
- Name: "assert",
88
- Value: nativeprogrammers.AssertProgrammer.Write(nativeprogrammers.AssertProgrammer_IProps{
89
- Context: context,
90
- Modulo: modulo,
91
- Type: typ,
92
- Name: name,
93
- Config: nativeprogrammers.AssertProgrammer_IConfig{Equals: false, Guard: false},
94
- }),
95
- }),
96
- nativefactories.StatementFactory.Constant(nativefactories.StatementFactory_ConstantProps{
97
- Name: "stringify",
98
- Value: nestiaCoreHttpQuerifyProgrammer(prog, typ),
99
- }),
100
- nestiaCoreFactory.NewReturnStatement(nestiaCoreCall("stringify", nestiaCoreCall("assert", nestiaCoreFactory.NewIdentifier("input")))),
101
- })
102
- }
103
-
104
- func nestiaCoreHttpIsQuerifyProgrammer(prog *driver.Program, modulo *shimast.Node, typ *shimchecker.Type) *shimast.Node {
105
- context := nestiaCoreTypiaContext(prog, false, false, false)
106
- name := nestiaCoreTypeName(prog, typ)
107
- return nestiaCoreQueryWrapperArrow([]*shimast.Node{
108
- nativefactories.StatementFactory.Constant(nativefactories.StatementFactory_ConstantProps{
109
- Name: "is",
110
- Value: nativeprogrammers.IsProgrammer.Write(nativeprogrammers.IsProgrammer_IProps{
111
- Context: context,
112
- Modulo: modulo,
113
- Type: typ,
114
- Name: name,
115
- Config: nativeprogrammers.IsProgrammer_IConfig{Equals: false},
116
- }),
117
- }),
118
- nativefactories.StatementFactory.Constant(nativefactories.StatementFactory_ConstantProps{
119
- Name: "stringify",
120
- Value: nestiaCoreHttpQuerifyProgrammer(prog, typ),
121
- }),
122
- nestiaCoreFactory.NewReturnStatement(nestiaCoreFactory.NewConditionalExpression(
123
- nestiaCoreCall("is", nestiaCoreFactory.NewIdentifier("input")),
124
- nil,
125
- nestiaCoreCall("stringify", nestiaCoreFactory.NewIdentifier("input")),
126
- nil,
127
- nestiaCoreFactory.NewKeywordExpression(shimast.KindNullKeyword),
128
- )),
129
- })
130
- }
131
-
132
- func nestiaCoreHttpValidateQuerifyProgrammer(prog *driver.Program, modulo *shimast.Node, typ *shimchecker.Type) *shimast.Node {
133
- context := nestiaCoreTypiaContext(prog, true, false, false)
134
- name := nestiaCoreTypeName(prog, typ)
135
- return nestiaCoreQueryWrapperArrow([]*shimast.Node{
136
- nativefactories.StatementFactory.Constant(nativefactories.StatementFactory_ConstantProps{
137
- Name: "validate",
138
- Value: nativeprogrammers.ValidateProgrammer.Write(nativeprogrammers.ValidateProgrammer_IProps{
139
- Context: context,
140
- Modulo: modulo,
141
- Type: typ,
142
- Name: name,
143
- Config: nativeprogrammers.ValidateProgrammer_IConfig{Equals: false},
144
- }),
145
- }),
146
- nativefactories.StatementFactory.Constant(nativefactories.StatementFactory_ConstantProps{
147
- Name: "query",
148
- Value: nestiaCoreHttpQuerifyProgrammer(prog, typ),
149
- }),
150
- nativefactories.StatementFactory.Constant(nativefactories.StatementFactory_ConstantProps{
151
- Name: "output",
152
- Value: nestiaCoreCall("query", nestiaCoreFactory.NewIdentifier("input")),
153
- }),
154
- nestiaCoreFactory.NewReturnStatement(nestiaCoreFactory.NewAsExpression(
155
- nestiaCoreCall("validate", nestiaCoreFactory.NewIdentifier("output")),
156
- nativefactories.TypeFactory.Keyword("any"),
157
- )),
158
- })
159
- }
160
-
161
- func nestiaCoreQueryWrapperArrow(statements []*shimast.Node) *shimast.Node {
162
- return nestiaCoreFactory.NewArrowFunction(
163
- nil,
164
- nil,
165
- nestiaCoreFactory.NewNodeList([]*shimast.Node{
166
- nativefactories.IdentifierFactory.Parameter("input", nil, nil),
167
- }),
168
- nil,
169
- nil,
170
- nestiaCoreFactory.NewToken(shimast.KindEqualsGreaterThanToken),
171
- nestiaCoreFactory.NewBlock(nestiaCoreFactory.NewNodeList(statements), true),
172
- )
173
- }
174
-
175
- func nestiaCoreHttpQuerifyDecode(key string, value *schemametadata.MetadataSchema) *shimast.Node {
176
- if len(value.Arrays) != 0 {
177
- return nestiaCoreFactory.NewCallExpression(
178
- nativefactories.IdentifierFactory.Access(
179
- nativefactories.IdentifierFactory.Access(nestiaCoreFactory.NewIdentifier("input"), key),
180
- "forEach",
181
- ),
182
- nil,
183
- nil,
184
- nestiaCoreFactory.NewNodeList([]*shimast.Node{
185
- nestiaCoreFactory.NewArrowFunction(
186
- nil,
187
- nil,
188
- nestiaCoreFactory.NewNodeList([]*shimast.Node{
189
- nativefactories.IdentifierFactory.Parameter("elem", nil, nil),
190
- }),
191
- nil,
192
- nil,
193
- nestiaCoreFactory.NewToken(shimast.KindEqualsGreaterThanToken),
194
- nestiaCoreHttpQuerifyAppend(key, nestiaCoreFactory.NewIdentifier("elem")),
195
- ),
196
- }),
197
- shimast.NodeFlagsNone,
198
- )
199
- }
200
- return nestiaCoreHttpQuerifyAppend(
201
- key,
202
- nativefactories.IdentifierFactory.Access(nestiaCoreFactory.NewIdentifier("input"), key),
203
- )
204
- }
205
-
206
- func nestiaCoreHttpQuerifyAppend(key string, elem *shimast.Node) *shimast.Node {
207
- return nestiaCoreFactory.NewCallExpression(
208
- nativefactories.IdentifierFactory.Access(nestiaCoreFactory.NewIdentifier("output"), "append"),
209
- nil,
210
- nil,
211
- nestiaCoreFactory.NewNodeList([]*shimast.Node{
212
- nestiaCoreFactory.NewStringLiteral(key, shimast.TokenFlagsNone),
213
- elem,
214
- }),
215
- shimast.NodeFlagsNone,
216
- )
217
- }
218
-
219
- func nestiaCoreCall(name string, args ...*shimast.Node) *shimast.Node {
220
- return nestiaCoreFactory.NewCallExpression(
221
- nestiaCoreFactory.NewIdentifier(name),
222
- nil,
223
- nil,
224
- nestiaCoreFactory.NewNodeList(args),
225
- shimast.NodeFlagsNone,
226
- )
227
- }
1
+ package transform
2
+
3
+ import (
4
+ "fmt"
5
+
6
+ shimast "github.com/microsoft/typescript-go/shim/ast"
7
+ shimchecker "github.com/microsoft/typescript-go/shim/checker"
8
+ shimprinter "github.com/microsoft/typescript-go/shim/printer"
9
+ "github.com/samchon/ttsc/packages/ttsc/driver"
10
+ nativecontext "github.com/samchon/typia/packages/typia/native/core/context"
11
+ nativefactories "github.com/samchon/typia/packages/typia/native/core/factories"
12
+ nativeprogrammers "github.com/samchon/typia/packages/typia/native/core/programmers"
13
+ nativehttp "github.com/samchon/typia/packages/typia/native/core/programmers/http"
14
+ schemametadata "github.com/samchon/typia/packages/typia/native/core/schemas/metadata"
15
+ )
16
+
17
+ func nestiaCoreHttpQuerifyProgrammer(prog *driver.Program, ec *shimprinter.EmitContext, typ *shimchecker.Type) *shimast.Node {
18
+ collection := schemametadata.NewMetadataCollection()
19
+ result := nativefactories.MetadataFactory.Analyze(nativefactories.MetadataFactory_IProps{
20
+ Checker: prog.Checker,
21
+ Options: nativefactories.MetadataFactory_IOptions{
22
+ Escape: false,
23
+ Constant: true,
24
+ Absorb: true,
25
+ Validate: func(next struct {
26
+ Metadata *schemametadata.MetadataSchema
27
+ Explore nativefactories.MetadataFactory_IExplore
28
+ Top *schemametadata.MetadataSchema
29
+ }) []string {
30
+ return nativehttp.HttpQueryProgrammer.Validate(struct {
31
+ Metadata *schemametadata.MetadataSchema
32
+ Explore nativefactories.MetadataFactory_IExplore
33
+ Top *schemametadata.MetadataSchema
34
+ AllowOptional bool
35
+ }{
36
+ Metadata: next.Metadata,
37
+ Explore: next.Explore,
38
+ Top: next.Top,
39
+ AllowOptional: false,
40
+ })
41
+ },
42
+ },
43
+ Components: collection,
44
+ Type: typ,
45
+ })
46
+ if result.Success == false {
47
+ panic(fmt.Errorf("failed to analyze query-string metadata: %d error(s)", len(result.Errors)))
48
+ }
49
+ statements := []*shimast.Node{
50
+ nativefactories.StatementFactory.Constant(nativefactories.StatementFactory_ConstantProps{
51
+ Name: "output",
52
+ Value: nestiaCoreFactory.NewNewExpression(
53
+ nestiaCoreFactory.NewIdentifier("URLSearchParams"),
54
+ nil,
55
+ nestiaCoreFactory.NewNodeList([]*shimast.Node{}),
56
+ ),
57
+ }),
58
+ }
59
+ if result.Data != nil && len(result.Data.Objects) != 0 && result.Data.Objects[0] != nil && result.Data.Objects[0].Type != nil {
60
+ for _, property := range result.Data.Objects[0].Type.Properties {
61
+ key, ok := nestiaCorePropertyStringKey(property)
62
+ if ok == false || property == nil || property.Value == nil {
63
+ continue
64
+ }
65
+ statements = append(statements, nestiaCoreFactory.NewExpressionStatement(
66
+ nestiaCoreHttpQuerifyDecode(key, property.Value, ec),
67
+ ))
68
+ }
69
+ }
70
+ statements = append(statements, nestiaCoreFactory.NewReturnStatement(nestiaCoreFactory.NewIdentifier("output")))
71
+ return nestiaCoreFactory.NewArrowFunction(
72
+ nil,
73
+ nil,
74
+ nestiaCoreFactory.NewNodeList([]*shimast.Node{
75
+ nativefactories.IdentifierFactory.Parameter("input", nil, nil),
76
+ }),
77
+ nil,
78
+ nil,
79
+ nestiaCoreFactory.NewToken(shimast.KindEqualsGreaterThanToken),
80
+ nestiaCoreFactory.NewBlock(nestiaCoreFactory.NewNodeList(statements), true),
81
+ )
82
+ }
83
+
84
+ func nestiaCoreHttpAssertQuerifyProgrammer(prog *driver.Program, importer *nativecontext.ImportProgrammer, ec *shimprinter.EmitContext, modulo *shimast.Node, typ *shimchecker.Type) *shimast.Node {
85
+ context := nestiaCoreTypiaContext(prog, importer, ec, false, false, false)
86
+ name := nestiaCoreTypeName(prog, typ)
87
+ return nestiaCoreQueryWrapperArrow([]*shimast.Node{
88
+ nativefactories.StatementFactory.Constant(nativefactories.StatementFactory_ConstantProps{
89
+ Name: "assert",
90
+ Value: nativeprogrammers.AssertProgrammer.Write(nativeprogrammers.AssertProgrammer_IProps{
91
+ Context: context,
92
+ Modulo: modulo,
93
+ Type: typ,
94
+ Name: name,
95
+ Config: nativeprogrammers.AssertProgrammer_IConfig{Equals: false, Guard: false},
96
+ }),
97
+ }),
98
+ nativefactories.StatementFactory.Constant(nativefactories.StatementFactory_ConstantProps{
99
+ Name: "stringify",
100
+ Value: nestiaCoreHttpQuerifyProgrammer(prog, ec, typ),
101
+ }),
102
+ nestiaCoreFactory.NewReturnStatement(nestiaCoreCall("stringify", nestiaCoreCall("assert", nestiaCoreFactory.NewIdentifier("input")))),
103
+ })
104
+ }
105
+
106
+ func nestiaCoreHttpIsQuerifyProgrammer(prog *driver.Program, importer *nativecontext.ImportProgrammer, ec *shimprinter.EmitContext, modulo *shimast.Node, typ *shimchecker.Type) *shimast.Node {
107
+ context := nestiaCoreTypiaContext(prog, importer, ec, false, false, false)
108
+ name := nestiaCoreTypeName(prog, typ)
109
+ return nestiaCoreQueryWrapperArrow([]*shimast.Node{
110
+ nativefactories.StatementFactory.Constant(nativefactories.StatementFactory_ConstantProps{
111
+ Name: "is",
112
+ Value: nativeprogrammers.IsProgrammer.Write(nativeprogrammers.IsProgrammer_IProps{
113
+ Context: context,
114
+ Modulo: modulo,
115
+ Type: typ,
116
+ Name: name,
117
+ Config: nativeprogrammers.IsProgrammer_IConfig{Equals: false},
118
+ }),
119
+ }),
120
+ nativefactories.StatementFactory.Constant(nativefactories.StatementFactory_ConstantProps{
121
+ Name: "stringify",
122
+ Value: nestiaCoreHttpQuerifyProgrammer(prog, ec, typ),
123
+ }),
124
+ nestiaCoreFactory.NewReturnStatement(nestiaCoreFactory.NewConditionalExpression(
125
+ nestiaCoreCall("is", nestiaCoreFactory.NewIdentifier("input")),
126
+ nil,
127
+ nestiaCoreCall("stringify", nestiaCoreFactory.NewIdentifier("input")),
128
+ nil,
129
+ nestiaCoreFactory.NewKeywordExpression(shimast.KindNullKeyword),
130
+ )),
131
+ })
132
+ }
133
+
134
+ func nestiaCoreHttpValidateQuerifyProgrammer(prog *driver.Program, importer *nativecontext.ImportProgrammer, ec *shimprinter.EmitContext, modulo *shimast.Node, typ *shimchecker.Type) *shimast.Node {
135
+ context := nestiaCoreTypiaContext(prog, importer, ec, true, false, false)
136
+ name := nestiaCoreTypeName(prog, typ)
137
+ return nestiaCoreQueryWrapperArrow([]*shimast.Node{
138
+ nativefactories.StatementFactory.Constant(nativefactories.StatementFactory_ConstantProps{
139
+ Name: "validate",
140
+ Value: nativeprogrammers.ValidateProgrammer.Write(nativeprogrammers.ValidateProgrammer_IProps{
141
+ Context: context,
142
+ Modulo: modulo,
143
+ Type: typ,
144
+ Name: name,
145
+ Config: nativeprogrammers.ValidateProgrammer_IConfig{Equals: false},
146
+ }),
147
+ }),
148
+ nativefactories.StatementFactory.Constant(nativefactories.StatementFactory_ConstantProps{
149
+ Name: "query",
150
+ Value: nestiaCoreHttpQuerifyProgrammer(prog, ec, typ),
151
+ }),
152
+ nativefactories.StatementFactory.Constant(nativefactories.StatementFactory_ConstantProps{
153
+ Name: "output",
154
+ Value: nestiaCoreCall("query", nestiaCoreFactory.NewIdentifier("input")),
155
+ }),
156
+ nestiaCoreFactory.NewReturnStatement(nestiaCoreFactory.NewAsExpression(
157
+ nestiaCoreCall("validate", nestiaCoreFactory.NewIdentifier("output")),
158
+ nativefactories.TypeFactory.Keyword("any"),
159
+ )),
160
+ })
161
+ }
162
+
163
+ func nestiaCoreQueryWrapperArrow(statements []*shimast.Node) *shimast.Node {
164
+ return nestiaCoreFactory.NewArrowFunction(
165
+ nil,
166
+ nil,
167
+ nestiaCoreFactory.NewNodeList([]*shimast.Node{
168
+ nativefactories.IdentifierFactory.Parameter("input", nil, nil),
169
+ }),
170
+ nil,
171
+ nil,
172
+ nestiaCoreFactory.NewToken(shimast.KindEqualsGreaterThanToken),
173
+ nestiaCoreFactory.NewBlock(nestiaCoreFactory.NewNodeList(statements), true),
174
+ )
175
+ }
176
+
177
+ func nestiaCoreHttpQuerifyDecode(key string, value *schemametadata.MetadataSchema, ec *shimprinter.EmitContext) *shimast.Node {
178
+ if len(value.Arrays) != 0 {
179
+ return nestiaCoreFactory.NewCallExpression(
180
+ nativefactories.IdentifierFactory.Access(
181
+ ec,
182
+ nativefactories.IdentifierFactory.Access(ec, nestiaCoreFactory.NewIdentifier("input"), key),
183
+ "forEach",
184
+ ),
185
+ nil,
186
+ nil,
187
+ nestiaCoreFactory.NewNodeList([]*shimast.Node{
188
+ nestiaCoreFactory.NewArrowFunction(
189
+ nil,
190
+ nil,
191
+ nestiaCoreFactory.NewNodeList([]*shimast.Node{
192
+ nativefactories.IdentifierFactory.Parameter("elem", nil, nil),
193
+ }),
194
+ nil,
195
+ nil,
196
+ nestiaCoreFactory.NewToken(shimast.KindEqualsGreaterThanToken),
197
+ nestiaCoreHttpQuerifyAppend(key, nestiaCoreFactory.NewIdentifier("elem"), ec),
198
+ ),
199
+ }),
200
+ shimast.NodeFlagsNone,
201
+ )
202
+ }
203
+ return nestiaCoreHttpQuerifyAppend(
204
+ key,
205
+ nativefactories.IdentifierFactory.Access(ec, nestiaCoreFactory.NewIdentifier("input"), key),
206
+ ec,
207
+ )
208
+ }
209
+
210
+ func nestiaCoreHttpQuerifyAppend(key string, elem *shimast.Node, ec *shimprinter.EmitContext) *shimast.Node {
211
+ return nestiaCoreFactory.NewCallExpression(
212
+ nativefactories.IdentifierFactory.Access(ec, nestiaCoreFactory.NewIdentifier("output"), "append"),
213
+ nil,
214
+ nil,
215
+ nestiaCoreFactory.NewNodeList([]*shimast.Node{
216
+ nestiaCoreFactory.NewStringLiteral(key, shimast.TokenFlagsNone),
217
+ elem,
218
+ }),
219
+ shimast.NodeFlagsNone,
220
+ )
221
+ }
222
+
223
+ func nestiaCoreCall(name string, args ...*shimast.Node) *shimast.Node {
224
+ return nestiaCoreFactory.NewCallExpression(
225
+ nestiaCoreFactory.NewIdentifier(name),
226
+ nil,
227
+ nil,
228
+ nestiaCoreFactory.NewNodeList(args),
229
+ shimast.NodeFlagsNone,
230
+ )
231
+ }