@nestia/migrate 0.2.13 → 0.3.0

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 (31) hide show
  1. package/lib/NestiaMigrateApplication.js +49 -6
  2. package/lib/NestiaMigrateApplication.js.map +1 -1
  3. package/lib/bundles/TEMPLATE.js +3 -3
  4. package/lib/bundles/TEMPLATE.js.map +1 -1
  5. package/lib/programmers/ControllerProgrammer.js +4 -14
  6. package/lib/programmers/ControllerProgrammer.js.map +1 -1
  7. package/lib/programmers/DtoProgrammer.js +8 -13
  8. package/lib/programmers/DtoProgrammer.js.map +1 -1
  9. package/lib/programmers/ImportProgrammer.d.ts +7 -3
  10. package/lib/programmers/ImportProgrammer.js +28 -7
  11. package/lib/programmers/ImportProgrammer.js.map +1 -1
  12. package/lib/programmers/MigrateProgrammer.js +5 -5
  13. package/lib/programmers/MigrateProgrammer.js.map +1 -1
  14. package/lib/programmers/RouteProgrammer.d.ts +2 -1
  15. package/lib/programmers/RouteProgrammer.js +19 -19
  16. package/lib/programmers/RouteProgrammer.js.map +1 -1
  17. package/lib/programmers/SchemaProgrammer.d.ts +2 -1
  18. package/lib/programmers/SchemaProgrammer.js +80 -51
  19. package/lib/programmers/SchemaProgrammer.js.map +1 -1
  20. package/lib/structures/IMigrateRoute.d.ts +1 -1
  21. package/lib/structures/ISwaggerRoute.d.ts +1 -1
  22. package/package.json +5 -5
  23. package/src/bundles/TEMPLATE.ts +3 -3
  24. package/src/programmers/ControllerProgrammer.ts +13 -29
  25. package/src/programmers/DtoProgrammer.ts +9 -17
  26. package/src/programmers/ImportProgrammer.ts +41 -13
  27. package/src/programmers/MigrateProgrammer.ts +5 -5
  28. package/src/programmers/RouteProgrammer.ts +31 -31
  29. package/src/programmers/SchemaProgrammer.ts +128 -61
  30. package/src/structures/IMigrateRoute.ts +1 -1
  31. package/src/structures/ISwaggerRoute.ts +1 -1
@@ -3,19 +3,25 @@ import { Escaper } from "typia/lib/utils/Escaper";
3
3
  import { ISwaggerSchema } from "../structures/ISwaggeSchema";
4
4
  import { ISwaggerComponents } from "../structures/ISwaggerComponents";
5
5
  import { JsonTypeChecker } from "../utils/JsonTypeChecker";
6
+ import { ImportProgrammer } from "./ImportProgrammer";
6
7
 
