@nestia/sdk 4.6.1-dev.20250117 → 4.6.2

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 (122) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +92 -87
  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 +2 -2
  15. package/lib/analyses/GenericAnalyzer.js +1 -1
  16. package/lib/executable/internal/NestiaConfigLoader.js +4 -4
  17. package/lib/executable/sdk.js +12 -12
  18. package/lib/generates/SdkGenerator.js +2 -2
  19. package/lib/generates/SdkGenerator.js.map +1 -1
  20. package/lib/generates/internal/SdkHttpNamespaceProgrammer.js +3 -3
  21. package/lib/generates/internal/SdkHttpNamespaceProgrammer.js.map +1 -1
  22. package/lib/generates/internal/SdkHttpRouteProgrammer.js +1 -1
  23. package/lib/generates/internal/SdkTypeTagProgrammer.js +3 -16
  24. package/lib/generates/internal/SdkTypeTagProgrammer.js.map +1 -1
  25. package/lib/generates/internal/SdkWebSocketNamespaceProgrammer.js +3 -3
  26. package/lib/generates/internal/SdkWebSocketNamespaceProgrammer.js.map +1 -1
  27. package/lib/generates/internal/SwaggerOperationResponseComposer.js +1 -1
  28. package/lib/generates/internal/SwaggerOperationResponseComposer.js.map +1 -1
  29. package/package.json +7 -7
  30. package/src/INestiaConfig.ts +271 -271
  31. package/src/NestiaSdkApplication.ts +307 -307
  32. package/src/NestiaSwaggerComposer.ts +138 -138
  33. package/src/analyses/AccessorAnalyzer.ts +67 -67
  34. package/src/analyses/ConfigAnalyzer.ts +155 -155
  35. package/src/analyses/ExceptionAnalyzer.ts +154 -154
  36. package/src/analyses/GenericAnalyzer.ts +49 -49
  37. package/src/analyses/ImportAnalyzer.ts +171 -171
  38. package/src/analyses/PathAnalyzer.ts +69 -69
  39. package/src/analyses/ReflectControllerAnalyzer.ts +105 -105
  40. package/src/analyses/ReflectHttpOperationAnalyzer.ts +183 -183
  41. package/src/analyses/ReflectHttpOperationExceptionAnalyzer.ts +71 -71
  42. package/src/analyses/ReflectHttpOperationParameterAnalyzer.ts +348 -348
  43. package/src/analyses/ReflectHttpOperationResponseAnalyzer.ts +127 -127
  44. package/src/analyses/ReflectMetadataAnalyzer.ts +44 -44
  45. package/src/analyses/ReflectWebSocketOperationAnalyzer.ts +172 -172
  46. package/src/analyses/SecurityAnalyzer.ts +25 -25
  47. package/src/analyses/TypedHttpRouteAnalyzer.ts +186 -186
  48. package/src/analyses/TypedWebSocketRouteAnalyzer.ts +18 -18
  49. package/src/decorators/OperationMetadata.ts +15 -15
  50. package/src/executable/internal/CommandParser.ts +15 -15
  51. package/src/executable/internal/NestiaConfigLoader.ts +78 -78
  52. package/src/executable/internal/NestiaSdkCommand.ts +103 -103
  53. package/src/executable/sdk.ts +75 -75
  54. package/src/generates/CloneGenerator.ts +66 -66
  55. package/src/generates/E2eGenerator.ts +32 -32
  56. package/src/generates/SdkGenerator.ts +159 -159
  57. package/src/generates/SwaggerGenerator.ts +292 -292
  58. package/src/generates/internal/E2eFileProgrammer.ts +183 -183
  59. package/src/generates/internal/FilePrinter.ts +53 -53
  60. package/src/generates/internal/ImportDictionary.ts +147 -147
  61. package/src/generates/internal/SdkAliasCollection.ts +185 -185
  62. package/src/generates/internal/SdkDistributionComposer.ts +103 -103
  63. package/src/generates/internal/SdkFileProgrammer.ts +116 -116
  64. package/src/generates/internal/SdkHttpCloneProgrammer.ts +124 -124
  65. package/src/generates/internal/SdkHttpCloneReferencer.ts +71 -71
  66. package/src/generates/internal/SdkHttpFunctionProgrammer.ts +301 -301
  67. package/src/generates/internal/SdkHttpNamespaceProgrammer.ts +529 -529
  68. package/src/generates/internal/SdkHttpRouteProgrammer.ts +117 -117
  69. package/src/generates/internal/SdkHttpSimulationProgrammer.ts +362 -362
  70. package/src/generates/internal/SdkImportWizard.ts +55 -55
  71. package/src/generates/internal/SdkRouteDirectory.ts +18 -18
  72. package/src/generates/internal/SdkTypeProgrammer.ts +377 -377
  73. package/src/generates/internal/SdkTypeTagProgrammer.ts +102 -120
  74. package/src/generates/internal/SdkWebSocketNamespaceProgrammer.ts +362 -363
  75. package/src/generates/internal/SdkWebSocketRouteProgrammer.ts +265 -265
  76. package/src/generates/internal/SwaggerDescriptionComposer.ts +64 -64
  77. package/src/generates/internal/SwaggerOperationComposer.ts +119 -119
  78. package/src/generates/internal/SwaggerOperationParameterComposer.ts +177 -177
  79. package/src/generates/internal/SwaggerOperationResponseComposer.ts +110 -110
  80. package/src/index.ts +4 -4
  81. package/src/module.ts +3 -3
  82. package/src/structures/INestiaProject.ts +13 -13
  83. package/src/structures/INestiaSdkInput.ts +20 -20
  84. package/src/structures/IReflectApplication.ts +8 -8
  85. package/src/structures/IReflectController.ts +15 -15
  86. package/src/structures/IReflectHttpOperation.ts +26 -26
  87. package/src/structures/IReflectHttpOperationException.ts +19 -19
  88. package/src/structures/IReflectHttpOperationParameter.ts +81 -81
  89. package/src/structures/IReflectHttpOperationSuccess.ts +22 -22
  90. package/src/structures/IReflectOperationError.ts +26 -26
  91. package/src/structures/IReflectType.ts +4 -4
  92. package/src/structures/IReflectTypeImport.ts +4 -4
  93. package/src/structures/IReflectWebSocketOperation.ts +17 -17
  94. package/src/structures/IReflectWebSocketOperationParameter.ts +38 -38
  95. package/src/structures/ITypedApplication.ts +11 -11
  96. package/src/structures/ITypedHttpRoute.ts +30 -30
  97. package/src/structures/ITypedHttpRouteException.ts +15 -15
  98. package/src/structures/ITypedHttpRouteParameter.ts +41 -41
  99. package/src/structures/ITypedHttpRouteSuccess.ts +22 -22
  100. package/src/structures/ITypedWebSocketRoute.ts +20 -20
  101. package/src/structures/ITypedWebSocketRouteParameter.ts +3 -3
  102. package/src/structures/MethodType.ts +5 -5
  103. package/src/structures/ParamCategory.ts +1 -1
  104. package/src/structures/TypeEntry.ts +22 -22
  105. package/src/transform.ts +9 -9
  106. package/src/transformers/IOperationMetadata.ts +44 -44
  107. package/src/transformers/ISdkOperationTransformerContext.ts +8 -8
  108. package/src/transformers/SdkOperationProgrammer.ts +209 -209
  109. package/src/transformers/SdkOperationTransformer.ts +253 -253
  110. package/src/transformers/TextPlainValidator.ts +17 -17
  111. package/src/typings/get-function-location.d.ts +7 -7
  112. package/src/utils/ArrayUtil.ts +26 -26
  113. package/src/utils/FileRetriever.ts +22 -22
  114. package/src/utils/MapUtil.ts +14 -14
  115. package/src/utils/MetadataUtil.ts +26 -26
  116. package/src/utils/PathUtil.ts +10 -10
  117. package/src/utils/SourceFinder.ts +66 -66
  118. package/src/utils/StringUtil.ts +17 -17
  119. package/src/utils/StripEnums.ts +5 -5
  120. package/src/utils/VersioningStrategy.ts +28 -28
  121. package/src/validators/HttpHeadersValidator.ts +34 -34
  122. package/src/validators/HttpQueryValidator.ts +34 -34
