typia 13.0.0-dev.20260521.1 → 13.0.0-dev.20260604.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 (91) hide show
  1. package/native/adapter/adapter.go +0 -149
  2. package/native/cmd/ttsc-typia/build.go +28 -90
  3. package/native/cmd/ttsc-typia/main.go +2 -2
  4. package/native/cmd/ttsc-typia/transform.go +132 -280
  5. package/native/core/context/ITypiaContext.go +9 -4
  6. package/native/core/{programmers → context}/ImportProgrammer.go +80 -5
  7. package/native/core/factories/ExpressionFactory.go +9 -21
  8. package/native/core/factories/IdentifierFactory.go +2 -2
  9. package/native/core/factories/JsonMetadataFactory.go +5 -7
  10. package/native/core/factories/LiteralFactory.go +43 -2
  11. package/native/core/factories/MetadataFactory.go +13 -17
  12. package/native/core/factories/ProtobufFactory.go +5 -7
  13. package/native/core/factories/TemplateFactory.go +4 -2
  14. package/native/core/factories/internal/metadata/MetadataHelper.go +72 -4
  15. package/native/core/factories/internal/metadata/iterate_metadata.go +1 -1
  16. package/native/core/factories/internal/metadata/iterate_metadata_constant.go +17 -1
  17. package/native/core/factories/internal/metadata/iterate_metadata_map.go +1 -1
  18. package/native/core/factories/internal/metadata/iterate_metadata_set.go +1 -1
  19. package/native/core/programmers/AssertProgrammer.go +6 -11
  20. package/native/core/programmers/IsProgrammer.go +1 -4
  21. package/native/core/programmers/RandomProgrammer.go +7 -13
  22. package/native/core/programmers/ValidateProgrammer.go +5 -10
  23. package/native/core/programmers/functional/FunctionalAssertFunctionProgrammer.go +1 -1
  24. package/native/core/programmers/functional/FunctionalValidateFunctionProgrammer.go +4 -7
  25. package/native/core/programmers/functional/FunctionalValidateParametersProgrammer.go +1 -1
  26. package/native/core/programmers/helpers/ModuloText.go +23 -0
  27. package/native/core/programmers/helpers/StringifyJoinder.go +1 -1
  28. package/native/core/programmers/http/HttpFormDataProgrammer.go +5 -12
  29. package/native/core/programmers/http/HttpHeadersProgrammer.go +2 -4
  30. package/native/core/programmers/http/HttpParameterProgrammer.go +3 -7
  31. package/native/core/programmers/http/HttpQueryProgrammer.go +4 -6
  32. package/native/core/programmers/http/HttpValidateFormDataProgrammer.go +1 -1
  33. package/native/core/programmers/internal/CheckerProgrammer.go +22 -21
  34. package/native/core/programmers/iterate/check_array_length.go +3 -4
  35. package/native/core/programmers/iterate/check_bigint.go +3 -4
  36. package/native/core/programmers/iterate/check_dynamic_key.go +1 -1
  37. package/native/core/programmers/iterate/check_dynamic_properties.go +1 -1
  38. package/native/core/programmers/iterate/check_number.go +3 -4
  39. package/native/core/programmers/iterate/check_string.go +3 -4
  40. package/native/core/programmers/iterate/feature_object_entries.go +2 -2
  41. package/native/core/programmers/iterate/json_schema_alias.go +1 -0
  42. package/native/core/programmers/iterate/json_schema_array.go +1 -0
  43. package/native/core/programmers/iterate/json_schema_native.go +48 -1
  44. package/native/core/programmers/iterate/json_schema_object.go +1 -0
  45. package/native/core/programmers/json/JsonApplicationProgrammer.go +6 -0
  46. package/native/core/programmers/json/JsonAssertParseProgrammer.go +5 -9
  47. package/native/core/programmers/json/JsonIsParseProgrammer.go +4 -9
  48. package/native/core/programmers/json/JsonSchemaProgrammer.go +1 -1
  49. package/native/core/programmers/json/JsonSchemasProgrammer.go +1 -1
  50. package/native/core/programmers/json/JsonStringifyProgrammer.go +5 -9
  51. package/native/core/programmers/json/JsonValidateParseProgrammer.go +3 -6
  52. package/native/core/programmers/json/JsonValidateStringifyProgrammer.go +1 -1
  53. package/native/core/programmers/llm/LlmApplicationProgrammer.go +5 -3
  54. package/native/core/programmers/llm/LlmControllerProgrammer.go +1 -2
  55. package/native/core/programmers/llm/LlmMetadataFactory.go +1 -2
  56. package/native/core/programmers/llm/LlmParametersProgrammer.go +1 -2
  57. package/native/core/programmers/llm/LlmParseProgrammer.go +3 -4
  58. package/native/core/programmers/llm/LlmSchemaProgrammer.go +5 -11
  59. package/native/core/programmers/llm/LlmStructuredOutputProgrammer.go +2 -2
  60. package/native/core/programmers/misc/MiscCloneProgrammer.go +6 -12
  61. package/native/core/programmers/misc/MiscLiteralsProgrammer.go +1 -2
  62. package/native/core/programmers/misc/MiscPruneProgrammer.go +1 -2
  63. package/native/core/programmers/misc/MiscValidateCloneProgrammer.go +1 -1
  64. package/native/core/programmers/misc/MiscValidatePruneProgrammer.go +1 -1
  65. package/native/core/programmers/notations/NotationGeneralProgrammer.go +6 -12
  66. package/native/core/programmers/notations/NotationValidateGeneralProgrammer.go +1 -1
  67. package/native/core/programmers/protobuf/ProtobufAssertEncodeProgrammer.go +1 -4
  68. package/native/core/programmers/protobuf/ProtobufDecodeProgrammer.go +9 -18
  69. package/native/core/programmers/protobuf/ProtobufEncodeProgrammer.go +9 -17
  70. package/native/core/programmers/protobuf/ProtobufMessageProgrammer.go +9 -15
  71. package/native/core/programmers/protobuf/ProtobufValidateDecodeProgrammer.go +1 -1
  72. package/native/core/programmers/protobuf/ProtobufValidateEncodeProgrammer.go +3 -5
  73. package/native/core/schemas/metadata/MetadataCollection.go +87 -30
  74. package/native/internal/printer/printer.go +5 -199
  75. package/native/transform/CallExpressionTransformer.go +6 -5
  76. package/native/transform/FileTransformer.go +41 -9
  77. package/native/transform/TypiaGenerator.go +1 -1
  78. package/native/transform/features/RandomTransformer.go +3 -2
  79. package/native/transform/features/json/JsonApplicationTransformer.go +1 -2
  80. package/native/transform/features/json/JsonSchemaTransformer.go +1 -2
  81. package/native/transform/features/json/JsonSchemasTransformer.go +1 -2
  82. package/native/transform/features/llm/LlmSchemaTransformer.go +1 -2
  83. package/native/transform/features/reflect/ReflectMetadataTransformer.go +1 -2
  84. package/native/transform/features/reflect/ReflectNameTransformer.go +1 -2
  85. package/native/transform/features/reflect/ReflectSchemaTransformer.go +1 -2
  86. package/native/transform/features/reflect/ReflectSchemasTransformer.go +1 -2
  87. package/native/transform/transform.go +7 -2
  88. package/package.json +5 -8
  89. package/native/adapter/cleanup.go +0 -243
  90. package/native/adapter/imports.go +0 -102
  91. package/native/cmd/ttsc-typia/transform_test.go +0 -40