7
8
  export namespace SchemaProgrammer {
8
9
  export const write =
9
10
  (components: ISwaggerComponents) =>
10
11
  (references: ISwaggerSchema.IReference[]) =>
12
+ (importer: ImportProgrammer) =>
11
13
  (schema: ISwaggerSchema): string =>
12
- writeSchema(components)(references)(() => () => {})(true)(schema);
14
+ writeSchema(components)(references)(importer)(() => () => {})(true)(
15
+ schema,
16
+ );
17
+
18
+ type CommentTagger = (tag: string) => (value?: string) => void;
13
19
 
14
- type Tagger = (tag: string) => (value?: string) => void;
15
20
  const writeSchema =
16
21
  (components: ISwaggerComponents) =>
17
22
  (references: ISwaggerSchema.IReference[]) =>
18
- (tagger: Tagger) =>
23
+ (importer: ImportProgrammer) =>
24
+ (commentTagger: CommentTagger) =>
19
25
  (final: boolean) =>
20
26
  (schema: ISwaggerSchema): string => {
21
27
  // SPECIAL TYPES
@@ -27,38 +33,49 @@ export namespace SchemaProgrammer {
27
33
  "(" +
28
34
  schema.anyOf
29
35
  .map(
30
- writeSchema(components)(references)(tagger)(
31
- false,
32
- ),
36
+ writeSchema(components)(references)(importer)(
37
+ commentTagger,
38
+ )(false),
33
39
  )
34
40
  .join(" | ") +
35
41
  ")"
36
42
  );
37
43
  else if (JsonTypeChecker.isOneOf(schema))
38
44
  return schema.oneOf
39
- .map(writeSchema(components)(references)(tagger)(false))
45
+ .map(
46
+ writeSchema(components)(references)(importer)(
47
+ commentTagger,
48
+ )(false),
49
+ )
40
50
  .join(" | ");
41
51
  // ATOMIC TYPES
42
52
  else if (JsonTypeChecker.isBoolean(schema))
43
- return writeBoolean(tagger)(schema);
44
- else if (JsonTypeChecker.isInteger(schema))
45
- return writeInteger(tagger)(schema);
46
- else if (JsonTypeChecker.isNumber(schema))
47
- return writeNumber(tagger)(schema);
53
+ return writeBoolean(commentTagger)(schema);
54
+ else if (
55
+ JsonTypeChecker.isInteger(schema) ||
56
+ JsonTypeChecker.isNumber(schema)
57
+ )
58
+ return writeNumber(importer)(commentTagger)(schema);
48
59
  else if (JsonTypeChecker.isString(schema))
49
- return writeString(tagger)(schema);
60
+ return writeString(importer)(commentTagger)(schema);
50
61
  // INSTANCE TYPES
51
62
  else if (JsonTypeChecker.isArray(schema))
52
- return writeArray(components)(references)(tagger)(schema);
63
+ return writeArray(components)(references)(importer)(
64
+ commentTagger,
65
+ )(schema);
53
66
  else if (JsonTypeChecker.isObject(schema))
54
- return writeObject(components)(references)(schema);
67
+ return writeObject(components)(references)(importer)(
68
+ schema,
69
+ );
55
70
  else if (JsonTypeChecker.isReference(schema)) {
56
71
  references.push(schema);
57
- return schema.$ref.replace(`#/components/schemas/`, ``);
72
+ return importer.dto(
73
+ schema.$ref.replace(`#/components/schemas/`, ``),
74
+ );
58
75
  } else return "any";
59
76
  })();
60
77
  if (type === "any" || final === false) return type;
61
- return isNullable(components)(schema) ? `${type} | null` : type;
78
+ return isNullable(components)(schema) ? `null | ${type}` : type;
62
79
  };
63
80
 
64
81
  const isNullable =
@@ -79,69 +96,103 @@ export namespace SchemaProgrammer {
79
96
  };
80
97
 
81
98
  const writeBoolean =
82
- (tagger: Tagger) =>
99
+ (tagger: CommentTagger) =>
83
100
  (schema: ISwaggerSchema.IBoolean): string => {
84
101
  if (schema.default) tagger("default")(schema.default.toString());
85
102
  return schema.enum ? schema.enum.join(" | ") : "boolean";
86
103
  };
87
- const writeInteger =
88
- (tagger: Tagger) =>
89
- (schema: ISwaggerSchema.IInteger): string => {
90
- tagger("type")("int");
91
- return writeNumber(tagger)(schema);
92
- };
104
+
93
105
  const writeNumber =
94
- (tagger: Tagger) =>
106
+ (importer: ImportProgrammer) =>
107
+ (commentTagger: CommentTagger) =>
95
108
  (schema: ISwaggerSchema.IInteger | ISwaggerSchema.INumber): string => {
96
- if (schema.default) tagger("default")(schema.default.toString());
109
+ if (schema.default)
110
+ commentTagger("default")(schema.default.toString());
97
111
  if (schema.enum?.length) return schema.enum.join(" | ");
98
112
 
113
+ const intersection: string[] = ["number"];
114
+ if (schema.type === "integer")
115
+ intersection.push(importer.tag("Type", "int32"));
99
116
  if (schema.minimum !== undefined)
100
- tagger(
101
- schema.exclusiveMinimum ? "exclusiveMinimum" : "minimum",
102
- )(schema.minimum.toString());
117
+ intersection.push(
118
+ importer.tag(
119
+ schema.exclusiveMinimum
120
+ ? "ExclusiveMinimum"
121
+ : "Minimum",
122
+ schema.minimum,
123
+ ),
124
+ );
103
125
  if (schema.maximum !== undefined)
104
- tagger(
105
- schema.exclusiveMaximum ? "exclusiveMaximum" : "maximum",
106
- )(schema.maximum.toString());
126
+ intersection.push(
127
+ importer.tag(
128
+ schema.exclusiveMaximum
129
+ ? "ExclusiveMaximum"
130
+ : "Maximum",
131
+ schema.maximum,
132
+ ),
133
+ );
107
134
  if (schema.multipleOf !== undefined)
108
- tagger("multipleOf")(schema.multipleOf.toString());
109
- return "number";
135
+ intersection.push(
136
+ importer.tag("MultipleOf", schema.multipleOf),
137
+ );
138
+ return intersection.length === 1
139
+ ? intersection[0]
140
+ : "(" + intersection.join(" & ") + ")";
110
141
  };
