@nestia/sdk 12.0.0-dev.20260601.1 → 12.0.0-dev.20260619.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 (259) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +93 -93
  3. package/assets/bundle/api/HttpError.ts +1 -1
  4. package/assets/bundle/api/IConnection.ts +1 -1
  5. package/assets/bundle/api/Primitive.ts +1 -1
  6. package/assets/bundle/api/Resolved.ts +1 -1
  7. package/assets/bundle/api/index.ts +4 -4
  8. package/assets/bundle/api/module.ts +6 -6
  9. package/assets/bundle/distribute/README.md +37 -37
  10. package/assets/bundle/distribute/package.json +28 -28
  11. package/assets/bundle/distribute/tsconfig.json +109 -109
  12. package/assets/bundle/e2e/index.ts +42 -42
  13. package/assets/config/nestia.config.ts +97 -97
  14. package/lib/NestiaSdkApplication.js +29 -7
  15. package/lib/NestiaSdkApplication.js.map +1 -1
  16. package/lib/NestiaSwaggerComposer.js +21 -13
  17. package/lib/NestiaSwaggerComposer.js.map +1 -1
  18. package/lib/analyses/AccessorAnalyzer.d.ts +4 -1
  19. package/lib/analyses/AccessorAnalyzer.js.map +1 -1
  20. package/lib/analyses/ConfigAnalyzer.js +1 -1
  21. package/lib/analyses/PathAnalyzer.d.ts +18 -3
  22. package/lib/analyses/PathAnalyzer.js +32 -0
  23. package/lib/analyses/PathAnalyzer.js.map +1 -1
  24. package/lib/analyses/ReflectControllerAnalyzer.js +3 -2
  25. package/lib/analyses/ReflectControllerAnalyzer.js.map +1 -1
  26. package/lib/analyses/ReflectHttpOperationAnalyzer.d.ts +1 -1
  27. package/lib/analyses/ReflectHttpOperationAnalyzer.js +1 -1
  28. package/lib/analyses/ReflectHttpOperationAnalyzer.js.map +1 -1
  29. package/lib/analyses/ReflectHttpOperationResponseAnalyzer.d.ts +1 -1
  30. package/lib/analyses/ReflectHttpOperationResponseAnalyzer.js +53 -20
  31. package/lib/analyses/ReflectHttpOperationResponseAnalyzer.js.map +1 -1
  32. package/lib/analyses/ReflectMcpOperationAnalyzer.d.ts +14 -0
  33. package/lib/analyses/ReflectMcpOperationAnalyzer.js +79 -0
  34. package/lib/analyses/ReflectMcpOperationAnalyzer.js.map +1 -0
  35. package/lib/analyses/TypedMcpRouteAnalyzer.d.ts +9 -0
  36. package/lib/analyses/TypedMcpRouteAnalyzer.js +31 -0
  37. package/lib/analyses/TypedMcpRouteAnalyzer.js.map +1 -0
  38. package/lib/executable/internal/NestiaConfigLoader.js +5 -1
  39. package/lib/executable/internal/NestiaConfigLoader.js.map +1 -1
  40. package/lib/executable/internal/NestiaSdkCommand.js +30 -14
  41. package/lib/executable/internal/NestiaSdkCommand.js.map +1 -1
  42. package/lib/executable/internal/NestiaSdkWatcher.d.ts +10 -0
  43. package/lib/executable/internal/NestiaSdkWatcher.js +322 -0
  44. package/lib/executable/internal/NestiaSdkWatcher.js.map +1 -0
  45. package/lib/executable/sdk.js +12 -12
  46. package/lib/executable/sdk.js.map +1 -1
  47. package/lib/factories/ExpressionFactory.d.ts +9 -0
  48. package/lib/factories/ExpressionFactory.js +16 -0
  49. package/lib/factories/ExpressionFactory.js.map +1 -0
  50. package/lib/factories/IdentifierFactory.d.ts +22 -0
  51. package/lib/factories/IdentifierFactory.js +50 -0
  52. package/lib/factories/IdentifierFactory.js.map +1 -0
  53. package/lib/factories/LiteralFactory.d.ts +9 -0
  54. package/lib/factories/LiteralFactory.js +48 -0
  55. package/lib/factories/LiteralFactory.js.map +1 -0
  56. package/lib/factories/StatementFactory.d.ts +14 -0
  57. package/lib/factories/StatementFactory.js +20 -0
  58. package/lib/factories/StatementFactory.js.map +1 -0
  59. package/lib/factories/TypeFactory.d.ts +24 -0
  60. package/lib/factories/TypeFactory.js +27 -0
  61. package/lib/factories/TypeFactory.js.map +1 -0
  62. package/lib/generates/CloneGenerator.js +6 -4
  63. package/lib/generates/CloneGenerator.js.map +1 -1
  64. package/lib/generates/SdkGenerator.js +50 -1
  65. package/lib/generates/SdkGenerator.js.map +1 -1
  66. package/lib/generates/SwaggerGenerator.js +18 -2
  67. package/lib/generates/SwaggerGenerator.js.map +1 -1
  68. package/lib/generates/internal/E2eFileProgrammer.js +32 -29
  69. package/lib/generates/internal/E2eFileProgrammer.js.map +1 -1
  70. package/lib/generates/internal/FilePrinter.d.ts +2 -2
  71. package/lib/generates/internal/FilePrinter.js +14 -25
  72. package/lib/generates/internal/FilePrinter.js.map +1 -1
  73. package/lib/generates/internal/ImportDictionary.d.ts +2 -1
  74. package/lib/generates/internal/ImportDictionary.js +16 -10
  75. package/lib/generates/internal/ImportDictionary.js.map +1 -1
  76. package/lib/generates/internal/SdkAliasCollection.d.ts +12 -10
  77. package/lib/generates/internal/SdkAliasCollection.js +29 -22
  78. package/lib/generates/internal/SdkAliasCollection.js.map +1 -1
  79. package/lib/generates/internal/SdkDistributionComposer.d.ts +1 -0
  80. package/lib/generates/internal/SdkDistributionComposer.js +3 -0
  81. package/lib/generates/internal/SdkDistributionComposer.js.map +1 -1
  82. package/lib/generates/internal/SdkFileProgrammer.js +6 -3
  83. package/lib/generates/internal/SdkFileProgrammer.js.map +1 -1
  84. package/lib/generates/internal/SdkHttpCloneProgrammer.d.ts +1 -1
  85. package/lib/generates/internal/SdkHttpCloneProgrammer.js +3 -3
  86. package/lib/generates/internal/SdkHttpCloneProgrammer.js.map +1 -1
  87. package/lib/generates/internal/SdkHttpCloneReferencer.d.ts +1 -1
  88. package/lib/generates/internal/SdkHttpCloneReferencer.js +42 -9
  89. package/lib/generates/internal/SdkHttpCloneReferencer.js.map +1 -1
  90. package/lib/generates/internal/SdkHttpFunctionProgrammer.d.ts +1 -1
  91. package/lib/generates/internal/SdkHttpFunctionProgrammer.js +47 -51
  92. package/lib/generates/internal/SdkHttpFunctionProgrammer.js.map +1 -1
  93. package/lib/generates/internal/SdkHttpNamespaceProgrammer.d.ts +1 -1
  94. package/lib/generates/internal/SdkHttpNamespaceProgrammer.js +63 -61
  95. package/lib/generates/internal/SdkHttpNamespaceProgrammer.js.map +1 -1
  96. package/lib/generates/internal/SdkHttpParameterProgrammer.d.ts +2 -2
  97. package/lib/generates/internal/SdkHttpParameterProgrammer.js +11 -13
  98. package/lib/generates/internal/SdkHttpParameterProgrammer.js.map +1 -1
  99. package/lib/generates/internal/SdkHttpRouteProgrammer.d.ts +1 -1
  100. package/lib/generates/internal/SdkHttpSimulationProgrammer.d.ts +1 -1
  101. package/lib/generates/internal/SdkHttpSimulationProgrammer.js +52 -47
  102. package/lib/generates/internal/SdkHttpSimulationProgrammer.js.map +1 -1
  103. package/lib/generates/internal/SdkMcpRouteProgrammer.d.ts +15 -0
  104. package/lib/generates/internal/SdkMcpRouteProgrammer.js +149 -0
  105. package/lib/generates/internal/SdkMcpRouteProgrammer.js.map +1 -0
  106. package/lib/generates/internal/SdkRouteDirectory.d.ts +2 -1
  107. package/lib/generates/internal/SdkRouteDirectory.js.map +1 -1
  108. package/lib/generates/internal/SdkTypeProgrammer.d.ts +3 -3
  109. package/lib/generates/internal/SdkTypeProgrammer.js +42 -43
  110. package/lib/generates/internal/SdkTypeProgrammer.js.map +1 -1
  111. package/lib/generates/internal/SdkTypeTagProgrammer.d.ts +2 -1
  112. package/lib/generates/internal/SdkTypeTagProgrammer.js +7 -9
  113. package/lib/generates/internal/SdkTypeTagProgrammer.js.map +1 -1
  114. package/lib/generates/internal/SdkWebSocketCloneProgrammer.d.ts +6 -0
  115. package/lib/generates/internal/SdkWebSocketCloneProgrammer.js +283 -0
  116. package/lib/generates/internal/SdkWebSocketCloneProgrammer.js.map +1 -0
  117. package/lib/generates/internal/SdkWebSocketNamespaceProgrammer.d.ts +2 -2
  118. package/lib/generates/internal/SdkWebSocketNamespaceProgrammer.js +45 -47
  119. package/lib/generates/internal/SdkWebSocketNamespaceProgrammer.js.map +1 -1
  120. package/lib/generates/internal/SdkWebSocketParameterProgrammer.d.ts +3 -3
  121. package/lib/generates/internal/SdkWebSocketParameterProgrammer.js +9 -9
  122. package/lib/generates/internal/SdkWebSocketParameterProgrammer.js.map +1 -1
  123. package/lib/generates/internal/SdkWebSocketRouteProgrammer.d.ts +2 -2
  124. package/lib/generates/internal/SdkWebSocketRouteProgrammer.js +37 -41
  125. package/lib/generates/internal/SdkWebSocketRouteProgrammer.js.map +1 -1
  126. package/lib/generates/internal/SwaggerOperationParameterComposer.js +10 -2
  127. package/lib/generates/internal/SwaggerOperationParameterComposer.js.map +1 -1
  128. package/lib/generates/internal/SwaggerOperationResponseComposer.d.ts +1 -1
  129. package/lib/generates/internal/SwaggerOperationResponseComposer.js +6 -1
  130. package/lib/generates/internal/SwaggerOperationResponseComposer.js.map +1 -1
  131. package/lib/generates/internal/SwaggerReadonlyArrayEmender.d.ts +9 -0
  132. package/lib/generates/internal/SwaggerReadonlyArrayEmender.js +174 -0
  133. package/lib/generates/internal/SwaggerReadonlyArrayEmender.js.map +1 -0
  134. package/lib/structures/INestiaSdkInput.d.ts +9 -2
  135. package/lib/structures/IReflectController.d.ts +2 -1
  136. package/lib/structures/IReflectHttpOperationSuccess.d.ts +4 -2
  137. package/lib/structures/IReflectMcpOperation.d.ts +35 -0
  138. package/lib/structures/IReflectMcpOperation.js +3 -0
  139. package/lib/structures/IReflectMcpOperation.js.map +1 -0
  140. package/lib/structures/IReflectMcpOperationParameter.d.ts +19 -0
  141. package/lib/structures/IReflectMcpOperationParameter.js +3 -0
  142. package/lib/structures/IReflectMcpOperationParameter.js.map +1 -0
  143. package/lib/structures/ITypedApplication.d.ts +2 -1
  144. package/lib/structures/ITypedHttpRouteSuccess.d.ts +3 -1
  145. package/lib/structures/ITypedMcpRoute.d.ts +31 -0
  146. package/lib/structures/ITypedMcpRoute.js +3 -0
  147. package/lib/structures/ITypedMcpRoute.js.map +1 -0
  148. package/lib/transform.d.ts +5 -9
  149. package/lib/transform.js +8 -31
  150. package/lib/transform.js.map +1 -1
  151. package/lib/utils/HttpResponseContentTypeUtil.d.ts +5 -0
  152. package/lib/utils/HttpResponseContentTypeUtil.js +22 -0
  153. package/lib/utils/HttpResponseContentTypeUtil.js.map +1 -0
  154. package/native/go.mod +52 -52
  155. package/native/go.sum +84 -54
  156. package/native/sdk/register.go +322 -165
  157. package/native/sdk/sdk.go +17 -17
  158. package/native/sdk/sdk_metadata_json.go +327 -327
  159. package/native/sdk/sdk_transform.go +1879 -1549
  160. package/package.json +13 -11
  161. package/src/INestiaConfig.ts +267 -267
  162. package/src/NestiaSdkApplication.ts +39 -8
  163. package/src/NestiaSwaggerComposer.ts +153 -142
  164. package/src/analyses/AccessorAnalyzer.ts +64 -67
  165. package/src/analyses/ConfigAnalyzer.ts +330 -330
  166. package/src/analyses/ImportAnalyzer.ts +92 -92
  167. package/src/analyses/PathAnalyzer.ts +130 -69
  168. package/src/analyses/ReflectControllerAnalyzer.ts +112 -105
  169. package/src/analyses/ReflectHttpOperationAnalyzer.ts +183 -183
  170. package/src/analyses/ReflectHttpOperationExceptionAnalyzer.ts +90 -90
  171. package/src/analyses/ReflectHttpOperationParameterAnalyzer.ts +350 -350
  172. package/src/analyses/ReflectHttpOperationResponseAnalyzer.ts +163 -130
  173. package/src/analyses/ReflectMcpOperationAnalyzer.ts +124 -0
  174. package/src/analyses/ReflectMetadataAnalyzer.ts +44 -44
  175. package/src/analyses/SecurityAnalyzer.ts +25 -25
  176. package/src/analyses/TypedMcpRouteAnalyzer.ts +34 -0
  177. package/src/decorators/OperationMetadata.ts +29 -29
  178. package/src/executable/internal/CommandParser.ts +15 -15
  179. package/src/executable/internal/NestiaConfigLoader.ts +451 -446
  180. package/src/executable/internal/NestiaSdkCommand.ts +124 -106
  181. package/src/executable/internal/NestiaSdkWatcher.ts +342 -0
  182. package/src/executable/sdk.ts +90 -88
  183. package/src/factories/ExpressionFactory.ts +23 -0
  184. package/src/factories/IdentifierFactory.ts +84 -0
  185. package/src/factories/LiteralFactory.ts +54 -0
  186. package/src/factories/StatementFactory.ts +56 -0
  187. package/src/factories/TypeFactory.ts +27 -0
  188. package/src/generates/CloneGenerator.ts +74 -66
  189. package/src/generates/E2eGenerator.ts +32 -32
  190. package/src/generates/SdkGenerator.ts +176 -118
  191. package/src/generates/SwaggerGenerator.ts +342 -310
  192. package/src/generates/internal/E2eFileProgrammer.ts +246 -233
  193. package/src/generates/internal/FilePrinter.ts +57 -65
  194. package/src/generates/internal/ImportDictionary.ts +207 -204
  195. package/src/generates/internal/SdkAliasCollection.ts +280 -261
  196. package/src/generates/internal/SdkDistributionComposer.ts +123 -116
  197. package/src/generates/internal/SdkFileProgrammer.ts +113 -112
  198. package/src/generates/internal/SdkHttpCloneProgrammer.ts +124 -126
  199. package/src/generates/internal/SdkHttpCloneReferencer.ts +131 -77
  200. package/src/generates/internal/SdkHttpFunctionProgrammer.ts +290 -301
  201. package/src/generates/internal/SdkHttpNamespaceProgrammer.ts +507 -510
  202. package/src/generates/internal/SdkHttpParameterProgrammer.ts +163 -165
  203. package/src/generates/internal/SdkHttpRouteProgrammer.ts +109 -109
  204. package/src/generates/internal/SdkHttpSimulationProgrammer.ts +322 -314
  205. package/src/generates/internal/SdkImportWizard.ts +62 -62
  206. package/src/generates/internal/SdkMcpRouteProgrammer.ts +447 -0
  207. package/src/generates/internal/SdkRouteDirectory.ts +21 -18
  208. package/src/generates/internal/SdkTypeProgrammer.ts +389 -382
  209. package/src/generates/internal/SdkTypeTagProgrammer.ts +110 -114
  210. package/src/generates/internal/SdkWebSocketCloneProgrammer.ts +319 -0
  211. package/src/generates/internal/SdkWebSocketNamespaceProgrammer.ts +383 -389
  212. package/src/generates/internal/SdkWebSocketParameterProgrammer.ts +91 -89
  213. package/src/generates/internal/SdkWebSocketRouteProgrammer.ts +304 -323
  214. package/src/generates/internal/SwaggerDescriptionComposer.ts +64 -64
  215. package/src/generates/internal/SwaggerOperationComposer.ts +119 -119
  216. package/src/generates/internal/SwaggerOperationParameterComposer.ts +175 -162
  217. package/src/generates/internal/SwaggerOperationResponseComposer.ts +115 -110
  218. package/src/generates/internal/SwaggerReadonlyArrayEmender.ts +262 -0
  219. package/src/index.ts +4 -4
  220. package/src/internal/legacy.ts +492 -492
  221. package/src/module.ts +4 -4
  222. package/src/structures/INestiaProject.ts +10 -10
  223. package/src/structures/INestiaSdkInput.ts +27 -20
  224. package/src/structures/IOperationMetadata.ts +41 -41
  225. package/src/structures/IReflectController.ts +18 -15
  226. package/src/structures/IReflectHttpOperation.ts +26 -26
  227. package/src/structures/IReflectHttpOperationException.ts +18 -18
  228. package/src/structures/IReflectHttpOperationParameter.ts +79 -79
  229. package/src/structures/IReflectHttpOperationSuccess.ts +18 -21
  230. package/src/structures/IReflectImport.ts +6 -6
  231. package/src/structures/IReflectMcpOperation.ts +38 -0
  232. package/src/structures/IReflectMcpOperationParameter.ts +27 -0
  233. package/src/structures/IReflectOperationError.ts +26 -26
  234. package/src/structures/IReflectType.ts +4 -4
  235. package/src/structures/IReflectWebSocketOperation.ts +17 -17
  236. package/src/structures/ITypedApplication.ts +12 -11
  237. package/src/structures/ITypedHttpRoute.ts +41 -41
  238. package/src/structures/ITypedHttpRouteException.ts +15 -15
  239. package/src/structures/ITypedHttpRouteParameter.ts +41 -41
  240. package/src/structures/ITypedHttpRouteSuccess.ts +18 -22
  241. package/src/structures/ITypedMcpRoute.ts +33 -0
  242. package/src/structures/ITypedWebSocketRoute.ts +24 -24
  243. package/src/structures/ITypedWebSocketRouteParameter.ts +3 -3
  244. package/src/transform.ts +28 -59
  245. package/src/typings/get-function-location.d.ts +7 -7
  246. package/src/utils/ArrayUtil.ts +26 -26
  247. package/src/utils/EmittedJavaScriptPatcher.ts +88 -88
  248. package/src/utils/FileRetriever.ts +22 -22
  249. package/src/utils/HttpResponseContentTypeUtil.ts +30 -0
  250. package/src/utils/MapUtil.ts +14 -14
  251. package/src/utils/PathUtil.ts +10 -10
  252. package/src/utils/SourceFinder.ts +63 -63
  253. package/src/utils/StringUtil.ts +17 -17
  254. package/src/utils/TsConfigReader.ts +108 -108
  255. package/src/utils/TtscExecutor.ts +68 -68
  256. package/src/utils/VersioningStrategy.ts +28 -28
  257. package/src/validators/HttpHeadersValidator.ts +11 -11
  258. package/src/validators/HttpQueryValidator.ts +11 -11
  259. package/src/validators/TextPlainValidator.ts +17 -17