@@ -1,186 +1,186 @@
1
- import { MetadataFactory } from "typia/lib/factories/MetadataFactory";
2
- import { IMetadata } from "typia/lib/schemas/metadata/IMetadata";
3
- import { IMetadataComponents } from "typia/lib/schemas/metadata/IMetadataComponents";
4
- import { IMetadataDictionary } from "typia/lib/schemas/metadata/IMetadataDictionary";
5
- import { Metadata } from "typia/lib/schemas/metadata/Metadata";
6
- import { MetadataComponents } from "typia/lib/schemas/metadata/MetadataComponents";
7
- import { MetadataObjectType } from "typia/lib/schemas/metadata/MetadataObjectType";
8
- import { Escaper } from "typia/lib/utils/Escaper";
9
-
10
- import { IReflectController } from "../structures/IReflectController";
11
- import { IReflectHttpOperation } from "../structures/IReflectHttpOperation";
12
- import { IReflectOperationError } from "../structures/IReflectOperationError";
13
- import { ITypedHttpRoute } from "../structures/ITypedHttpRoute";
14
- import { ITypedHttpRouteException } from "../structures/ITypedHttpRouteException";
15
- import { ITypedHttpRouteParameter } from "../structures/ITypedHttpRouteParameter";
16
- import { ITypedHttpRouteSuccess } from "../structures/ITypedHttpRouteSuccess";
17
- import { PathUtil } from "../utils/PathUtil";
18
-
19
- export namespace TypedHttpRouteAnalyzer {
20
- export const dictionary = (
21
- controllers: IReflectController[],
22
- ): IMetadataDictionary => {
23
- const individual: IMetadataComponents[] = [];
24
- for (const c of controllers)
25
- for (const o of c.operations) {
26
- if (o.protocol !== "http") continue;
27
- if (o.success) individual.push(o.success.components);
28
- for (const p of o.parameters) individual.push(p.components);
29
- for (const e of Object.values(o.exceptions))
30
- individual.push(e.components);
31
- }
32
- const components: MetadataComponents = MetadataComponents.from({
33
- objects: Object.values(
34
- Object.fromEntries(
35
- individual.map((c) => c.objects.map((o) => [o.name, o])).flat(),
36
- ),
37
- ),
38
- arrays: Object.values(
39
- Object.fromEntries(
40
- individual.map((c) => c.arrays.map((a) => [a.name, a])).flat(),
41
- ),
42
- ),
43
- tuples: Object.values(
44
- Object.fromEntries(
45
- individual.map((c) => c.tuples.map((t) => [t.name, t])).flat(),
46
- ),
47
- ),
48
- aliases: Object.values(
49
- Object.fromEntries(
50
- individual.map((c) => c.aliases.map((a) => [a.name, a])).flat(),
51
- ),
52
- ),
53
- });
54
- return components.dictionary;
55
- };
56
-
57
- export const analyze = (props: {
58
- controller: IReflectController;
59
- errors: IReflectOperationError[];
60
- dictionary: IMetadataDictionary;
61
- operation: IReflectHttpOperation;
62
- paths: string[];
63
- }): ITypedHttpRoute[] => {
64
- const errors: IReflectOperationError[] = [];
65
- const cast = (
66
- next: {
67
- metadata: IMetadata;
68
- validate: MetadataFactory.Validator;
69
- },
70
- from: string,
71
- escape: boolean,
72
- ): Metadata => {
73
- const metadata: Metadata = Metadata.from(next.metadata, props.dictionary);
74
- const metaErrors: MetadataFactory.IError[] = MetadataFactory.validate({
75
- options: {
76
- escape,
77
- constant: true,
78
- absorb: true,
79
- validate: next.validate, // @todo -> CHECK IN TYPIA
80
- },
81
- functor: next.validate, // @todo -> CHECK IN TYPIA
82
- metadata,
83
- });
84
- if (metaErrors.length)
85
- errors.push({
86
- file: props.controller.file,
87
- class: props.controller.class.name,
88
- function: props.operation.name,
89
- from,
90
- contents: metaErrors.map((e) => ({
91
- name: e.name,
92
- accessor:
93
- e.explore.object !== null
94
- ? join({
95
- object: e.explore.object,
96
- key: e.explore.property,
97
- })
98
- : null,
99
- messages: e.messages,
100
- })),
101
- });
102
- return metadata;
103
- };
104
- const exceptions: Record<
105
- number | "2XX" | "3XX" | "4XX" | "5XX",
106
- ITypedHttpRouteException
107
- > = Object.fromEntries(
108
- Object.entries(props.operation.exceptions).map(([key, value]) => [
109
- key as any,
110
- {
111
- status: value.status,
112
- description: value.description,
113
- example: value.example,
114
- examples: value.examples,
115
- type: value.type,
116
- metadata: cast(value, `exception (status: ${key})`, true),
117
- },
118
- ]),
119
- );
120
- const parameters: ITypedHttpRouteParameter[] =
121
- props.operation.parameters.map((p) => ({
122
- ...p,
123
- metadata: cast(
124
- p,
125
- `parameter (name: ${JSON.stringify(p.name)})`,
126
- p.category === "body" &&
127
- (p.contentType === "application/json" || p.encrypted === true),
128
- ),
129
- }));
130
- const success: ITypedHttpRouteSuccess = {
131
- ...props.operation.success,
132
- metadata: cast(
133
- props.operation.success,
134
- "success",
135
- props.operation.success.encrypted ||
136
- props.operation.success.contentType === "application/json",
137
- ),
138
- setHeaders: props.operation.jsDocTags
139
- .filter(
140
- (t) =>
141
- t.text?.length &&
142
- t.text[0].text &&
143
- (t.name === "setHeader" || t.name === "assignHeaders"),
144
- )
145
- .map((t) =>
146
- t.name === "setHeader"
147
- ? {
148
- type: "setter",
149
- source: t.text![0].text.split(" ")[0].trim(),
150
- target: t.text![0].text.split(" ")[1]?.trim(),
151
- }
152
- : {
153
- type: "assigner",
154
- source: t.text![0].text,
155
- },
156
- ),
157
- };
158
- if (errors.length) {
159
- props.errors.push(...errors);
160
- return [];
161
- }
162
- return props.paths.map((path) => ({
163
- ...props.operation,
164
- controller: props.controller,
165
- path,
166
- accessor: [...PathUtil.accessors(path), props.operation.name],
167
- exceptions,
168
- parameters,
169
- success,
170
- extensions: props.operation.extensions,
171
- }));
172
- };
173
- }
174
-
175
- const join = ({
176
- object,
177
- key,
178
- }: {
179
- object: MetadataObjectType;
180
- key: string | object | null;
181
- }) => {
182
- if (key === null) return object.name;
183
- else if (typeof key === "object") return `${object.name}[key]`;
184
- else if (Escaper.variable(key)) return `${object.name}.${key}`;
185
- return `${object.name}[${JSON.stringify(key)}]`;
186
- };
1
+ import { MetadataFactory } from "typia/lib/factories/MetadataFactory";
2
+ import { IMetadata } from "typia/lib/schemas/metadata/IMetadata";
3
+ import { IMetadataComponents } from "typia/lib/schemas/metadata/IMetadataComponents";
4
+ import { IMetadataDictionary } from "typia/lib/schemas/metadata/IMetadataDictionary";
5
+ import { Metadata } from "typia/lib/schemas/metadata/Metadata";
6
+ import { MetadataComponents } from "typia/lib/schemas/metadata/MetadataComponents";
7
+ import { MetadataObjectType } from "typia/lib/schemas/metadata/MetadataObjectType";
8
+ import { Escaper } from "typia/lib/utils/Escaper";
9
+
10
+ import { IReflectController } from "../structures/IReflectController";
11
+ import { IReflectHttpOperation } from "../structures/IReflectHttpOperation";
12
+ import { IReflectOperationError } from "../structures/IReflectOperationError";
13
+ import { ITypedHttpRoute } from "../structures/ITypedHttpRoute";
14
+ import { ITypedHttpRouteException } from "../structures/ITypedHttpRouteException";
15
+ import { ITypedHttpRouteParameter } from "../structures/ITypedHttpRouteParameter";
16
+ import { ITypedHttpRouteSuccess } from "../structures/ITypedHttpRouteSuccess";
17
+ import { PathUtil } from "../utils/PathUtil";
18
+
19
+ export namespace TypedHttpRouteAnalyzer {
20
+ export const dictionary = (
21
+ controllers: IReflectController[],
22
+ ): IMetadataDictionary => {
23
+ const individual: IMetadataComponents[] = [];
24
+ for (const c of controllers)
25
+ for (const o of c.operations) {
26
+ if (o.protocol !== "http") continue;
27
+ if (o.success) individual.push(o.success.components);
28
+ for (const p of o.parameters) individual.push(p.components);
29
+ for (const e of Object.values(o.exceptions))
30
+ individual.push(e.components);
31
+ }
32
+ const components: MetadataComponents = MetadataComponents.from({
33
+ objects: Object.values(
34
+ Object.fromEntries(
35
+ individual.map((c) => c.objects.map((o) => [o.name, o])).flat(),
36
+ ),
37
+ ),
38
+ arrays: Object.values(
39
+ Object.fromEntries(
40
+ individual.map((c) => c.arrays.map((a) => [a.name, a])).flat(),
41
+ ),
42
+ ),
43
+ tuples: Object.values(
44
+ Object.fromEntries(
45
+ individual.map((c) => c.tuples.map((t) => [t.name, t])).flat(),
46
+ ),
47
+ ),
48
+ aliases: Object.values(
49
+ Object.fromEntries(
50
+ individual.map((c) => c.aliases.map((a) => [a.name, a])).flat(),
51
+ ),
52
+ ),
53
+ });
54
+ return components.dictionary;
55
+ };
56
+
57
+ export const analyze = (props: {
58
+ controller: IReflectController;
59
+ errors: IReflectOperationError[];
60
+ dictionary: IMetadataDictionary;
61
+ operation: IReflectHttpOperation;
62
+ paths: string[];
63
+ }): ITypedHttpRoute[] => {
64
+ const errors: IReflectOperationError[] = [];
65
+ const cast = (
66
+ next: {
67
+ metadata: IMetadata;
68
+ validate: MetadataFactory.Validator;
69
+ },
70
+ from: string,
71
+ escape: boolean,
72
+ ): Metadata => {
73
+ const metadata: Metadata = Metadata.from(next.metadata, props.dictionary);
74
+ const metaErrors: MetadataFactory.IError[] = MetadataFactory.validate({
75
+ options: {
76
+ escape,
77
+ constant: true,
78
+ absorb: true,
79
+ validate: next.validate, // @todo -> CHECK IN TYPIA
80
+ },
81
+ functor: next.validate, // @todo -> CHECK IN TYPIA
82
+ metadata,
83
+ });
84
+ if (metaErrors.length)
85
+ errors.push({
86
+ file: props.controller.file,
87
+ class: props.controller.class.name,
88
+ function: props.operation.name,
89
+ from,
90
+ contents: metaErrors.map((e) => ({
91
+ name: e.name,
92
+ accessor:
93
+ e.explore.object !== null
94
+ ? join({
95
+ object: e.explore.object,
96
+ key: e.explore.property,
97
+ })
98
+ : null,
99
+ messages: e.messages,
100
+ })),
101
+ });
102
+ return metadata;
103
+ };
104
+ const exceptions: Record<
105
+ number | "2XX" | "3XX" | "4XX" | "5XX",
106
+ ITypedHttpRouteException
107
+ > = Object.fromEntries(
108
+ Object.entries(props.operation.exceptions).map(([key, value]) => [
109
+ key as any,
110
+ {
111
+ status: value.status,
112
+ description: value.description,
113
+ example: value.example,
114
+ examples: value.examples,
115
+ type: value.type,
116
+ metadata: cast(value, `exception (status: ${key})`, true),
117
+ },
118
+ ]),
119
+ );
120
+ const parameters: ITypedHttpRouteParameter[] =
121
+ props.operation.parameters.map((p) => ({
122
+ ...p,
123
+ metadata: cast(
124
+ p,
125
+ `parameter (name: ${JSON.stringify(p.name)})`,
126
+ p.category === "body" &&
127
+ (p.contentType === "application/json" || p.encrypted === true),
128
+ ),
129
+ }));
130
+ const success: ITypedHttpRouteSuccess = {
131
+ ...props.operation.success,
132
+ metadata: cast(
133
+ props.operation.success,
134
+ "success",
135
+ props.operation.success.encrypted ||
136
+ props.operation.success.contentType === "application/json",
137
+ ),
138
+ setHeaders: props.operation.jsDocTags
139
+ .filter(
140
+ (t) =>
141
+ t.text?.length &&
142
+ t.text[0].text &&
143
+ (t.name === "setHeader" || t.name === "assignHeaders"),
144
+ )
145
+ .map((t) =>
146
+ t.name === "setHeader"
147
+ ? {
148
+ type: "setter",
149
+ source: t.text![0].text.split(" ")[0].trim(),
150
+ target: t.text![0].text.split(" ")[1]?.trim(),
151
+ }
152
+ : {
153
+ type: "assigner",
154
+ source: t.text![0].text,
155
+ },
156
+ ),
157
+ };
158
+ if (errors.length) {
159
+ props.errors.push(...errors);
160
+ return [];
161
+ }
162
+ return props.paths.map((path) => ({
163
+ ...props.operation,
164
+ controller: props.controller,
165
+ path,
166
+ accessor: [...PathUtil.accessors(path), props.operation.name],
167
+ exceptions,
168
+ parameters,
169
+ success,
170
+ extensions: props.operation.extensions,
171
+ }));
172
+ };
173
+ }
174
+
175
+ const join = ({
176
+ object,
177
+ key,
178
+ }: {
179
+ object: MetadataObjectType;
180
+ key: string | object | null;
181
+ }) => {
182
+ if (key === null) return object.name;
183
+ else if (typeof key === "object") return `${object.name}[key]`;
184
+ else if (Escaper.variable(key)) return `${object.name}.${key}`;
185
+ return `${object.name}[${JSON.stringify(key)}]`;
186
+ };
@@ -1,18 +1,18 @@
1
- import { IReflectController } from "../structures/IReflectController";
2
- import { IReflectWebSocketOperation } from "../structures/IReflectWebSocketOperation";
3
- import { ITypedWebSocketRoute } from "../structures/ITypedWebSocketRoute";
4
- import { PathUtil } from "../utils/PathUtil";
5
-
6
- export namespace TypedWebSocketRouteAnalyzer {
7
- export const analyze = (props: {
8
- controller: IReflectController;
9
- operation: IReflectWebSocketOperation;
10
- paths: string[];
11
- }): ITypedWebSocketRoute[] =>
12
- props.paths.map((path) => ({
13
- ...props.operation,
14
- controller: props.controller,
15
- path,
16
- accessor: [...PathUtil.accessors(path), props.operation.name],
17
- }));
18
- }
1
+ import { IReflectController } from "../structures/IReflectController";
2
+ import { IReflectWebSocketOperation } from "../structures/IReflectWebSocketOperation";
3
+ import { ITypedWebSocketRoute } from "../structures/ITypedWebSocketRoute";
4
+ import { PathUtil } from "../utils/PathUtil";
5
+
6
+ export namespace TypedWebSocketRouteAnalyzer {
7
+ export const analyze = (props: {
8
+ controller: IReflectController;
9
+ operation: IReflectWebSocketOperation;
10
+ paths: string[];
11
+ }): ITypedWebSocketRoute[] =>
12
+ props.paths.map((path) => ({
13
+ ...props.operation,
14
+ controller: props.controller,
15
+ path,
16
+ accessor: [...PathUtil.accessors(path), props.operation.name],
17
+ }));
18
+ }
@@ -1,15 +1,15 @@
1
- import { IOperationMetadata } from "../transformers/IOperationMetadata";
2
-
3
- export function OperationMetadata(
4
- metadata: IOperationMetadata,
5
- ): MethodDecorator {
6
- return function OperationMetadata(target, propertyKey, descriptor) {
7
- Reflect.defineMetadata(
8
- "nestia/OperationMetadata",
9
- metadata,
10
- target,
11
- propertyKey,
12
- );
13
- return descriptor;
14
- };
15
- }
1
+ import { IOperationMetadata } from "../transformers/IOperationMetadata";
2
+
3
+ export function OperationMetadata(
4
+ metadata: IOperationMetadata,
5
+ ): MethodDecorator {
6
+ return function OperationMetadata(target, propertyKey, descriptor) {
7
+ Reflect.defineMetadata(
8
+ "nestia/OperationMetadata",
9
+ metadata,
10
+ target,
11
+ propertyKey,
12
+ );
13
+ return descriptor;
14
+ };
15
+ }
@@ -1,15 +1,15 @@
1
- export namespace CommandParser {
2
- export function parse(argList: string[]): Record<string, string> {
3
- const output: Record<string, string> = {};
4
- argList.forEach((arg, i) => {
5
- if (arg.startsWith("--") === false) return;
6
-
7
- const key = arg.slice(2);
8
- const value: string | undefined = argList[i + 1];
9
- if (value === undefined || value.startsWith("--")) return;
10
-
11
- output[key] = value;
12
- });
13
- return output;
14
- }
15
- }
1
+ export namespace CommandParser {
2
+ export function parse(argList: string[]): Record<string, string> {
3
+ const output: Record<string, string> = {};
4
+ argList.forEach((arg, i) => {
5
+ if (arg.startsWith("--") === false) return;
6
+
7
+ const key = arg.slice(2);
8
+ const value: string | undefined = argList[i + 1];
9
+ if (value === undefined || value.startsWith("--")) return;
10
+
11
+ output[key] = value;
12
+ });
13
+ return output;
14
+ }
15
+ }
@@ -1,78 +1,78 @@
1
- import { NoTransformConfigurationError } from "@nestia/core/lib/decorators/NoTransformConfigurationError";
2
- import fs from "fs";
3
- import path from "path";
4
- import { register } from "ts-node";
5
- import { parse } from "tsconfck";
6
- import ts from "typescript";
7
- import typia from "typia";
8
-
9
- import { INestiaConfig } from "../../INestiaConfig";
10
-
11
- export namespace NestiaConfigLoader {
12
- export const compilerOptions = async (
13
- project: string,
14
- ): Promise<ts.ParsedCommandLine> => {
15
- const configFileName = ts.findConfigFile(
16
- process.cwd(),
17
- ts.sys.fileExists,
18
- project,
19
- );
20
- if (!configFileName) throw new Error(`unable to find "${project}" file.`);
21
- const { tsconfig } = await parse(configFileName);
22
- const configFileText = JSON.stringify(tsconfig);
23
- const { config } = ts.parseConfigFileTextToJson(
24
- configFileName,
25
- configFileText,
26
- );
27
- return ts.parseJsonConfigFileContent(
28
- config,
29
- ts.sys,
30
- path.dirname(configFileName),
31
- );
32
- };
33
-
34
- export const configurations = async (
35
- file: string,
36
- compilerOptions: Record<string, any>,
37
- ): Promise<INestiaConfig[]> => {
38
- if (fs.existsSync(path.resolve(file)) === false)
39
- throw new Error(`Unable to find "${file}" file.`);
40
-
41
- NoTransformConfigurationError.throws = false;
42
- const plugins: any[] = [
43
- ...typia
44
- .assert<object[]>(compilerOptions.plugins ?? [])
45
- .filter((x: any) => x.transform !== "@nestia/sdk/lib/transform"),
46
- { transform: "@nestia/sdk/lib/transform" },
47
- ];
48
- register({
49
- emit: false,
50
- compilerOptions: {
51
- ...compilerOptions,
52
- plugins,
53
- },
54
- require: compilerOptions.baseUrl
55
- ? ["tsconfig-paths/register"]
56
- : undefined,
57
- });
58
-
59
- const loaded: (INestiaConfig | INestiaConfig[]) & {
60
- default?: INestiaConfig | INestiaConfig[];
61
- } = await import(path.resolve(file));
62
- const instance: INestiaConfig | INestiaConfig[] =
63
- typeof loaded?.default === "object" && loaded.default !== null
64
- ? loaded.default
65
- : loaded;
66
- const configurations: INestiaConfig[] = Array.isArray(instance)
67
- ? instance
68
- : [instance];
69
-
70
- try {
71
- return typia.assert(configurations);
72
- } catch (exp) {
73
- if (typia.is<typia.TypeGuardError>(exp))
74
- exp.message = `invalid "${file}" data.`;
75
- throw exp;
76
- }
77
- };
78
- }
1
+ import { NoTransformConfigurationError } from "@nestia/core/lib/decorators/NoTransformConfigurationError";
2
+ import fs from "fs";
3
+ import path from "path";
4
+ import { register } from "ts-node";
5
+ import { parse } from "tsconfck";
6
+ import ts from "typescript";
7
+ import typia from "typia";
8
+
9
+ import { INestiaConfig } from "../../INestiaConfig";
10
+
11
+ export namespace NestiaConfigLoader {
12
+ export const compilerOptions = async (
13
+ project: string,
14
+ ): Promise<ts.ParsedCommandLine> => {
15
+ const configFileName = ts.findConfigFile(
16
+ process.cwd(),
17
+ ts.sys.fileExists,
18
+ project,
19
+ );
20
+ if (!configFileName) throw new Error(`unable to find "${project}" file.`);
21
+ const { tsconfig } = await parse(configFileName);
22
+ const configFileText = JSON.stringify(tsconfig);
23
+ const { config } = ts.parseConfigFileTextToJson(
24
+ configFileName,
25
+ configFileText,
26
+ );
27
+ return ts.parseJsonConfigFileContent(
28
+ config,
29
+ ts.sys,
30
+ path.dirname(configFileName),
31
+ );
32
+ };
33
+
34
+ export const configurations = async (
35
+ file: string,
36
+ compilerOptions: Record<string, any>,
37
+ ): Promise<INestiaConfig[]> => {
38
+ if (fs.existsSync(path.resolve(file)) === false)
39
+ throw new Error(`Unable to find "${file}" file.`);
40
+
41
+ NoTransformConfigurationError.throws = false;
42
+ const plugins: any[] = [
43
+ ...typia
44
+ .assert<object[]>(compilerOptions.plugins ?? [])
45
+ .filter((x: any) => x.transform !== "@nestia/sdk/lib/transform"),
46
+ { transform: "@nestia/sdk/lib/transform" },
47
+ ];
48
+ register({
49
+ emit: false,
50
+ compilerOptions: {
51
+ ...compilerOptions,
52
+ plugins,
53
+ },
54
+ require: compilerOptions.baseUrl
55
+ ? ["tsconfig-paths/register"]
56
+ : undefined,
57
+ });
58
+
59
+ const loaded: (INestiaConfig | INestiaConfig[]) & {
60
+ default?: INestiaConfig | INestiaConfig[];
61
+ } = await import(path.resolve(file));
62
+ const instance: INestiaConfig | INestiaConfig[] =
63
+ typeof loaded?.default === "object" && loaded.default !== null
64
+ ? loaded.default
65
+ : loaded;
66
+ const configurations: INestiaConfig[] = Array.isArray(instance)
67
+ ? instance
68
+ : [instance];
69
+
70
+ try {
71
+ return typia.assert(configurations);
72
+ } catch (exp) {
73
+ if (typia.is<typia.TypeGuardError>(exp))
74
+ exp.message = `invalid "${file}" data.`;
75
+ throw exp;
76
+ }
77
+ };
78
+ }