@@ -1,18 +1,7 @@
1
1
  package adapter
2
2
 
3
3
  import (
4
- "fmt"
5
- "os"
6
- "regexp"
7
- "runtime/debug"
8
- "strings"
9
-
10
- shimast "github.com/microsoft/typescript-go/shim/ast"
11
- "github.com/samchon/ttsc/packages/ttsc/driver"
12
4
  nativecontext "github.com/samchon/typia/packages/typia/native/core/context"
13
- nativeprogrammers "github.com/samchon/typia/packages/typia/native/core/programmers"
14
- nativeprinter "github.com/samchon/typia/packages/typia/native/internal/printer"
15
- nativetransform "github.com/samchon/typia/packages/typia/native/transform"
16
5
  )
17
6
 
18
7
  type PluginOptions struct {
@@ -38,141 +27,3 @@ func boolPointer(value bool) *bool {
38
27
  }
39
28
  return &value
40
29
  }
41
-
42
- func EmitCallWithOptions(program *driver.Program, site CallSite, plugin PluginOptions) (text string, handled bool, err error) {
43
- return emitCallWithOptions(program, site, plugin, false)
44
- }
45
-
46
- func EmitCallWithOptionsPreservingTypes(program *driver.Program, site CallSite, plugin PluginOptions) (text string, handled bool, err error) {
47
- return emitCallWithOptions(program, site, plugin, true)
48
- }
49
-
50
- func emitCallWithOptions(program *driver.Program, site CallSite, plugin PluginOptions, preserveTypes bool) (text string, handled bool, err error) {
51
- if program == nil || program.Checker == nil || site.Call == nil {
52
- return "", false, nil
53
- }
54
- importer := nativeprogrammers.NewImportProgrammer(nativeprogrammers.ImportProgrammer_IOptions{
55
- InternalPrefix: "typia_transform_",
56
- Runtime: "typia",
57
- })
58
- context := nativecontext.ITypiaContext{
59
- Program: program,
60
- CompilerOptions: program.ParsedConfig.ParsedConfig.CompilerOptions,
61
- Checker: program.Checker,
62
- Options: plugin.TransformOptions(),
63
- Importer: importer,
64
- }
65
- defer func() {
66
- if exp := recover(); exp != nil {
67
- if e, ok := exp.(*nativetransform.TransformerError); ok {
68
- text = ""
69
- handled = true
70
- err = e
71
- return
72
- }
73
- text = ""
74
- handled = true
75
- if os.Getenv("TYPIA_NATIVE_DEBUG_STACK") != "" {
76
- err = fmt.Errorf("%v\n%s", exp, debug.Stack())
77
- } else {
78
- err = fmt.Errorf("%v", exp)
79
- }
80
- }
81
- }()
82
- var node *shimast.Node
83
- if site.Module != "" && site.Method != "" {
84
- node = nativetransform.CallExpressionTransformer.TransformKnown(nativetransform.CallExpressionTransformer_TransformKnownProps{
85
- Context: context,
86
- Expression: site.Call,
87
- Module: site.Module,
88
- Method: site.Method,
89
- })
90
- } else {
91
- node = nativetransform.CallExpressionTransformer.Transform(nativetransform.CallExpressionTransformer_TransformProps{
92
- Context: context,
93
- Expression: site.Call,
94
- })
95
- }
96
- if node == nil || node == site.Call.AsNode() {
97
- return "", false, nil
98
- }
99
- if preserveTypes {
100
- return cleanupPrintedExpression(nativeprinter.EmitPreservingTypesWithIdentifierSubstitutions(
101
- node,
102
- site.File,
103
- nil,
104
- )), true, nil
105
- }
106
- return cleanupPrintedExpression(nativeprinter.EmitWithIdentifierSubstitutions(
107
- node,
108
- site.File,
109
- identifierSubstitutionsForEmit(program, site.File),
110
- )), true, nil
111
- }
112
-
113
- func identifierSubstitutionsForEmit(program *driver.Program, file any) map[string]string {
114
- if program == nil ||
115
- program.ParsedConfig == nil ||
116
- program.ParsedConfig.ParsedConfig == nil ||
117
- program.ParsedConfig.ParsedConfig.CompilerOptions == nil ||
118
- program.ParsedConfig.ParsedConfig.CompilerOptions.GetEmitModuleKind().String() != "CommonJS" {
119
- return nil
120
- }
121
- sourceFile, ok := file.(*shimast.SourceFile)
122
- if ok == false {
123
- return nil
124
- }
125
- return commonJSImportIdentifierSubstitutions(sourceFile)
126
- }
127
-
128
- func cleanupPrintedExpression(text string) string {
129
- text = strings.TrimSpace(text)
130
- text = strings.TrimSuffix(text, ";")
131
- text = parenthesizeSingleParameterArrows(text)
132
- if strings.HasPrefix(text, "(") && strings.HasSuffix(text, ")") {
133
- return text
134
- }
135
- if strings.Contains(text, "=>") || strings.Contains(text, "function") {
136
- return "(" + text + ")"
137
- }
138
- return text
139
- }
140
-
141
- var singleParameterArrowPattern = regexp.MustCompile(`(^|[\s(=,:?])([A-Za-z_$][A-Za-z0-9_$]*) =>`)
142
-
143
- func parenthesizeSingleParameterArrows(text string) string {
144
- return singleParameterArrowPattern.ReplaceAllString(text, `${1}(${2}) =>`)
145
- }
146
-
147
- func UnsupportedReason(site CallSite) string {
148
- if site.Call == nil {
149
- return "invalid call expression"
150
- }
151
- if site.Call.TypeArguments == nil || len(site.Call.TypeArguments.Nodes) == 0 {
152
- switch site.Module {
153
- case "module":
154
- switch site.Method {
155
- case "assert", "assertEquals", "assertGuard", "assertGuardEquals", "assertType", "equals", "is", "validate", "validateEquals":
156
- return ""
157
- }
158
- case "json":
159
- switch site.Method {
160
- case "stringify", "assertStringify", "isStringify", "validateStringify":
161
- return ""
162
- }
163
- }
164
- return "generic argument is not specified."
165
- }
166
- return ""
167
- }
168
-
169
- func FormatTransformError(site CallSite, err error) string {
170
- if err == nil {
171
- return ""
172
- }
173
- code := "typia." + site.Method
174
- if site.Module != "" {
175
- code = "typia." + site.Module + "." + site.Method
176
- }
177
- return fmt.Sprintf("error TS(%s): %s", code, err.Error())
178
- }
@@ -9,10 +9,13 @@ import (
9
9
  "path/filepath"
10
10
  "regexp"
11
11
 
12
+ shimast "github.com/microsoft/typescript-go/shim/ast"
12
13
  shimcompiler "github.com/microsoft/typescript-go/shim/compiler"
13
- shimscanner "github.com/microsoft/typescript-go/shim/scanner"
14
+ shimprinter "github.com/microsoft/typescript-go/shim/printer"
14
15
  "github.com/samchon/ttsc/packages/ttsc/driver"
15
16
  typiaadapter "github.com/samchon/typia/packages/typia/native/adapter"
17
+ nativecontext "github.com/samchon/typia/packages/typia/native/core/context"
18
+ nativetransform "github.com/samchon/typia/packages/typia/native/transform"
16
19
  )