111
142
  const writeString =
112
- (tagger: Tagger) =>
143
+ (importer: ImportProgrammer) =>
144
+ (commentTagger: CommentTagger) =>
113
145
  (schema: ISwaggerSchema.IString): string => {
114
- if (schema.default) tagger("default")(schema.default);
146
+ if (schema.default) commentTagger("default")(schema.default);
115
147
  if (schema.enum?.length)
116
148
  return schema.enum
117
149
  .map((str) => JSON.stringify(str))
118
150
  .join(" | ");
119
151
 
152
+ const intersection: string[] = ["string"];
153
+ if (schema.format !== undefined && FORMATS.has(schema.format))
154
+ intersection.push(importer.tag("Format", schema.format));
155
+ if (schema.pattern !== undefined)
156
+ intersection.push(importer.tag("Pattern", schema.pattern));
120
157
  if (schema.minLength !== undefined)
121
- tagger("minLength")(schema.minLength.toString());
158
+ intersection.push(importer.tag("MinLength", schema.minLength));
122
159
  if (schema.maxLength !== undefined)
123
- tagger("maxLength")(schema.maxLength.toString());
124
- if (schema.pattern !== undefined) tagger("pattern")(schema.pattern);
125
- return "string";
160
+ intersection.push(importer.tag("MaxLength", schema.maxLength));
161
+ return intersection.length === 1
162
+ ? intersection[0]
163
+ : "(" + intersection.join(" & ") + ")";
126
164
  };
127
165
 
128
166
  const writeArray =
129
167
  (components: ISwaggerComponents) =>
130
168
  (references: ISwaggerSchema.IReference[]) =>
131
- (tagger: Tagger) =>
132
- (schema: ISwaggerSchema.IArray): string =>
133
- schema["x-typia-tuple"]
134
- ? `[${schema["x-typia-tuple"].items
135
- .map(writeTupleElement(components)(references))
136
- .join(", ")}]`
137
- : `Array<${writeSchema(components)(references)(tagger)(true)(
138
- schema.items,
139
- )}>`;
169
+ (importer: ImportProgrammer) =>
170
+ (commentTagger: CommentTagger) =>
171
+ (schema: ISwaggerSchema.IArray): string => {
172
+ if (schema["x-typia-tuple"])
173
+ return `[${schema["x-typia-tuple"].items
174
+ .map(writeTupleElement(components)(references)(importer))
175
+ .join(", ")}]`;
176
+ const intersection: string[] = [
177
+ `Array<${writeSchema(components)(references)(importer)(
178
+ commentTagger,
179
+ )(true)(schema.items)}>`,
180
+ ];
181
+ if (schema.minItems !== undefined)
182
+ intersection.push(importer.tag("MinItems", schema.minItems));
183
+ if (schema.maxItems !== undefined)
184
+ intersection.push(importer.tag("MaxItems", schema.maxItems));
185
+
186
+ return intersection.length === 1
187
+ ? intersection[0]
188
+ : "(" + intersection.join(" & ") + ")";
189
+ };
140
190
  const writeTupleElement =
141
191
  (components: ISwaggerComponents) =>
142
192
  (references: ISwaggerSchema.IReference[]) =>
