@nestia/migrate 6.0.5 → 7.0.0-dev.20250605

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 (218) hide show
  1. package/README.md +92 -92
  2. package/lib/NestiaMigrateApplication.d.ts +23 -0
  3. package/lib/NestiaMigrateApplication.js +17522 -0
  4. package/lib/NestiaMigrateApplication.js.map +1 -0
  5. package/lib/analyzers/NestiaMigrateControllerAnalyzer.d.ts +5 -0
  6. package/lib/analyzers/{MigrateControllerAnalyzer.js → NestiaMigrateControllerAnalyzer.js} +10 -10
  7. package/lib/analyzers/NestiaMigrateControllerAnalyzer.js.map +1 -0
  8. package/lib/archivers/NestiaMigrateFileArchiver.d.ts +8 -0
  9. package/lib/archivers/NestiaMigrateFileArchiver.js +36 -0
  10. package/lib/archivers/NestiaMigrateFileArchiver.js.map +1 -0
  11. package/lib/bundles/NEST_TEMPLATE.d.ts +1 -5
  12. package/lib/bundles/NEST_TEMPLATE.js +50 -242
  13. package/lib/bundles/NEST_TEMPLATE.js.map +1 -1
  14. package/lib/bundles/SDK_TEMPLATE.d.ts +1 -5
  15. package/lib/bundles/SDK_TEMPLATE.js +23 -107
  16. package/lib/bundles/SDK_TEMPLATE.js.map +1 -1
  17. package/lib/{internal/MigrateCommander.d.ts → executable/NestiaMigrateCommander.d.ts} +1 -1
  18. package/lib/{internal/MigrateCommander.js → executable/NestiaMigrateCommander.js} +23 -21
  19. package/lib/executable/NestiaMigrateCommander.js.map +1 -0
  20. package/lib/{internal/MigrateInquirer.d.ts → executable/NestiaMigrateInquirer.d.ts} +2 -1
  21. package/lib/{internal/MigrateInquirer.js → executable/NestiaMigrateInquirer.js} +22 -9
  22. package/lib/executable/NestiaMigrateInquirer.js.map +1 -0
  23. package/lib/executable/migrate.js +2 -2
  24. package/lib/executable/migrate.js.map +1 -1
  25. package/lib/index.mjs +10042 -694
  26. package/lib/index.mjs.map +1 -1
  27. package/lib/module.d.ts +2 -5
  28. package/lib/module.js +2 -5
  29. package/lib/module.js.map +1 -1
  30. package/lib/programmers/NestiaMigrateApiFileProgrammer.d.ts +13 -0
  31. package/lib/programmers/NestiaMigrateApiFileProgrammer.js +40 -0
  32. package/lib/programmers/NestiaMigrateApiFileProgrammer.js.map +1 -0
  33. package/lib/programmers/NestiaMigrateApiFunctionProgrammer.d.ts +14 -0
  34. package/lib/programmers/NestiaMigrateApiFunctionProgrammer.js +132 -0
  35. package/lib/programmers/NestiaMigrateApiFunctionProgrammer.js.map +1 -0
  36. package/lib/programmers/NestiaMigrateApiNamespaceProgrammer.d.ts +14 -0
  37. package/lib/programmers/NestiaMigrateApiNamespaceProgrammer.js +237 -0
  38. package/lib/programmers/NestiaMigrateApiNamespaceProgrammer.js.map +1 -0
  39. package/lib/programmers/NestiaMigrateApiProgrammer.d.ts +4 -0
  40. package/lib/programmers/{MigrateApiProgrammer.js → NestiaMigrateApiProgrammer.js} +31 -30
  41. package/lib/programmers/NestiaMigrateApiProgrammer.js.map +1 -0
  42. package/lib/programmers/NestiaMigrateApiSimulationProgrammer.d.ts +14 -0
  43. package/lib/programmers/{MigrateApiSimulationProgrammer.js → NestiaMigrateApiSimulationProgrammer.js} +54 -36
  44. package/lib/programmers/NestiaMigrateApiSimulationProgrammer.js.map +1 -0
  45. package/lib/programmers/NestiaMigrateApiStartProgrammer.d.ts +4 -0
  46. package/lib/programmers/{MigrateApiStartProgrammer.js → NestiaMigrateApiStartProgrammer.js} +23 -20
  47. package/lib/programmers/NestiaMigrateApiStartProgrammer.js.map +1 -0
  48. package/lib/programmers/NestiaMigrateDtoProgrammer.d.ts +15 -0
  49. package/lib/programmers/{MigrateDtoProgrammer.js → NestiaMigrateDtoProgrammer.js} +21 -12
  50. package/lib/programmers/NestiaMigrateDtoProgrammer.js.map +1 -0
  51. package/lib/programmers/NestiaMigrateE2eFileProgrammer.d.ts +14 -0
  52. package/lib/programmers/NestiaMigrateE2eFileProgrammer.js +81 -0
  53. package/lib/programmers/NestiaMigrateE2eFileProgrammer.js.map +1 -0
  54. package/lib/programmers/NestiaMigrateE2eProgrammer.d.ts +4 -0
  55. package/lib/programmers/NestiaMigrateE2eProgrammer.js +32 -0
  56. package/lib/programmers/NestiaMigrateE2eProgrammer.js.map +1 -0
  57. package/lib/programmers/{MigrateImportProgrammer.d.ts → NestiaMigrateImportProgrammer.d.ts} +1 -1
  58. package/lib/programmers/{MigrateImportProgrammer.js → NestiaMigrateImportProgrammer.js} +4 -4
  59. package/lib/programmers/NestiaMigrateImportProgrammer.js.map +1 -0
  60. package/lib/programmers/NestiaMigrateNestControllerProgrammer.d.ts +12 -0
  61. package/lib/programmers/{MigrateNestControllerProgrammer.js → NestiaMigrateNestControllerProgrammer.js} +20 -13
  62. package/lib/programmers/NestiaMigrateNestControllerProgrammer.js.map +1 -0
  63. package/lib/programmers/NestiaMigrateNestMethodProgrammer.d.ts +15 -0
  64. package/lib/programmers/{MigrateNestMethodProgrammer.js → NestiaMigrateNestMethodProgrammer.js} +85 -69
  65. package/lib/programmers/NestiaMigrateNestMethodProgrammer.js.map +1 -0
  66. package/lib/programmers/NestiaMigrateNestModuleProgrammer.d.ts +5 -0
  67. package/lib/programmers/{MigrateNestModuleProgrammer.js → NestiaMigrateNestModuleProgrammer.js} +6 -6
  68. package/lib/programmers/NestiaMigrateNestModuleProgrammer.js.map +1 -0
  69. package/lib/programmers/NestiaMigrateNestProgrammer.d.ts +4 -0
  70. package/lib/programmers/NestiaMigrateNestProgrammer.js +65 -0
  71. package/lib/programmers/NestiaMigrateNestProgrammer.js.map +1 -0
  72. package/lib/programmers/NestiaMigrateSchemaProgrammer.d.ts +10 -0
  73. package/lib/programmers/NestiaMigrateSchemaProgrammer.js +414 -0
  74. package/lib/programmers/NestiaMigrateSchemaProgrammer.js.map +1 -0
  75. package/lib/structures/INestiaMigrateConfig.d.ts +10 -0
  76. package/lib/structures/{IHttpMigrateFile.js → INestiaMigrateConfig.js} +1 -1
  77. package/lib/structures/INestiaMigrateConfig.js.map +1 -0
  78. package/lib/structures/INestiaMigrateContext.d.ts +9 -0
  79. package/lib/structures/INestiaMigrateContext.js +3 -0
  80. package/lib/structures/INestiaMigrateContext.js.map +1 -0
  81. package/lib/structures/INestiaMigrateController.d.ts +7 -0
  82. package/lib/structures/{IHttpMigrateController.js → INestiaMigrateController.js} +1 -1
  83. package/lib/structures/INestiaMigrateController.js.map +1 -0
  84. package/lib/structures/{IHttpMigrateDto.d.ts → INestiaMigrateDto.d.ts} +2 -2
  85. package/lib/structures/{IHttpMigrateRoute.js → INestiaMigrateDto.js} +1 -1
  86. package/lib/structures/INestiaMigrateDto.js.map +1 -0
  87. package/lib/structures/{IHttpMigrateFile.d.ts → INestiaMigrateFile.d.ts} +1 -1
  88. package/lib/structures/{IHttpMigrateDto.js → INestiaMigrateFile.js} +1 -1
  89. package/lib/structures/INestiaMigrateFile.js.map +1 -0
  90. package/lib/structures/INestiaMigrateProgram.d.ts +9 -0
  91. package/lib/structures/INestiaMigrateProgram.js +3 -0
  92. package/lib/structures/INestiaMigrateProgram.js.map +1 -0
  93. package/lib/structures/INestiaMigrateSchema.d.ts +4 -0
  94. package/lib/structures/{IHttpMigrateProgram.js → INestiaMigrateSchema.js} +1 -1
  95. package/lib/structures/INestiaMigrateSchema.js.map +1 -0
  96. package/lib/utils/openapi-down-convert/converter.js +2 -2
  97. package/package.json +8 -8
  98. package/src/NestiaMigrateApplication.ts +144 -0
  99. package/src/analyzers/{MigrateControllerAnalyzer.ts → NestiaMigrateControllerAnalyzer.ts} +51 -51
  100. package/src/archivers/NestiaMigrateFileArchiver.ts +28 -0
  101. package/src/bundles/NEST_TEMPLATE.ts +50 -242
  102. package/src/bundles/SDK_TEMPLATE.ts +23 -107
  103. package/src/{internal/MigrateCommander.ts → executable/NestiaMigrateCommander.ts} +98 -94
  104. package/src/{internal/MigrateInquirer.ts → executable/NestiaMigrateInquirer.ts} +106 -89
  105. package/src/executable/bundle.js +129 -127
  106. package/src/executable/migrate.ts +7 -7
  107. package/src/factories/TypeLiteralFactory.ts +57 -57
  108. package/src/index.ts +4 -4
  109. package/src/module.ts +2 -8
  110. package/src/programmers/NestiaMigrateApiFileProgrammer.ts +55 -0
  111. package/src/programmers/NestiaMigrateApiFunctionProgrammer.ts +256 -0
  112. package/src/programmers/NestiaMigrateApiNamespaceProgrammer.ts +524 -0
  113. package/src/programmers/NestiaMigrateApiProgrammer.ts +107 -0
  114. package/src/programmers/NestiaMigrateApiSimulationProgrammer.ts +340 -0
  115. package/src/programmers/NestiaMigrateApiStartProgrammer.ts +198 -0
  116. package/src/programmers/NestiaMigrateDtoProgrammer.ts +101 -0
  117. package/src/programmers/NestiaMigrateE2eFileProgrammer.ts +153 -0
  118. package/src/programmers/NestiaMigrateE2eProgrammer.ts +46 -0
  119. package/src/programmers/{MigrateImportProgrammer.ts → NestiaMigrateImportProgrammer.ts} +118 -118
  120. package/src/programmers/NestiaMigrateNestControllerProgrammer.ts +66 -0
  121. package/src/programmers/NestiaMigrateNestMethodProgrammer.ts +406 -0
  122. package/src/programmers/{MigrateNestModuleProgrammer.ts → NestiaMigrateNestModuleProgrammer.ts} +65 -65
  123. package/src/programmers/NestiaMigrateNestProgrammer.ts +88 -0
  124. package/src/programmers/NestiaMigrateSchemaProgrammer.ts +475 -0
  125. package/src/structures/INestiaMigrateConfig.ts +10 -0
  126. package/src/structures/INestiaMigrateContext.ts +15 -0
  127. package/src/structures/INestiaMigrateController.ts +8 -0
  128. package/src/structures/{IHttpMigrateDto.ts → INestiaMigrateDto.ts} +8 -8
  129. package/src/structures/{IHttpMigrateFile.ts → INestiaMigrateFile.ts} +5 -5
  130. package/src/structures/INestiaMigrateProgram.ts +11 -0
  131. package/src/structures/INestiaMigrateSchema.ts +4 -0
  132. package/src/utils/FilePrinter.ts +38 -38
  133. package/src/utils/MapUtil.ts +13 -13
  134. package/src/utils/OpenApiTypeChecker.ts +73 -73
  135. package/src/utils/SetupWizard.ts +12 -12
  136. package/src/utils/StringUtil.ts +113 -113
  137. package/src/utils/openapi-down-convert/RefVisitor.ts +139 -139
  138. package/src/utils/openapi-down-convert/converter.ts +527 -527
  139. package/lib/MigrateApplication.d.ts +0 -28
  140. package/lib/MigrateApplication.js +0 -7994
  141. package/lib/MigrateApplication.js.map +0 -1
  142. package/lib/analyzers/MigrateApplicationAnalyzer.d.ts +0 -4
  143. package/lib/analyzers/MigrateApplicationAnalyzer.js +0 -12
  144. package/lib/analyzers/MigrateApplicationAnalyzer.js.map +0 -1
  145. package/lib/analyzers/MigrateControllerAnalyzer.d.ts +0 -7
  146. package/lib/analyzers/MigrateControllerAnalyzer.js.map +0 -1
  147. package/lib/archivers/MigrateFileArchiver.d.ts +0 -8
  148. package/lib/archivers/MigrateFileArchiver.js +0 -35
  149. package/lib/archivers/MigrateFileArchiver.js.map +0 -1
  150. package/lib/internal/MigrateCommander.js.map +0 -1
  151. package/lib/internal/MigrateInquirer.js.map +0 -1
  152. package/lib/programmers/MigrateApiFileProgrammer.d.ts +0 -11
  153. package/lib/programmers/MigrateApiFileProgrammer.js +0 -30
  154. package/lib/programmers/MigrateApiFileProgrammer.js.map +0 -1
  155. package/lib/programmers/MigrateApiFunctionProgrammer.d.ts +0 -9
  156. package/lib/programmers/MigrateApiFunctionProgrammer.js +0 -102
  157. package/lib/programmers/MigrateApiFunctionProgrammer.js.map +0 -1
  158. package/lib/programmers/MigrateApiNamespaceProgrammer.d.ts +0 -9
  159. package/lib/programmers/MigrateApiNamespaceProgrammer.js +0 -142
  160. package/lib/programmers/MigrateApiNamespaceProgrammer.js.map +0 -1
  161. package/lib/programmers/MigrateApiProgrammer.d.ts +0 -5
  162. package/lib/programmers/MigrateApiProgrammer.js.map +0 -1
  163. package/lib/programmers/MigrateApiSimulationProgrammer.d.ts +0 -8
  164. package/lib/programmers/MigrateApiSimulationProgrammer.js.map +0 -1
  165. package/lib/programmers/MigrateApiStartProgrammer.d.ts +0 -5
  166. package/lib/programmers/MigrateApiStartProgrammer.js.map +0 -1
  167. package/lib/programmers/MigrateDtoProgrammer.d.ts +0 -11
  168. package/lib/programmers/MigrateDtoProgrammer.js.map +0 -1
  169. package/lib/programmers/MigrateE2eFileProgrammer.d.ts +0 -8
  170. package/lib/programmers/MigrateE2eFileProgrammer.js +0 -45
  171. package/lib/programmers/MigrateE2eFileProgrammer.js.map +0 -1
  172. package/lib/programmers/MigrateE2eProgrammer.d.ts +0 -5
  173. package/lib/programmers/MigrateE2eProgrammer.js +0 -25
  174. package/lib/programmers/MigrateE2eProgrammer.js.map +0 -1
  175. package/lib/programmers/MigrateImportProgrammer.js.map +0 -1
  176. package/lib/programmers/MigrateNestControllerProgrammer.d.ts +0 -7
  177. package/lib/programmers/MigrateNestControllerProgrammer.js.map +0 -1
  178. package/lib/programmers/MigrateNestMethodProgrammer.d.ts +0 -9
  179. package/lib/programmers/MigrateNestMethodProgrammer.js.map +0 -1
  180. package/lib/programmers/MigrateNestModuleProgrammer.d.ts +0 -5
  181. package/lib/programmers/MigrateNestModuleProgrammer.js.map +0 -1
  182. package/lib/programmers/MigrateNestProgrammer.d.ts +0 -5
  183. package/lib/programmers/MigrateNestProgrammer.js +0 -69
  184. package/lib/programmers/MigrateNestProgrammer.js.map +0 -1
  185. package/lib/programmers/MigrateSchemaProgrammer.d.ts +0 -6
  186. package/lib/programmers/MigrateSchemaProgrammer.js +0 -335
  187. package/lib/programmers/MigrateSchemaProgrammer.js.map +0 -1
  188. package/lib/structures/IHttpMigrateController.d.ts +0 -7
  189. package/lib/structures/IHttpMigrateController.js.map +0 -1
  190. package/lib/structures/IHttpMigrateDto.js.map +0 -1
  191. package/lib/structures/IHttpMigrateFile.js.map +0 -1
  192. package/lib/structures/IHttpMigrateProgram.d.ts +0 -33
  193. package/lib/structures/IHttpMigrateProgram.js.map +0 -1
  194. package/lib/structures/IHttpMigrateRoute.d.ts +0 -1
  195. package/lib/structures/IHttpMigrateRoute.js.map +0 -1
  196. package/lib/structures/IHttpMigrateSchema.d.ts +0 -4
  197. package/lib/structures/IHttpMigrateSchema.js +0 -3
  198. package/lib/structures/IHttpMigrateSchema.js.map +0 -1
  199. package/src/MigrateApplication.ts +0 -124
  200. package/src/analyzers/MigrateApplicationAnalyzer.ts +0 -18
  201. package/src/archivers/MigrateFileArchiver.ts +0 -38
  202. package/src/programmers/MigrateApiFileProgrammer.ts +0 -51
  203. package/src/programmers/MigrateApiFunctionProgrammer.ts +0 -213
  204. package/src/programmers/MigrateApiNamespaceProgrammer.ts +0 -418
  205. package/src/programmers/MigrateApiProgrammer.ts +0 -104
  206. package/src/programmers/MigrateApiSimulationProgrammer.ts +0 -324
  207. package/src/programmers/MigrateApiStartProgrammer.ts +0 -194
  208. package/src/programmers/MigrateDtoProgrammer.ts +0 -87
  209. package/src/programmers/MigrateE2eFileProgrammer.ts +0 -117
  210. package/src/programmers/MigrateE2eProgrammer.ts +0 -34
  211. package/src/programmers/MigrateNestControllerProgrammer.ts +0 -57
  212. package/src/programmers/MigrateNestMethodProgrammer.ts +0 -397
  213. package/src/programmers/MigrateNestProgrammer.ts +0 -82
  214. package/src/programmers/MigrateSchemaProgrammer.ts +0 -378
  215. package/src/structures/IHttpMigrateController.ts +0 -8
  216. package/src/structures/IHttpMigrateProgram.ts +0 -35
  217. package/src/structures/IHttpMigrateRoute.ts +0 -1
  218. package/src/structures/IHttpMigrateSchema.ts +0 -4
