@nestia/sdk 5.0.0 → 6.0.0-dev.20250406

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 (112) 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 +1 -1
  15. package/lib/executable/internal/NestiaConfigLoader.js +4 -4
  16. package/lib/executable/sdk.js +12 -12
  17. package/lib/generates/SwaggerGenerator.js +1 -1
  18. package/lib/generates/SwaggerGenerator.js.map +1 -1
  19. package/package.json +9 -9
  20. package/src/INestiaConfig.ts +271 -271
  21. package/src/NestiaSdkApplication.ts +307 -307
  22. package/src/NestiaSwaggerComposer.ts +138 -138
  23. package/src/analyses/AccessorAnalyzer.ts +67 -67
  24. package/src/analyses/ConfigAnalyzer.ts +155 -155
  25. package/src/analyses/ExceptionAnalyzer.ts +154 -154
  26. package/src/analyses/GenericAnalyzer.ts +49 -49
  27. package/src/analyses/ImportAnalyzer.ts +171 -171
  28. package/src/analyses/PathAnalyzer.ts +69 -69
  29. package/src/analyses/ReflectControllerAnalyzer.ts +105 -105
  30. package/src/analyses/ReflectHttpOperationAnalyzer.ts +183 -183
  31. package/src/analyses/ReflectHttpOperationExceptionAnalyzer.ts +71 -71
  32. package/src/analyses/ReflectHttpOperationParameterAnalyzer.ts +348 -348
  33. package/src/analyses/ReflectHttpOperationResponseAnalyzer.ts +127 -127
  34. package/src/analyses/ReflectMetadataAnalyzer.ts +44 -44
  35. package/src/analyses/ReflectWebSocketOperationAnalyzer.ts +172 -172
  36. package/src/analyses/SecurityAnalyzer.ts +25 -25
  37. package/src/analyses/TypedHttpRouteAnalyzer.ts +186 -186
  38. package/src/analyses/TypedWebSocketRouteAnalyzer.ts +18 -18
  39. package/src/decorators/OperationMetadata.ts +15 -15
  40. package/src/executable/internal/CommandParser.ts +15 -15
  41. package/src/executable/internal/NestiaConfigLoader.ts +78 -78
  42. package/src/executable/internal/NestiaSdkCommand.ts +103 -103
  43. package/src/executable/sdk.ts +75 -75
  44. package/src/generates/CloneGenerator.ts +66 -66
  45. package/src/generates/E2eGenerator.ts +32 -32
  46. package/src/generates/SdkGenerator.ts +159 -159
  47. package/src/generates/SwaggerGenerator.ts +292 -292
  48. package/src/generates/internal/E2eFileProgrammer.ts +183 -183
  49. package/src/generates/internal/FilePrinter.ts +53 -53
  50. package/src/generates/internal/ImportDictionary.ts +147 -147
  51. package/src/generates/internal/SdkAliasCollection.ts +185 -185
  52. package/src/generates/internal/SdkDistributionComposer.ts +103 -103
  53. package/src/generates/internal/SdkFileProgrammer.ts +116 -116
  54. package/src/generates/internal/SdkHttpCloneProgrammer.ts +124 -124
  55. package/src/generates/internal/SdkHttpCloneReferencer.ts +71 -71
  56. package/src/generates/internal/SdkHttpFunctionProgrammer.ts +301 -301
  57. package/src/generates/internal/SdkHttpNamespaceProgrammer.ts +529 -529
  58. package/src/generates/internal/SdkHttpRouteProgrammer.ts +117 -117
  59. package/src/generates/internal/SdkHttpSimulationProgrammer.ts +362 -362
  60. package/src/generates/internal/SdkImportWizard.ts +55 -55
  61. package/src/generates/internal/SdkRouteDirectory.ts +18 -18
  62. package/src/generates/internal/SdkTypeProgrammer.ts +377 -377
  63. package/src/generates/internal/SdkTypeTagProgrammer.ts +102 -102
  64. package/src/generates/internal/SdkWebSocketNamespaceProgrammer.ts +362 -362
  65. package/src/generates/internal/SdkWebSocketRouteProgrammer.ts +265 -265
  66. package/src/generates/internal/SwaggerDescriptionComposer.ts +64 -64
  67. package/src/generates/internal/SwaggerOperationComposer.ts +119 -119
  68. package/src/generates/internal/SwaggerOperationParameterComposer.ts +177 -177
  69. package/src/generates/internal/SwaggerOperationResponseComposer.ts +110 -110
  70. package/src/index.ts +4 -4
  71. package/src/module.ts +3 -3
  72. package/src/structures/INestiaProject.ts +13 -13
  73. package/src/structures/INestiaSdkInput.ts +20 -20
  74. package/src/structures/IReflectApplication.ts +8 -8
  75. package/src/structures/IReflectController.ts +15 -15
  76. package/src/structures/IReflectHttpOperation.ts +26 -26
  77. package/src/structures/IReflectHttpOperationException.ts +19 -19
  78. package/src/structures/IReflectHttpOperationParameter.ts +81 -81
  79. package/src/structures/IReflectHttpOperationSuccess.ts +22 -22
  80. package/src/structures/IReflectOperationError.ts +26 -26
  81. package/src/structures/IReflectType.ts +4 -4
  82. package/src/structures/IReflectTypeImport.ts +4 -4
  83. package/src/structures/IReflectWebSocketOperation.ts +17 -17
  84. package/src/structures/IReflectWebSocketOperationParameter.ts +38 -38
  85. package/src/structures/ITypedApplication.ts +11 -11
  86. package/src/structures/ITypedHttpRoute.ts +30 -30
  87. package/src/structures/ITypedHttpRouteException.ts +15 -15
  88. package/src/structures/ITypedHttpRouteParameter.ts +41 -41
  89. package/src/structures/ITypedHttpRouteSuccess.ts +22 -22
  90. package/src/structures/ITypedWebSocketRoute.ts +20 -20
  91. package/src/structures/ITypedWebSocketRouteParameter.ts +3 -3
  92. package/src/structures/MethodType.ts +5 -5
  93. package/src/structures/ParamCategory.ts +1 -1
  94. package/src/structures/TypeEntry.ts +22 -22
  95. package/src/transform.ts +9 -9
  96. package/src/transformers/IOperationMetadata.ts +44 -44
  97. package/src/transformers/ISdkOperationTransformerContext.ts +8 -8
  98. package/src/transformers/SdkOperationProgrammer.ts +209 -209
  99. package/src/transformers/SdkOperationTransformer.ts +253 -253
  100. package/src/transformers/TextPlainValidator.ts +17 -17
  101. package/src/typings/get-function-location.d.ts +7 -7
  102. package/src/utils/ArrayUtil.ts +26 -26
  103. package/src/utils/FileRetriever.ts +22 -22
  104. package/src/utils/MapUtil.ts +14 -14
  105. package/src/utils/MetadataUtil.ts +26 -26
  106. package/src/utils/PathUtil.ts +10 -10
  107. package/src/utils/SourceFinder.ts +66 -66
  108. package/src/utils/StringUtil.ts +17 -17
  109. package/src/utils/StripEnums.ts +5 -5
  110. package/src/utils/VersioningStrategy.ts +28 -28
  111. package/src/validators/HttpHeadersValidator.ts +34 -34
  112. 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
+ }