typia 14.0.6 → 15.0.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/README.md +3 -0
  2. package/lib/http.d.ts +49 -24
  3. package/lib/http.js.map +1 -1
  4. package/lib/http.mjs.map +1 -1
  5. package/lib/internal/_createLlmEvaluation.d.ts +1 -0
  6. package/lib/internal/_createLlmEvaluation.js +486 -0
  7. package/lib/internal/_createLlmEvaluation.js.map +1 -0
  8. package/lib/internal/_createLlmEvaluation.mjs +382 -0
  9. package/lib/internal/_createLlmEvaluation.mjs.map +1 -0
  10. package/lib/internal/_httpFormDataReadBigint.js +7 -5
  11. package/lib/internal/_httpFormDataReadBigint.js.map +1 -1
  12. package/lib/internal/_httpFormDataReadBigint.mjs +1 -1
  13. package/lib/internal/_httpFormDataReadBigint.mjs.map +1 -1
  14. package/lib/internal/_httpFormDataReadBoolean.js +12 -10
  15. package/lib/internal/_httpFormDataReadBoolean.js.map +1 -1
  16. package/lib/internal/_httpFormDataReadBoolean.mjs +1 -1
  17. package/lib/internal/_httpFormDataReadBoolean.mjs.map +1 -1
  18. package/lib/internal/_httpFormDataReadNumber.js +7 -5
  19. package/lib/internal/_httpFormDataReadNumber.js.map +1 -1
  20. package/lib/internal/_httpFormDataReadNumber.mjs +1 -1
  21. package/lib/internal/_httpFormDataReadNumber.mjs.map +1 -1
  22. package/lib/internal/_httpFormDataReadString.d.ts +9 -1
  23. package/lib/internal/_httpFormDataReadString.js +10 -2
  24. package/lib/internal/_httpFormDataReadString.js.map +1 -1
  25. package/lib/internal/_httpFormDataReadString.mjs +9 -1
  26. package/lib/internal/_httpFormDataReadString.mjs.map +1 -1
  27. package/lib/internal/_httpHeaderReadBigint.js +5 -1
  28. package/lib/internal/_httpHeaderReadBigint.js.map +1 -1
  29. package/lib/internal/_httpHeaderReadBigint.mjs +2 -1
  30. package/lib/internal/_httpHeaderReadBigint.mjs.map +1 -1
  31. package/lib/internal/_httpHeaderReadNumber.js +5 -1
  32. package/lib/internal/_httpHeaderReadNumber.js.map +1 -1
  33. package/lib/internal/_httpHeaderReadNumber.mjs +2 -1
  34. package/lib/internal/_httpHeaderReadNumber.mjs.map +1 -1
  35. package/lib/internal/_httpParameterReadBigint.js +4 -0
  36. package/lib/internal/_httpParameterReadBigint.js.map +1 -1
  37. package/lib/internal/_httpParameterReadBigint.mjs +1 -0
  38. package/lib/internal/_httpParameterReadBigint.mjs.map +1 -1
  39. package/lib/internal/_httpParameterReadNumber.js +4 -0
  40. package/lib/internal/_httpParameterReadNumber.js.map +1 -1
  41. package/lib/internal/_httpParameterReadNumber.mjs +1 -0
  42. package/lib/internal/_httpParameterReadNumber.mjs.map +1 -1
  43. package/lib/internal/_httpParameterReadString.d.ts +9 -1
  44. package/lib/internal/_httpParameterReadString.js +9 -1
  45. package/lib/internal/_httpParameterReadString.js.map +1 -1
  46. package/lib/internal/_httpParameterReadString.mjs +9 -1
  47. package/lib/internal/_httpParameterReadString.mjs.map +1 -1
  48. package/lib/internal/_httpQueryReadBigint.js +8 -1
  49. package/lib/internal/_httpQueryReadBigint.js.map +1 -1
  50. package/lib/internal/_httpQueryReadBigint.mjs +1 -1
  51. package/lib/internal/_httpQueryReadBigint.mjs.map +1 -1
  52. package/lib/internal/_httpQueryReadBoolean.js +4 -1
  53. package/lib/internal/_httpQueryReadBoolean.js.map +1 -1
  54. package/lib/internal/_httpQueryReadBoolean.mjs +1 -1
  55. package/lib/internal/_httpQueryReadBoolean.mjs.map +1 -1
  56. package/lib/internal/_httpQueryReadNumber.js +8 -1
  57. package/lib/internal/_httpQueryReadNumber.js.map +1 -1
  58. package/lib/internal/_httpQueryReadNumber.mjs +1 -1
  59. package/lib/internal/_httpQueryReadNumber.mjs.map +1 -1
  60. package/lib/internal/_httpQueryReadString.d.ts +9 -1
  61. package/lib/internal/_httpQueryReadString.js +9 -1
  62. package/lib/internal/_httpQueryReadString.js.map +1 -1
  63. package/lib/internal/_httpQueryReadString.mjs +9 -1
  64. package/lib/internal/_httpQueryReadString.mjs.map +1 -1
  65. package/lib/internal/_randomBigint.d.ts +12 -1
  66. package/lib/internal/_randomBigint.js +90 -2
  67. package/lib/internal/_randomBigint.js.map +1 -1
  68. package/lib/internal/_randomBigint.mjs +70 -2
  69. package/lib/internal/_randomBigint.mjs.map +1 -1
  70. package/lib/internal/_randomInteger.js +21 -12
  71. package/lib/internal/_randomInteger.js.map +1 -1
  72. package/lib/internal/_randomInteger.mjs +21 -16
  73. package/lib/internal/_randomInteger.mjs.map +1 -1
  74. package/lib/internal/_randomNumber.js +19 -10
  75. package/lib/internal/_randomNumber.js.map +1 -1
  76. package/lib/internal/_randomNumber.mjs +19 -14
  77. package/lib/internal/_randomNumber.mjs.map +1 -1
  78. package/lib/internal/_stringLengthGte.d.ts +1 -0
  79. package/lib/internal/_stringLengthGte.js +14 -0
  80. package/lib/internal/_stringLengthGte.js.map +1 -0
  81. package/lib/internal/_stringLengthGte.mjs +11 -0
  82. package/lib/internal/_stringLengthGte.mjs.map +1 -0
  83. package/lib/internal/_stringLengthLte.d.ts +1 -0
  84. package/lib/internal/_stringLengthLte.js +14 -0
  85. package/lib/internal/_stringLengthLte.js.map +1 -0
  86. package/lib/internal/_stringLengthLte.mjs +11 -0
  87. package/lib/internal/_stringLengthLte.mjs.map +1 -0
  88. package/lib/llm.d.ts +54 -1
  89. package/lib/llm.js +5 -0
  90. package/lib/llm.js.map +1 -1
  91. package/lib/llm.mjs +6 -1
  92. package/lib/llm.mjs.map +1 -1
  93. package/lib/re-exports.d.ts +1 -1
  94. package/lib/re-exports.js.map +1 -1
  95. package/native/cmd/ttsc-typia/build.go +2 -0
  96. package/native/cmd/ttsc-typia/dynamic_key_tags_transform_test.go +1 -1
  97. package/native/cmd/ttsc-typia/llm_evaluation_accepts_property_probability_test.go +27 -0
  98. package/native/cmd/ttsc-typia/llm_evaluation_accepts_unselected_source_probability_test.go +26 -0
  99. package/native/cmd/ttsc-typia/llm_evaluation_complete_object_shape_test.go +96 -0
  100. package/native/cmd/ttsc-typia/llm_evaluation_ignores_declaration_probability_without_call_test.go +18 -0
  101. package/native/cmd/ttsc-typia/llm_evaluation_plan_emission_transform_test.go +90 -0
  102. package/native/cmd/ttsc-typia/llm_evaluation_program_scan_dependencies_test.go +69 -0
  103. package/native/cmd/ttsc-typia/llm_evaluation_rejects_alias_comment_test.go +44 -0
  104. package/native/cmd/ttsc-typia/llm_evaluation_rejects_alias_refinement_test.go +45 -0
  105. package/native/cmd/ttsc-typia/llm_evaluation_rejects_computed_method_probability_test.go +30 -0
  106. package/native/cmd/ttsc-typia/llm_evaluation_rejects_imported_declaration_probability_test.go +48 -0
  107. package/native/cmd/ttsc-typia/llm_evaluation_rejects_invalid_probability_test.go +208 -0
  108. package/native/cmd/ttsc-typia/llm_evaluation_rejects_refinements_test.go +94 -0
  109. package/native/cmd/ttsc-typia/llm_evaluation_rejects_undecidable_types_test.go +232 -0
  110. package/native/cmd/ttsc-typia/metadata_type_tag_sole_malformed_diagnostic_test.go +94 -0
  111. package/native/cmd/ttsc-typia/random_recursive_min_items_diagnostic_test.go +18 -1
  112. package/native/cmd/ttsc-typia/template_literal_type_tags_transform_test.go +3 -2
  113. package/native/cmd/ttsc-typia/transform.go +2 -0
  114. package/native/cmd/ttsc-typia/transform_helpers_test.go +17 -3
  115. package/native/core/context/ITypiaContext.go +4 -0
  116. package/native/core/factories/ExpressionFactory.go +16 -1
  117. package/native/core/factories/IdentifierFactory.go +10 -0
  118. package/native/core/factories/LiteralFactory.go +16 -0
  119. package/native/core/factories/MetadataCommentTagFactory.go +185 -35
  120. package/native/core/factories/MetadataTypeTagFactory.go +97 -24
  121. package/native/core/factories/MetadataTypeTagSchemaFactory.go +5 -0
  122. package/native/core/factories/expression_factory_number_spells_non_finite_values_test.go +69 -0
  123. package/native/core/factories/internal/metadata/IMetadataIteratorProps.go +6 -2
  124. package/native/core/factories/internal/metadata/emplace_metadata_object.go +49 -15
  125. package/native/core/factories/literal_factory_null_survives_objects_test.go +43 -0
  126. package/native/core/factories/metadata_comment_tag_factory_holds_bigint_tags_exact_test.go +168 -0
  127. package/native/core/factories/metadata_comment_tag_factory_reads_javascript_numbers_test.go +158 -0
  128. package/native/core/factories/metadata_comment_tag_factory_string_length_helpers_test.go +55 -0
  129. package/native/core/factories/metadata_type_tag_factory_reports_all_invalid_candidates_test.go +73 -0
  130. package/native/core/programmers/functional/FunctionalAssertParametersProgrammer.go +1 -3
  131. package/native/core/programmers/functional/FunctionalIsParametersProgrammer.go +107 -9
  132. package/native/core/programmers/functional/FunctionalValidateParametersProgrammer.go +1 -3
  133. package/native/core/programmers/http/HttpFormDataProgrammer.go +41 -2
  134. package/native/core/programmers/http/HttpHeadersProgrammer.go +56 -4
  135. package/native/core/programmers/http/HttpParameterProgrammer.go +1 -3
  136. package/native/core/programmers/http/HttpQueryProgrammer.go +26 -43
  137. package/native/core/programmers/iterate/json_schema_jsDocTags.go +10 -3
  138. package/native/core/programmers/iterate/json_schema_jsdoc_tags_cast_reads_javascript_numbers_test.go +64 -0
  139. package/native/core/programmers/llm/LlmApplicationProgrammer.go +1 -0
  140. package/native/core/programmers/llm/LlmEvaluationProgrammer.go +559 -0
  141. package/native/core/programmers/llm/LlmParametersProgrammer.go +6 -5
  142. package/native/core/programmers/llm/LlmReferenceDescription.go +113 -0
  143. package/native/core/programmers/llm/LlmSchemaProgrammer.go +34 -4
  144. package/native/core/programmers/llm/llm_reference_description_test.go +134 -0
  145. package/native/core/schemas/metadata/MetadataDependency.go +9 -0
  146. package/native/core/utils/NumberUtil.go +195 -0
  147. package/native/core/utils/number_util_rational_keeps_written_value_test.go +62 -0
  148. package/native/core/utils/number_util_reads_javascript_number_grammar_test.go +147 -0
  149. package/native/transform/CallExpressionTransformer.go +1 -0
  150. package/native/transform/FileTransformer.go +5 -0
  151. package/native/transform/features/llm/LlmEvaluationProbabilityDeclarations.go +94 -0
  152. package/native/transform/features/llm/LlmEvaluationProbabilityDeclarations_test.go +50 -0
  153. package/native/transform/features/llm/LlmEvaluationTransformer.go +59 -0
  154. package/native/transform/features/llm/LlmSchemaTransformer.go +14 -11
  155. package/native/transform/features/llm/llm_transformer_entry_coverage_test.go +29 -27
  156. package/package.json +3 -3
  157. package/src/http.ts +61 -34
  158. package/src/internal/_createLlmEvaluation.ts +678 -0
  159. package/src/internal/_httpFormDataReadBigint.ts +3 -1
  160. package/src/internal/_httpFormDataReadBoolean.ts +3 -1
  161. package/src/internal/_httpFormDataReadNumber.ts +3 -1
  162. package/src/internal/_httpFormDataReadString.ts +10 -1
  163. package/src/internal/_httpHeaderReadBigint.ts +6 -1
  164. package/src/internal/_httpHeaderReadNumber.ts +6 -1
  165. package/src/internal/_httpParameterReadBigint.ts +3 -0
  166. package/src/internal/_httpParameterReadNumber.ts +3 -0
  167. package/src/internal/_httpParameterReadString.ts +12 -2
  168. package/src/internal/_httpQueryReadBigint.ts +7 -1
  169. package/src/internal/_httpQueryReadBoolean.ts +3 -1
  170. package/src/internal/_httpQueryReadNumber.ts +7 -1
  171. package/src/internal/_httpQueryReadString.ts +10 -1
  172. package/src/internal/_randomBigint.ts +111 -3
  173. package/src/internal/_randomInteger.ts +31 -16
  174. package/src/internal/_randomNumber.ts +23 -12
  175. package/src/internal/_stringLengthGte.ts +6 -0
  176. package/src/internal/_stringLengthLte.ts +6 -0
  177. package/src/llm.ts +64 -0
  178. package/src/re-exports.ts +1 -0