193
+ (importer: ImportProgrammer) =>
143
194
  (schema: ISwaggerSchema): string => {
144
- const name: string = writeSchema(components)(references)(
195
+ const name: string = writeSchema(components)(references)(importer)(
145
196
  () => () => {},
146
197
  )(true)(schema);
147
198
  return schema["x-typia-optional"]
@@ -154,29 +205,31 @@ export namespace SchemaProgrammer {
154
205
  const writeObject =
155
206
  (components: ISwaggerComponents) =>
156
207
  (references: ISwaggerSchema.IReference[]) =>
208
+ (importer: ImportProgrammer) =>
157
209
  (schema: ISwaggerSchema.IObject): string => {
158
210
  const entries = Object.entries(schema.properties ?? {});
159
211
  return typeof schema.additionalProperties === "object"
160
212
  ? entries.length
161
- ? `${writeStaticObject(components)(references)(
213
+ ? `${writeStaticObject(components)(references)(importer)(
162
214
  schema,
163
215
  )} & ${writeDynamicObject(components)(references)(
164
- schema.additionalProperties,
165
- )}`
166
- : writeDynamicObject(components)(references)(
216
+ importer,
217
+ )(schema.additionalProperties)}`
218
+ : writeDynamicObject(components)(references)(importer)(
167
219
  schema.additionalProperties,
168
220
  )
169
- : writeStaticObject(components)(references)(schema);
221
+ : writeStaticObject(components)(references)(importer)(schema);
170
222
  };
171
223
  const writeStaticObject =
172
224
  (components: ISwaggerComponents) =>
173
225
  (references: ISwaggerSchema.IReference[]) =>
226
+ (importer: ImportProgrammer) =>
174
227
  (schema: ISwaggerSchema.IObject): string =>
175
228
  [
176
229
  "{",
177
230
  ...Object.entries(schema.properties ?? {})
178
231
  .map(([key, value]) =>
179
- writeProperty(components)(references)(key)(
232
+ writeProperty(components)(references)(importer)(key)(
180
233
  (schema.required ?? []).some((r) => r === key),
181
234
  )(value),
182
235
  )
@@ -186,11 +239,12 @@ export namespace SchemaProgrammer {
186
239
  const writeDynamicObject =
187
240
  (components: ISwaggerComponents) =>
188
241
  (references: ISwaggerSchema.IReference[]) =>
242
+ (importer: ImportProgrammer) =>
189
243
  (additional: ISwaggerSchema): string => {
190
244
  return [
191
245
  "{",
192
246
  tab(4)(
193
- writeProperty(components)(references)(
247
+ writeProperty(components)(references)(importer)(
194
248
  "[key: string]",
195
249
  true,
196
250
  )(true)(additional),
@@ -202,11 +256,12 @@ export namespace SchemaProgrammer {
202
256
  const writeProperty =
203
257
  (components: ISwaggerComponents) =>
204
258
  (references: ISwaggerSchema.IReference[]) =>
259
+ (importer: ImportProgrammer) =>
205
260
  (key: string, ensureVariable: boolean = false) =>
206
261
  (required: boolean) =>
207
262
  (schema: ISwaggerSchema): string => {
208
263
  const content: string[] = [];
209
- const tagger = (tag: string) => (value?: string) => {
264
+ const commentTagger = (tag: string) => (value?: string) => {
210
265
  const exists: boolean =
211
266
  (!!schema.description?.length &&
212
267
  schema.description.includes(`@${tag}`)) ||
@@ -222,14 +277,16 @@ export namespace SchemaProgrammer {
222
277
  }
223
278
 
224
279
  // STARTS FROM TITLE
225
- if (schema.title) tagger("@title")(schema.title);
280
+ if (schema.title) commentTagger("@title")(schema.title);
226
281
 
227
282
  // GET TYPE WITH SPECIAL TAGS
228
283
  const type: string =
229
- writeSchema(components)(references)(tagger)(true)(schema);
284
+ writeSchema(components)(references)(importer)(commentTagger)(
285
+ true,
286
+ )(schema);
230
287
 
231
288
  // ENDS WITH DEPRECATED TAG
232
- if (schema.deprecated) tagger("@deprecated")();
289
+ if (schema.deprecated) commentTagger("@deprecated")();
233
290
 
234
291
  const description: string =
235
292
  content.length === 0
@@ -255,3 +312,13 @@ export namespace SchemaProgrammer {
255
312
  .map((l) => `${" ".repeat(size)}${l}`)
256
313
  .join("\n");
257
314
  }
315
+
316
+ const FORMATS = new Set([
317
+ "email",
318
+ "uuid",
319
+ "ipv4",
320
+ "ipv6",
321
+ "url",
322
+ "date",
323
+ "date-time",
324
+ ]);
@@ -1,4 +1,4 @@
1
- import { IJsDocTagInfo } from "typia/lib/metadata/IJsDocTagInfo";
1
+ import { IJsDocTagInfo } from "typia/lib/schemas/metadata/IJsDocTagInfo";
2
2
 
3
3
  import { ISwaggerSchema } from "./ISwaggeSchema";
4
4
 
@@ -1,4 +1,4 @@
1
- import { IJsDocTagInfo } from "typia/lib/metadata/IJsDocTagInfo";
1
+ import { IJsDocTagInfo } from "typia/lib/schemas/metadata/IJsDocTagInfo";
2
2
 
3
3
  import { ISwaggerSchema } from "./ISwaggeSchema";
4
4