17
20
 
18
21
  func runBuild(args []string) int {
@@ -71,30 +74,35 @@ func runBuild(args []string) int {
71
74
  return 2
72
75
  }
73
76
 
74
- rewrites := driver.NewRewriteSet()
75
- transformDiags := []typiaTransformDiagnostic{}
76
- sites, recognized := 0, 0
77
77
  shouldEmit := !prog.ParsedConfig.ParsedConfig.CompilerOptions.NoEmit.IsTrue()
78
- if *rewriteMode == "typia" {
79
- sites, recognized, transformDiags = collectTypiaRewrites(
80
- prog,
81
- cwd,
82
- shouldEmit,
83
- *quiet,
84
- "",
85
- rewrites,
86
- readTypiaPluginOptions(cwd, *tsconfigPath),
87
- )
78
+ transformDiags := []typiaTransformDiagnostic{}
79
+ pluginOptions := readTypiaPluginOptions(cwd, *tsconfigPath)
80
+ transformOptions := pluginOptions.TransformOptions()
81
+ extras := nativecontext.ITypiaContext_Extras{
82
+ AddDiagnostic: func(diag *shimast.Diagnostic) int {
83
+ transformDiags = append(transformDiags, typiaTransformDiagnostic{Message: "typia transform error"})
84
+ return len(transformDiags)
85
+ },
86
+ }
87
+ // AST-integration emit: typia's per-file transformer runs inside tsgo's emit
88
+ // pipeline (sharing the EmitContext), so it returns AST and tsgo's module-
89
+ // transform aliases the injected namespace imports. No text-splice RewriteSet.
90
+ typiaTransform := func(ec *shimprinter.EmitContext, sf *shimast.SourceFile) *shimast.SourceFile {
91
+ if *rewriteMode != "typia" {
92
+ return sf
93
+ }
94
+ return nativetransform.Transform(prog, &transformOptions, extras, ec)(sf)
88
95
  }
89
96
  if !*quiet {
90
- fmt.Fprintf(stdout, "// ttsc-typia build: tsconfig=%s cwd=%s sites=%d emit=%v rewrite=%s\n", *tsconfigPath, cwd, sites, shouldEmit, *rewriteMode)
97
+ fmt.Fprintf(stdout, "// ttsc-typia build: tsconfig=%s cwd=%s emit=%v rewrite=%s\n", *tsconfigPath, cwd, shouldEmit, *rewriteMode)
91
98
  }
92
99
  if shouldEmit {
100
+ emitted := []string{}
93
101
  writeFile := shimcompiler.WriteFile(func(fileName, text string, data *shimcompiler.WriteFileData) error {
94
- text = typiaadapter.CleanupTransformedText(text)
102
+ emitted = append(emitted, fileName)
95
103
  return driver.DefaultWriteFile(fileName, text)
96
104
  })
97
- res, eDiags, err := prog.EmitAll(rewrites, writeFile)
105
+ eDiags, err := prog.EmitWithPluginTransformers([]driver.PluginTransform{typiaTransform}, writeFile)
98
106
  if err != nil {
99
107
  fmt.Fprintf(stderr, "ttsc-typia build: emit failed: %v\n", err)
100
108
  return 3
@@ -103,8 +111,8 @@ func runBuild(args []string) int {
103
111
  fmt.Fprintln(stderr, " -", d.String())
104
112
  }
105
113
  if !*quiet {
106
- fmt.Fprintf(stdout, "// ttsc-typia build: emitted=%d files\n", len(res.EmittedFiles))
107
- for _, f := range res.EmittedFiles {
114
+ fmt.Fprintf(stdout, "// ttsc-typia build: emitted=%d files\n", len(emitted))
115
+ for _, f := range emitted {
108
116
  rel := f
109
117
  if abs, err := filepath.Rel(cwd, f); err == nil {
110
118
  rel = abs
@@ -113,7 +121,7 @@ func runBuild(args []string) int {
113
121
  }
114
122
  }
115
123
  if *manifestPath != "" {
116
- data, err := json.Marshal(res.EmittedFiles)
124
+ data, err := json.Marshal(emitted)
117
125
  if err != nil {
118
126
  fmt.Fprintf(stderr, "ttsc-typia build: manifest marshal failed: %v\n", err)
119
127
  return 3
@@ -132,9 +140,6 @@ func runBuild(args []string) int {
132
140
  writeTypiaTransformDiagnostics(stderr, transformDiags, cwd)
133
141
  return 3
134
142
  }
135
- if !*quiet {
136
- fmt.Fprintf(stdout, "// ttsc-typia build: recognized=%d total=%d rewrites=%d\n", recognized, sites, rewrites.Len())
137
- }
138
143
  return 0
139
144
  }
140
145
 
@@ -163,73 +168,6 @@ func writeTypiaTransformDiagnostics(out io.Writer, diagnostics []typiaTransformD
163
168
  }
164
169
  }
165
170
 
166
- func newTypiaTransformDiagnostic(site typiaadapter.CallSite, message string) typiaTransformDiagnostic {
167
- line, column := 0, 0
168
- if site.File != nil && site.Call != nil {
169
- pos := site.Call.AsNode().Pos()
170
- if pos >= 0 {
171
- l, c := shimscanner.GetECMALineAndByteOffsetOfPosition(site.File, pos)
172
- line, column = l+1, c+1
173
- }
174
- }
175
- return typiaTransformDiagnostic{
176
- File: site.FilePath,
177
- Line: line,
178
- Column: column,
179
- Code: "typia." + site.Module + "." + site.Method,
180
- Message: message,
181
- }
182
- }
183
-
184
- func collectTypiaRewrites(
185
- prog *driver.Program,
186
- cwd string,
187
- emit bool,
188
- quiet bool,
189
- onlyFile string,
190
- rewrites *driver.RewriteSet,
191
- pluginOptions typiaadapter.PluginOptions,
192
- ) (int, int, []typiaTransformDiagnostic) {
193
- sites := typiaadapter.CollectCallSites(prog.SourceFiles(), prog.Checker)
194
- recognized := 0
195
- diagnostics := []typiaTransformDiagnostic{}
196
- for _, site := range sites {
197
- if onlyFile != "" && filepath.ToSlash(site.FilePath) != filepath.ToSlash(onlyFile) {
198
- continue
199
- }
200
- rel := site.FilePath
201
- if abs, err := filepath.Rel(cwd, rel); err == nil {
202
- rel = abs
203
- }
204
- if reason := typiaadapter.UnsupportedReason(site); reason != "" {
205
- diagnostics = append(diagnostics, newTypiaTransformDiagnostic(site, reason))
206
- continue
207
- }
208
- expr, handled, err := typiaadapter.EmitCallWithOptions(prog, site, pluginOptions)
209
- if !handled {
210
- diagnostics = append(diagnostics, newTypiaTransformDiagnostic(site, "method not covered"))
211
- continue
212
- }
213
- if err != nil {
214
- diagnostics = append(diagnostics, newTypiaTransformDiagnostic(site, err.Error()))
215
- continue
216
- }
217
- rewrites.Add(driver.Rewrite{
218
- File: site.File,
219
- RootName: site.RootName,
220
- Namespaces: site.Namespaces,
221
- Method: site.Method,
222
- Replacement: expr,
223
- ConsumeParens: true,
224
- })
225
- if !emit && !quiet {
226
- fmt.Fprintf(stdout, "%s: typia.%s<T> -> %s\n", rel, site.Method, expr)
227
- }
228
- recognized++
229
- }
230
- return len(sites), recognized, diagnostics
231
- }
232
-
233
171
  func readTypiaPluginOptions(cwd, tsconfigPath string) typiaadapter.PluginOptions {
234
172
  path := tsconfigPath
235
173
  if !filepath.IsAbs(path) {
@@ -41,10 +41,10 @@ func run(args []string) int {
41
41
  return runDemo(args[1:])
42
42
  case "build":
43
43
  return runBuild(args[1:])
44
- case "check":
45
- return runBuild(append([]string{"--noEmit"}, args[1:]...))
46
44
  case "transform":
47
45
  return runTransform(args[1:])
46
+ case "check":
47
+ return runBuild(append([]string{"--noEmit"}, args[1:]...))
48
48
  case "-p", "--project":
49
49
  if len(args) < 2 {
50
50
  fmt.Fprintln(stderr, "ttsc-typia: -p/--project requires a path argument")