@@ -0,0 +1,147 @@
1
+ package utils
2
+
3
+ import (
4
+ "math"
5
+ "testing"
6
+ )
7
+
8
+ // TestNumberUtilReadsJavaScriptNumberGrammar verifies NumberUtil.Read against
9
+ // JavaScript's `Number()`.
10
+ //
11
+ // Tag values and JSDoc extensions are TypeScript source, so the grammar that
12
+ // reads them is JavaScript's StringNumericLiteral. The expectations below are
13
+ // what `Number(text)` returns in JavaScript (samchon/typia#2442), not what the
14
+ // Go float parser accepts; the Go-only spellings (`NaN`, `Inf`, `0x1p4`,
15
+ // `1_000`) are the cases that used to leak through. Text without digits is the
16
+ // one deliberate difference: `Number("")` is 0, but it names no number here.
17
+ //
18
+ // 1. Read decimal, signed, exponent, and point-edge spellings.
19
+ // 2. Read hexadecimal, octal, and binary integers, and reject signed ones.
20
+ // 3. Classify `Infinity`, overflow, and underflow by finiteness.
21
+ // 4. Reject Go-only spellings, separators, and empty or blank text.
22
+ // 5. Spell values back exactly as JavaScript's `String()` does.
23
+ // 6. Read integer spellings exactly, beyond double precision.
24
+ func TestNumberUtilReadsJavaScriptNumberGrammar(t *testing.T) {
25
+ finite := func(value float64) NumberUtil_Reading {
26
+ return NumberUtil_Reading{Value: value, Numeric: true, Finite: true}
27
+ }
28
+ infinite := func(sign int) NumberUtil_Reading {
29
+ return NumberUtil_Reading{Value: math.Inf(sign), Numeric: true, Finite: false}
30
+ }
31
+ invalid := NumberUtil_Reading{}
32
+ for _, item := range []struct {
33
+ text string
34
+ expected NumberUtil_Reading
35
+ }{
36
+ // Decimal notation, including every point and sign edge `Number()` admits.
37
+ {"0", finite(0)},
38
+ {"3", finite(3)},
39
+ {"-2.5", finite(-2.5)},
40
+ {"+5", finite(5)},
41
+ {".5", finite(0.5)},
42
+ {"5.", finite(5)},
43
+ {"1e3", finite(1000)},
44
+ {"1E-3", finite(0.001)},
45
+ {"-0", finite(0)},
46
+ {" 12\t", finite(12)},
47
+ {"\u00a012\u2028", finite(12)},
48
+ {"007", finite(7)},
49
+ // Non-decimal integers: unsigned only, any letter case in the prefix.
50
+ {"0x10", finite(16)},
51
+ {"0XfF", finite(255)},
52
+ {"0o7", finite(7)},
53
+ {"0b101", finite(5)},
54
+ {"-0x10", invalid},
55
+ {"+0x10", invalid},
56
+ {"0o8", invalid},
57
+ {"0b2", invalid},
58
+ {"0x", invalid},
59
+ // Non-finite values are numeric but not finite.
60
+ {"Infinity", infinite(1)},
61
+ {"+Infinity", infinite(1)},
62
+ {"-Infinity", infinite(-1)},
63
+ {"1e400", infinite(1)},
64
+ {"-1e400", infinite(-1)},
65
+ {"1e-400", finite(0)},
66
+ // Go-only spellings and separators: NaN in JavaScript.
67
+ {"NaN", invalid},
68
+ {"nan", invalid},
69
+ {"Inf", invalid},
70
+ {"inf", invalid},
71
+ {"-inf", invalid},
72
+ {"infinity", invalid},
73
+ {"0x1p4", invalid},
74
+ {"1_000", invalid},
75
+ {"1e", invalid},
76
+ {".", invalid},
77
+ {"1.2.3", invalid},
78
+ {"12px", invalid},
79
+ // No digits at all.
80
+ {"", invalid},
81
+ {" ", invalid},
82
+ {"+", invalid},
83
+ } {
84
+ actual := NumberUtil.Read(item.text)
85
+ if actual != item.expected || math.Signbit(actual.Value) != math.Signbit(item.expected.Value) {
86
+ t.Fatalf("Read(%q) = %+v, expected %+v", item.text, actual, item.expected)
87
+ }
88
+ }
89
+
90
+ // String: the oracle is JavaScript's `String(value)`.
91
+ for _, item := range []struct {
92
+ value float64
93
+ expected string
94
+ }{
95
+ {0, "0"},
96
+ {math.Copysign(0, -1), "0"},
97
+ {16, "16"},
98
+ {-2.5, "-2.5"},
99
+ {0.001, "0.001"},
100
+ {0.000001, "0.000001"},
101
+ {1e6, "1000000"},
102
+ {123456789012345680000, "123456789012345680000"},
103
+ {1e21, "1e+21"},
104
+ {1e-7, "1e-7"},
105
+ {-1e-7, "-1e-7"},
106
+ {1.23e-18, "1.23e-18"},
107
+ {1.5e300, "1.5e+300"},
108
+ {9007199254740993, "9007199254740992"},
109
+ {math.NaN(), "NaN"},
110
+ {math.Inf(1), "Infinity"},
111
+ {math.Inf(-1), "-Infinity"},
112
+ } {
113
+ if actual := NumberUtil.String(item.value); actual != item.expected {
114
+ t.Fatalf("String(%v) = %q, expected %q", item.value, actual, item.expected)
115
+ }
116
+ }
117
+
118
+ // Integer: exact digits for integer spellings, nothing for the rest.
119
+ for _, item := range []struct {
120
+ text string
121
+ expected string
122
+ ok bool
123
+ }{
124
+ {"9007199254740993", "9007199254740993", true},
125
+ {"-12", "-12", true},
126
+ {"+5", "5", true},
127
+ {"007", "7", true},
128
+ {"-0", "0", true},
129
+ {" 42 ", "42", true},
130
+ {"0x10", "16", true},
131
+ {"0b101", "5", true},
132
+ {"0o17", "15", true},
133
+ {"0xffffffffffffffffff", "4722366482869645213695", true},
134
+ {"1e3", "", false},
135
+ {"1.0", "", false},
136
+ {"-0x10", "", false},
137
+ {"0o8", "", false},
138
+ {"", "", false},
139
+ {"Infinity", "", false},
140
+ } {
141
+ integer, ok := NumberUtil.Integer(item.text)
142
+ if ok != item.ok || (ok && integer.String() != item.expected) {
143
+ t.Fatalf("Integer(%q) = %v, %v; expected %q, %v", item.text, integer, ok, item.expected, item.ok)
144
+ }
145
+ }
146
+
147
+ }
@@ -469,6 +469,7 @@ func callExpressionTransformer_createFunctors() map[string]map[string]callExpres
469
469
  "structuredOutput": func() callExpressionTransformerTask {
470
470
  return nativellmtransformers.LlmStructuredOutputTransformer.Transform
471
471
  },
