typia 3.8.0-dev.20230426-4 → 3.8.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 (152) hide show
  1. package/package.json +2 -2
  2. package/src/Primitive.ts +120 -120
  3. package/src/executable/TypiaGenerateWizard.ts +85 -85
  4. package/src/executable/TypiaSetupWizard.ts +133 -133
  5. package/src/executable/setup/CommandExecutor.ts +8 -8
  6. package/src/executable/setup/PackageManager.ts +71 -71
  7. package/src/executable/typia.ts +52 -52
  8. package/src/factories/CommentFactory.ts +14 -14
  9. package/src/factories/ExpressionFactory.ts +70 -70
  10. package/src/factories/IdentifierFactory.ts +63 -63
  11. package/src/factories/LiteralFactory.ts +39 -39
  12. package/src/factories/MetadataCollection.ts +121 -121
  13. package/src/factories/MetadataFactory.ts +62 -62
  14. package/src/factories/MetadataTagFactory.ts +297 -297
  15. package/src/factories/StatementFactory.ts +24 -24
  16. package/src/factories/TemplateFactory.ts +58 -58
  17. package/src/factories/TypeFactory.ts +124 -124
  18. package/src/factories/internal/metadata/MetadataHelper.ts +12 -12
  19. package/src/factories/internal/metadata/emplace_metadata_object.ts +140 -140
  20. package/src/factories/internal/metadata/iterate_metadata.ts +67 -67
  21. package/src/factories/internal/metadata/iterate_metadata_map.ts +41 -41
  22. package/src/factories/internal/metadata/iterate_metadata_native.ts +219 -219
  23. package/src/factories/internal/metadata/iterate_metadata_resolve.ts +27 -27
  24. package/src/factories/internal/metadata/iterate_metadata_set.ts +33 -33
  25. package/src/factories/internal/metadata/iterate_metadata_tuple.ts +44 -44
  26. package/src/factories/internal/metadata/iterate_metadata_union.ts +57 -57
  27. package/src/functional/$any.ts +2 -2
  28. package/src/functional/$is_between.ts +2 -2
  29. package/src/functional/$is_custom.ts +14 -14
  30. package/src/functional/$is_date.ts +3 -3
  31. package/src/functional/$is_datetime.ts +2 -2
  32. package/src/functional/$is_email.ts +4 -4
  33. package/src/functional/$is_ipv4.ts +4 -4
  34. package/src/functional/$is_ipv6.ts +4 -4
  35. package/src/functional/$is_url.ts +4 -4
  36. package/src/functional/$is_uuid.ts +4 -4
  37. package/src/functional/$join.ts +46 -46
  38. package/src/functional/$number.ts +12 -12
  39. package/src/functional/$rest.ts +3 -3
  40. package/src/functional/$string.ts +37 -37
  41. package/src/functional/$tail.ts +5 -5
  42. package/src/metadata/Metadata.ts +533 -533
  43. package/src/metadata/MetadataConstant.ts +3 -3
  44. package/src/metadata/MetadataObject.ts +127 -127
  45. package/src/module.ts +2043 -2043
  46. package/src/programmers/ApplicationProgrammer.ts +62 -62
  47. package/src/programmers/AssertCloneProgrammer.ts +79 -79
  48. package/src/programmers/AssertParseProgrammer.ts +74 -74
  49. package/src/programmers/AssertProgrammer.ts +285 -285
  50. package/src/programmers/AssertPruneProgrammer.ts +76 -76
  51. package/src/programmers/AssertStringifyProgrammer.ts +74 -74
  52. package/src/programmers/CheckerProgrammer.ts +875 -875
  53. package/src/programmers/CloneProgrammer.ts +389 -389
  54. package/src/programmers/FeatureProgrammer.ts +500 -500
  55. package/src/programmers/IsCloneProgrammer.ts +86 -86
  56. package/src/programmers/IsParseProgrammer.ts +80 -80
  57. package/src/programmers/IsProgrammer.ts +212 -212
  58. package/src/programmers/IsPruneProgrammer.ts +81 -81
  59. package/src/programmers/IsStringifyProgrammer.ts +84 -84
  60. package/src/programmers/LiteralsProgrammer.ts +65 -65
  61. package/src/programmers/PruneProgrammer.ts +347 -347
  62. package/src/programmers/RandomProgrammer.ts +423 -423
  63. package/src/programmers/StringifyProgrammer.ts +798 -798
  64. package/src/programmers/TypiaProgrammer.ts +129 -129
  65. package/src/programmers/ValidateCloneProgrammer.ts +93 -93
  66. package/src/programmers/ValidateParseProgrammer.ts +78 -78
  67. package/src/programmers/ValidateProgrammer.ts +316 -316
  68. package/src/programmers/ValidatePruneProgrammer.ts +86 -86
  69. package/src/programmers/ValidateStringifyProgrammer.ts +92 -92
  70. package/src/programmers/helpers/CloneJoiner.ts +131 -131
  71. package/src/programmers/helpers/FunctionImporeter.ts +54 -54
  72. package/src/programmers/helpers/OptionPredicator.ts +15 -15
  73. package/src/programmers/helpers/PruneJoiner.ts +144 -144
  74. package/src/programmers/helpers/StringifyJoinder.ts +113 -113
  75. package/src/programmers/helpers/StringifyPredicator.ts +12 -12
  76. package/src/programmers/helpers/UnionExplorer.ts +275 -275
  77. package/src/programmers/helpers/UnionPredicator.ts +81 -81
  78. package/src/programmers/internal/application_array.ts +36 -36
  79. package/src/programmers/internal/application_boolean.ts +17 -17
  80. package/src/programmers/internal/application_constant.ts +30 -30
  81. package/src/programmers/internal/application_default_string.ts +33 -33
  82. package/src/programmers/internal/application_native.ts +32 -32
  83. package/src/programmers/internal/application_number.ts +73 -73
  84. package/src/programmers/internal/application_object.ts +154 -154
  85. package/src/programmers/internal/application_schema.ts +213 -213
  86. package/src/programmers/internal/application_string.ts +45 -45
  87. package/src/programmers/internal/application_templates.ts +26 -26
  88. package/src/programmers/internal/application_tuple.ts +29 -29
  89. package/src/programmers/internal/check_array.ts +30 -30
  90. package/src/programmers/internal/check_custom.ts +31 -31
  91. package/src/programmers/internal/check_dynamic_properties.ts +194 -194
  92. package/src/programmers/internal/check_everything.ts +28 -28
  93. package/src/programmers/internal/check_native.ts +21 -21
  94. package/src/programmers/internal/check_string_tags.ts +67 -67
  95. package/src/programmers/internal/check_union_array_like.ts +271 -271
  96. package/src/programmers/internal/check_union_tuple.ts +33 -33
  97. package/src/programmers/internal/random_custom.ts +29 -29
  98. package/src/programmers/internal/stringify_dynamic_properties.ts +167 -167
  99. package/src/programmers/internal/stringify_native.ts +7 -7
  100. package/src/programmers/internal/stringify_regular_properties.ts +83 -83
  101. package/src/schemas/IJsonSchema.ts +129 -129
  102. package/src/transform.ts +17 -17
  103. package/src/transformers/CallExpressionTransformer.ts +177 -177
  104. package/src/transformers/FileTransformer.ts +47 -47
  105. package/src/transformers/NodeTransformer.ts +13 -13
  106. package/src/transformers/features/miscellaneous/ApplicationTransformer.ts +114 -114
  107. package/src/transformers/features/miscellaneous/AssertCloneTransformer.ts +9 -9
  108. package/src/transformers/features/miscellaneous/AssertPruneTransformer.ts +9 -9
  109. package/src/transformers/features/miscellaneous/CloneTransformer.ts +9 -9
  110. package/src/transformers/features/miscellaneous/CreateAssertCloneTransformer.ts +9 -9
  111. package/src/transformers/features/miscellaneous/CreateAssertPruneTransformer.ts +9 -9
  112. package/src/transformers/features/miscellaneous/CreateCloneTransformer.ts +9 -9
  113. package/src/transformers/features/miscellaneous/CreateIsCloneTransformer.ts +9 -9
  114. package/src/transformers/features/miscellaneous/CreateIsPruneTransformer.ts +9 -9
  115. package/src/transformers/features/miscellaneous/CreatePruneTransformer.ts +9 -9
  116. package/src/transformers/features/miscellaneous/CreateRandomTransformer.ts +39 -39
  117. package/src/transformers/features/miscellaneous/CreateValidateCloneTransformer.ts +9 -9
  118. package/src/transformers/features/miscellaneous/CreateValidatePruneTransformer.ts +9 -9
  119. package/src/transformers/features/miscellaneous/IsCloneTransformer.ts +9 -9
  120. package/src/transformers/features/miscellaneous/IsPruneTransformer.ts +9 -9
  121. package/src/transformers/features/miscellaneous/LiteralsTransformer.ts +28 -28
  122. package/src/transformers/features/miscellaneous/MetadataTransformer.ts +52 -52
  123. package/src/transformers/features/miscellaneous/PruneTransformer.ts +9 -9
  124. package/src/transformers/features/miscellaneous/RandomTransformer.ts +42 -42
  125. package/src/transformers/features/miscellaneous/ValidateCloneTransformer.ts +9 -9
  126. package/src/transformers/features/miscellaneous/ValidatePruneTransformer.ts +9 -9
  127. package/src/transformers/features/parsers/AssertParseTransformer.ts +9 -9
  128. package/src/transformers/features/parsers/CreateAssertParseTransformer.ts +9 -9
  129. package/src/transformers/features/parsers/CreateIsParseTransformer.ts +9 -9
  130. package/src/transformers/features/parsers/CreateValidateParseTransformer.ts +9 -9
  131. package/src/transformers/features/parsers/IsParseTransformer.ts +9 -9
  132. package/src/transformers/features/parsers/ValidateParseTransformer.ts +9 -9
  133. package/src/transformers/features/stringifiers/AssertStringifyTransformer.ts +10 -10
  134. package/src/transformers/features/stringifiers/CreateAssertStringifyTransformer.ts +12 -12
  135. package/src/transformers/features/stringifiers/CreateIsStringifyTransformer.ts +9 -9
  136. package/src/transformers/features/stringifiers/CreateStringifyTransformer.ts +9 -9
  137. package/src/transformers/features/stringifiers/CreateValidateStringifyProgrammer.ts +12 -12
  138. package/src/transformers/features/stringifiers/IsStringifyTransformer.ts +9 -9
  139. package/src/transformers/features/stringifiers/StringifyTransformer.ts +9 -9
  140. package/src/transformers/features/stringifiers/ValidateStringifyTransformer.ts +10 -10
  141. package/src/transformers/features/validators/AssertTransformer.ts +11 -11
  142. package/src/transformers/features/validators/CreateAssertTransformer.ts +13 -13
  143. package/src/transformers/features/validators/CreateIsTransformer.ts +11 -11
  144. package/src/transformers/features/validators/CreateValidateTransformer.ts +13 -13
  145. package/src/transformers/features/validators/IsTransformer.ts +11 -11
  146. package/src/transformers/features/validators/ValidateTransformer.ts +11 -11
  147. package/src/transformers/internal/GenericTransformer.ts +97 -97
  148. package/src/utils/ArrayUtil.ts +44 -44
  149. package/src/utils/Escaper.ts +45 -45
  150. package/src/utils/MapUtil.ts +12 -12
  151. package/src/utils/PatternUtil.ts +30 -30
  152. package/src/utils/RandomGenerator.ts +81 -81
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "typia",
3
- "version": "3.8.0-dev.20230426-4",
3
+ "version": "3.8.0",
4
4
  "description": "Superfast runtime validators with only one line",
