@nestia/sdk 6.0.6 → 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 (137) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +92 -92
  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/INestiaConfig.d.ts +66 -69
  15. package/lib/executable/internal/NestiaConfigLoader.js +10 -5
  16. package/lib/executable/internal/NestiaConfigLoader.js.map +1 -1
  17. package/lib/executable/sdk.js +12 -12
  18. package/lib/generates/internal/E2eFileProgrammer.js +30 -14
  19. package/lib/generates/internal/E2eFileProgrammer.js.map +1 -1
  20. package/lib/generates/internal/ImportDictionary.js +13 -4
  21. package/lib/generates/internal/ImportDictionary.js.map +1 -1
  22. package/lib/generates/internal/SdkAliasCollection.d.ts +3 -2
  23. package/lib/generates/internal/SdkAliasCollection.js +8 -3
  24. package/lib/generates/internal/SdkAliasCollection.js.map +1 -1
  25. package/lib/generates/internal/SdkHttpFunctionProgrammer.d.ts +1 -1
  26. package/lib/generates/internal/SdkHttpFunctionProgrammer.js +47 -35
  27. package/lib/generates/internal/SdkHttpFunctionProgrammer.js.map +1 -1
  28. package/lib/generates/internal/SdkHttpNamespaceProgrammer.d.ts +1 -1
  29. package/lib/generates/internal/SdkHttpNamespaceProgrammer.js +50 -37
  30. package/lib/generates/internal/SdkHttpNamespaceProgrammer.js.map +1 -1
  31. package/lib/generates/internal/SdkHttpRouteProgrammer.js +5 -4
  32. package/lib/generates/internal/SdkHttpRouteProgrammer.js.map +1 -1
  33. package/lib/generates/internal/SdkHttpSimulationProgrammer.d.ts +1 -1
  34. package/lib/generates/internal/SdkHttpSimulationProgrammer.js +28 -16
  35. package/lib/generates/internal/SdkHttpSimulationProgrammer.js.map +1 -1
  36. package/lib/generates/internal/SdkTypeProgrammer.js +3 -3
  37. package/lib/generates/internal/SdkTypeProgrammer.js.map +1 -1
  38. package/lib/generates/internal/SdkWebSocketNamespaceProgrammer.js +1 -1
  39. package/lib/generates/internal/SdkWebSocketNamespaceProgrammer.js.map +1 -1
  40. package/lib/generates/internal/SdkWebSocketRouteProgrammer.js +1 -1
  41. package/lib/generates/internal/SdkWebSocketRouteProgrammer.js.map +1 -1
  42. package/lib/utils/ArrayUtil.d.ts +2 -2
  43. package/lib/utils/ArrayUtil.js.map +1 -1
  44. package/package.json +6 -6
  45. package/src/INestiaConfig.ts +269 -271
  46. package/src/NestiaSdkApplication.ts +307 -307
  47. package/src/NestiaSwaggerComposer.ts +138 -138
  48. package/src/analyses/AccessorAnalyzer.ts +67 -67
  49. package/src/analyses/ConfigAnalyzer.ts +155 -155
  50. package/src/analyses/ExceptionAnalyzer.ts +154 -154
  51. package/src/analyses/GenericAnalyzer.ts +49 -49
  52. package/src/analyses/ImportAnalyzer.ts +171 -171
  53. package/src/analyses/PathAnalyzer.ts +69 -69
  54. package/src/analyses/ReflectControllerAnalyzer.ts +105 -105
  55. package/src/analyses/ReflectHttpOperationAnalyzer.ts +183 -183
  56. package/src/analyses/ReflectHttpOperationExceptionAnalyzer.ts +71 -71
  57. package/src/analyses/ReflectHttpOperationParameterAnalyzer.ts +348 -348
  58. package/src/analyses/ReflectHttpOperationResponseAnalyzer.ts +127 -127
  59. package/src/analyses/ReflectMetadataAnalyzer.ts +44 -44
  60. package/src/analyses/ReflectWebSocketOperationAnalyzer.ts +172 -172
  61. package/src/analyses/SecurityAnalyzer.ts +25 -25
  62. package/src/analyses/TypedHttpRouteAnalyzer.ts +186 -186
  63. package/src/analyses/TypedWebSocketRouteAnalyzer.ts +18 -18
  64. package/src/decorators/OperationMetadata.ts +15 -15
  65. package/src/executable/internal/CommandParser.ts +15 -15
  66. package/src/executable/internal/NestiaConfigLoader.ts +78 -78
  67. package/src/executable/internal/NestiaSdkCommand.ts +103 -103
  68. package/src/executable/sdk.ts +75 -75
  69. package/src/generates/CloneGenerator.ts +66 -66
  70. package/src/generates/E2eGenerator.ts +32 -32
  71. package/src/generates/SdkGenerator.ts +159 -159
  72. package/src/generates/SwaggerGenerator.ts +292 -292
  73. package/src/generates/internal/E2eFileProgrammer.ts +214 -183
  74. package/src/generates/internal/FilePrinter.ts +53 -53
  75. package/src/generates/internal/ImportDictionary.ts +159 -147
  76. package/src/generates/internal/SdkAliasCollection.ts +204 -185
  77. package/src/generates/internal/SdkDistributionComposer.ts +103 -103
  78. package/src/generates/internal/SdkFileProgrammer.ts +116 -116
  79. package/src/generates/internal/SdkHttpCloneProgrammer.ts +124 -124
  80. package/src/generates/internal/SdkHttpCloneReferencer.ts +71 -71
  81. package/src/generates/internal/SdkHttpFunctionProgrammer.ts +325 -301
  82. package/src/generates/internal/SdkHttpNamespaceProgrammer.ts +563 -529
  83. package/src/generates/internal/SdkHttpRouteProgrammer.ts +119 -117
  84. package/src/generates/internal/SdkHttpSimulationProgrammer.ts +386 -362
  85. package/src/generates/internal/SdkImportWizard.ts +55 -55
  86. package/src/generates/internal/SdkRouteDirectory.ts +18 -18
  87. package/src/generates/internal/SdkTypeProgrammer.ts +377 -377
  88. package/src/generates/internal/SdkTypeTagProgrammer.ts +102 -102
  89. package/src/generates/internal/SdkWebSocketNamespaceProgrammer.ts +362 -362
  90. package/src/generates/internal/SdkWebSocketRouteProgrammer.ts +265 -265
  91. package/src/generates/internal/SwaggerDescriptionComposer.ts +64 -64
  92. package/src/generates/internal/SwaggerOperationComposer.ts +119 -119
  93. package/src/generates/internal/SwaggerOperationParameterComposer.ts +177 -177
  94. package/src/generates/internal/SwaggerOperationResponseComposer.ts +110 -110
  95. package/src/index.ts +4 -4
  96. package/src/module.ts +3 -3
  97. package/src/structures/INestiaProject.ts +13 -13
  98. package/src/structures/INestiaSdkInput.ts +20 -20
  99. package/src/structures/IReflectApplication.ts +8 -8
  100. package/src/structures/IReflectController.ts +15 -15
  101. package/src/structures/IReflectHttpOperation.ts +26 -26
  102. package/src/structures/IReflectHttpOperationException.ts +19 -19
  103. package/src/structures/IReflectHttpOperationParameter.ts +81 -81
  104. package/src/structures/IReflectHttpOperationSuccess.ts +22 -22
  105. package/src/structures/IReflectOperationError.ts +26 -26
  106. package/src/structures/IReflectType.ts +4 -4
  107. package/src/structures/IReflectTypeImport.ts +4 -4
  108. package/src/structures/IReflectWebSocketOperation.ts +17 -17
  109. package/src/structures/IReflectWebSocketOperationParameter.ts +38 -38
  110. package/src/structures/ITypedApplication.ts +11 -11
  111. package/src/structures/ITypedHttpRoute.ts +30 -30
  112. package/src/structures/ITypedHttpRouteException.ts +15 -15
  113. package/src/structures/ITypedHttpRouteParameter.ts +41 -41
  114. package/src/structures/ITypedHttpRouteSuccess.ts +22 -22
  115. package/src/structures/ITypedWebSocketRoute.ts +20 -20
  116. package/src/structures/ITypedWebSocketRouteParameter.ts +3 -3
  117. package/src/structures/MethodType.ts +5 -5
  118. package/src/structures/ParamCategory.ts +1 -1
  119. package/src/structures/TypeEntry.ts +22 -22
  120. package/src/transform.ts +9 -9
  121. package/src/transformers/IOperationMetadata.ts +44 -44
  122. package/src/transformers/ISdkOperationTransformerContext.ts +8 -8
  123. package/src/transformers/SdkOperationProgrammer.ts +209 -209
  124. package/src/transformers/SdkOperationTransformer.ts +253 -253
  125. package/src/transformers/TextPlainValidator.ts +17 -17
  126. package/src/typings/get-function-location.d.ts +7 -7
  127. package/src/utils/ArrayUtil.ts +26 -26
  128. package/src/utils/FileRetriever.ts +22 -22
  129. package/src/utils/MapUtil.ts +14 -14
  130. package/src/utils/MetadataUtil.ts +26 -26
  131. package/src/utils/PathUtil.ts +10 -10
  132. package/src/utils/SourceFinder.ts +66 -66
  133. package/src/utils/StringUtil.ts +17 -17
  134. package/src/utils/StripEnums.ts +5 -5
  135. package/src/utils/VersioningStrategy.ts +28 -28
  136. package/src/validators/HttpHeadersValidator.ts +34 -34
  137. package/src/validators/HttpQueryValidator.ts +34 -34