@@ -1,382 +1,389 @@
1
- import { Node, SyntaxKind, TypeScriptFactory } from "@nestia/factory";
2
- import { ExpressionFactory, TypeFactory } from "@nestia/factory";
3
- import { MetadataAliasType, MetadataArray, MetadataAtomic, MetadataConstantValue, MetadataEscaped, MetadataObjectType, MetadataProperty, MetadataSchema, MetadataTuple, isSoleLiteralOf, sizeOf } from "../../internal/legacy";
4
- import { NamingConvention } from "@typia/utils";
5
- import { IJsDocTagInfo, IMetadataTypeTag } from "typia";
6
-
7
- import { INestiaProject } from "../../structures/INestiaProject";
8
- import { FilePrinter } from "./FilePrinter";
9
- import { ImportDictionary } from "./ImportDictionary";
10
- import { SdkTypeTagProgrammer } from "./SdkTypeTagProgrammer";
11
-
12
- export namespace SdkTypeProgrammer {
13
- /* -----------------------------------------------------------
14
- FACADE
15
- ----------------------------------------------------------- */
16
- export const write =
17
- (project: INestiaProject) =>
18
- (importer: ImportDictionary) =>
19
- (meta: MetadataSchema, parentEscaped: boolean = false): Node => {
20
- const union: Node[] = [];
21
-
22
- // COALESCES
23
- if (meta.any) union.push(TypeFactory.keyword("any"));
24
- if (meta.nullable) union.push(writeNode("null"));
25
- if (meta.required === false) union.push(writeNode("undefined"));
26
- if (parentEscaped === false && meta.escaped)
27
- union.push(write_escaped(project)(importer)(meta.escaped));
28
-
29
- // ATOMIC TYPES
30
- for (const c of meta.constants)
31
- for (const value of c.values) union.push(write_constant(value));
32
- for (const tpl of meta.templates)
33
- union.push(write_template(project)(importer)(tpl.row ?? tpl));
34
- for (const atom of meta.atomics) union.push(write_atomic(importer)(atom));
35
-
36
- // OBJECT TYPES
37
- for (const tuple of meta.tuples)
38
- union.push(write_tuple(project)(importer)(tuple as MetadataTuple));
39
- for (const array of meta.arrays)
40
- union.push(write_array(project)(importer)(array as MetadataArray));
41
- for (const object of meta.objects) {
42
- const target = object.type as MetadataObjectType;
43
- if (
44
- target.name === "object" ||
45
- target.name === "__type" ||
46
- target.name.startsWith("__type.") ||
47
- target.name === "__object" ||
48
- target.name.startsWith("__object.")
49
- )
50
- union.push(write_object(project)(importer)(target));
51
- else union.push(writeAlias(project)(importer)(target));
52
- }
53
- for (const alias of meta.aliases)
54
- union.push(writeAlias(project)(importer)(alias.type as MetadataAliasType));
55
- for (const native of meta.natives)
56
- if (native.name === "Blob" || native.name === "File")
57
- union.push(write_native(native.name));
58
-
59
- return union.length === 1
60
- ? union[0]!
61
- : TypeScriptFactory.createUnionTypeNode(union);
62
- };
63
-
64
- export const write_object =
65
- (project: INestiaProject) =>
66
- (importer: ImportDictionary) =>
67
- (object: MetadataObjectType): Node => {
68
- const regular = object.properties.filter((p) => isSoleLiteralOf(p.key));
69
- const dynamic = object.properties.filter((p) => !isSoleLiteralOf(p.key));
70
- return regular.length && dynamic.length
71
- ? TypeScriptFactory.createIntersectionTypeNode([
72
- write_regular_property(project)(importer)(regular),
73
- ...dynamic.map(write_dynamic_property(project)(importer)),
74
- ])
75
- : dynamic.length
76
- ? TypeScriptFactory.createIntersectionTypeNode(
77
- dynamic.map(write_dynamic_property(project)(importer)),
78
- )
79
- : write_regular_property(project)(importer)(regular);
80
- };
81
-
82
- const write_escaped =
83
- (project: INestiaProject) =>
84
- (importer: ImportDictionary) =>
85
- (meta: MetadataEscaped): Node => {
86
- if (
87
- sizeOf(meta.original) === 1 &&
88
- meta.original.natives.length === 1 &&
89
- meta.original.natives[0]!.name === "Date"
90
- )
91
- return TypeScriptFactory.createIntersectionTypeNode([
92
- TypeFactory.keyword("string"),
93
- SdkTypeTagProgrammer.write(importer, "string", {
94
- name: "Format",
95
- value: "date-time",
96
- } as IMetadataTypeTag),
97
- ]);
98
- return write(project)(importer)(meta.returns, true);
99
- };
100
-
101
- /* -----------------------------------------------------------
102
- ATOMICS
103
- ----------------------------------------------------------- */
104
- const write_constant = (value: MetadataConstantValue) => {
105
- if (typeof value.value === "boolean")
106
- return TypeScriptFactory.createLiteralTypeNode(
107
- value.value
108
- ? TypeScriptFactory.createTrue()
109
- : TypeScriptFactory.createFalse(),
110
- );
111
- else if (typeof value.value === "bigint")
112
- return TypeScriptFactory.createLiteralTypeNode(
113
- value.value < BigInt(0)
114
- ? TypeScriptFactory.createPrefixUnaryExpression(
115
- SyntaxKind.MinusToken,
116
- TypeScriptFactory.createBigIntLiteral((-value.value).toString()),
117
- )
118
- : TypeScriptFactory.createBigIntLiteral(value.value.toString()),
119
- );
120
- else if (typeof value.value === "number")
121
- return TypeScriptFactory.createLiteralTypeNode(
122
- ExpressionFactory.number(value.value),
123
- );
124
- return TypeScriptFactory.createLiteralTypeNode(
125
- TypeScriptFactory.createStringLiteral(value.value as string),
126
- );
127
- };
128
-
129
- const write_template =
130
- (project: INestiaProject) =>
131
- (importer: ImportDictionary) =>
132
- (meta: MetadataSchema[]): Node => {
133
- const head: boolean = isSoleLiteralOf(meta[0]!);
134
- const spans: [Node | null, string | null][] = [];
135
- for (const elem of meta.slice(head ? 1 : 0)) {
136
- const last =
137
- spans.at(-1) ??
138
- (() => {
139
- const tuple = [null!, null!] as [Node | null, string | null];
140
- spans.push(tuple);
141
- return tuple;
142
- })();
143
- if (isSoleLiteralOf(elem))
144
- if (last[1] === null)
145
- last[1] = String(elem.constants[0]!.values[0]!.value);
146
- else
147
- spans.push([
148
- TypeScriptFactory.createLiteralTypeNode(
149
- TypeScriptFactory.createStringLiteral(
150
- String(elem.constants[0]!.values[0]!.value),
151
- ),
152
- ),
153
- null,
154
- ]);
155
- else if (last[0] === null) last[0] = write(project)(importer)(elem);
156
- else spans.push([write(project)(importer)(elem), null]);
157
- }
158
- return TypeScriptFactory.createTemplateLiteralType(
159
- TypeScriptFactory.createTemplateHead(
160
- head ? (meta[0]!.constants[0]!.values[0]!.value as string) : "",
161
- ),
162
- spans
163
- .filter(([node]) => node !== null)
164
- .map(([node, str], i, array) =>
165
- TypeScriptFactory.createTemplateLiteralTypeSpan(
166
- node!,
167
- (i !== array.length - 1
168
- ? TypeScriptFactory.createTemplateMiddle
169
- : TypeScriptFactory.createTemplateTail)(str ?? ""),
170
- ),
171
- ),
172
- );
173
- };
174
-
175
- const write_atomic =
176
- (importer: ImportDictionary) =>
177
- (meta: MetadataAtomic): Node =>
178
- write_type_tag_matrix(importer)(
179
- meta.type as "boolean" | "bigint" | "number" | "string",
180
- TypeScriptFactory.createKeywordTypeNode(
181
- meta.type === "boolean"
182
- ? SyntaxKind.BooleanKeyword
183
- : meta.type === "bigint"
184
- ? SyntaxKind.BigIntKeyword
185
- : meta.type === "number"
186
- ? SyntaxKind.NumberKeyword
187
- : SyntaxKind.StringKeyword,
188
- ),
189
- meta.tags,
190
- );
191
-
192
- /* -----------------------------------------------------------
193
- INSTANCES
194
- ----------------------------------------------------------- */
195
- const write_array =
196
- (project: INestiaProject) =>
197
- (importer: ImportDictionary) =>
198
- (meta: MetadataArray): Node =>
199
- write_type_tag_matrix(importer)(
200
- "array",
201
- TypeScriptFactory.createArrayTypeNode(
202
- write(project)(importer)(meta.type!.value),
203
- ),
204
- meta.tags,
205
- );
206
-
207
- const write_tuple =
208
- (project: INestiaProject) =>
209
- (importer: ImportDictionary) =>
210
- (meta: MetadataTuple): Node =>
211
- TypeScriptFactory.createTupleTypeNode(
212
- meta.type!.elements.map((elem) =>
213
- elem.rest
214
- ? TypeScriptFactory.createRestTypeNode(
215
- TypeScriptFactory.createArrayTypeNode(
216
- write(project)(importer)(elem.rest),
217
- ),
218
- )
219
- : elem.optional
220
- ? TypeScriptFactory.createOptionalTypeNode(
221
- write(project)(importer)(elem),
222
- )
223
- : write(project)(importer)(elem),
224
- ),
225
- );
226
-
227
- const write_regular_property =
228
- (project: INestiaProject) =>
229
- (importer: ImportDictionary) =>
230
- (properties: MetadataProperty[]): Node =>
231
- TypeScriptFactory.createTypeLiteralNode(
232
- properties
233
- .map((p) => {
234
- const description: string = writeComment(p.value.atomics)(
235
- p.description,
236
- p.jsDocTags,
237
- );
238
- const signature: Node =
239
- TypeScriptFactory.createPropertySignature(
240
- undefined,
241
- NamingConvention.variable(
242
- String(p.key.constants[0]!.values[0]!.value),
243
- )
244
- ? TypeScriptFactory.createIdentifier(
245
- String(p.key.constants[0]!.values[0]!.value),
246
- )
247
- : TypeScriptFactory.createStringLiteral(
248
- String(p.key.constants[0]!.values[0]!.value),
249
- ),
250
- p.value.required === false
251
- ? TypeScriptFactory.createToken(SyntaxKind.QuestionToken)
252
- : undefined,
253
- SdkTypeProgrammer.write(project)(importer)(p.value),
254
- );
255
- return !!description.length
256
- ? [
257
- TypeScriptFactory.createIdentifier("\n") as any,
258
- FilePrinter.description(signature, description),
259
- ]
260
- : signature;
261
- })
262
- .flat(),
263
- );
264
-
265
- const write_dynamic_property =
266
- (project: INestiaProject) =>
267
- (importer: ImportDictionary) =>
268
- (property: MetadataProperty): Node =>
269
- TypeScriptFactory.createTypeLiteralNode([
270
- FilePrinter.description(
271
- TypeScriptFactory.createIndexSignature(
272
- undefined,
273
- [
274
- TypeScriptFactory.createParameterDeclaration(
275
- undefined,
276
- undefined,
277
- TypeScriptFactory.createIdentifier("key"),
278
- undefined,
279
- SdkTypeProgrammer.write(project)(importer)(property.key),
280
- ),
281
- ],
282
- SdkTypeProgrammer.write(project)(importer)(property.value),
283
- ),
284
- writeComment(property.value.atomics)(
285
- property.description,
286
- property.jsDocTags,
287
- ),
288
- ),
289
- ]);
290
-
291
- const writeAlias =
292
- (project: INestiaProject) =>
293
- (importer: ImportDictionary) =>
294
- (meta: MetadataAliasType | MetadataObjectType): Node => {
295
- importInternalFile(project)(importer)(meta.name);
296
- return TypeScriptFactory.createTypeReferenceNode(meta.name);
297
- };
298
-
299
- const write_native = (name: string): Node =>
300
- TypeScriptFactory.createTypeReferenceNode(name);
301
-
302
- /* -----------------------------------------------------------
303
- MISCELLANEOUS
304
- ----------------------------------------------------------- */
305
- const write_type_tag_matrix =
306
- (importer: ImportDictionary) =>
307
- (
308
- from: "array" | "boolean" | "number" | "bigint" | "string" | "object",
309
- base: Node,
310
- matrix: IMetadataTypeTag[][],
311
- ): Node => {
312
- matrix = matrix.filter((row) => row.length !== 0);
313
- if (matrix.length === 0) return base;
314
- else if (matrix.length === 1)
315
- return TypeScriptFactory.createIntersectionTypeNode([
316
- base,
317
- ...matrix[0]!.map((tag) =>
318
- SdkTypeTagProgrammer.write(importer, from, tag),
319
- ),
320
- ]);
321
- return TypeScriptFactory.createIntersectionTypeNode([
322
- base,
323
- TypeScriptFactory.createUnionTypeNode(
324
- matrix.map((row) =>
325
- row.length === 1
326
- ? SdkTypeTagProgrammer.write(importer, from, row[0]!)
327
- : TypeScriptFactory.createIntersectionTypeNode(
328
- row.map((tag) =>
329
- SdkTypeTagProgrammer.write(importer, from, tag),
330
- ),
331
- ),
332
- ),
333
- ),
334
- ]);
335
- };
336
- }
337
-
338
- const writeNode = (text: string) =>
339
- TypeScriptFactory.createTypeReferenceNode(text);
340
- const writeComment =
341
- (atomics: MetadataAtomic[]) =>
342
- (description: string | null, jsDocTags: IJsDocTagInfo[]): string => {
343
- const lines: string[] = [];
344
- if (description?.length)
345
- lines.push(...description.split("\n").map((s) => `${s}`));
346
-
347
- const filtered: IJsDocTagInfo[] =
348
- !!atomics.length && !!jsDocTags?.length
349
- ? jsDocTags.filter(
350
- (tag) =>
351
- !atomics.some((a) =>
352
- a.tags.some((r) => r.some((t) => t.kind === tag.name)),
353
- ),
354
- )
355
- : (jsDocTags ?? []);
356
-
357
- if (description?.length && filtered.length) lines.push("");
358
- if (filtered.length)
359
- lines.push(
360
- ...filtered.map((t) =>
361
- t.text?.length
362
- ? `@${t.name} ${t.text.map((e) => e.text).join("")}`
363
- : `@${t.name}`,
364
- ),
365
- );
366
- return lines.join("\n");
367
- };
368
-
369
- const importInternalFile =
370
- (project: INestiaProject) =>
371
- (importer: ImportDictionary) =>
372
- (name: string) => {
373
- const top: string = name.split(".")[0]!;
374
- if (importer.file === `${project.config.output}/structures/${top}.ts`)
375
- return;
376
- importer.internal({
377
- declaration: true,
378
- file: `${project.config.output}/structures/${name.split(".")[0]}`,
379
- type: "element",
380
- name: top,
381
- });
382
- };
1
+ import { SyntaxKind, type TypeNode, factory } from "@ttsc/factory";
2
+ import { NamingConvention } from "@typia/utils";
3
+ import { IJsDocTagInfo, IMetadataTypeTag } from "typia";
4
+
5
+ import { ExpressionFactory } from "../../factories/ExpressionFactory";
6
+ import { TypeFactory } from "../../factories/TypeFactory";
7
+ import {
8
+ MetadataAliasType,
9
+ MetadataArray,
10
+ MetadataAtomic,
11
+ MetadataConstantValue,
12
+ MetadataEscaped,
13
+ MetadataObjectType,
14
+ MetadataProperty,
15
+ MetadataSchema,
16
+ MetadataTuple,
17
+ isSoleLiteralOf,
18
+ sizeOf,
19
+ } from "../../internal/legacy";
20
+ import { INestiaProject } from "../../structures/INestiaProject";
21
+ import { FilePrinter } from "./FilePrinter";
22
+ import { ImportDictionary } from "./ImportDictionary";
23
+ import { SdkTypeTagProgrammer } from "./SdkTypeTagProgrammer";
24
+
25
+ export namespace SdkTypeProgrammer {
26
+ /* -----------------------------------------------------------
27
+ FACADE
28
+ ----------------------------------------------------------- */
29
+ export const write =
30
+ (project: INestiaProject) =>
31
+ (importer: ImportDictionary) =>
32
+ (meta: MetadataSchema, parentEscaped: boolean = false): TypeNode => {
33
+ const union: TypeNode[] = [];
34
+
35
+ // COALESCES
36
+ if (meta.any) union.push(TypeFactory.keyword("any"));
37
+ if (meta.nullable) union.push(writeNode("null"));
38
+ if (meta.required === false) union.push(writeNode("undefined"));
39
+ if (parentEscaped === false && meta.escaped)
40
+ union.push(write_escaped(project)(importer)(meta.escaped));
41
+
42
+ // ATOMIC TYPES
43
+ for (const c of meta.constants)
44
+ for (const value of c.values) union.push(write_constant(value));
45
+ for (const tpl of meta.templates)
46
+ union.push(write_template(project)(importer)(tpl.row ?? tpl));
47
+ for (const atom of meta.atomics) union.push(write_atomic(importer)(atom));
48
+
49
+ // OBJECT TYPES
50
+ for (const tuple of meta.tuples)
51
+ union.push(write_tuple(project)(importer)(tuple as MetadataTuple));
52
+ for (const array of meta.arrays)
53
+ union.push(write_array(project)(importer)(array as MetadataArray));
54
+ for (const object of meta.objects) {
55
+ const target = object.type as MetadataObjectType;
56
+ if (
57
+ target.name === "object" ||
58
+ target.name === "__type" ||
59
+ target.name.startsWith("__type.") ||
60
+ target.name === "__object" ||
61
+ target.name.startsWith("__object.")
62
+ )
63
+ union.push(write_object(project)(importer)(target));
64
+ else union.push(writeAlias(project)(importer)(target));
65
+ }
66
+ for (const alias of meta.aliases)
67
+ union.push(
68
+ writeAlias(project)(importer)(alias.type as MetadataAliasType),
69
+ );
70
+ for (const native of meta.natives)
71
+ if (native.name === "Blob" || native.name === "File")
72
+ union.push(write_native(native.name));
73
+
74
+ return union.length === 1
75
+ ? union[0]!
76
+ : factory.createUnionTypeNode(union);
77
+ };
78
+
79
+ export const write_object =
80
+ (project: INestiaProject) =>
81
+ (importer: ImportDictionary) =>
82
+ (object: MetadataObjectType): TypeNode => {
83
+ const regular = object.properties.filter((p) => isSoleLiteralOf(p.key));
84
+ const dynamic = object.properties.filter((p) => !isSoleLiteralOf(p.key));
85
+ return regular.length && dynamic.length
86
+ ? factory.createIntersectionTypeNode([
87
+ write_regular_property(project)(importer)(regular),
88
+ ...dynamic.map(write_dynamic_property(project)(importer)),
89
+ ])
90
+ : dynamic.length
91
+ ? factory.createIntersectionTypeNode(
92
+ dynamic.map(write_dynamic_property(project)(importer)),
93
+ )
94
+ : write_regular_property(project)(importer)(regular);
95
+ };
96
+
97
+ const write_escaped =
98
+ (project: INestiaProject) =>
99
+ (importer: ImportDictionary) =>
100
+ (meta: MetadataEscaped): TypeNode => {
101
+ if (
102
+ sizeOf(meta.original) === 1 &&
103
+ meta.original.natives.length === 1 &&
104
+ meta.original.natives[0]!.name === "Date"
105
+ )
106
+ return factory.createIntersectionTypeNode([
107
+ TypeFactory.keyword("string"),
108
+ SdkTypeTagProgrammer.write(importer, "string", {
109
+ name: "Format",
110
+ value: "date-time",
111
+ } as IMetadataTypeTag),
112
+ ]);
113
+ return write(project)(importer)(meta.returns, true);
114
+ };
115
+
116
+ /* -----------------------------------------------------------
117
+ ATOMICS
118
+ ----------------------------------------------------------- */
119
+ const write_constant = (value: MetadataConstantValue) => {
120
+ if (typeof value.value === "boolean")
121
+ return factory.createLiteralTypeNode(
122
+ value.value ? factory.createTrue() : factory.createFalse(),
123
+ );
124
+ else if (typeof value.value === "bigint")
125
+ return factory.createLiteralTypeNode(
126
+ value.value < BigInt(0)
127
+ ? factory.createPrefixUnaryExpression(
128
+ SyntaxKind.MinusToken,
129
+ factory.createBigIntLiteral((-value.value).toString()),
130
+ )
131
+ : factory.createBigIntLiteral(value.value.toString()),
132
+ );
133
+ else if (typeof value.value === "number")
134
+ return factory.createLiteralTypeNode(
135
+ ExpressionFactory.number(value.value),
136
+ );
137
+ return factory.createLiteralTypeNode(
138
+ factory.createStringLiteral(value.value as string),
139
+ );
140
+ };
141
+
142
+ const write_template =
143
+ (project: INestiaProject) =>
144
+ (importer: ImportDictionary) =>
145
+ (meta: MetadataSchema[]): TypeNode => {
146
+ const head: boolean = isSoleLiteralOf(meta[0]!);
147
+ const spans: [TypeNode | null, string | null][] = [];
148
+ for (const elem of meta.slice(head ? 1 : 0)) {
149
+ const last =
150
+ spans.at(-1) ??
151
+ (() => {
152
+ const tuple = [null!, null!] as [TypeNode | null, string | null];
153
+ spans.push(tuple);
154
+ return tuple;
155
+ })();
156
+ if (isSoleLiteralOf(elem))
157
+ if (last[1] === null)
158
+ last[1] = String(elem.constants[0]!.values[0]!.value);
159
+ else
160
+ spans.push([
161
+ factory.createLiteralTypeNode(
162
+ factory.createStringLiteral(
163
+ String(elem.constants[0]!.values[0]!.value),
164
+ ),
165
+ ),
166
+ null,
167
+ ]);
168
+ else if (last[0] === null) last[0] = write(project)(importer)(elem);
169
+ else spans.push([write(project)(importer)(elem), null]);
170
+ }
171
+ return factory.createTemplateLiteralType(
172
+ factory.createTemplateHead(
173
+ head ? (meta[0]!.constants[0]!.values[0]!.value as string) : "",
174
+ ),
175
+ spans
176
+ .filter(([node]) => node !== null)
177
+ .map(([node, str], i, array) =>
178
+ factory.createTemplateLiteralTypeSpan(
179
+ node!,
180
+ (i !== array.length - 1
181
+ ? factory.createTemplateMiddle
182
+ : factory.createTemplateTail)(str ?? ""),
183
+ ),
184
+ ),
185
+ );
186
+ };
187
+
188
+ const write_atomic =
189
+ (importer: ImportDictionary) =>
190
+ (meta: MetadataAtomic): TypeNode =>
191
+ write_type_tag_matrix(importer)(
192
+ meta.type as "boolean" | "bigint" | "number" | "string",
193
+ factory.createKeywordTypeNode(
194
+ meta.type === "boolean"
195
+ ? SyntaxKind.BooleanKeyword
196
+ : meta.type === "bigint"
197
+ ? SyntaxKind.BigIntKeyword
198
+ : meta.type === "number"
199
+ ? SyntaxKind.NumberKeyword
200
+ : SyntaxKind.StringKeyword,
201
+ ),
202
+ meta.tags,
203
+ );
204
+
205
+ /* -----------------------------------------------------------
206
+ INSTANCES
207
+ ----------------------------------------------------------- */
208
+ const write_array =
209
+ (project: INestiaProject) =>
210
+ (importer: ImportDictionary) =>
211
+ (meta: MetadataArray): TypeNode =>
212
+ write_type_tag_matrix(importer)(
213
+ "array",
214
+ factory.createArrayTypeNode(write(project)(importer)(meta.type!.value)),
215
+ meta.tags,
216
+ );
217
+
218
+ const write_tuple =
219
+ (project: INestiaProject) =>
220
+ (importer: ImportDictionary) =>
221
+ (meta: MetadataTuple): TypeNode =>
222
+ factory.createTupleTypeNode(
223
+ meta.type!.elements.map((elem) =>
224
+ elem.rest
225
+ ? factory.createRestTypeNode(
226
+ factory.createArrayTypeNode(
227
+ write(project)(importer)(elem.rest),
228
+ ),
229
+ )
230
+ : elem.optional
231
+ ? factory.createOptionalTypeNode(write(project)(importer)(elem))
232
+ : write(project)(importer)(elem),
233
+ ),
234
+ );
235
+
236
+ const write_regular_property =
237
+ (project: INestiaProject) =>
238
+ (importer: ImportDictionary) =>
239
+ (properties: MetadataProperty[]): TypeNode =>
240
+ factory.createTypeLiteralNode(
241
+ properties
242
+ .map((p) => {
243
+ const description: string = writeComment(p.value.atomics)(
244
+ p.description,
245
+ p.jsDocTags,
246
+ );
247
+ const signature = factory.createPropertySignature(
248
+ undefined,
249
+ NamingConvention.variable(
250
+ String(p.key.constants[0]!.values[0]!.value),
251
+ )
252
+ ? factory.createIdentifier(
253
+ String(p.key.constants[0]!.values[0]!.value),
254
+ )
255
+ : factory.createStringLiteral(
256
+ String(p.key.constants[0]!.values[0]!.value),
257
+ ),
258
+ p.value.required === false
259
+ ? factory.createToken(SyntaxKind.QuestionToken)
260
+ : undefined,
261
+ SdkTypeProgrammer.write(project)(importer)(p.value),
262
+ );
263
+ return !!description.length
264
+ ? [
265
+ factory.createIdentifier("\n") as any,
266
+ FilePrinter.description(signature, description),
267
+ ]
268
+ : signature;
269
+ })
270
+ .flat(),
271
+ );
272
+
273
+ const write_dynamic_property =
274
+ (project: INestiaProject) =>
275
+ (importer: ImportDictionary) =>
276
+ (property: MetadataProperty): TypeNode =>
277
+ factory.createTypeLiteralNode([
278
+ FilePrinter.description(
279
+ factory.createIndexSignature(
280
+ undefined,
281
+ [
282
+ factory.createParameterDeclaration(
283
+ undefined,
284
+ undefined,
285
+ factory.createIdentifier("key"),
286
+ undefined,
287
+ SdkTypeProgrammer.write(project)(importer)(property.key),
288
+ ),
289
+ ],
290
+ SdkTypeProgrammer.write(project)(importer)(property.value),
291
+ ),
292
+ writeComment(property.value.atomics)(
293
+ property.description,
294
+ property.jsDocTags,
295
+ ),
296
+ ),
297
+ ]);
298
+
299
+ const writeAlias =
300
+ (project: INestiaProject) =>
301
+ (importer: ImportDictionary) =>
302
+ (meta: MetadataAliasType | MetadataObjectType): TypeNode => {
303
+ importInternalFile(project)(importer)(meta.name);
304
+ return factory.createTypeReferenceNode(meta.name);
305
+ };
306
+
307
+ const write_native = (name: string): TypeNode =>
308
+ factory.createTypeReferenceNode(name);
309
+
310
+ /* -----------------------------------------------------------
311
+ MISCELLANEOUS
312
+ ----------------------------------------------------------- */
313
+ const write_type_tag_matrix =
314
+ (importer: ImportDictionary) =>
315
+ (
316
+ from: "array" | "boolean" | "number" | "bigint" | "string" | "object",
317
+ base: TypeNode,
318
+ matrix: IMetadataTypeTag[][],
319
+ ): TypeNode => {
320
+ matrix = matrix.filter((row) => row.length !== 0);
321
+ if (matrix.length === 0) return base;
322
+ else if (matrix.length === 1)
323
+ return factory.createIntersectionTypeNode([
324
+ base,
325
+ ...matrix[0]!.map((tag) =>
326
+ SdkTypeTagProgrammer.write(importer, from, tag),
327
+ ),
328
+ ]);
329
+ return factory.createIntersectionTypeNode([
330
+ base,
331
+ factory.createUnionTypeNode(
332
+ matrix.map((row) =>
333
+ row.length === 1
334
+ ? SdkTypeTagProgrammer.write(importer, from, row[0]!)
335
+ : factory.createIntersectionTypeNode(
336
+ row.map((tag) =>
337
+ SdkTypeTagProgrammer.write(importer, from, tag),
338
+ ),
339
+ ),
340
+ ),
341
+ ),
342
+ ]);
343
+ };
344
+ }
345
+
346
+ const writeNode = (text: string) => factory.createTypeReferenceNode(text);
347
+ const writeComment =
348
+ (atomics: MetadataAtomic[]) =>
349
+ (description: string | null, jsDocTags: IJsDocTagInfo[]): string => {
350
+ const lines: string[] = [];
351
+ if (description?.length)
352
+ lines.push(...description.split("\n").map((s) => `${s}`));
353
+
354
+ const filtered: IJsDocTagInfo[] =
355
+ !!atomics.length && !!jsDocTags?.length
356
+ ? jsDocTags.filter(
357
+ (tag) =>
358
+ !atomics.some((a) =>
359
+ a.tags.some((r) => r.some((t) => t.kind === tag.name)),
360
+ ),
361
+ )
362
+ : (jsDocTags ?? []);
363
+
364
+ if (description?.length && filtered.length) lines.push("");
365
+ if (filtered.length)
366
+ lines.push(
367
+ ...filtered.map((t) =>
368
+ t.text?.length
369
+ ? `@${t.name} ${t.text.map((e) => e.text).join("")}`
370
+ : `@${t.name}`,
371
+ ),
372
+ );
373
+ return lines.join("\n");
374
+ };
375
+
376
+ const importInternalFile =
377
+ (project: INestiaProject) =>
378
+ (importer: ImportDictionary) =>
379
+ (name: string) => {
380
+ const top: string = name.split(".")[0]!;
381
+ if (importer.file === `${project.config.output}/structures/${top}.ts`)
382
+ return;
383
+ importer.internal({
384
+ declaration: true,
385
+ file: `${project.config.output}/structures/${name.split(".")[0]}`,
386
+ type: "element",
387
+ name: top,
388
+ });
389
+ };