@nestia/migrate 0.9.5 → 0.9.7

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 (36) hide show
  1. package/lib/MigrateApplication.js +268 -192
  2. package/lib/MigrateApplication.js.map +1 -1
  3. package/lib/analyzers/MigrateControllerAnalyzer.js +5 -0
  4. package/lib/analyzers/MigrateControllerAnalyzer.js.map +1 -1
  5. package/lib/analyzers/MigrateMethodAnalyzer.js +103 -31
  6. package/lib/analyzers/MigrateMethodAnalyzer.js.map +1 -1
  7. package/lib/bundles/NEST_TEMPLATE.js +2 -2
  8. package/lib/bundles/NEST_TEMPLATE.js.map +1 -1
  9. package/lib/bundles/SDK_TEMPLATE.js +1 -1
  10. package/lib/bundles/SDK_TEMPLATE.js.map +1 -1
  11. package/lib/programmers/MigrateSchemaProgrammer.js +14 -12
  12. package/lib/programmers/MigrateSchemaProgrammer.js.map +1 -1
  13. package/lib/structures/ISwagger.d.ts +1 -1
  14. package/lib/structures/ISwaggerComponents.d.ts +2 -0
  15. package/lib/structures/ISwaggerRoute.d.ts +2 -8
  16. package/lib/structures/ISwaggerRouteParameter.d.ts +13 -0
  17. package/lib/structures/ISwaggerRouteParameter.js +3 -0
  18. package/lib/structures/ISwaggerRouteParameter.js.map +1 -0
  19. package/lib/utils/FilePrinter.d.ts +1 -1
  20. package/lib/utils/SwaggerTypeChecker.d.ts +4 -2
  21. package/lib/utils/SwaggerTypeChecker.js +31 -25
  22. package/lib/utils/SwaggerTypeChecker.js.map +1 -1
  23. package/package.json +5 -5
  24. package/src/analyzers/MigrateControllerAnalyzer.ts +7 -0
  25. package/src/analyzers/MigrateMethodAnalyzer.ts +95 -59
  26. package/src/bundles/NEST_TEMPLATE.ts +2 -2
  27. package/src/bundles/SDK_TEMPLATE.ts +1 -1
  28. package/src/programmers/MigrateSchemaProgrammer.ts +15 -15
  29. package/src/structures/ISwagger.ts +4 -1
  30. package/src/structures/ISwaggerComponents.ts +2 -0
  31. package/src/structures/ISwaggerRoute.ts +2 -8
  32. package/src/structures/ISwaggerRouteHeaders.ts +0 -0
  33. package/src/structures/ISwaggerRouteParameter.ts +14 -0
  34. package/src/structures/ISwaggerRouteRequestBody.ts +0 -0
  35. package/src/structures/ISwaggerRouteResponse.ts +0 -0
  36. package/src/utils/SwaggerTypeChecker.ts +17 -5
@@ -1,7 +1,8 @@
1
1
  import { IJsDocTagInfo } from "typia/lib/schemas/metadata/IJsDocTagInfo";
2
+ import { ISwaggerRouteParameter } from "./ISwaggerRouteParameter";
2
3
  import { ISwaggerSchema } from "./ISwaggerSchema";