@@ -1,183 +1,214 @@
1
- import ts from "typescript";
2
- import { IdentifierFactory } from "typia/lib/factories/IdentifierFactory";
3
-
4
- import { INestiaProject } from "../../structures/INestiaProject";
5
- import { ITypedHttpRoute } from "../../structures/ITypedHttpRoute";
6
- import { FilePrinter } from "./FilePrinter";
7
- import { ImportDictionary } from "./ImportDictionary";
8
- import { SdkAliasCollection } from "./SdkAliasCollection";
9
- import { SdkImportWizard } from "./SdkImportWizard";
10
-
11
- export namespace E2eFileProgrammer {
12
- export const generate =
13
- (project: INestiaProject) =>
14
- (props: { api: string; current: string }) =>
15
- async (route: ITypedHttpRoute): Promise<void> => {
16
- const importer: ImportDictionary = new ImportDictionary(
17
- `${props.current}/${getFunctionName(route)}.ts`,
18
- );
19
- if (project.config.clone !== true)
20
- for (const tuple of route.imports)
21
- for (const instance of tuple.instances)
22
- importer.internal({
23
- file: tuple.file,
24
- type: true,
25
- instance,
26
- });
27
- importer.internal({
28
- type: false,
29
- file: props.api,
30
- instance: null,
31
- name: "api",
32
- });
33
-
34
- const functor = generate_function(project)(importer)(route);
35
- await FilePrinter.write({
36
- location: importer.file,
37
- statements: [
38
- ...importer.toStatements(props.current),
39
- FilePrinter.enter(),
40
- functor,
41
- ],
42
- });
43
- };
44
-
45
- const generate_function =
46
- (project: INestiaProject) =>
47
- (importer: ImportDictionary) =>
48
- (route: ITypedHttpRoute): ts.Statement =>
49
- ts.factory.createVariableStatement(
50
- [ts.factory.createModifier(ts.SyntaxKind.ExportKeyword)],
51
- ts.factory.createVariableDeclarationList(
52
- [
53
- ts.factory.createVariableDeclaration(
54
- ts.factory.createIdentifier(getFunctionName(route)),
55
- undefined,
56
- undefined,
57
- generate_arrow(project)(importer)(route),
58
- ),
59
- ],
60
- ts.NodeFlags.Const,
61
- ),
62
- );
63
-
64
- const generate_arrow =
65
- (project: INestiaProject) =>
66
- (importer: ImportDictionary) =>
67
- (route: ITypedHttpRoute) => {
68
- const headers = route.parameters.find(
69
- (p) => p.category === "headers" && p.field === null,
70
- );
71
- const connection = headers
72
- ? ts.factory.createObjectLiteralExpression(
73
- [
74
- ts.factory.createSpreadAssignment(
75
- ts.factory.createIdentifier("connection"),
76
- ),
77
- ts.factory.createPropertyAssignment(
78
- "headers",
79
- ts.factory.createObjectLiteralExpression(
80
- [
81
- ts.factory.createSpreadAssignment(
82
- IdentifierFactory.access(
83
- ts.factory.createIdentifier("connection"),
84
- "headers",
85
- ),
86
- ),
87
- ts.factory.createSpreadAssignment(
88
- ts.factory.createCallExpression(
89
- IdentifierFactory.access(
90
- ts.factory.createIdentifier(
91
- SdkImportWizard.typia(importer),
92
- ),
93
- "random",
94
- ),
95
- [
96
- project.config.clone === true
97
- ? SdkAliasCollection.from(project)(importer)(
98
- headers.metadata,
99
- )
100
- : SdkAliasCollection.name(headers),
101
- ],
102
- undefined,
103
- ),
104
- ),
105
- ],
106
- true,
107
- ),
108
- ),
109
- ],
110
- true,
111
- )
112
- : ts.factory.createIdentifier("connection");
113
- const caller = ts.factory.createCallExpression(
114
- ts.factory.createIdentifier(
115
- ["api", "functional", ...route.accessor].join("."),
116
- ),
117
- undefined,
118
- [
119
- connection,
120
- ...route.parameters
121
- .filter((p) => p.category !== "headers")
122
- .map((p) =>
123
- ts.factory.createCallExpression(
124
- IdentifierFactory.access(
125
- ts.factory.createIdentifier(SdkImportWizard.typia(importer)),
126
- "random",
127
- ),
128
- [
129
- project.config.clone === true
130
- ? SdkAliasCollection.from(project)(importer)(p.metadata)
131
- : SdkAliasCollection.name(p),
132
- ],
133
- undefined,
134
- ),
135
- ),
136
- ],
137
- );
138
- const assert = ts.factory.createCallExpression(
139
- IdentifierFactory.access(
140
- ts.factory.createIdentifier(SdkImportWizard.typia(importer)),
141
- "assert",
142
- ),
143
- undefined,
144
- [ts.factory.createIdentifier("output")],
145
- );
146
-
147
- return ts.factory.createArrowFunction(
148
- [ts.factory.createModifier(ts.SyntaxKind.AsyncKeyword)],
149
- undefined,
150
- [
151
- IdentifierFactory.parameter(
152
- "connection",
153
- ts.factory.createTypeReferenceNode("api.IConnection"),
154
- ),
155
- ],
156
- undefined,
157
- undefined,
158
- ts.factory.createBlock([
159
- ts.factory.createVariableStatement(
160
- [],
161
- ts.factory.createVariableDeclarationList(
162
- [
163
- ts.factory.createVariableDeclaration(
164
- "output",
165
- undefined,
166
- project.config.propagate !== true &&
167
- route.success.type.name === "void"
168
- ? undefined
169
- : SdkAliasCollection.output(project)(importer)(route),
170
- ts.factory.createAwaitExpression(caller),
171
- ),
172
- ],
173
- ts.NodeFlags.Const,
174
- ),
175
- ),
176
- ts.factory.createExpressionStatement(assert),
177
- ]),
178
- );
179
- };
180
- }
181
-
182
- const getFunctionName = (route: ITypedHttpRoute): string =>
183
- ["test", "api", ...route.accessor].join("_");
1
+ import ts from "typescript";
2
+ import { IdentifierFactory } from "typia/lib/factories/IdentifierFactory";
3
+ import { LiteralFactory } from "typia/lib/factories/LiteralFactory";
4
+
5
+ import { INestiaProject } from "../../structures/INestiaProject";
6
+ import { ITypedHttpRoute } from "../../structures/ITypedHttpRoute";
7
+ import { FilePrinter } from "./FilePrinter";
8
+ import { ImportDictionary } from "./ImportDictionary";
9
+ import { SdkAliasCollection } from "./SdkAliasCollection";
10
+ import { SdkImportWizard } from "./SdkImportWizard";
11
+
12
+ export namespace E2eFileProgrammer {
13
+ export const generate =
14
+ (project: INestiaProject) =>
15
+ (props: { api: string; current: string }) =>
16
+ async (route: ITypedHttpRoute): Promise<void> => {
17
+ const importer: ImportDictionary = new ImportDictionary(
18
+ `${props.current}/${getFunctionName(route)}.ts`,
19
+ );
20
+ if (project.config.clone !== true)
21
+ for (const tuple of route.imports)
22
+ for (const instance of tuple.instances)
23
+ importer.internal({
24
+ file: tuple.file,
25
+ type: true,
26
+ instance,
27
+ });
28
+ importer.internal({
29
+ type: false,
30
+ file: props.api,
31
+ instance: null,
32
+ name: "api",
33
+ });
34
+
35
+ const functor: ts.Statement = generateFunctor(project)(importer)(route);
36
+ await FilePrinter.write({
37
+ location: importer.file,
38
+ statements: [
39
+ ...importer.toStatements(props.current),
40
+ FilePrinter.enter(),
41
+ functor,
42
+ ],
43
+ });
44
+ };
45
+
46
+ const generateFunctor =
47
+ (project: INestiaProject) =>
48
+ (importer: ImportDictionary) =>
49
+ (route: ITypedHttpRoute): ts.Statement =>
50
+ ts.factory.createVariableStatement(
51
+ [ts.factory.createModifier(ts.SyntaxKind.ExportKeyword)],
52
+ ts.factory.createVariableDeclarationList(
53
+ [
54
+ ts.factory.createVariableDeclaration(
55
+ ts.factory.createIdentifier(getFunctionName(route)),
56
+ undefined,
57
+ undefined,
58
+ generateArrow(project)(importer)(route),
59
+ ),
60
+ ],
61
+ ts.NodeFlags.Const,
62
+ ),
63
+ );
64
+
65
+ const generateArrow =
66
+ (project: INestiaProject) =>
67
+ (importer: ImportDictionary) =>
68
+ (route: ITypedHttpRoute) => {
69
+ const headers = route.parameters.find(
70
+ (p) => p.category === "headers" && p.field === null,
71
+ );
72
+ const random = IdentifierFactory.access(
73
+ ts.factory.createIdentifier(SdkImportWizard.typia(importer)),
74
+ "random",
75
+ );
76
+ const connection = headers
77
+ ? ts.factory.createObjectLiteralExpression(
78
+ [
79
+ ts.factory.createSpreadAssignment(
80
+ ts.factory.createIdentifier("connection"),
81
+ ),
82
+ ts.factory.createPropertyAssignment(
83
+ "headers",
84
+ ts.factory.createObjectLiteralExpression(
85
+ [
86
+ ts.factory.createSpreadAssignment(
87
+ IdentifierFactory.access(
88
+ ts.factory.createIdentifier("connection"),
89
+ "headers",
90
+ ),
91
+ ),
92
+ ts.factory.createSpreadAssignment(
93
+ ts.factory.createCallExpression(
94
+ random,
95
+ [
96
+ project.config.clone === true
97
+ ? SdkAliasCollection.from(project)(importer)(
98
+ headers.metadata,
99
+ )
100
+ : SdkAliasCollection.name(headers),
101
+ ],
102
+ undefined,
103
+ ),
104
+ ),
105
+ ],
106
+ true,
107
+ ),
108
+ ),
109
+ ],
110
+ true,
111
+ )
112
+ : ts.factory.createIdentifier("connection");
113
+ const fetch = ts.factory.createCallExpression(
114
+ ts.factory.createIdentifier(
115
+ ["api", "functional", ...route.accessor].join("."),
116
+ ),
117
+ undefined,
118
+ [
119
+ connection,
120
+ ...(project.config.keyword === true &&
121
+ route.parameters.filter((p) => p.category !== "headers").length !== 0
122
+ ? [
123
+ LiteralFactory.write(
124
+ Object.fromEntries(
125
+ route.parameters
126
+ .filter((p) => p.category !== "headers")
127
+ .map((p) => [
128
+ p.name,
129
+ ts.factory.createCallExpression(
130
+ IdentifierFactory.access(
131
+ ts.factory.createIdentifier(
132
+ SdkImportWizard.typia(importer),
133
+ ),
134
+ "random",
135
+ ),
136
+ [
137
+ project.config.clone === true
138
+ ? SdkAliasCollection.from(project)(importer)(
139
+ p.metadata,
140
+ )
141
+ : SdkAliasCollection.name(p),
142
+ ],
143
+ undefined,
144
+ ),
145
+ ]),
146
+ ),
147
+ ),
148
+ ]
149
+ : route.parameters
150
+ .filter((p) => p.category !== "headers")
151
+ .map((p) =>
152
+ ts.factory.createCallExpression(
153
+ IdentifierFactory.access(
154
+ ts.factory.createIdentifier(
155
+ SdkImportWizard.typia(importer),
156
+ ),
157
+ "random",
158
+ ),
159
+ [
160
+ project.config.clone === true
161
+ ? SdkAliasCollection.from(project)(importer)(p.metadata)
162
+ : SdkAliasCollection.name(p),
163
+ ],
164
+ undefined,
165
+ ),
166
+ )),
167
+ ],
168
+ );
169
+ const assert = ts.factory.createCallExpression(
170
+ IdentifierFactory.access(
171
+ ts.factory.createIdentifier(SdkImportWizard.typia(importer)),
172
+ "assert",
173
+ ),
174
+ undefined,
175
+ [ts.factory.createIdentifier("output")],
176
+ );
177
+
178
+ return ts.factory.createArrowFunction(
179
+ [ts.factory.createModifier(ts.SyntaxKind.AsyncKeyword)],
180
+ undefined,
181
+ [
182
+ IdentifierFactory.parameter(
183
+ "connection",
184
+ ts.factory.createTypeReferenceNode("api.IConnection"),
185
+ ),
186
+ ],
187
+ undefined,
188
+ undefined,
189
+ ts.factory.createBlock([
190
+ ts.factory.createVariableStatement(
191
+ [],
192
+ ts.factory.createVariableDeclarationList(
193
+ [
194
+ ts.factory.createVariableDeclaration(
195
+ "output",
196
+ undefined,
197
+ project.config.propagate !== true &&
198
+ route.success.type.name === "void"
199
+ ? undefined
200
+ : SdkAliasCollection.response(project)(importer)(route),
201
+ ts.factory.createAwaitExpression(fetch),
202
+ ),
203
+ ],
204
+ ts.NodeFlags.Const,
205
+ ),
206
+ ),
207
+ ts.factory.createExpressionStatement(assert),
208
+ ]),
209
+ );
210
+ };
211
+ }
212
+
213
+ const getFunctionName = (route: ITypedHttpRoute): string =>
214
+ ["test", "api", ...route.accessor].join("_");
@@ -1,53 +1,53 @@
1
- import fs from "fs";
2
- import { format } from "prettier";
3
- import ts from "typescript";
4
-
5
- export namespace FilePrinter {
6
- export const description = <Node extends ts.Node>(
7
- node: Node,
8
- comment: string,
9
- ): Node => {
10
- if (comment.length === 0) return node;
11
- ts.addSyntheticLeadingComment(
12
- node,
13
- ts.SyntaxKind.MultiLineCommentTrivia,
14
- ["*", ...comment.split("\n").map((str) => ` * ${str}`), ""].join("\n"),
15
- true,
16
- );
17
- return node;
18
- };
19
-
20
- export const enter = () =>
21
- ts.factory.createExpressionStatement(ts.factory.createIdentifier("\n"));
22
-
23
- export const write = async (props: {
24
- location: string;
25
- statements: ts.Statement[];
26
- top?: string;
27
- }): Promise<void> => {
28
- const script: string = ts
29
- .createPrinter()
30
- .printFile(
31
- ts.factory.createSourceFile(
32
- props.statements,
33
- ts.factory.createToken(ts.SyntaxKind.EndOfFileToken),
34
- ts.NodeFlags.None,
35
- ),
36
- );
37
- await fs.promises.writeFile(
38
- props.location,
39
- await beautify((props.top ?? "") + script),
40
- "utf8",
41
- );
42
- };
43
-
44
- const beautify = async (script: string): Promise<string> => {
45
- try {
46
- return await format(script, {
47
- parser: "typescript",
48
- });
49
- } catch {
50
- return script;
51
- }
52
- };
53
- }
1
+ import fs from "fs";
2
+ import { format } from "prettier";
3
+ import ts from "typescript";
4
+
5
+ export namespace FilePrinter {
6
+ export const description = <Node extends ts.Node>(
7
+ node: Node,
8
+ comment: string,
9
+ ): Node => {
10
+ if (comment.length === 0) return node;
11
+ ts.addSyntheticLeadingComment(
12
+ node,
13
+ ts.SyntaxKind.MultiLineCommentTrivia,
14
+ ["*", ...comment.split("\n").map((str) => ` * ${str}`), ""].join("\n"),
15
+ true,
16
+ );
17
+ return node;
18
+ };
19
+
20
+ export const enter = () =>
21
+ ts.factory.createExpressionStatement(ts.factory.createIdentifier("\n"));
22
+
23
+ export const write = async (props: {
24
+ location: string;
25
+ statements: ts.Statement[];
26
+ top?: string;
27
+ }): Promise<void> => {
28
+ const script: string = ts
29
+ .createPrinter()
30
+ .printFile(
31
+ ts.factory.createSourceFile(
32
+ props.statements,
33
+ ts.factory.createToken(ts.SyntaxKind.EndOfFileToken),
34
+ ts.NodeFlags.None,
35
+ ),
36
+ );
37
+ await fs.promises.writeFile(
38
+ props.location,
39
+ await beautify((props.top ?? "") + script),
40
+ "utf8",
41
+ );
42
+ };
43
+
44
+ const beautify = async (script: string): Promise<string> => {
45
+ try {
46
+ return await format(script, {
47
+ parser: "typescript",
48
+ });
49
+ } catch {
50
+ return script;
51
+ }
52
+ };
53
+ }