472
+ "evaluation": func() callExpressionTransformerTask { return nativellmtransformers.LlmEvaluationTransformer.Transform },
472
473
  "parameters": func() callExpressionTransformerTask { return nativellmtransformers.LlmParametersTransformer.Transform },
473
474
  "schema": func() callExpressionTransformerTask { return nativellmtransformers.LlmSchemaTransformer.Transform },
474
475
  "parse": func() callExpressionTransformerTask { return nativellmtransformers.LlmParseTransformer.Transform },
@@ -33,6 +33,10 @@ var fileTransformer_factory = shimast.NewNodeFactory(shimast.NodeFactoryHooks{})
33
33
  var fileTransformer_jsDocParsingMode sync.Map
34
34
 
35
35
  func (fileTransformerNamespace) Transform(environments FileTransformer_IEnvironments) func(transformer any) FileTransformer_Type {
36
+ shared := environments.Extras.Shared
37
+ if shared == nil {
38
+ shared = &sync.Map{}
39
+ }
36
40
  return func(transformer any) FileTransformer_Type {
37
41
  return func(file *shimast.SourceFile) *shimast.SourceFile {
38
42
  if file == nil || file.IsDeclarationFile {
@@ -53,6 +57,7 @@ func (fileTransformerNamespace) Transform(environments FileTransformer_IEnvironm
53
57
  Emit: environments.EmitContext,
54
58
  Importer: importer,
55
59
  Extras: environments.Extras,
60
+ Shared: shared,
56
61
  }
57
62
  _ = transformer
58
63
  fileTransformer_checkJsDocParsingMode(context, file)
@@ -0,0 +1,94 @@
1
+ package llm
2
+
3
+ import (
4
+ "fmt"
5
+ "strings"
6
+ "sync"
7
+
8
+ shimast "github.com/microsoft/typescript-go/shim/ast"
9
+ nativecontext "github.com/samchon/typia/packages/typia/native/core/context"
10
+ nativellmprogrammers "github.com/samchon/typia/packages/typia/native/core/programmers/llm"
11
+ )
12
+
13
+ func llmEvaluation_cachedDeclarationProbabilityErrors(context nativecontext.ITypiaContext) []nativellmprogrammers.LlmEvaluationProgrammer_IError {
14
+ if context.Program == nil {
15
+ return nil
16
+ }
17
+ return llmEvaluation_onceDeclarationProbabilityErrors(context.Shared, func() []nativellmprogrammers.LlmEvaluationProgrammer_IError {
18
+ return llmEvaluation_declarationProbabilityErrors(context.Program.SourceFiles())
19
+ })
20
+ }
21
+
22
+ func llmEvaluation_onceDeclarationProbabilityErrors(shared *sync.Map, analyze func() []nativellmprogrammers.LlmEvaluationProgrammer_IError) []nativellmprogrammers.LlmEvaluationProgrammer_IError {
23
+ if shared == nil {
24
+ return analyze()
25
+ }
26
+ cached, _ := shared.LoadOrStore("llm.evaluation.probability.declarations", sync.OnceValue(analyze))
27
+ return cached.(func() []nativellmprogrammers.LlmEvaluationProgrammer_IError)()
28
+ }
29
+
30
+ // Primitive aliases lose their declaration identity when TypeScript resolves
31
+ // them (boolean aliases become the same boolean type). Consequently, no walk
32
+ // of the resolved evaluation type can reliably distinguish a used annotation
33
+ // from an unused one. Validate tag placement syntactically across a program
34
+ // that uses llm.evaluation: only properties and enum members can carry it.
35
+ func llmEvaluation_declarationProbabilityErrors(files []*shimast.SourceFile) []nativellmprogrammers.LlmEvaluationProgrammer_IError {
36
+ errors := []nativellmprogrammers.LlmEvaluationProgrammer_IError{}
37
+ for _, file := range files {
38
+ if file == nil || !strings.Contains(file.Text(), "@probability") {
39
+ continue
40
+ }
41
+ var walk func(*shimast.Node)
42
+ walk = func(node *shimast.Node) {
43
+ if node == nil {
44
+ return
45
+ }
46
+ allowed := node.Kind == shimast.KindPropertySignature ||
47
+ node.Kind == shimast.KindPropertyDeclaration ||
48
+ node.Kind == shimast.KindGetAccessor ||
49
+ node.Kind == shimast.KindSetAccessor ||
50
+ node.Kind == shimast.KindEnumMember
51
+ if !allowed {
52
+ for _, doc := range node.JSDoc(nil) {
53
+ parsed := doc.AsJSDoc()
54
+ if parsed == nil || parsed.Tags == nil {
55
+ continue
56
+ }
57
+ for _, tag := range parsed.Tags.Nodes {
58
+ if tag != nil && tag.TagName() != nil && tag.TagName().Text() == "probability" {
59
+ name := "<anonymous>"
60
+ if identifier := node.Name(); identifier != nil {
61
+ switch identifier.Kind {
62
+ case shimast.KindIdentifier, shimast.KindStringLiteral, shimast.KindNumericLiteral, shimast.KindNoSubstitutionTemplateLiteral:
63
+ name = identifier.Text()
64
+ }
65
+ }
66
+ kind := "declaration"
67
+ switch node.Kind {
68
+ case shimast.KindTypeAliasDeclaration:
69
+ kind = "type alias"
70
+ case shimast.KindInterfaceDeclaration:
71
+ kind = "interface"
72
+ case shimast.KindClassDeclaration, shimast.KindClassExpression:
73
+ kind = "class"
74
+ case shimast.KindEnumDeclaration:
75
+ kind = "enum"
76
+ }
77
+ errors = append(errors, nativellmprogrammers.LlmEvaluationProgrammer_IError{
78
+ Accessor: "$input",
79
+ Message: fmt.Sprintf("LLM evaluation @probability on %s %s in %s is unsupported; put it on a decision property or enum member.", kind, name, file.FileName()),
80
+ })
81
+ break
82
+ }
83
+ }
84
+ }
85
+ }
86
+ node.ForEachChild(func(child *shimast.Node) bool {
87
+ walk(child)
88
+ return false
89
+ })
90
+ }
91
+ walk(file.AsNode())
92
+ }
93
+ return errors
94
+ }
@@ -0,0 +1,50 @@
1
+ package llm
2
+
3
+ import (
4
+ "sync"
5
+ "sync/atomic"
6
+ "testing"
7
+
8
+ nativellmprogrammers "github.com/samchon/typia/packages/typia/native/core/programmers/llm"
9
+ )
10
+
11
+ // TestLlmEvaluationDeclarationProbabilityCache verifies one placement scan
12
+ // runs for every transform invocation sharing a program cache.
13
+ //
14
+ // File callbacks can run concurrently and must receive the same diagnostic
15
+ // result without redoing the program-wide scan. A new program gets a new map.
16
+ //
17
+ // 1. Read the result concurrently through one shared map.
18
+ // 2. Require one calculation and identical diagnostics for every reader.
19
+ // 3. Require a fresh map and an uncached call to calculate independently.
20
+ func TestLlmEvaluationDeclarationProbabilityCache(t *testing.T) {
21
+ var calls atomic.Int32
22
+ analyze := func() []nativellmprogrammers.LlmEvaluationProgrammer_IError {
23
+ calls.Add(1)
24
+ return []nativellmprogrammers.LlmEvaluationProgrammer_IError{{
25
+ Accessor: "$input",
26
+ Message: "unsupported declaration",
27
+ }}
28
+ }
29
+ shared := &sync.Map{}
30
+ var group sync.WaitGroup
31
+ for range 16 {
32
+ group.Add(1)
33
+ go func() {
34
+ defer group.Done()
35
+ errors := llmEvaluation_onceDeclarationProbabilityErrors(shared, analyze)
36
+ if len(errors) != 1 || errors[0].Message != "unsupported declaration" {
37
+ t.Errorf("cached diagnostic changed: %+v", errors)
38
+ }
39
+ }()
40
+ }
41
+ group.Wait()
42
+ if count := calls.Load(); count != 1 {
43
+ t.Fatalf("one program must scan once, got %d scans", count)
44
+ }
45
+ llmEvaluation_onceDeclarationProbabilityErrors(&sync.Map{}, analyze)
46
+ llmEvaluation_onceDeclarationProbabilityErrors(nil, analyze)
47
+ if count := calls.Load(); count != 3 {
48
+ t.Fatalf("fresh and uncached programs must recalculate, got %d scans", count)
49
+ }
50
+ }
@@ -0,0 +1,59 @@
1
+ package llm
2
+
3
+ import (
4
+ shimast "github.com/microsoft/typescript-go/shim/ast"
5
+ nativefactories "github.com/samchon/typia/packages/typia/native/core/factories"
6
+ nativellmprogrammers "github.com/samchon/typia/packages/typia/native/core/programmers/llm"
7
+ schemametadata "github.com/samchon/typia/packages/typia/native/core/schemas/metadata"
8
+ nativetransform "github.com/samchon/typia/packages/typia/native/transform/internal"
9
+ )
10
+
11
+ type llmEvaluationTransformerNamespace struct{}
12
+
13
+ var LlmEvaluationTransformer = llmEvaluationTransformerNamespace{}
14
+
15
+ func (llmEvaluationTransformerNamespace) Transform(props nativetransform.ITransformProps) *shimast.Node {
16
+ top, typ, ok := llmTransformer_type_argument(props, "typia.llm.evaluation")
17
+ if ok == false {
18
+ return props.Expression.AsNode()
19
+ }
20
+ if typ != nil && typ.IsTypeParameter() {
21
+ panic(nativetransform.NewTransformerError(nativetransform.TransformerError_IProps{Code: "typia.llm.evaluation", Message: "non-specified generic argument."}))
22
+ }
23
+ metadata := llmTransformer_analyze(llmTransformer_analyzeProps{
24
+ Context: props.Context,
25
+ Type: typ,
26
+ Code: "typia.llm.evaluation",
27
+ Absorb: true,
28
+ StrictObjectMembers: true,
29
+ Validate: func(struct {
30
+ Metadata *schemametadata.MetadataSchema
31
+ Explore nativefactories.MetadataFactory_IExplore
32
+ Top *schemametadata.MetadataSchema
33
+ }) []string {
34
+ return nil
35
+ },
36
+ })
37
+ plan, errors := nativellmprogrammers.LlmEvaluationProgrammer.Compose(metadata)
38
+ errors = append(errors, llmEvaluation_cachedDeclarationProbabilityErrors(props.Context)...)
39
+ // The placement scan depends on every program source, including files with
40
+ // no tag today: adding one later must invalidate a cached successful emit.
41
+ if props.Context.Program != nil && schemametadata.MetadataDependency_active(props.Context.Checker) {
42
+ for _, file := range props.Context.Program.SourceFiles() {
43
+ if file != nil {
44
+ schemametadata.MetadataDependency_touchFile(props.Context.Checker, file.FileName())
45
+ }
46
+ }
47
+ }
48
+ if len(errors) != 0 {
49
+ panic(nativetransform.NewTransformerError(nativetransform.TransformerError_IProps{
50
+ Code: "typia.llm.evaluation",
51
+ Message: nativellmprogrammers.LlmEvaluationProgrammer.Message(errors),
52
+ }))
53
+ }
54
+ return nativellmprogrammers.LlmEvaluationProgrammer.Write(nativellmprogrammers.LlmEvaluationProgrammer_IWriteProps{
55
+ Context: props.Context,
56
+ Metadata: metadata,
57
+ Name: llmTransformer_type_name(top),
58
+ }, plan)
59
+ }
@@ -68,12 +68,13 @@ func (llmSchemaTransformerNamespace) Transform(props nativetransform.ITransformP
68
68
  }
69
69
 
70
70
  type llmTransformer_analyzeProps struct {
71
- Context nativecontext.ITypiaContext
72
- Type *shimchecker.Type
73
- Code string
74
- Absorb bool
75
- Functional bool
76
- Validate func(props struct {
71
+ Context nativecontext.ITypiaContext
72
+ Type *shimchecker.Type
73
+ Code string
74
+ Absorb bool
75
+ Functional bool
76
+ StrictObjectMembers bool
77
+ Validate func(props struct {
77
78
  Metadata *schemametadata.MetadataSchema
78
79
  Explore nativefactories.MetadataFactory_IExplore
79
80
  Top *schemametadata.MetadataSchema
@@ -105,11 +106,13 @@ func llmTransformer_analyze(props llmTransformer_analyzeProps) *schemametadata.M
105
106
  result := nativefactories.MetadataFactory.Analyze(nativefactories.MetadataFactory_IProps{
106
107
  Checker: props.Context.Checker,
107
108
  Options: nativefactories.MetadataFactory_IOptions{
108
- Absorb: props.Absorb,
109
- Escape: true,
110
- Constant: true,
111
- Functional: props.Functional,
112
- Validate: props.Validate,
109
+ Absorb: props.Absorb,
110
+ Escape: true,
111
+ Constant: true,
112
+ Functional: props.Functional,
113
+ Methods: props.StrictObjectMembers,
114
+ StrictObjectMembers: props.StrictObjectMembers,
115
+ Validate: props.Validate,
113
116
  },
114
117
  Components: schemametadata.NewMetadataCollection(&schemametadata.MetadataCollection_IOptions{
115
118
  Replace: schemametadata.MetadataCollection_replace,
@@ -4,9 +4,9 @@
4
4
  package llm
5
5
 
6
6
  import (
7
- "testing"
7
+ "testing"
8
8
 
9
- nativetransform "github.com/samchon/typia/packages/typia/native/transform/internal"
9
+ nativetransform "github.com/samchon/typia/packages/typia/native/transform/internal"
10
10
  )
11
11
 
12
12
  // TestLLMTransformerEntryCoverage exercises LLM transform entrypoints.
@@ -16,33 +16,35 @@ import (
16
16
  // guards. Empty transform props visit those entrypoints and recover their guard
17
17
  // failures deterministically.
18
18
  //
19
- // 1. Visit schema, parameters, application, and structured-output wrappers.
20
- // 2. Visit controller and parse/coerce scalar wrappers.
21
- // 3. Visit create-parse and create-coerce factory wrappers.
22
- // 4. Recover expected guard panics for every wrapper call.
19
+ // 1. Visit schema, parameters, application, structured-output, and evaluation
20
+ // wrappers.
21
+ // 2. Visit controller and parse/coerce scalar wrappers.
22
+ // 3. Visit create-parse and create-coerce factory wrappers.
23
+ // 4. Recover expected guard panics for every wrapper call.
23
24
  func TestLLMTransformerEntryCoverage(t *testing.T) {
24
- props := nativetransform.ITransformProps{}
25
- for _, run := range []func(){
26
- func() { LlmSchemaTransformer.Transform(props) },
27
- func() { LlmParametersTransformer.Transform(props) },
28
- func() { LlmApplicationTransformer.Transform(props) },
29
- func() { LlmStructuredOutputTransformer.Transform(props) },
30
- func() { LlmControllerTransformer.Transform(props) },
31
- func() { LlmParseTransformer.Transform(props) },
32
- func() { LlmCoerceTransformer.Transform(props) },
33
- func() { LlmCreateParseTransformer.Transform(props) },
34
- func() { LlmCreateCoerceTransformer.Transform(props) },
35
- } {
36
- expectLLMPanic(t, run)
37
- }
25
+ props := nativetransform.ITransformProps{}
26
+ for _, run := range []func(){
27
+ func() { LlmSchemaTransformer.Transform(props) },
28
+ func() { LlmParametersTransformer.Transform(props) },
29
+ func() { LlmApplicationTransformer.Transform(props) },
30
+ func() { LlmStructuredOutputTransformer.Transform(props) },
31
+ func() { LlmEvaluationTransformer.Transform(props) },
32
+ func() { LlmControllerTransformer.Transform(props) },
33
+ func() { LlmParseTransformer.Transform(props) },
34
+ func() { LlmCoerceTransformer.Transform(props) },
35
+ func() { LlmCreateParseTransformer.Transform(props) },
36
+ func() { LlmCreateCoerceTransformer.Transform(props) },
37
+ } {
38
+ expectLLMPanic(t, run)
39
+ }
38
40
  }
39
41
 
40
42
  func expectLLMPanic(t *testing.T, run func()) {
41
- t.Helper()
42
- defer func() {
43
- if recover() == nil {
44
- t.Fatal("expected LLM transformer panic")
45
- }
46
- }()
47
- run()
43
+ t.Helper()
44
+ defer func() {
45
+ if recover() == nil {
46
+ t.Fatal("expected LLM transformer panic")
47
+ }
48
+ }()
49
+ run()
48
50
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "typia",
3
- "version": "14.0.6",
3
+ "version": "15.0.1",
4
4
  "description": "Superfast runtime validators with only one line",
5
5
  "main": "lib/index.js",
6
6
  "exports": {
@@ -43,8 +43,8 @@
43
43
  "homepage": "https://typia.io",
44
44
  "dependencies": {
45
45
  "randexp": "^0.5.3",
46
- "@typia/interface": "^14.0.6",
47
- "@typia/utils": "^14.0.6"
46
+ "@typia/interface": "^15.0.1",
47
+ "@typia/utils": "^15.0.1"
48
48
  },
49
49
  "peerDependencies": {
50
50
  "ttsc": ">=0.19.2"