@@ -0,0 +1,524 @@
1
+ import { IHttpMigrateRoute, OpenApi } from "@samchon/openapi";
2
+ import ts from "typescript";
3
+ import { ExpressionFactory } from "typia/lib/factories/ExpressionFactory";
4
+ import { IdentifierFactory } from "typia/lib/factories/IdentifierFactory";
5
+ import { LiteralFactory } from "typia/lib/factories/LiteralFactory";
6
+ import { TypeFactory } from "typia/lib/factories/TypeFactory";
7
+
8
+ import { INestiaMigrateConfig } from "../structures/INestiaMigrateConfig";
9
+ import { FilePrinter } from "../utils/FilePrinter";
10
+ import { NestiaMigrateApiSimulationProgrammer } from "./NestiaMigrateApiSimulationProgrammer";
11
+ import { NestiaMigrateImportProgrammer } from "./NestiaMigrateImportProgrammer";
12
+ import { NestiaMigrateSchemaProgrammer } from "./NestiaMigrateSchemaProgrammer";
13
+
14
+ export namespace NestiaMigrateApiNamespaceProgrammer {
15
+ export interface IContext {
16
+ config: INestiaMigrateConfig;
17
+ components: OpenApi.IComponents;
18
+ importer: NestiaMigrateImportProgrammer;
19
+ route: IHttpMigrateRoute;
20
+ }
21
+
22
+ export const write = (ctx: IContext): ts.ModuleDeclaration => {
23
+ const types: ts.TypeAliasDeclaration[] = writeTypes(ctx);
24
+ return ts.factory.createModuleDeclaration(
25
+ [ts.factory.createToken(ts.SyntaxKind.ExportKeyword)],
26
+ ts.factory.createIdentifier(ctx.route.accessor.at(-1)!),
27
+ ts.factory.createModuleBlock([
28
+ ...types,
29
+ ...(types.length ? [FilePrinter.newLine()] : []),
30
+ writeMetadata(ctx),
31
+ FilePrinter.newLine(),
32
+ writePathFunction(ctx),
33
+ ...(ctx.config.simulate === true
34
+ ? [
35
+ NestiaMigrateApiSimulationProgrammer.random(ctx),
36
+ NestiaMigrateApiSimulationProgrammer.simulate(ctx),
37
+ ]
38
+ : []),
39
+ ]),
40
+ ts.NodeFlags.Namespace,
41
+ );
42
+ };
43
+
44
+ export const writePathCallExpression = (
45
+ config: INestiaMigrateConfig,
46
+ route: IHttpMigrateRoute,
47
+ ) =>
48
+ ts.factory.createCallExpression(
49
+ ts.factory.createIdentifier(`${route.accessor.at(-1)!}.path`),
50
+ undefined,
51
+ route.parameters.length === 0 && route.query === null
52
+ ? []
53
+ : config.keyword === true
54
+ ? [ts.factory.createIdentifier("props")]
55
+ : [...route.parameters, ...(route.query ? [route.query] : [])].map(
56
+ (p) => ts.factory.createIdentifier(p.key),
57
+ ),
58
+ );
59
+
60
+ const writeTypes = (ctx: IContext): ts.TypeAliasDeclaration[] => {
61
+ const array: ts.TypeAliasDeclaration[] = [];
62
+ const declare = (name: string, type: ts.TypeNode) =>
63
+ array.push(
64
+ ts.factory.createTypeAliasDeclaration(
65
+ [ts.factory.createModifier(ts.SyntaxKind.ExportKeyword)],
66
+ name,
67
+ undefined,
68
+ type,
69
+ ),
70
+ );
71
+ if (
72
+ ctx.config.keyword === true &&
73
+ (ctx.route.parameters.length > 0 || ctx.route.query || ctx.route.body)
74
+ )
75
+ declare(
76
+ "IProps",
77
+ NestiaMigrateSchemaProgrammer.write({
78
+ components: ctx.components,
79
+ importer: ctx.importer,
80
+ schema: {
81
+ type: "object",
82
+ properties: Object.fromEntries([
83
+ ...ctx.route.parameters.map((p) => [
84
+ p.key,
85
+ {
86
+ ...p.schema,
87
+ title: p.parameter().title,
88
+ description: p.parameter().description,
89
+ },
90
+ ]),
91
+ ...(ctx.route.query
92
+ ? [
93
+ [
94
+ ctx.route.query.key,
95
+ {
96
+ ...ctx.route.query.schema,
97
+ title: ctx.route.query.title(),
98
+ description: ctx.route.query.description(),
99
+ },
100
+ ],
101
+ ]
102
+ : []),
103
+ ...(ctx.route.body
104
+ ? [
105
+ [
106
+ ctx.route.body.key,
107
+ {
108
+ ...ctx.route.body.schema,
109
+ description: ctx.route.body.description(),
110
+ },
111
+ ],
112
+ ]
113
+ : []),
114
+ ]),
115
+ required: [
116
+ ...ctx.route.parameters.map((p) => p.key),
117
+ ...(ctx.route.query ? [ctx.route.query.key] : []),
118
+ ...(ctx.route.body ? [ctx.route.body.key] : []),
119
+ ],
120
+ },
121
+ }),
122
+ );
123
+ if (ctx.route.headers)
124
+ declare(
125
+ "Headers",
126
+ NestiaMigrateSchemaProgrammer.write({
127
+ components: ctx.components,
128
+ importer: ctx.importer,
129
+ schema: ctx.route.headers.schema,
130
+ }),
131
+ );
132
+ if (ctx.route.query)
133
+ declare(
134
+ "Query",
135
+ NestiaMigrateSchemaProgrammer.write({
136
+ components: ctx.components,
137
+ importer: ctx.importer,
138
+ schema: ctx.route.query.schema,
139
+ }),
140
+ );
141
+ if (ctx.route.body)
142
+ declare(
143
+ "RequestBody",
144
+ NestiaMigrateSchemaProgrammer.write({
145
+ components: ctx.components,
146
+ importer: ctx.importer,
147
+ schema: ctx.route.body.schema,
148
+ }),
149
+ );
150
+ if (ctx.route.success)
151
+ declare(
152
+ "Response",
153
+ NestiaMigrateSchemaProgrammer.write({
154
+ components: ctx.components,
155
+ importer: ctx.importer,
156
+ schema: ctx.route.success.schema,
157
+ }),
158
+ );
159
+ return array;
160
+ };
161
+
162
+ const writeMetadata = (ctx: IContext): ts.VariableStatement =>
163
+ constant(
164
+ "METADATA",
165
+ ts.factory.createAsExpression(
166
+ ts.factory.createObjectLiteralExpression(
167
+ [
168
+ ts.factory.createPropertyAssignment(
169
+ "method",
170
+ ts.factory.createStringLiteral(ctx.route.method.toUpperCase()),
171
+ ),
172
+ ts.factory.createPropertyAssignment(
173
+ "path",
174
+ ts.factory.createStringLiteral(getPath(ctx.route)),
175
+ ),
176
+ ts.factory.createPropertyAssignment(
177
+ "request",
178
+ ctx.route.body
179
+ ? LiteralFactory.write({
180
+ type: ctx.route.body.type,
181
+ encrypted: !!ctx.route.body["x-nestia-encrypted"],
182
+ })
183
+ : ts.factory.createNull(),
184
+ ),
185
+ ts.factory.createPropertyAssignment(
186
+ "response",
187
+ ctx.route.method.toUpperCase() !== "HEAD"
188
+ ? LiteralFactory.write({
189
+ type: ctx.route.success?.type ?? "application/json",
190
+ encrypted: !!ctx.route.success?.["x-nestia-encrypted"],
191
+ })
192
+ : ts.factory.createNull(),
193
+ ),
194
+ ...(ctx.route.success?.type === "application/x-www-form-urlencoded"
195
+ ? [
196
+ ts.factory.createPropertyAssignment(
197
+ "parseQuery",
198
+ ts.factory.createCallExpression(
199
+ ts.factory.createIdentifier(
200
+ `${ctx.importer.external({
201
+ type: "default",
202
+ library: "typia",
203
+ name: "typia",
204
+ })}.http.createAssertQuery`,
205
+ ),
206
+ [
207
+ NestiaMigrateSchemaProgrammer.write({
208
+ components: ctx.components,
209
+ importer: ctx.importer,
210
+ schema: ctx.route.success.schema,
211
+ }),
212
+ ],
213
+ undefined,
214
+ ),
215
+ ),
216
+ ]
217
+ : []),
218
+ ],
219
+ true,
220
+ ),
221
+ ts.factory.createTypeReferenceNode(
222
+ ts.factory.createIdentifier("const"),
223
+ ),
224
+ ),
225
+ );
226
+
227
+ const writePathFunction = (ctx: IContext): ts.VariableStatement => {
228
+ const empty: boolean =
229
+ ctx.route.parameters.length === 0 && ctx.route.query === null;
230
+ const property = (key: string) =>
231
+ ctx.config.keyword === true
232
+ ? IdentifierFactory.access(ts.factory.createIdentifier("p"), key)
233
+ : ts.factory.createIdentifier(key);
234
+ const out = (body: ts.ConciseBody) =>
235
+ constant(
236
+ "path",
237
+ ts.factory.createArrowFunction(
238
+ [],
239
+ [],
240
+ empty
241
+ ? []
242
+ : ctx.config.keyword === true
243
+ ? [
244
+ IdentifierFactory.parameter(
245
+ "p",
246
+ NestiaMigrateSchemaProgrammer.write({
247
+ components: ctx.components,
248
+ importer: ctx.importer,
249
+ schema: {
250
+ type: "object",
251
+ properties: Object.fromEntries([
252
+ ...ctx.route.parameters.map((p) => [p.key, p.schema]),
253
+ ...(ctx.route.query
254
+ ? [[ctx.route.query.key, ctx.route.query.schema]]
255
+ : []),
256
+ ]),
257
+ required: [
258
+ ...ctx.route.parameters.map((p) => p.key),
259
+ ...(ctx.route.query ? [ctx.route.query.key] : []),
260
+ ],
261
+ },
262
+ }),
263
+ ),
264
+ ]
265
+ : [
266
+ ...ctx.route.parameters.map((p) =>
267
+ IdentifierFactory.parameter(
268
+ p.key,
269
+ NestiaMigrateSchemaProgrammer.write({
270
+ components: ctx.components,
271
+ importer: ctx.importer,
272
+ schema: p.schema,
273
+ }),
274
+ ),
275
+ ),
276
+ ...(ctx.route.query
277
+ ? [
278
+ IdentifierFactory.parameter(
279
+ ctx.route.query.key,
280
+ ts.factory.createTypeReferenceNode(
281
+ `${ctx.route.accessor.at(-1)!}.Query`,
282
+ ),
283
+ ),
284
+ ]
285
+ : []),
286
+ ],
287
+ undefined,
288
+ undefined,
289
+ body,
290
+ ),
291
+ );
292
+ const template = () => {
293
+ const path: string = getPath(ctx.route);
294
+ const split: string[] = path.split(":");
295
+ if (split.length === 1) return ts.factory.createStringLiteral(path);
296
+ return ts.factory.createTemplateExpression(
297
+ ts.factory.createTemplateHead(split[0]),
298
+ split.slice(1).map((s, i, arr) => {
299
+ const name: string = s.split("/")[0];
300
+ return ts.factory.createTemplateSpan(
301
+ ts.factory.createCallExpression(
302
+ ts.factory.createIdentifier("encodeURIComponent"),
303
+ undefined,
304
+ [
305
+ ts.factory.createBinaryExpression(
306
+ property(
307
+ ctx.route.parameters.find((p) => p.name === name)!.key,
308
+ ),
309
+ ts.factory.createToken(ts.SyntaxKind.QuestionQuestionToken),
310
+ ts.factory.createStringLiteral("null"),
311
+ ),
312
+ ],
313
+ ),
314
+ (i !== arr.length - 1
315
+ ? ts.factory.createTemplateMiddle
316
+ : ts.factory.createTemplateTail)(s.substring(name.length)),
317
+ );
318
+ }),
319
+ );
320
+ };
321
+ if (!ctx.route.query) return out(template());
322
+
323
+ const computeName = (str: string): string =>
324
+ ctx.route.parameters.find((p) => p.key === str) !== undefined
325
+ ? computeName("_" + str)
326
+ : str;
327
+ const variables: string = computeName("variables");
328
+ return out(
329
+ ts.factory.createBlock(
330
+ [
331
+ local({
332
+ name: variables,
333
+ type: "URLSearchParams",
334
+ expression: ts.factory.createNewExpression(
335
+ ts.factory.createIdentifier("URLSearchParams"),
336
+ [],
337
+ [],
338
+ ),
339
+ }),
340
+ ts.factory.createForOfStatement(
341
+ undefined,
342
+ ts.factory.createVariableDeclarationList(
343
+ [
344
+ ts.factory.createVariableDeclaration(
345
+ ts.factory.createArrayBindingPattern([
346
+ ts.factory.createBindingElement(
347
+ undefined,
348
+ undefined,
349
+ ts.factory.createIdentifier("key"),
350
+ undefined,
351
+ ),
352
+ ts.factory.createBindingElement(
353
+ undefined,
354
+ undefined,
355
+ ts.factory.createIdentifier("value"),
356
+ undefined,
357
+ ),
358
+ ]),
359
+ undefined,
360
+ undefined,
361
+ undefined,
362
+ ),
363
+ ],
364
+ ts.NodeFlags.Const,
365
+ ),
366
+ ts.factory.createCallExpression(
367
+ ts.factory.createIdentifier("Object.entries"),
368
+ undefined,
369
+ [
370
+ ts.factory.createAsExpression(
371
+ property(ctx.route.query.key),
372
+ TypeFactory.keyword("any"),
373
+ ),
374
+ ],
375
+ ),
376
+ ts.factory.createIfStatement(
377
+ ts.factory.createStrictEquality(
378
+ ts.factory.createIdentifier("undefined"),
379
+ ts.factory.createIdentifier("value"),
380
+ ),
381
+ ts.factory.createContinueStatement(),
382
+ ts.factory.createIfStatement(
383
+ ts.factory.createCallExpression(
384
+ ts.factory.createIdentifier("Array.isArray"),
385
+ undefined,
386
+ [ts.factory.createIdentifier("value")],
387
+ ),
388
+ ts.factory.createExpressionStatement(
389
+ ts.factory.createCallExpression(
390
+ ts.factory.createPropertyAccessExpression(
391
+ ts.factory.createIdentifier("value"),
392
+ ts.factory.createIdentifier("forEach"),
393
+ ),
394
+ undefined,
395
+ [
396
+ ts.factory.createArrowFunction(
397
+ undefined,
398
+ undefined,
399
+ [IdentifierFactory.parameter("elem")],
400
+ undefined,
401
+ undefined,
402
+ ts.factory.createCallExpression(
403
+ IdentifierFactory.access(
404
+ ts.factory.createIdentifier(variables),
405
+ "append",
406
+ ),
407
+ undefined,
408
+ [
409
+ ts.factory.createIdentifier("key"),
410
+ ts.factory.createCallExpression(
411
+ ts.factory.createIdentifier("String"),
412
+ undefined,
413
+ [ts.factory.createIdentifier("elem")],
414
+ ),
415
+ ],
416
+ ),
417
+ ),
418
+ ],
419
+ ),
420
+ ),
421
+ ts.factory.createExpressionStatement(
422
+ ts.factory.createCallExpression(
423
+ IdentifierFactory.access(
424
+ ts.factory.createIdentifier(variables),
425
+ "set",
426
+ ),
427
+ undefined,
428
+ [
429
+ ts.factory.createIdentifier("key"),
430
+ ts.factory.createCallExpression(
431
+ ts.factory.createIdentifier("String"),
432
+ undefined,
433
+ [ts.factory.createIdentifier("value")],
434
+ ),
435
+ ],
436
+ ),
437
+ ),
438
+ ),
439
+ ),
440
+ ),
441
+ local({
442
+ name: "location",
443
+ type: "string",
444
+ expression: template(),
445
+ }),
446
+ ts.factory.createReturnStatement(
447
+ ts.factory.createConditionalExpression(
448
+ ts.factory.createStrictEquality(
449
+ ExpressionFactory.number(0),
450
+ IdentifierFactory.access(
451
+ ts.factory.createIdentifier(variables),
452
+ "size",
453
+ ),
454
+ ),
455
+ undefined,
456
+ ts.factory.createIdentifier("location"),
457
+ undefined,
458
+ ts.factory.createTemplateExpression(
459
+ ts.factory.createTemplateHead(""),
460
+ [
461
+ ts.factory.createTemplateSpan(
462
+ ts.factory.createIdentifier("location"),
463
+ ts.factory.createTemplateMiddle("?"),
464
+ ),
465
+ ts.factory.createTemplateSpan(
466
+ ts.factory.createCallExpression(
467
+ IdentifierFactory.access(
468
+ ts.factory.createIdentifier(variables),
469
+ "toString",
470
+ ),
471
+ undefined,
472
+ undefined,
473
+ ),
474
+ ts.factory.createTemplateTail(""),
475
+ ),
476
+ ],
477
+ ),
478
+ ),
479
+ ),
480
+ ],
481
+ true,
482
+ ),
483
+ );
484
+ };
485
+ }
486
+
487
+ const constant = (name: string, expression: ts.Expression) =>
488
+ ts.factory.createVariableStatement(
489
+ [ts.factory.createModifier(ts.SyntaxKind.ExportKeyword)],
490
+ ts.factory.createVariableDeclarationList(
491
+ [
492
+ ts.factory.createVariableDeclaration(
493
+ name,
494
+ undefined,
495
+ undefined,
496
+ expression,
497
+ ),
498
+ ],
499
+ ts.NodeFlags.Const,
500
+ ),
501
+ );
502
+
503
+ const getPath = (route: IHttpMigrateRoute) =>
504
+ (route.emendedPath.startsWith("/") ? "" : "/") + route.emendedPath;
505
+
506
+ const local = (props: {
507
+ name: string;
508
+ type: string;
509
+ expression: ts.Expression;
510
+ }) =>
511
+ ts.factory.createVariableStatement(
512
+ [],
513
+ ts.factory.createVariableDeclarationList(
514
+ [
515
+ ts.factory.createVariableDeclaration(
516
+ props.name,
517
+ undefined,
518
+ ts.factory.createTypeReferenceNode(props.type),
519
+ props.expression,
520
+ ),
521
+ ],
522
+ ts.NodeFlags.Const,
523
+ ),
524
+ );
@@ -0,0 +1,107 @@
1
+ import { HashMap, hash } from "tstl";
2
+ import ts from "typescript";
3
+
4
+ import { INestiaMigrateContext } from "../structures/INestiaMigrateContext";
5
+ import { FilePrinter } from "../utils/FilePrinter";
6
+ import { NestiaMigrateApiFileProgrammer } from "./NestiaMigrateApiFileProgrammer";
7
+ import { NestiaMigrateDtoProgrammer } from "./NestiaMigrateDtoProgrammer";
8
+ import { NestiaMigrateImportProgrammer } from "./NestiaMigrateImportProgrammer";
9
+
10
+ export namespace NestiaMigrateApiProgrammer {
11
+ export const write = (ctx: INestiaMigrateContext): Record<string, string> => {
12
+ const dict: HashMap<string[], NestiaMigrateApiFileProgrammer.IProps> =
13
+ new HashMap(
14
+ (x) => hash(x.join(".")),
15
+ (x, y) => x.length === y.length && x.join(".") === y.join("."),
16
+ );
17
+ for (const route of ctx.routes) {
18
+ const namespace: string[] = route.accessor.slice(0, -1);
19
+ let last: NestiaMigrateApiFileProgrammer.IProps = dict.take(
20
+ namespace,
21
+ () => ({
22
+ config: ctx.config,
23
+ components: ctx.document.components,
24
+ namespace,
25
+ routes: [],
26
+ children: new Set(),
27
+ }),
28
+ );
29
+ last.routes.push(route);
30
+ namespace.forEach((_s, i, array) => {
31
+ const partial: string[] = namespace.slice(0, array.length - i - 1);
32
+ const props: NestiaMigrateApiFileProgrammer.IProps = dict.take(
33
+ partial,
34
+ () => ({
35
+ config: ctx.config,
36
+ components: ctx.document.components,
37
+ namespace: partial,
38
+ children: new Set(),
39
+ routes: [],
40
+ }),
41
+ );
42
+ props.children.add(last.namespace.at(-1)!);
43
+ last = props;
44
+ });
45
+ }
46
+
47
+ // DO GENERATE
48
+ const files: Record<string, string> = Object.fromEntries(
49
+ dict.toJSON().map(({ second: value }) => [
50
+ `src/${ctx.mode === "nest" ? "api/" : ""}functional/${value.namespace.join("/")}/index.ts`,
51
+ FilePrinter.write({
52
+ statements: NestiaMigrateApiFileProgrammer.write({
53
+ ...value,
54
+ config: ctx.config,
55
+ components: ctx.document.components,
56
+ }),
57
+ }),
58
+ ]),
59
+ );
60
+ if (ctx.mode === "sdk")
61
+ for (const [key, value] of NestiaMigrateDtoProgrammer.compose({
62
+ config: ctx.config,
63
+ components: ctx.document.components,
64
+ }).entries())
65
+ files[`src/structures/${key}.ts`] = FilePrinter.write({
66
+ statements: writeDtoFile(key, value),
67
+ });
68
+ return files;
69
+ };
70
+
71
+ const writeDtoFile = (
72
+ key: string,
73
+ modulo: NestiaMigrateDtoProgrammer.IModule,
74
+ ): ts.Statement[] => {
75
+ const importer = new NestiaMigrateImportProgrammer();
76
+ const statements: ts.Statement[] = iterate(importer, modulo);
77
+ if (statements.length === 0) return [];
78
+ return [
79
+ ...importer.toStatements((name) => `./${name}`, key),
80
+ ...(importer.empty() ? [] : [FilePrinter.newLine()]),
81
+ ...statements,
82
+ ];
83
+ };
84
+
85
+ const iterate = (
86
+ importer: NestiaMigrateImportProgrammer,
87
+ modulo: NestiaMigrateDtoProgrammer.IModule,
88
+ ): ts.Statement[] => {
89
+ const output: ts.Statement[] = [];
90
+ if (modulo.programmer !== null) output.push(modulo.programmer(importer));
91
+ if (modulo.children.size !== 0) {
92
+ const internal: ts.Statement[] = [];
93
+ for (const child of modulo.children.values())
94
+ internal.push(...iterate(importer, child));
95
+ output.push(
96
+ ts.factory.createModuleDeclaration(
97
+ [ts.factory.createModifier(ts.SyntaxKind.ExportKeyword)],
98
+ ts.factory.createIdentifier(modulo.name),
99
+ ts.factory.createModuleBlock(internal),
100
+ ts.NodeFlags.Namespace,
101
+ ),
102
+ );
103
+ }
104
+ output.push(FilePrinter.newLine());
105
+ return output;
106
+ };
107
+ }