3
4
  export interface ISwaggerRoute {
4
- parameters?: ISwaggerRoute.IParameter[];
5
+ parameters?: (ISwaggerRouteParameter | ISwaggerRouteParameter.IReference)[];
5
6
  requestBody?: ISwaggerRoute.IRequestBody;
6
7
  responses?: ISwaggerRoute.IResponseBody;
7
8
  summary?: string;
@@ -12,13 +13,6 @@ export interface ISwaggerRoute {
12
13
  "x-nestia-jsDocTags"?: IJsDocTagInfo[];
13
14
  }
14
15
  export declare namespace ISwaggerRoute {
15
- interface IParameter {
16
- name?: string;
17
- in: "path" | "query" | "header" | "cookie";
18
- schema: ISwaggerSchema;
19
- required?: boolean;
20
- description?: string;
21
- }
22
16
  interface IRequestBody {
23
17
  description?: string;
24
18
  content: IContent;
@@ -0,0 +1,13 @@
1
+ import { ISwaggerSchema } from "./ISwaggerSchema";
2
+ export interface ISwaggerRouteParameter {
3
+ name?: string;
4
+ in: "path" | "query" | "header" | "cookie";
5
+ schema: ISwaggerSchema;
6
+ required?: boolean;
7
+ description?: string;
8
+ }
9
+ export declare namespace ISwaggerRouteParameter {
10
+ interface IReference {
11
+ $ref: `#/components/parameters/${string}`;
12
+ }
13
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=ISwaggerRouteParameter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ISwaggerRouteParameter.js","sourceRoot":"","sources":["../../src/structures/ISwaggerRouteParameter.ts"],"names":[],"mappings":""}
@@ -1,6 +1,6 @@
1
1
  import ts from "typescript";
2
2
  export declare namespace FilePrinter {
3
- const description: <Node_1 extends ts.Node>(node: Node_1, comment: string) => Node_1;
3
+ const description: <Node extends ts.Node>(node: Node, comment: string) => Node;
4
4
  const newLine: () => ts.ExpressionStatement;
5
5
  const write: (props: {
6
6
  statements: ts.Statement[];
@@ -1,6 +1,7 @@
1
- import { ISwaggerSchema } from "../structures/ISwaggerSchema";
2
1
  import { ISwaggerComponents } from "../structures/ISwaggerComponents";
3
- export declare namespace SwaggerSwaggerChecker {
2
+ import { ISwaggerRouteParameter } from "../structures/ISwaggerRouteParameter";
3
+ import { ISwaggerSchema } from "../structures/ISwaggerSchema";
4
+ export declare namespace SwaggerTypeChecker {
4
5
  const isAnyOf: (schema: ISwaggerSchema) => schema is ISwaggerSchema.IAnyOf;
5
6
  const isOneOf: (schema: ISwaggerSchema) => schema is ISwaggerSchema.IOneOf;
6
7
  const isNullOnly: (schema: ISwaggerSchema) => schema is ISwaggerSchema.INullOnly;
@@ -13,4 +14,5 @@ export declare namespace SwaggerSwaggerChecker {
13
14
  const isReference: (schema: ISwaggerSchema) => schema is ISwaggerSchema.IReference;
14
15
  const isUnknown: (schema: ISwaggerSchema) => schema is ISwaggerSchema.IUnknown;
15
16
  const isNullable: (components: ISwaggerComponents) => (schema: ISwaggerSchema) => boolean;
17
+ const getParameter: (components: ISwaggerComponents) => (schema: ISwaggerRouteParameter | ISwaggerRouteParameter.IReference) => ISwaggerRouteParameter | null;
16
18
  }
@@ -1,34 +1,40 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SwaggerSwaggerChecker = void 0;
4
- var SwaggerSwaggerChecker;
5
- (function (SwaggerSwaggerChecker) {
6
- SwaggerSwaggerChecker.isAnyOf = (schema) => schema.anyOf !== undefined;
7
- SwaggerSwaggerChecker.isOneOf = (schema) => schema.oneOf !== undefined;
8
- SwaggerSwaggerChecker.isNullOnly = (schema) => schema.type === "null";
9
- SwaggerSwaggerChecker.isBoolean = (schema) => schema.type === "boolean";
10
- SwaggerSwaggerChecker.isInteger = (schema) => schema.type === "integer";
11
- SwaggerSwaggerChecker.isNumber = (schema) => schema.type === "number";
12
- SwaggerSwaggerChecker.isString = (schema) => schema.type === "string";
13
- SwaggerSwaggerChecker.isArray = (schema) => schema.type === "array";
14
- SwaggerSwaggerChecker.isObject = (schema) => schema.type === "object";
15
- SwaggerSwaggerChecker.isReference = (schema) => schema.$ref !== undefined;
16
- SwaggerSwaggerChecker.isUnknown = (schema) => schema.type === undefined &&
17
- !SwaggerSwaggerChecker.isAnyOf(schema) &&
18
- !SwaggerSwaggerChecker.isOneOf(schema) &&
19
- !SwaggerSwaggerChecker.isReference(schema);
20
- SwaggerSwaggerChecker.isNullable = (components) => (schema) => {
3
+ exports.SwaggerTypeChecker = void 0;
4
+ var SwaggerTypeChecker;
5
+ (function (SwaggerTypeChecker) {
6
+ SwaggerTypeChecker.isAnyOf = (schema) => schema.anyOf !== undefined;
7
+ SwaggerTypeChecker.isOneOf = (schema) => schema.oneOf !== undefined;
8
+ SwaggerTypeChecker.isNullOnly = (schema) => schema.type === "null";
9
+ SwaggerTypeChecker.isBoolean = (schema) => schema.type === "boolean";
10
+ SwaggerTypeChecker.isInteger = (schema) => schema.type === "integer";
11
+ SwaggerTypeChecker.isNumber = (schema) => schema.type === "number";
12
+ SwaggerTypeChecker.isString = (schema) => schema.type === "string";
13
+ SwaggerTypeChecker.isArray = (schema) => schema.type === "array";
14
+ SwaggerTypeChecker.isObject = (schema) => schema.type === "object";
15
+ SwaggerTypeChecker.isReference = (schema) => schema.$ref !== undefined;
16
+ SwaggerTypeChecker.isUnknown = (schema) => schema.type === undefined &&
17
+ !SwaggerTypeChecker.isAnyOf(schema) &&
18
+ !SwaggerTypeChecker.isOneOf(schema) &&
19
+ !SwaggerTypeChecker.isReference(schema);
20
+ SwaggerTypeChecker.isNullable = (components) => (schema) => {
21
21
  var _a;
22
- if (SwaggerSwaggerChecker.isAnyOf(schema))
23
- return schema.anyOf.some(SwaggerSwaggerChecker.isNullable(components));
24
- else if (SwaggerSwaggerChecker.isOneOf(schema))
25
- return schema.oneOf.some(SwaggerSwaggerChecker.isNullable(components));
26
- else if (SwaggerSwaggerChecker.isReference(schema)) {
22
+ if (SwaggerTypeChecker.isAnyOf(schema))
23
+ return schema.anyOf.some(SwaggerTypeChecker.isNullable(components));
24
+ else if (SwaggerTypeChecker.isOneOf(schema))
25
+ return schema.oneOf.some(SwaggerTypeChecker.isNullable(components));
26
+ else if (SwaggerTypeChecker.isReference(schema)) {
27
27
  const $id = schema.$ref.replace("#/components/schemas/", "");
28
28
  const target = ((_a = components.schemas) !== null && _a !== void 0 ? _a : {})[$id];
29
- return target === undefined ? false : SwaggerSwaggerChecker.isNullable(components)(target);
29
+ return target === undefined ? false : SwaggerTypeChecker.isNullable(components)(target);
30
30
  }
31
31
  return schema.nullable === true;
32
32
  };
33
- })(SwaggerSwaggerChecker || (exports.SwaggerSwaggerChecker = SwaggerSwaggerChecker = {}));
33
+ SwaggerTypeChecker.getParameter = (components) => (schema) => {
34
+ var _a, _b;
35
+ return SwaggerTypeChecker.isReference(schema) && schema.$ref.startsWith("#/components/parameters/")
36
+ ? (_b = (_a = components.parameters) === null || _a === void 0 ? void 0 : _a[schema.$ref.replace("#/components/parameters/", "")]) !== null && _b !== void 0 ? _b : null
37
+ : schema;
38
+ };
39
+ })(SwaggerTypeChecker || (exports.SwaggerTypeChecker = SwaggerTypeChecker = {}));
34
40
  //# sourceMappingURL=SwaggerTypeChecker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SwaggerTypeChecker.js","sourceRoot":"","sources":["../../src/utils/SwaggerTypeChecker.ts"],"names":[],"mappings":";;;AAGA,IAAiB,qBAAqB,CA+DrC;AA/DD,WAAiB,qBAAqB;IACvB,6BAAO,GAAG,CACrB,MAAsB,EACW,EAAE,CAAE,MAAc,CAAC,KAAK,KAAK,SAAS,CAAC;IAE7D,6BAAO,GAAG,CACrB,MAAsB,EACW,EAAE,CAAE,MAAc,CAAC,KAAK,KAAK,SAAS,CAAC;IAE7D,gCAAU,GAAG,CACxB,MAAsB,EACc,EAAE,CAAE,MAAc,CAAC,IAAI,KAAK,MAAM,CAAC;IAE5D,+BAAS,GAAG,CACvB,MAAsB,EACa,EAAE,CAAE,MAAc,CAAC,IAAI,KAAK,SAAS,CAAC;IAE9D,+BAAS,GAAG,CACvB,MAAsB,EACa,EAAE,CAAE,MAAc,CAAC,IAAI,KAAK,SAAS,CAAC;IAE9D,8BAAQ,GAAG,CACtB,MAAsB,EACY,EAAE,CAAE,MAAc,CAAC,IAAI,KAAK,QAAQ,CAAC;IAE5D,8BAAQ,GAAG,CACtB,MAAsB,EACY,EAAE,CAAE,MAAc,CAAC,IAAI,KAAK,QAAQ,CAAC;IAE5D,6BAAO,GAAG,CACrB,MAAsB,EACW,EAAE,CAAE,MAAc,CAAC,IAAI,KAAK,OAAO,CAAC;IAE1D,8BAAQ,GAAG,CACtB,MAAsB,EACY,EAAE,CAAE,MAAc,CAAC,IAAI,KAAK,QAAQ,CAAC;IAE5D,iCAAW,GAAG,CACzB,MAAsB,EACe,EAAE,CAAE,MAAc,CAAC,IAAI,KAAK,SAAS,CAAC;IAEhE,+BAAS,GAAG,CACvB,MAAsB,EACa,EAAE,CACpC,MAAc,CAAC,IAAI,KAAK,SAAS;QAClC,CAAC,sBAAA,OAAO,CAAC,MAAM,CAAC;QAChB,CAAC,sBAAA,OAAO,CAAC,MAAM,CAAC;QAChB,CAAC,sBAAA,WAAW,CAAC,MAAM,CAAC,CAAC;IAEV,gCAAU,GACrB,CAAC,UAA8B,EAAE,EAAE,CACnC,CAAC,MAAsB,EAAW,EAAE;;QAClC,IAAI,qBAAqB,CAAC,OAAO,CAAC,MAAM,CAAC;YACvC,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAA,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;aAC9C,IAAI,qBAAqB,CAAC,OAAO,CAAC,MAAM,CAAC;YAC5C,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,sBAAA,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;aAC9C,IAAI,qBAAqB,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;YACnD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAC;YAC7D,MAAM,MAAM,GAAG,CAAC,MAAA,UAAU,CAAC,OAAO,mCAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;YAC/C,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,sBAAA,UAAU,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;QACvE,CAAC;QACD,OAAQ,MAAiC,CAAC,QAAQ,KAAK,IAAI,CAAC;IAC9D,CAAC,CAAC;AACN,CAAC,EA/DgB,qBAAqB,qCAArB,qBAAqB,QA+DrC"}
1
+ {"version":3,"file":"SwaggerTypeChecker.js","sourceRoot":"","sources":["../../src/utils/SwaggerTypeChecker.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nestia/migrate",
3
- "version": "0.9.5",
3
+ "version": "0.9.7",
4
4
  "description": "Migration program from swagger to NestJS",
5
5
  "main": "lib/index.js",
6
6
  "typings": "lib/index.d.ts",
@@ -34,9 +34,9 @@
34
34
  },
35
35
  "homepage": "https://nestia.io",
36
36
  "devDependencies": {
37
- "@nestia/core": "^2.5.8",
37
+ "@nestia/core": "^2.5.15",
38
38
  "@nestia/e2e": "^0.4.1",
39
- "@nestia/fetcher": "^2.5.8",
39
+ "@nestia/fetcher": "^2.5.15",
40
40
  "@nestjs/common": "^10.3.3",
41
41
  "@nestjs/core": "^10.3.3",
42
42
  "@nestjs/platform-express": "^10.3.3",
@@ -59,8 +59,8 @@
59
59
  "inquirer": "8.2.5",
60
60
  "prettier": "^3.2.5",
61
61
  "tstl": "^2.5.13",
62
- "typescript": "^5.3.3",
63
- "typia": "^5.5.0"
62
+ "typescript": "^5.4.2",
63
+ "typia": "^5.5.7"
64
64
  },
65
65
  "files": [
66
66
  "lib",
@@ -20,6 +20,8 @@ export namespace MigrateControllerAnalyzer {
20
20
 
21
21
  // GATHER ROUTES
22
22
  for (const [path, collection] of Object.entries(props.swagger.paths)) {
23
+ if (collection === undefined) continue;
24
+
23
25
  // PREPARE DIRECTORIES
24
26
  const location: string = StringUtil.splitWithNormalization(path)
25
27
  .filter((str) => str[0] !== "{" && str[0] !== ":")
@@ -29,6 +31,11 @@ export namespace MigrateControllerAnalyzer {
29
31
  // INSERT ROUTES TO THE LAST DIRECTORY
30
32
  const routes: IEntry[] = MapUtil.take(endpoints)(location)(() => []);
31
33
  for (const [method, value] of Object.entries(collection)) {
34
+ if (
35
+ value === undefined ||
36
+ ["get", "post", "patch", "put", "delete"].includes(method) === false
37
+ )
38
+ continue;
32
39
  const r: IMigrateRoute | null = MigrateMethodAnalzyer.analyze(props)({
33
40
  path,
34
41
  method,
@@ -1,12 +1,14 @@
1
+ import typia from "typia";
1
2
  import { Escaper } from "typia/lib/utils/Escaper";
2
3
 
3
4
  import { IMigrateProgram } from "../structures/IMigrateProgram";
4
5
  import { IMigrateRoute } from "../structures/IMigrateRoute";
5
6
  import { ISwagger } from "../structures/ISwagger";
6
7
  import { ISwaggerRoute } from "../structures/ISwaggerRoute";
8
+ import { ISwaggerRouteParameter } from "../structures/ISwaggerRouteParameter";
7
9
  import { ISwaggerSchema } from "../structures/ISwaggerSchema";
8
10
  import { StringUtil } from "../utils/StringUtil";
9
- import { SwaggerSwaggerChecker } from "../utils/SwaggerTypeChecker";
11
+ import { SwaggerTypeChecker } from "../utils/SwaggerTypeChecker";
10
12
 
11
13
  export namespace MigrateMethodAnalzyer {
12
14
  export const analyze =
@@ -25,6 +27,13 @@ export namespace MigrateMethodAnalzyer {
25
27
  );
26
28
 
27
29
  const failures: string[] = [];
30
+ for (const p of route.parameters ?? [])
31
+ if (
32
+ SwaggerTypeChecker.getParameter(props.swagger.components)(p) === null
33
+ )
34
+ failures.push(
35
+ `parameter "${(p as ISwaggerRouteParameter.IReference).$ref}" is not defined in "components.parameters".`,
36
+ );
28
37
  if (body === false)
29
38
  failures.push(
30
39
  `supports only "application/json", "application/x-www-form-urlencoded", "multipart/form-data" and "text/plain" content type in the request body.`,
@@ -39,17 +48,24 @@ export namespace MigrateMethodAnalzyer {
39
48
  );
40
49
 
41
50
  const [headers, query] = ["header", "query"].map((type) => {
42
- const parameters = (route.parameters ?? []).filter(
43
- (p) => p.in === type,
44
- );
51
+ const parameters: ISwaggerRouteParameter[] = (route.parameters ?? [])
52
+ .filter(
53
+ (p) =>
54
+ SwaggerTypeChecker.getParameter(props.swagger.components)(p)
55
+ ?.in === type,
56
+ )
57
+ .map(
58
+ (p) =>
59
+ SwaggerTypeChecker.getParameter(props.swagger.components)(p)!,
60
+ );
45
61
  if (parameters.length === 0) return null;
46
62
 
47
63
  const objects = parameters
48
64
  .map((p) =>
49
- SwaggerSwaggerChecker.isObject(p.schema)
65
+ SwaggerTypeChecker.isObject(p.schema)
50
66
  ? p.schema
51
- : SwaggerSwaggerChecker.isReference(p.schema) &&
52
- SwaggerSwaggerChecker.isObject(
67
+ : SwaggerTypeChecker.isReference(p.schema) &&
68
+ SwaggerTypeChecker.isObject(
53
69
  (props.swagger.components.schemas ?? {})[
54
70
  p.schema.$ref.replace(`#/components/schemas/`, ``)
55
71
  ] ?? {},
@@ -60,11 +76,11 @@ export namespace MigrateMethodAnalzyer {
60
76
  .filter((s) => !!s);
61
77
  const primitives = parameters.filter(
62
78
  (p) =>
63
- SwaggerSwaggerChecker.isBoolean(p.schema) ||
64
- SwaggerSwaggerChecker.isNumber(p.schema) ||
65
- SwaggerSwaggerChecker.isInteger(p.schema) ||
66
- SwaggerSwaggerChecker.isString(p.schema) ||
67
- SwaggerSwaggerChecker.isArray(p.schema),
79
+ SwaggerTypeChecker.isBoolean(p.schema) ||
80
+ SwaggerTypeChecker.isNumber(p.schema) ||
81
+ SwaggerTypeChecker.isInteger(p.schema) ||
82
+ SwaggerTypeChecker.isString(p.schema) ||
83
+ SwaggerTypeChecker.isArray(p.schema),
68
84
  );
69
85
  if (objects.length === 1 && primitives.length === 0) return objects[0];
70
86
  else if (objects.length > 1) {
@@ -75,7 +91,7 @@ export namespace MigrateMethodAnalzyer {
75
91
  }
76
92
 
77
93
  const dto: ISwaggerSchema.IObject | null = objects[0]
78
- ? SwaggerSwaggerChecker.isObject(objects[0])
94
+ ? SwaggerTypeChecker.isObject(objects[0])
79
95
  ? objects[0]
80
96
  : ((props.swagger.components.schemas ?? {})[
81
97
  (objects[0] as ISwaggerSchema.IReference).$ref.replace(
@@ -86,7 +102,7 @@ export namespace MigrateMethodAnalzyer {
86
102
  : null;
87
103
  const entire: ISwaggerSchema.IObject[] = [
88
104
  ...objects.map((o) =>
89
- SwaggerSwaggerChecker.isObject(o)
105
+ SwaggerTypeChecker.isObject(o)
90
106
  ? o
91
107
  : (props.swagger.components.schemas?.[
92
108
  o.$ref.replace(`#/components/schemas/`, ``)
@@ -152,7 +168,11 @@ export namespace MigrateMethodAnalzyer {
152
168
  );
153
169
  if (
154
170
  parameterNames.length !==
155
- (route.parameters ?? []).filter((p) => p.in === "path").length
171
+ (route.parameters ?? []).filter(
172
+ (p) =>
173
+ SwaggerTypeChecker.getParameter(props.swagger.components)(p)?.in ===
174
+ "path",
175
+ ).length
156
176
  )
157
177
  failures.push(
158
178
  "number of path parameters are not matched with its full path.",
@@ -179,7 +199,10 @@ export namespace MigrateMethodAnalzyer {
179
199
  }
180
200
  : null,
181
201
  parameters: (route.parameters ?? [])
182
- .filter((p) => p.in === "path")
202
+ .map((p) =>
203
+ SwaggerTypeChecker.getParameter(props.swagger.components)(p),
204
+ )
205
+ .filter((p) => p !== null && p.in === "path")
183
206
  .map((p, i) => ({
184
207
  name: parameterNames[i],
185
208
  key: (() => {
@@ -191,8 +214,8 @@ export namespace MigrateMethodAnalzyer {
191
214
  }
192
215
  })(),
193
216
  schema: {
194
- ...p.schema,
195
- description: p.schema.description ?? p.description,
217
+ ...p!.schema,
218
+ description: p!.schema.description ?? p!.description,
196
219
  },
197
220
  })),
198
221
  query: query
@@ -222,56 +245,69 @@ export namespace MigrateMethodAnalzyer {
222
245
  ]),
223
246
  ),
224
247
  deprecated: route.deprecated ?? false,
225
- comment: () => describe(route),
248
+ comment: () => describe(props.swagger)(route),
226
249
  tags: route.tags ?? [],
227
250
  };
228
251
  };
229
252
 
230
- const describe = (route: ISwaggerRoute): string => {
231
- const commentTags: string[] = [];
232
- const add = (text: string) => {
233
- if (commentTags.every((line) => line !== text)) commentTags.push(text);
234
- };
253
+ const describe =
254
+ (swagger: ISwagger) =>
255
+ (route: ISwaggerRoute): string => {
256
+ const commentTags: string[] = [];
257
+ const add = (text: string) => {
258
+ if (commentTags.every((line) => line !== text)) commentTags.push(text);
259
+ };
235
260
 
236
- let description: string = route.description ?? "";
237
- if (route.summary) {
238
- const emended: string = route.summary.endsWith(".")
239
- ? route.summary
240
- : route.summary + ".";
241
- if (
242
- !!description.length &&
243
- !description.startsWith(route.summary) &&
244
- !route["x-nestia-jsDocTags"]?.some((t) => t.name === "summary")
245
- )
246
- description = `${emended}\n${description}`;
247
- }
248
- for (const p of route.parameters ?? [])
249
- if (p.description) add(`@param ${p.name} ${p.description}`);
250
- if (route.requestBody?.description)
251
- add(`@param body ${route.requestBody.description}`);
252
- for (const security of route.security ?? [])
253
- for (const [name, scopes] of Object.entries(security))
254
- add(`@security ${[name, ...scopes].join("")}`);
255
- if (route.tags) route.tags.forEach((name) => add(`@tag ${name}`));
256
- if (route.deprecated) add("@deprecated");
257
- return description.length
258
- ? commentTags.length
259
- ? `${description}\n\n${commentTags.join("\n")}`
260
- : description
261
- : commentTags.join("\n");
262
- };
261
+ let description: string = route.description ?? "";
262
+ if (route.summary) {
263
+ const emended: string = route.summary.endsWith(".")
264
+ ? route.summary
265
+ : route.summary + ".";
266
+ if (
267
+ !!description.length &&
268
+ !description.startsWith(route.summary) &&
269
+ !route["x-nestia-jsDocTags"]?.some((t) => t.name === "summary")
270
+ )
271
+ description = `${emended}\n${description}`;
272
+ }
273
+ for (const p of route.parameters ?? []) {
274
+ const param: ISwaggerRouteParameter | null = (() => {
275
+ if (!typia.is<ISwaggerRouteParameter.IReference>(p))
276
+ return typia.is<ISwaggerRouteParameter>(p) ? p : null;
277
+ return (
278
+ swagger.components.parameters?.[
279
+ p.$ref.replace(`#/components/parameters/`, ``)
280
+ ] ?? null
281
+ );
282
+ })();
283
+ if (param !== null && param.description)
284
+ add(`@param ${param.name} ${param.description}`);
285
+ }
286
+ if (route.requestBody?.description)
287
+ add(`@param body ${route.requestBody.description}`);
288
+ for (const security of route.security ?? [])
289
+ for (const [name, scopes] of Object.entries(security))
290
+ add(`@security ${[name, ...scopes].join("")}`);
291
+ if (route.tags) route.tags.forEach((name) => add(`@tag ${name}`));
292
+ if (route.deprecated) add("@deprecated");
293
+ return description.length
294
+ ? commentTags.length
295
+ ? `${description}\n\n${commentTags.join("\n")}`
296
+ : description
297
+ : commentTags.join("\n");
298
+ };
263
299
 
264
300
  const isNotObjectLiteral = (schema: ISwaggerSchema): boolean =>
265
- SwaggerSwaggerChecker.isReference(schema) ||
266
- SwaggerSwaggerChecker.isBoolean(schema) ||
267
- SwaggerSwaggerChecker.isNumber(schema) ||
268
- SwaggerSwaggerChecker.isString(schema) ||
269
- SwaggerSwaggerChecker.isUnknown(schema) ||
270
- (SwaggerSwaggerChecker.isAnyOf(schema) &&
301
+ SwaggerTypeChecker.isReference(schema) ||
302
+ SwaggerTypeChecker.isBoolean(schema) ||
303
+ SwaggerTypeChecker.isNumber(schema) ||
304
+ SwaggerTypeChecker.isString(schema) ||
305
+ SwaggerTypeChecker.isUnknown(schema) ||
306
+ (SwaggerTypeChecker.isAnyOf(schema) &&
271
307
  schema.anyOf.every(isNotObjectLiteral)) ||
272
- (SwaggerSwaggerChecker.isOneOf(schema) &&
308
+ (SwaggerTypeChecker.isOneOf(schema) &&
273
309
  schema.oneOf.every(isNotObjectLiteral)) ||
274
- (SwaggerSwaggerChecker.isArray(schema) && isNotObjectLiteral(schema.items));
310
+ (SwaggerTypeChecker.isArray(schema) && isNotObjectLiteral(schema.items));
275
311
 
276
312
  const emplaceBodySchema =
277
313
  (from: "request" | "response") =>
@@ -47,7 +47,7 @@ export const NEST_TEMPLATE = [
47
47
  {
48
48
  "location": "",
49
49
  "file": "package.json",
50
- "content": "{\r\n \"private\": true,\r\n \"name\": \"@ORGANIZATION/PROJECT\",\r\n \"version\": \"0.1.0\",\r\n \"description\": \"Starter kit of Nestia\",\r\n \"main\": \"lib/index.js\",\r\n \"scripts\": {\r\n \"test\": \"node bin/test\",\r\n \"test:webpack\": \"npm run webpack && node bin/test/webpack.js\",\r\n \"------------------------BUILDS------------------------\": \"\",\r\n \"build\": \"npm run build:sdk && npm run build:main && npm run build:test\",\r\n \"build:api\": \"rimraf packages/api/lib && npm run build:sdk && tsc -p packages/api/tsconfig.json\",\r\n \"build:main\": \"rimraf lib && tsc\",\r\n \"build:sdk\": \"rimraf src/api/functional && nestia sdk\",\r\n \"build:swagger\": \"npx nestia swagger\",\r\n \"build:test\": \"rimraf bin && tsc -p test/tsconfig.json\",\r\n \"dev\": \"npm run build:test -- --watch\",\r\n \"eslint\": \"eslint src && eslint test\",\r\n \"eslint:fix\": \"eslint --fix src && eslint --fix test\",\r\n \"prepare\": \"ts-patch install && typia patch\",\r\n \"prettier\": \"prettier src --write && prettier test --write\",\r\n \"------------------------WEBPACK------------------------\": \"\",\r\n \"webpack\": \"rimraf dist && webpack\",\r\n \"webpack:start\": \"cd dist && node dist/server\",\r\n \"------------------------DEPLOYS------------------------\": \"\",\r\n \"package:api\": \"npm run build:swagger && npm run build:api && cd packages/api && npm publish\",\r\n \"start\": \"node lib/executable/server\",\r\n \"start:swagger\": \"ts-node src/executable/swagger.ts\"\r\n },\r\n \"repository\": {\r\n \"type\": \"git\",\r\n \"url\": \"https://github.com/samchon/nestia-start\"\r\n },\r\n \"keywords\": [\r\n \"nestia\",\r\n \"template\",\r\n \"boilerplate\"\r\n ],\r\n \"author\": \"AUTHOR\",\r\n \"license\": \"MIT\",\r\n \"bugs\": {\r\n \"url\": \"https://github.com/samchon/nestia-start/issues\"\r\n },\r\n \"homepage\": \"https://github.com/samchon/nestia-start#readme\",\r\n \"devDependencies\": {\r\n \"@nestia/e2e\": \"^0.4.1\",\r\n \"@nestia/sdk\": \"^2.5.12\",\r\n \"@trivago/prettier-plugin-sort-imports\": \"^4.3.0\",\r\n \"@types/cli\": \"^0.11.21\",\r\n \"@types/express\": \"^4.17.21\",\r\n \"@types/inquirer\": \"^8.2.5\",\r\n \"@types/node\": \"^18.11.0\",\r\n \"@types/uuid\": \"^8.3.4\",\r\n \"@typescript-eslint/eslint-plugin\": \"^6.19.1\",\r\n \"@typescript-eslint/parser\": \"^6.19.1\",\r\n \"chalk\": \"^4.1.0\",\r\n \"cli\": \"^1.0.1\",\r\n \"copy-webpack-plugin\": \"^11.0.0\",\r\n \"eslint-plugin-deprecation\": \"^2.0.0\",\r\n \"express\": \"^4.18.2\",\r\n \"nestia\": \"^5.2.2\",\r\n \"prettier\": \"^3.2.4\",\r\n \"prettier-plugin-prisma\": \"^5.0.0\",\r\n \"rimraf\": \"^3.0.2\",\r\n \"source-map-support\": \"^0.5.21\",\r\n \"swagger-ui-express\": \"^5.0.0\",\r\n \"ts-loader\": \"^9.5.1\",\r\n \"ts-node\": \"^10.9.1\",\r\n \"ts-patch\": \"^3.0.2\",\r\n \"typescript\": \"^5.3.2\",\r\n \"typescript-transform-paths\": \"^3.4.6\",\r\n \"webpack\": \"^5.89.0\",\r\n \"webpack-cli\": \"^5.1.4\",\r\n \"write-file-webpack-plugin\": \"^4.5.1\"\r\n },\r\n \"dependencies\": {\r\n \"@nestia/core\": \"^2.5.12\",\r\n \"@nestia/fetcher\": \"^2.5.12\",\r\n \"@nestjs/common\": \"^10.3.3\",\r\n \"@nestjs/core\": \"^10.3.3\",\r\n \"@nestjs/platform-express\": \"^10.3.3\",\r\n \"commander\": \"10.0.0\",\r\n \"dotenv\": \"^16.3.1\",\r\n \"dotenv-expand\": \"^10.0.0\",\r\n \"inquirer\": \"8.2.5\",\r\n \"serialize-error\": \"^4.1.0\",\r\n \"tstl\": \"^2.5.13\",\r\n \"typia\": \"^5.4.14\",\r\n \"uuid\": \"^9.0.0\"\r\n },\r\n \"stackblitz\": {\r\n \"startCommand\": \"npm run prepare && npm run build:test && npm run test\"\r\n }\r\n}"
50
+ "content": "{\r\n \"private\": true,\r\n \"name\": \"@ORGANIZATION/PROJECT\",\r\n \"version\": \"0.1.0\",\r\n \"description\": \"Starter kit of Nestia\",\r\n \"main\": \"lib/index.js\",\r\n \"scripts\": {\r\n \"test\": \"node bin/test\",\r\n \"test:webpack\": \"npm run webpack && node bin/test/webpack.js\",\r\n \"------------------------BUILDS------------------------\": \"\",\r\n \"build\": \"npm run build:sdk && npm run build:main && npm run build:test\",\r\n \"build:api\": \"rimraf packages/api/lib && npm run build:sdk && tsc -p packages/api/tsconfig.json\",\r\n \"build:main\": \"rimraf lib && tsc\",\r\n \"build:sdk\": \"rimraf src/api/functional && nestia sdk\",\r\n \"build:swagger\": \"npx nestia swagger\",\r\n \"build:test\": \"rimraf bin && tsc -p test/tsconfig.json\",\r\n \"dev\": \"npm run build:test -- --watch\",\r\n \"eslint\": \"eslint src && eslint test\",\r\n \"eslint:fix\": \"eslint --fix src && eslint --fix test\",\r\n \"prepare\": \"ts-patch install && typia patch\",\r\n \"prettier\": \"prettier src --write && prettier test --write\",\r\n \"------------------------WEBPACK------------------------\": \"\",\r\n \"webpack\": \"rimraf dist && webpack\",\r\n \"webpack:start\": \"cd dist && node dist/server\",\r\n \"------------------------DEPLOYS------------------------\": \"\",\r\n \"package:api\": \"npm run build:swagger && npm run build:api && cd packages/api && npm publish\",\r\n \"start\": \"node lib/executable/server\",\r\n \"start:swagger\": \"ts-node src/executable/swagger.ts\"\r\n },\r\n \"repository\": {\r\n \"type\": \"git\",\r\n \"url\": \"https://github.com/samchon/nestia-start\"\r\n },\r\n \"keywords\": [\r\n \"nestia\",\r\n \"template\",\r\n \"boilerplate\"\r\n ],\r\n \"author\": \"AUTHOR\",\r\n \"license\": \"MIT\",\r\n \"bugs\": {\r\n \"url\": \"https://github.com/samchon/nestia-start/issues\"\r\n },\r\n \"homepage\": \"https://github.com/samchon/nestia-start#readme\",\r\n \"devDependencies\": {\r\n \"@nestia/e2e\": \"^0.4.2\",\r\n \"@nestia/sdk\": \"^2.5.16\",\r\n \"@trivago/prettier-plugin-sort-imports\": \"^4.3.0\",\r\n \"@types/cli\": \"^0.11.21\",\r\n \"@types/express\": \"^4.17.21\",\r\n \"@types/inquirer\": \"^8.2.5\",\r\n \"@types/node\": \"^18.11.0\",\r\n \"@types/uuid\": \"^8.3.4\",\r\n \"@typescript-eslint/eslint-plugin\": \"^6.19.1\",\r\n \"@typescript-eslint/parser\": \"^6.19.1\",\r\n \"chalk\": \"^4.1.0\",\r\n \"cli\": \"^1.0.1\",\r\n \"copy-webpack-plugin\": \"^11.0.0\",\r\n \"eslint-plugin-deprecation\": \"^2.0.0\",\r\n \"express\": \"^4.18.2\",\r\n \"nestia\": \"^5.3.0\",\r\n \"prettier\": \"^3.2.4\",\r\n \"prettier-plugin-prisma\": \"^5.0.0\",\r\n \"rimraf\": \"^3.0.2\",\r\n \"source-map-support\": \"^0.5.21\",\r\n \"swagger-ui-express\": \"^5.0.0\",\r\n \"ts-loader\": \"^9.5.1\",\r\n \"ts-node\": \"^10.9.1\",\r\n \"ts-patch\": \"^3.0.2\",\r\n \"typescript\": \"^5.3.2\",\r\n \"typescript-transform-paths\": \"^3.4.6\",\r\n \"webpack\": \"^5.89.0\",\r\n \"webpack-cli\": \"^5.1.4\",\r\n \"write-file-webpack-plugin\": \"^4.5.1\"\r\n },\r\n \"dependencies\": {\r\n \"@nestia/core\": \"^2.5.16\",\r\n \"@nestia/fetcher\": \"^2.5.16\",\r\n \"@nestjs/common\": \"^10.3.4\",\r\n \"@nestjs/core\": \"^10.3.4\",\r\n \"@nestjs/platform-express\": \"^10.3.4\",\r\n \"commander\": \"10.0.0\",\r\n \"dotenv\": \"^16.3.1\",\r\n \"dotenv-expand\": \"^10.0.0\",\r\n \"inquirer\": \"8.2.5\",\r\n \"serialize-error\": \"^4.1.0\",\r\n \"tstl\": \"^2.5.13\",\r\n \"typia\": \"^5.5.7\",\r\n \"uuid\": \"^9.0.0\"\r\n },\r\n \"stackblitz\": {\r\n \"startCommand\": \"npm run prepare && npm run build:test && npm run test\"\r\n }\r\n}"
51
51
  },
52
52
  {
53
53
  "location": "packages/api",
@@ -62,7 +62,7 @@ export const NEST_TEMPLATE = [
62
62
  {
63
63
  "location": "packages/api",
64
64
  "file": "package.json",
65
- "content": "{\r\n \"name\": \"@ORGANIZATION/PROJECT-api\",\r\n \"version\": \"0.1.0\",\r\n \"description\": \"SDK library generated by Nestia\",\r\n \"main\": \"lib/index.js\",\r\n \"typings\": \"lib/index.d.ts\",\r\n \"scripts\": {\r\n \"build\": \"npm run build:sdk && npm run compile\",\r\n \"build:sdk\": \"rimraf ../../src/api/functional && cd ../.. && npx nestia sdk && cd packages/api\",\r\n \"compile\": \"rimraf lib && tsc\",\r\n \"deploy\": \"npm run build && npm publish\",\r\n \"prepare\": \"ts-patch install && typia patch\"\r\n },\r\n \"repository\": {\r\n \"type\": \"git\",\r\n \"url\": \"https://github.com/samchon/nestia\"\r\n },\r\n \"author\": \"Jeongho Nam\",\r\n \"license\": \"MIT\",\r\n \"bugs\": {\r\n \"url\": \"https://github.com/samchon/nestia/issues\"\r\n },\r\n \"homepage\": \"https://nestia.io\",\r\n \"files\": [\r\n \"lib\",\r\n \"swagger.json\",\r\n \"package.json\",\r\n \"README.md\"\r\n ],\r\n \"devDependencies\": {\r\n \"rimraf\": \"^5.0.5\",\r\n \"ts-node\": \"^10.9.2\",\r\n \"ts-patch\": \"^3.1.2\",\r\n \"typescript\": \"^5.3.3\"\r\n },\r\n \"dependencies\": {\r\n \"@nestia/fetcher\": \"^2.5.12\",\r\n \"typia\": \"^5.4.14\"\r\n }\r\n}"
65
+ "content": "{\r\n \"name\": \"@ORGANIZATION/PROJECT-api\",\r\n \"version\": \"0.1.0\",\r\n \"description\": \"SDK library generated by Nestia\",\r\n \"main\": \"lib/index.js\",\r\n \"typings\": \"lib/index.d.ts\",\r\n \"scripts\": {\r\n \"build\": \"npm run build:sdk && npm run compile\",\r\n \"build:sdk\": \"rimraf ../../src/api/functional && cd ../.. && npx nestia sdk && cd packages/api\",\r\n \"compile\": \"rimraf lib && tsc\",\r\n \"deploy\": \"npm run build && npm publish\",\r\n \"prepare\": \"ts-patch install && typia patch\"\r\n },\r\n \"repository\": {\r\n \"type\": \"git\",\r\n \"url\": \"https://github.com/samchon/nestia\"\r\n },\r\n \"author\": \"Jeongho Nam\",\r\n \"license\": \"MIT\",\r\n \"bugs\": {\r\n \"url\": \"https://github.com/samchon/nestia/issues\"\r\n },\r\n \"homepage\": \"https://nestia.io\",\r\n \"files\": [\r\n \"lib\",\r\n \"swagger.json\",\r\n \"package.json\",\r\n \"README.md\"\r\n ],\r\n \"devDependencies\": {\r\n \"rimraf\": \"^5.0.5\",\r\n \"ts-node\": \"^10.9.2\",\r\n \"ts-patch\": \"^3.1.2\",\r\n \"typescript\": \"^5.3.3\"\r\n },\r\n \"dependencies\": {\r\n \"@nestia/fetcher\": \"^2.5.16\",\r\n \"typia\": \"^5.5.7\"\r\n }\r\n}"
66
66
  },
67
67
  {
68
68
  "location": "packages/api",
@@ -22,7 +22,7 @@ export const SDK_TEMPLATE = [
22
22
  {
23
23
  "location": "",
24
24
  "file": "package.json",
25
- "content": "{\r\n \"name\": \"@ORGANIZATION/PROJECT-api\",\r\n \"version\": \"0.1.0\",\r\n \"description\": \"SDK library generated by Nestia\",\r\n \"main\": \"lib/index.js\",\r\n \"typings\": \"lib/index.d.ts\",\r\n \"scripts\": {\r\n \"build\": \"rimraf lib && tsc\",\r\n \"build:test\": \"rimraf bin && tsc --project test/tsconfig.json\",\r\n \"deploy\": \"npm run build && npm publish\",\r\n \"dev\": \"npm run build:test -- --watch\",\r\n \"prepare\": \"ts-patch install && typia patch\",\r\n \"start\": \"npx ts-node test/start.ts\",\r\n \"test\": \"npx ts-node test/index.ts\",\r\n \"test:simulate\": \"npx ts-node test/index.ts --simulate true\"\r\n },\r\n \"repository\": {\r\n \"type\": \"git\",\r\n \"url\": \"https://github.com/samchon/nestia\"\r\n },\r\n \"author\": \"Jeongho Nam\",\r\n \"license\": \"MIT\",\r\n \"bugs\": {\r\n \"url\": \"https://github.com/samchon/nestia/issues\"\r\n },\r\n \"homepage\": \"https://nestia.io\",\r\n \"files\": [\r\n \"lib\",\r\n \"swagger.json\",\r\n \"package.json\",\r\n \"README.md\"\r\n ],\r\n \"devDependencies\": {\r\n \"@nestia/e2e\": \"^0.4.1\",\r\n \"@types/inquirer\": \"8.2.5\",\r\n \"commander\": \"^10.0.0\",\r\n \"inquirer\": \"8.2.5\",\r\n \"prettier\": \"^3.2.5\",\r\n \"rimraf\": \"^5.0.5\",\r\n \"ts-node\": \"^10.9.2\",\r\n \"ts-patch\": \"^3.1.2\",\r\n \"typescript\": \"^5.3.3\",\r\n \"typescript-transform-paths\": \"^3.4.6\"\r\n },\r\n \"dependencies\": {\r\n \"@nestia/fetcher\": \"^2.5.12\",\r\n \"typia\": \"^5.4.14\"\r\n }\r\n}"
25
+ "content": "{\r\n \"name\": \"@ORGANIZATION/PROJECT-api\",\r\n \"version\": \"0.1.0\",\r\n \"description\": \"SDK library generated by Nestia\",\r\n \"main\": \"lib/index.js\",\r\n \"typings\": \"lib/index.d.ts\",\r\n \"scripts\": {\r\n \"build\": \"rimraf lib && tsc\",\r\n \"build:test\": \"rimraf bin && tsc --project test/tsconfig.json\",\r\n \"deploy\": \"npm run build && npm publish\",\r\n \"dev\": \"npm run build:test -- --watch\",\r\n \"prepare\": \"ts-patch install && typia patch\",\r\n \"start\": \"npx ts-node test/start.ts\",\r\n \"test\": \"npx ts-node test/index.ts\",\r\n \"test:simulate\": \"npx ts-node test/index.ts --simulate true\"\r\n },\r\n \"repository\": {\r\n \"type\": \"git\",\r\n \"url\": \"https://github.com/samchon/nestia\"\r\n },\r\n \"author\": \"Jeongho Nam\",\r\n \"license\": \"MIT\",\r\n \"bugs\": {\r\n \"url\": \"https://github.com/samchon/nestia/issues\"\r\n },\r\n \"homepage\": \"https://nestia.io\",\r\n \"files\": [\r\n \"lib\",\r\n \"swagger.json\",\r\n \"package.json\",\r\n \"README.md\"\r\n ],\r\n \"devDependencies\": {\r\n \"@nestia/e2e\": \"^0.4.1\",\r\n \"@types/inquirer\": \"8.2.5\",\r\n \"commander\": \"^10.0.0\",\r\n \"inquirer\": \"8.2.5\",\r\n \"prettier\": \"^3.2.5\",\r\n \"rimraf\": \"^5.0.5\",\r\n \"ts-node\": \"^10.9.2\",\r\n \"ts-patch\": \"^3.1.2\",\r\n \"typescript\": \"^5.3.3\",\r\n \"typescript-transform-paths\": \"^3.4.6\"\r\n },\r\n \"dependencies\": {\r\n \"@nestia/fetcher\": \"^2.5.16\",\r\n \"typia\": \"^5.5.7\"\r\n }\r\n}"
26
26
  },
27
27
  {
28
28
  "location": "",
@@ -7,7 +7,7 @@ import { Escaper } from "typia/lib/utils/Escaper";
7
7
  import { ISwaggerComponents } from "../structures/ISwaggerComponents";
8
8
  import { ISwaggerSchema } from "../structures/ISwaggerSchema";
9
9
  import { FilePrinter } from "../utils/FilePrinter";
10
- import { SwaggerSwaggerChecker } from "../utils/SwaggerTypeChecker";
10
+ import { SwaggerTypeChecker } from "../utils/SwaggerTypeChecker";
11
11
  import { MigrateImportProgrammer } from "./MigrateImportProgrammer";
12
12
 
13
13
  export namespace MigrateSchemaProgrammer {
@@ -19,34 +19,32 @@ export namespace MigrateSchemaProgrammer {
19
19
  (importer: MigrateImportProgrammer) =>
20
20
  (schema: ISwaggerSchema): ts.TypeNode => {
21
21
  const union: ts.TypeNode[] = [];
22
- if (SwaggerSwaggerChecker.isUnknown(schema))
22
+ if (SwaggerTypeChecker.isUnknown(schema))
23
23
  return TypeFactory.keyword("any");
24
- else if (SwaggerSwaggerChecker.isNullOnly(schema))
25
- return createNode("null");
26
- else if (SwaggerSwaggerChecker.isNullable(components)(schema))
24
+ else if (SwaggerTypeChecker.isNullOnly(schema)) return createNode("null");
25
+ else if (SwaggerTypeChecker.isNullable(components)(schema))
27
26
  union.push(createNode("null"));
28
27
 
29
28
  const type: ts.TypeNode = (() => {
30
29
  // ATOMIC
31
- if (SwaggerSwaggerChecker.isBoolean(schema))
32
- return writeBoolean(schema);
33
- else if (SwaggerSwaggerChecker.isInteger(schema))
30
+ if (SwaggerTypeChecker.isBoolean(schema)) return writeBoolean(schema);
31
+ else if (SwaggerTypeChecker.isInteger(schema))
34
32
  return writeInteger(importer)(schema);
35
- else if (SwaggerSwaggerChecker.isNumber(schema))
33
+ else if (SwaggerTypeChecker.isNumber(schema))
36
34
  return writeNumber(importer)(schema);
37
35
  // INSTANCES
38
- else if (SwaggerSwaggerChecker.isString(schema))
36
+ else if (SwaggerTypeChecker.isString(schema))
39
37
  return writeString(importer)(schema);
40
- else if (SwaggerSwaggerChecker.isArray(schema))
38
+ else if (SwaggerTypeChecker.isArray(schema))
41
39
  return writeArray(components)(importer)(schema);
42
- else if (SwaggerSwaggerChecker.isObject(schema))
40
+ else if (SwaggerTypeChecker.isObject(schema))
43
41
  return writeObject(components)(importer)(schema);
44
- else if (SwaggerSwaggerChecker.isReference(schema))
42
+ else if (SwaggerTypeChecker.isReference(schema))
45
43
  return writeReference(components)(importer)(schema);
46
44
  // NESTED UNION
47
- else if (SwaggerSwaggerChecker.isAnyOf(schema))
45
+ else if (SwaggerTypeChecker.isAnyOf(schema))
48
46
  return writeUnion(components)(importer)(schema.anyOf);
49
- else if (SwaggerSwaggerChecker.isOneOf(schema))
47
+ else if (SwaggerTypeChecker.isOneOf(schema))
50
48
  return writeUnion(components)(importer)(schema.oneOf);
51
49
  else return TypeFactory.keyword("any");
52
50
  })();
@@ -236,6 +234,8 @@ export namespace MigrateSchemaProgrammer {
236
234
  (
237
235
  schema: ISwaggerSchema.IReference,
238
236
  ): ts.TypeReferenceNode | ts.KeywordTypeNode => {
237
+ if (schema.$ref.startsWith("#/components/schemas") === false)
238
+ return TypeFactory.keyword("any");
239
239
  const name: string = schema.$ref.split("/").at(-1)!;
240
240
  return name === ""
241
241
  ? TypeFactory.keyword("any")
@@ -16,5 +16,8 @@ export namespace ISwagger {
16
16
  url: string;
17
17
  description?: string;
18
18
  }
19
- export type IPath = Record<string, ISwaggerRoute>;
19
+ export type IPath = Record<
20
+ "get" | "post" | "patch" | "put" | "delete",
21
+ ISwaggerRoute | undefined
22
+ >;
20
23
  }
@@ -1,7 +1,9 @@
1
+ import { ISwaggerRouteParameter } from "./ISwaggerRouteParameter";
1
2
  import { ISwaggerSchema } from "./ISwaggerSchema";
2
3
  import { ISwaggerSecurityScheme } from "./ISwaggerSecurityScheme";
3
4
 
4
5
  export interface ISwaggerComponents {
6
+ parameters?: Record<string, ISwaggerRouteParameter>;
5
7
  schemas?: Record<string, ISwaggerSchema>;
6
8
  securitySchemes?: Record<string, ISwaggerSecurityScheme>;
7
9
  namespace?: string;
@@ -1,9 +1,10 @@
1
1
  import { IJsDocTagInfo } from "typia/lib/schemas/metadata/IJsDocTagInfo";
2
2
 
3
+ import { ISwaggerRouteParameter } from "./ISwaggerRouteParameter";
3
4
  import { ISwaggerSchema } from "./ISwaggerSchema";
4
5
 
5
6
  export interface ISwaggerRoute {
6
- parameters?: ISwaggerRoute.IParameter[];
7
+ parameters?: (ISwaggerRouteParameter | ISwaggerRouteParameter.IReference)[];
7
8
  requestBody?: ISwaggerRoute.IRequestBody;
8
9
  responses?: ISwaggerRoute.IResponseBody;
9
10
  summary?: string;
@@ -14,13 +15,6 @@ export interface ISwaggerRoute {
14
15
  "x-nestia-jsDocTags"?: IJsDocTagInfo[];
15
16
  }
16
17
  export namespace ISwaggerRoute {
17
- export interface IParameter {
18
- name?: string;
19
- in: "path" | "query" | "header" | "cookie";
20
- schema: ISwaggerSchema;
21
- required?: boolean;
22
- description?: string;
23
- }
24
18
  export interface IRequestBody {
25
19
  description?: string;
26
20
  content: IContent;
File without changes