5
5
  "main": "lib/index.js",
6
6
  "typings": "lib/index.d.ts",
@@ -67,7 +67,7 @@
67
67
  "bugs": {
68
68
  "url": "https://github.com/samchon/typia/issues"
69
69
  },
70
- "homepage": "https://github.com/samchon/typia#readme",
70
+ "homepage": "https://typia.io",
71
71
  "dependencies": {
72
72
  "commander": "^10.0.0",
73
73
  "comment-json": "^4.2.3",
package/src/Primitive.ts CHANGED
@@ -1,120 +1,120 @@
1
- /**
2
- * Primitive type.
3
- *
4
- * `Primitive` is a type of TMP (Type Meta Programming) type who converts its argument as a
5
- * primitive type.
6
- *
7
- * If the target argument is a built-in class who returns its origin primitive type through
8
- * the `valueOf()` method like the `String` or `Number`, its return type would be the
9
- * `string` or `number`.
10
- *
11
- * Otherwise, the target argument is a type of custom class, all of its custom method would
12
- * be erased and its prototype would be changed to the primitive `object`. Therefore, return
13
- * type of the TMP type finally be the primitive object.
14
- *
15
- * In addition, if the target argument is a type of custom class and it has a special
16
- * method `toJSON()`, return type of this `Primitive` would be not `Primitive<Instance>`
17
- * but `Primitive<ReturnType<Instance.toJSON>>`.
18
- *
19
- * Before | After
20
- * ------------------------|----------------------------------------
21
- * `Boolean` | `boolean`
22
- * `Number` | `number`
23
- * `String` | `string`
24
- * `Class` | `object`
25
- * `Class` with `toJSON()` | `Primitive<ReturnType<Class.toJSON>>`
26
- * Others | No change
27
- *
28
- * @template Instance Target argument type.
29
- * @author Jenogho Nam - https://github.com/samchon
30
- */
31
- export type Primitive<T> = _Equal<T, _Primitive<T>> extends true
32
- ? T
33
- : _Primitive<T>;
34
-
35
- type _Equal<X, Y> = X extends Y ? (Y extends X ? true : false) : false;
36
-
37
- type _Primitive<Instance> = _ValueOf<Instance> extends object
38
- ? Instance extends object
39
- ? Instance extends _Native
40
- ? {}
41
- : Instance extends IJsonable<infer Raw>
42
- ? _ValueOf<Raw> extends object
43
- ? Raw extends object
44
- ? _PrimitiveObject<Raw> // object would be primitified
45
- : never // cannot be
46
- : _ValueOf<Raw> // atomic value
47
- : _PrimitiveObject<Instance> // object would be primitified
48
- : never // cannot be
49
- : _ValueOf<Instance>;
50
-
51
- type _PrimitiveObject<Instance extends object> = Instance extends Array<infer T>
52
- ? _IsTuple<Instance> extends true
53
- ? _PrimitiveSpread<Instance>
54
- : _Primitive<T>[]
55
- : {
56
- [P in keyof Instance]: Instance[P] extends Function
57
- ? never
58
- : _Primitive<Instance[P]>;
59
- };
60
-
61
- type _PrimitiveSpread<T extends any[]> = T extends [infer F, ...infer Rest]
62
- ? [_Primitive<F>, ..._PrimitiveSpread<Rest>]
63
- : [];
64
-
65
- type _ValueOf<Instance> = _IsValueOf<Instance, Boolean> extends true
66
- ? boolean
67
- : _IsValueOf<Instance, Number> extends true
68
- ? number
69
- : _IsValueOf<Instance, String> extends true
70
- ? string
71
- : Instance;
72
-
73
- type _Native =
74
- | Set<any>
75
- | Map<any, any>
76
- | WeakSet<any>
77
- | WeakMap<any, any>
78
- | Uint8Array
79
- | Uint8ClampedArray
80
- | Uint16Array
81
- | Uint32Array
82
- | BigUint64Array
83
- | Int8Array
84
- | Int16Array
85
- | Int32Array
86
- | BigInt64Array
87
- | Float32Array
88
- | Float64Array
89
- | ArrayBuffer
90
- | SharedArrayBuffer
91
- | DataView;
92
-
93
- type _IsTuple<T extends readonly any[] | { length: number }> = [T] extends [
94
- never,
95
- ]
96
- ? false
97
- : T extends readonly any[]
98
- ? number extends T["length"]
99
- ? false
100
- : true
101
- : false;
102
-
103
- type _IsValueOf<
104
- Instance,
105
- Object extends IValueOf<any>,
106
- > = Instance extends Object
107
- ? Object extends IValueOf<infer Primitive>
108
- ? Instance extends Primitive
109
- ? false
110
- : true // not Primitive, but Object
111
- : false // cannot be
112
- : false;
113
-
114
- interface IValueOf<T> {
115
- valueOf(): T;
116
- }
117
-
118
- interface IJsonable<T> {
119
- toJSON(): T;
120
- }
1
+ /**
2
+ * Primitive type.
3
+ *
4
+ * `Primitive` is a type of TMP (Type Meta Programming) type who converts its argument as a
5
+ * primitive type.
6
+ *
7
+ * If the target argument is a built-in class who returns its origin primitive type through
8
+ * the `valueOf()` method like the `String` or `Number`, its return type would be the
9
+ * `string` or `number`.
10
+ *
11
+ * Otherwise, the target argument is a type of custom class, all of its custom method would
12
+ * be erased and its prototype would be changed to the primitive `object`. Therefore, return
13
+ * type of the TMP type finally be the primitive object.
14
+ *
15
+ * In addition, if the target argument is a type of custom class and it has a special
16
+ * method `toJSON()`, return type of this `Primitive` would be not `Primitive<Instance>`
17
+ * but `Primitive<ReturnType<Instance.toJSON>>`.
18
+ *
19
+ * Before | After
20
+ * ------------------------|----------------------------------------
21
+ * `Boolean` | `boolean`
22
+ * `Number` | `number`
23
+ * `String` | `string`
24
+ * `Class` | `object`
25
+ * `Class` with `toJSON()` | `Primitive<ReturnType<Class.toJSON>>`
26
+ * Others | No change
27
+ *
28
+ * @template Instance Target argument type.
29
+ * @author Jenogho Nam - https://github.com/samchon
30
+ */
31
+ export type Primitive<T> = _Equal<T, _Primitive<T>> extends true
32
+ ? T
33
+ : _Primitive<T>;
34
+
35
+ type _Equal<X, Y> = X extends Y ? (Y extends X ? true : false) : false;
36
+
37
+ type _Primitive<Instance> = _ValueOf<Instance> extends object
38
+ ? Instance extends object
39
+ ? Instance extends _Native
40
+ ? {}
41
+ : Instance extends IJsonable<infer Raw>
42
+ ? _ValueOf<Raw> extends object
43
+ ? Raw extends object
44
+ ? _PrimitiveObject<Raw> // object would be primitified
45
+ : never // cannot be
46
+ : _ValueOf<Raw> // atomic value
47
+ : _PrimitiveObject<Instance> // object would be primitified
48
+ : never // cannot be
49
+ : _ValueOf<Instance>;
50
+
51
+ type _PrimitiveObject<Instance extends object> = Instance extends Array<infer T>
52
+ ? _IsTuple<Instance> extends true
53
+ ? _PrimitiveSpread<Instance>
54
+ : _Primitive<T>[]
55
+ : {
56
+ [P in keyof Instance]: Instance[P] extends Function
57
+ ? never
58
+ : _Primitive<Instance[P]>;
59
+ };
60
+
61
+ type _PrimitiveSpread<T extends any[]> = T extends [infer F, ...infer Rest]
62
+ ? [_Primitive<F>, ..._PrimitiveSpread<Rest>]
63
+ : [];
64
+
65
+ type _ValueOf<Instance> = _IsValueOf<Instance, Boolean> extends true
66
+ ? boolean
67
+ : _IsValueOf<Instance, Number> extends true
68
+ ? number
69
+ : _IsValueOf<Instance, String> extends true
70
+ ? string
71
+ : Instance;
72
+
73
+ type _Native =
74
+ | Set<any>
75
+ | Map<any, any>
76
+ | WeakSet<any>
77
+ | WeakMap<any, any>
78
+ | Uint8Array
79
+ | Uint8ClampedArray
80
+ | Uint16Array
81
+ | Uint32Array
82
+ | BigUint64Array
83
+ | Int8Array
84
+ | Int16Array
85
+ | Int32Array
86
+ | BigInt64Array
87
+ | Float32Array
88
+ | Float64Array
89
+ | ArrayBuffer
90
+ | SharedArrayBuffer
91
+ | DataView;
92
+
93
+ type _IsTuple<T extends readonly any[] | { length: number }> = [T] extends [
94
+ never,
95
+ ]
96
+ ? false
97
+ : T extends readonly any[]
98
+ ? number extends T["length"]
99
+ ? false
100
+ : true
101
+ : false;
102
+
103
+ type _IsValueOf<
104
+ Instance,
105
+ Object extends IValueOf<any>,
106
+ > = Instance extends Object
107
+ ? Object extends IValueOf<infer Primitive>
108
+ ? Instance extends Primitive
109
+ ? false
110
+ : true // not Primitive, but Object
111
+ : false // cannot be
112
+ : false;
113
+
114
+ interface IValueOf<T> {
115
+ valueOf(): T;
116
+ }
117
+
118
+ interface IJsonable<T> {
119
+ toJSON(): T;
120
+ }
@@ -1,85 +1,85 @@
1
- import fs from "fs";
2
-
3
- import { TypiaProgrammer } from "../programmers/TypiaProgrammer";
4
-
5
- import { ArgumentParser } from "./setup/ArgumentParser";
6
- import { PackageManager } from "./setup/PackageManager";
7
-
8
- export namespace TypiaGenerateWizard {
9
- export async function generate(): Promise<void> {
10
- console.log("----------------------------------------");
11
- console.log(" Typia Generate Wizard");
12
- console.log("----------------------------------------");
13
-
14
- // LOAD PACKAGE.JSON INFO
15
- const pack: PackageManager = await PackageManager.mount();
16
- const options: IArguments = await ArgumentParser.parse(pack)(inquiry);
17
- await TypiaProgrammer.build(options);
18
- }
19
-
20
- const inquiry: ArgumentParser.Inquiry<IArguments> = async (
21
- _pack,
22
- command,
23
- prompt,
24
- action,
25
- ) => {
26
- // PREPARE ASSETS
27
- command.option("--input [path]", "input directory");
28
- command.option("--output [directory]", "output directory");
29
- command.option("--project [project]", "tsconfig.json file location");
30
-
31
- const questioned = { value: false };
32
-
33
- const input = (name: string) => async (message: string) => {
34
- const result = await prompt()({
35
- type: "input",
36
- name,
37
- message,
38
- default: "",
39
- });
40
- return result[name] as string;
41
- };
42
- const select =
43
- (name: string) =>
44
- (message: string) =>
45
- async <Choice extends string>(
46
- choices: Choice[],
47
- ): Promise<Choice> => {
48
- questioned.value = true;
49
- return (
50
- await prompt()({
51
- type: "list",
52
- name: name,
53
- message: message,
54
- choices: choices,
55
- })
56
- )[name];
57
- };
58
- const configure = async () => {
59
- const files: string[] = await (
60
- await fs.promises.readdir(process.cwd())
61
- ).filter(
62
- (str) =>
63
- str.substring(0, 8) === "tsconfig" &&
64
- str.substring(str.length - 5) === ".json",
65
- );
66
- if (files.length === 0)
67
- throw new Error(`Unable to find "tsconfig.json" file.`);
68
- else if (files.length === 1) return files[0];
69
- return select("tsconfig")("TS Config File")(files);
70
- };
71
-
72
- return action(async (options) => {
73
- options.input ??= await input("input")("input directory");
74
- options.output ??= await input("output")("output directory");
75
- options.project ??= await configure();
76
- return options as IArguments;
77
- });
78
- };
79
-
80
- export interface IArguments {
81
- input: string;
82
- output: string;
83
- project: string;
84
- }
85
- }
1
+ import fs from "fs";
2
+
3
+ import { TypiaProgrammer } from "../programmers/TypiaProgrammer";
4
+
5
+ import { ArgumentParser } from "./setup/ArgumentParser";
6
+ import { PackageManager } from "./setup/PackageManager";
7
+
8
+ export namespace TypiaGenerateWizard {
9
+ export async function generate(): Promise<void> {
10
+ console.log("----------------------------------------");
11
+ console.log(" Typia Generate Wizard");
12
+ console.log("----------------------------------------");
13
+
14
+ // LOAD PACKAGE.JSON INFO
15
+ const pack: PackageManager = await PackageManager.mount();
16
+ const options: IArguments = await ArgumentParser.parse(pack)(inquiry);
17
+ await TypiaProgrammer.build(options);
18
+ }
19
+
20
+ const inquiry: ArgumentParser.Inquiry<IArguments> = async (
21
+ _pack,
22
+ command,
23
+ prompt,
24
+ action,
25
+ ) => {
26
+ // PREPARE ASSETS
27
+ command.option("--input [path]", "input directory");
28
+ command.option("--output [directory]", "output directory");
29
+ command.option("--project [project]", "tsconfig.json file location");
30
+
31
+ const questioned = { value: false };
32
+
33
+ const input = (name: string) => async (message: string) => {
34
+ const result = await prompt()({
35
+ type: "input",
36
+ name,
37
+ message,
38
+ default: "",
39
+ });
40
+ return result[name] as string;
41
+ };
42
+ const select =
43
+ (name: string) =>
44
+ (message: string) =>
45
+ async <Choice extends string>(
46
+ choices: Choice[],
47
+ ): Promise<Choice> => {
48
+ questioned.value = true;
49
+ return (
50
+ await prompt()({
51
+ type: "list",
52
+ name: name,
53
+ message: message,
54
+ choices: choices,
55
+ })
56
+ )[name];
57
+ };
58
+ const configure = async () => {
59
+ const files: string[] = await (
60
+ await fs.promises.readdir(process.cwd())
61
+ ).filter(
62
+ (str) =>
63
+ str.substring(0, 8) === "tsconfig" &&
64
+ str.substring(str.length - 5) === ".json",
65
+ );
66
+ if (files.length === 0)
67
+ throw new Error(`Unable to find "tsconfig.json" file.`);
68
+ else if (files.length === 1) return files[0];
69
+ return select("tsconfig")("TS Config File")(files);
70
+ };
71
+
72
+ return action(async (options) => {
73
+ options.input ??= await input("input")("input directory");
74
+ options.output ??= await input("output")("output directory");
75
+ options.project ??= await configure();
76
+ return options as IArguments;
77
+ });
78
+ };
79
+
80
+ export interface IArguments {
81
+ input: string;
82
+ output: string;
83
+ project: string;
84
+ }
85
+ }