typia 3.5.2 → 3.6.0-dev.20230219

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 (132) hide show
  1. package/README.md +18 -2
  2. package/lib/executable/TypiaGenerateWizard.d.ts +8 -0
  3. package/lib/executable/TypiaGenerateWizard.js +182 -0
  4. package/lib/executable/TypiaGenerateWizard.js.map +1 -0
  5. package/lib/executable/TypiaSetupWizard.d.ts +8 -0
  6. package/lib/executable/TypiaSetupWizard.js +218 -0
  7. package/lib/executable/TypiaSetupWizard.js.map +1 -0
  8. package/lib/executable/setup/ArgumentParser.d.ts +7 -0
  9. package/lib/executable/setup/ArgumentParser.js +155 -0
  10. package/lib/executable/setup/ArgumentParser.js.map +1 -0
  11. package/lib/executable/{internal → setup}/CommandExecutor.d.ts +0 -0
  12. package/lib/executable/{internal → setup}/CommandExecutor.js +0 -0
  13. package/lib/executable/setup/CommandExecutor.js.map +1 -0
  14. package/lib/executable/{internal → setup}/PackageManager.d.ts +0 -0
  15. package/lib/executable/{internal → setup}/PackageManager.js +0 -0
  16. package/lib/executable/setup/PackageManager.js.map +1 -0
  17. package/lib/executable/setup/PluginConfigurator.d.ts +5 -0
  18. package/lib/executable/{internal → setup}/PluginConfigurator.js +1 -0
  19. package/lib/executable/setup/PluginConfigurator.js.map +1 -0
  20. package/lib/executable/typia.js +13 -56
  21. package/lib/executable/typia.js.map +1 -1
  22. package/lib/factories/IdentifierFactory.d.ts +1 -1
  23. package/lib/factories/IdentifierFactory.js +3 -3
  24. package/lib/factories/IdentifierFactory.js.map +1 -1
  25. package/lib/factories/TypeFactory.d.ts +1 -0
  26. package/lib/factories/TypeFactory.js +15 -0
  27. package/lib/factories/TypeFactory.js.map +1 -1
  28. package/lib/generate/TypiaGenerator.d.ts +8 -0
  29. package/lib/generate/TypiaGenerator.js +211 -0
  30. package/lib/generate/TypiaGenerator.js.map +1 -0
  31. package/lib/module.d.ts +14 -8
  32. package/lib/module.js +2 -1
  33. package/lib/module.js.map +1 -1
  34. package/lib/programmers/AssertCloneProgrammer.js +8 -2
  35. package/lib/programmers/AssertCloneProgrammer.js.map +1 -1
  36. package/lib/programmers/AssertParseProgrammer.js +7 -1
  37. package/lib/programmers/AssertParseProgrammer.js.map +1 -1
  38. package/lib/programmers/AssertProgrammer.js +6 -2
  39. package/lib/programmers/AssertProgrammer.js.map +1 -1
  40. package/lib/programmers/AssertPruneProgrammer.js +5 -1
  41. package/lib/programmers/AssertPruneProgrammer.js.map +1 -1
  42. package/lib/programmers/AssertStringifyProgrammer.js +5 -1
  43. package/lib/programmers/AssertStringifyProgrammer.js.map +1 -1
  44. package/lib/programmers/CheckerProgrammer.js +8 -1
  45. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  46. package/lib/programmers/CloneProgrammer.js +13 -0
  47. package/lib/programmers/CloneProgrammer.js.map +1 -1
  48. package/lib/programmers/FeatureProgrammer.d.ts +6 -1
  49. package/lib/programmers/FeatureProgrammer.js +35 -26
  50. package/lib/programmers/FeatureProgrammer.js.map +1 -1
  51. package/lib/programmers/IsCloneProgrammer.js +10 -1
  52. package/lib/programmers/IsCloneProgrammer.js.map +1 -1
  53. package/lib/programmers/IsParseProgrammer.js +8 -2
  54. package/lib/programmers/IsParseProgrammer.js.map +1 -1
  55. package/lib/programmers/IsProgrammer.js +1 -1
  56. package/lib/programmers/IsProgrammer.js.map +1 -1
  57. package/lib/programmers/IsPruneProgrammer.js +5 -1
  58. package/lib/programmers/IsPruneProgrammer.js.map +1 -1
  59. package/lib/programmers/IsStringifyProgrammer.js +8 -1
  60. package/lib/programmers/IsStringifyProgrammer.js.map +1 -1
  61. package/lib/programmers/PruneProgrammer.js +8 -0
  62. package/lib/programmers/PruneProgrammer.js.map +1 -1
  63. package/lib/programmers/RandomProgrammer.js +4 -3
  64. package/lib/programmers/RandomProgrammer.js.map +1 -1
  65. package/lib/programmers/StringifyProgrammer.js +9 -1
  66. package/lib/programmers/StringifyProgrammer.js.map +1 -1
  67. package/lib/programmers/ValidateCloneProgrammer.js +10 -2
  68. package/lib/programmers/ValidateCloneProgrammer.js.map +1 -1
  69. package/lib/programmers/ValidateParseProgrammer.js +9 -1
  70. package/lib/programmers/ValidateParseProgrammer.js.map +1 -1
  71. package/lib/programmers/ValidateProgrammer.js +12 -4
  72. package/lib/programmers/ValidateProgrammer.js.map +1 -1
  73. package/lib/programmers/ValidatePruneProgrammer.js +7 -1
  74. package/lib/programmers/ValidatePruneProgrammer.js.map +1 -1
  75. package/lib/programmers/ValidateStringifyProgrammer.js +8 -2
  76. package/lib/programmers/ValidateStringifyProgrammer.js.map +1 -1
  77. package/lib/programmers/helpers/FunctionImporeter.js +2 -1
  78. package/lib/programmers/helpers/FunctionImporeter.js.map +1 -1
  79. package/lib/programmers/internal/check_everything.js +4 -1
  80. package/lib/programmers/internal/check_everything.js.map +1 -1
  81. package/lib/programmers/internal/check_union_array_like.js +4 -1
  82. package/lib/programmers/internal/check_union_array_like.js.map +1 -1
  83. package/lib/programmers/internal/feature_object_entries.d.ts +2 -1
  84. package/lib/programmers/internal/feature_object_entries.js +28 -23
  85. package/lib/programmers/internal/feature_object_entries.js.map +1 -1
  86. package/lib/transformers/CallExpressionTransformer.js +4 -1
  87. package/lib/transformers/CallExpressionTransformer.js.map +1 -1
  88. package/package.json +1 -1
  89. package/src/executable/TypiaGenerateWizard.ts +86 -0
  90. package/src/executable/{internal/ArgumentParser.ts → TypiaSetupWizard.ts} +58 -59
  91. package/src/executable/setup/ArgumentParser.ts +89 -0
  92. package/src/executable/{internal → setup}/CommandExecutor.ts +0 -0
  93. package/src/executable/{internal → setup}/PackageManager.ts +0 -0
  94. package/src/executable/{internal → setup}/PluginConfigurator.ts +4 -3
  95. package/src/executable/typia.ts +15 -46
  96. package/src/factories/IdentifierFactory.ts +3 -2
  97. package/src/factories/TypeFactory.ts +28 -0
  98. package/src/generate/TypiaGenerator.ts +126 -0
  99. package/src/module.ts +23 -11
  100. package/src/programmers/AssertCloneProgrammer.ts +22 -3
  101. package/src/programmers/AssertParseProgrammer.ts +14 -2
  102. package/src/programmers/AssertProgrammer.ts +15 -213
  103. package/src/programmers/AssertPruneProgrammer.ts +9 -2
  104. package/src/programmers/AssertStringifyProgrammer.ts +12 -2
  105. package/src/programmers/CheckerProgrammer.ts +15 -2
  106. package/src/programmers/CloneProgrammer.ts +14 -0
  107. package/src/programmers/FeatureProgrammer.ts +64 -26
  108. package/src/programmers/IsCloneProgrammer.ts +17 -2
  109. package/src/programmers/IsParseProgrammer.ts +18 -3
  110. package/src/programmers/IsProgrammer.ts +3 -1
  111. package/src/programmers/IsPruneProgrammer.ts +16 -2
  112. package/src/programmers/IsStringifyProgrammer.ts +15 -2
  113. package/src/programmers/PruneProgrammer.ts +7 -0
  114. package/src/programmers/RandomProgrammer.ts +15 -1
  115. package/src/programmers/StringifyProgrammer.ts +8 -1
  116. package/src/programmers/ValidateCloneProgrammer.ts +23 -6
  117. package/src/programmers/ValidateParseProgrammer.ts +16 -2
  118. package/src/programmers/ValidateProgrammer.ts +44 -5
  119. package/src/programmers/ValidatePruneProgrammer.ts +14 -2
  120. package/src/programmers/ValidateStringifyProgrammer.ts +21 -6
  121. package/src/programmers/helpers/FunctionImporeter.ts +10 -1
  122. package/src/programmers/internal/check_everything.ts +8 -5
  123. package/src/programmers/internal/check_union_array_like.ts +7 -1
  124. package/src/programmers/internal/feature_object_entries.ts +6 -1
  125. package/src/transformers/CallExpressionTransformer.ts +8 -1
  126. package/lib/executable/internal/ArgumentParser.d.ts +0 -9
  127. package/lib/executable/internal/ArgumentParser.js +0 -265
  128. package/lib/executable/internal/ArgumentParser.js.map +0 -1
  129. package/lib/executable/internal/CommandExecutor.js.map +0 -1
  130. package/lib/executable/internal/PackageManager.js.map +0 -1
  131. package/lib/executable/internal/PluginConfigurator.d.ts +0 -5
  132. package/lib/executable/internal/PluginConfigurator.js.map +0 -1
@@ -0,0 +1,89 @@
1
+ import type CommanderModule from "commander";
2
+ import type * as InquirerModule from "inquirer";
3
+ import path from "path";
4
+
5
+ import { PackageManager } from "./PackageManager";
6
+
7
+ export namespace ArgumentParser {
8
+ export type Inquiry<T> = (
9
+ pack: PackageManager,
10
+ command: CommanderModule.Command,
11
+ prompt: (
12
+ opt?: InquirerModule.StreamOptions,
13
+ ) => InquirerModule.PromptModule,
14
+ action: (closure: (options: Partial<T>) => Promise<T>) => Promise<T>,
15
+ ) => Promise<T>;
16
+
17
+ export const parse =
18
+ (pack: PackageManager) =>
19
+ (erase: boolean) =>
20
+ async <T>(
21
+ inquiry: (
22
+ pack: PackageManager,
23
+ command: CommanderModule.Command,
24
+ prompt: (
25
+ opt?: InquirerModule.StreamOptions,
26
+ ) => InquirerModule.PromptModule,
27
+ action: (
28
+ closure: (options: Partial<T>) => Promise<T>,
29
+ ) => Promise<T>,
30
+ ) => Promise<T>,
31
+ ): Promise<T> => {
32
+ // INSTALL TEMPORARY PACKAGES
33
+ const newbie = {
34
+ commander: pack.install({
35
+ dev: true,
36
+ modulo: "commander",
37
+ version: "10.0.0",
38
+ silent: true,
39
+ }),
40
+ inquirer: pack.install({
41
+ dev: true,
42
+ modulo: "inquirer",
43
+ version: "8.2.5",
44
+ silent: true,
45
+ }),
46
+ };
47
+
48
+ // LOAD INSTALLED MODULES
49
+ const { program: command }: typeof CommanderModule = await import(
50
+ path.join(pack.directory, "node_modules", "commander")
51
+ );
52
+ const { createPromptModule: prompt }: typeof InquirerModule =
53
+ await import(
54
+ path.join(pack.directory, "node_modules", "inquirer")
55
+ );
56
+
57
+ // TAKE OPTIONS
58
+ const action = (closure: (options: Partial<T>) => Promise<T>) =>
59
+ new Promise<T>((resolve, reject) => {
60
+ command.action(async (options) => {
61
+ try {
62
+ resolve(await closure(options));
63
+ } catch (exp) {
64
+ reject(exp);
65
+ }
66
+ });
67
+ command.parseAsync().catch(reject);
68
+ });
69
+ const output: T | Error = await (async () => {
70
+ try {
71
+ return await inquiry(pack, command, prompt, action);
72
+ } catch (error) {
73
+ return error as Error;
74
+ }
75
+ })();
76
+
77
+ // REMOVE TEMPORARY PACKAGES
78
+ if (erase === true) {
79
+ if (newbie.commander)
80
+ pack.erase({ modulo: "commander", silent: true });
81
+ if (newbie.inquirer)
82
+ pack.erase({ modulo: "inquirer", silent: true });
83
+ }
84
+
85
+ // RETURNS
86
+ if (output instanceof Error) throw output;
87
+ return output;
88
+ };
89
+ }
@@ -2,18 +2,19 @@ import type Comment from "comment-json";
2
2
  import fs from "fs";
3
3
  import path from "path";
4
4
 
5
- import { ArgumentParser } from "./ArgumentParser";
5
+ import { TypiaSetupWizard } from "../TypiaSetupWizard";
6
6
  import { PackageManager } from "./PackageManager";
7
7
 
8
8
  export namespace PluginConfigurator {
9
9
  export async function configure(
10
10
  pack: PackageManager,
11
- args: ArgumentParser.IArguments,
11
+ args: TypiaSetupWizard.IArguments,
12
12
  ): Promise<void> {
13
13
  // INSTALL COMMENT-JSON
14
14
  const installed: boolean = pack.install({
15
15
  dev: true,
16
16
  modulo: "comment-json",
17
+ version: "4.2.3",
17
18
  silent: true,
18
19
  });
19
20
 
@@ -38,7 +39,7 @@ export namespace PluginConfigurator {
38
39
 
39
40
  async function _Configure(
40
41
  pack: PackageManager,
41
- args: ArgumentParser.IArguments,
42
+ args: TypiaSetupWizard.IArguments,
42
43
  ): Promise<void> {
43
44
  // GET COMPILER-OPTIONS
44
45
  const Comment: typeof import("comment-json") = await import(
@@ -1,8 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import { ArgumentParser } from "./internal/ArgumentParser";
3
- import { CommandExecutor } from "./internal/CommandExecutor";
4
- import { PackageManager } from "./internal/PackageManager";
5
- import { PluginConfigurator } from "./internal/PluginConfigurator";
2
+ import { TypiaGenerateWizard } from "./TypiaGenerateWizard";
3
+ import { TypiaSetupWizard } from "./TypiaSetupWizard";
6
4
 
7
5
  const USAGE = `Wrong command has been detected. Use like below:
8
6
 
@@ -11,56 +9,27 @@ const USAGE = `Wrong command has been detected. Use like below:
11
9
  --manager (npm|pnpm|yarn) \\
12
10
  --project {tsconfig.json file path}
13
11
 
14
- - npx typia setup
15
- - npx typia setup --compiler ts-patch
16
- - npx typia setup --manager pnpm
17
- - npx typia setup --project tsconfig.test.json`;
12
+ - npx typia setup
13
+ - npx typia setup --compiler ts-patch
14
+ - npx typia setup --manager pnpm
15
+ - npx typia setup --project tsconfig.test.json
16
+
17
+ npx typia generate
18
+ --input {directory} \\
19
+ --output {directory}
20
+
21
+ --npx typia setup --input src/templates --output src/functinoal
22
+ `;
18
23
 
19
24
  function halt(desc: string): never {
20
25
  console.error(desc);
21
26
  process.exit(-1);
22
27
  }
23
28
 
24
- async function setup(): Promise<void> {
25
- console.log("----------------------------------------");
26
- console.log(" Typia Setup Wizard");
27
- console.log("----------------------------------------");
28
-
29
- // LOAD PACKAGE.JSON INFO
30
- const pack: PackageManager = await PackageManager.mount();
31
-
32
- // TAKE ARGUMENTS
33
- const args: ArgumentParser.IArguments = await ArgumentParser.parse(pack);
34
-
35
- // INSTALL TYPESCRIPT
36
- pack.install({ dev: true, modulo: "typescript" });
37
- args.project ??= (() => {
38
- CommandExecutor.run("npx tsc --init", false);
39
- return (args.project = "tsconfig.json");
40
- })();
41
- pack.install({ dev: true, modulo: "ts-node" });
42
-
43
- // INSTALL COMPILER
44
- pack.install({ dev: true, modulo: args.compiler });
45
- if (args.compiler === "ts-patch") {
46
- await pack.save((data) => {
47
- data.scripts ??= {};
48
- if (typeof data.scripts.prepare === "string")
49
- data.scripts.prepare =
50
- "ts-patch install && " + data.scripts.prepare;
51
- else data.scripts.prepare = "ts-patch install";
52
- });
53
- CommandExecutor.run("npm run prepare", false);
54
- }
55
-
56
- // INSTALL AND CONFIGURE TYPIA
57
- pack.install({ dev: false, modulo: "typia" });
58
- await PluginConfigurator.configure(pack, args);
59
- }
60
-
61
29
  async function main(): Promise<void> {
62
30
  const type: string | undefined = process.argv[2];
63
- if (type === "setup") await setup();
31
+ if (type === "setup") await TypiaSetupWizard.setup();
32
+ else if (type === "generate") await TypiaGenerateWizard.generate();
64
33
  else halt(USAGE);
65
34
  }
66
35
  main().catch((exp) => {
@@ -24,6 +24,7 @@ export namespace IdentifierFactory {
24
24
 
25
25
  export function parameter(
26
26
  name: string | ts.BindingName,
27
+ type?: ts.TypeNode,
27
28
  init?: ts.Expression,
28
29
  ) {
29
30
  if (ts.version >= "4.8")
@@ -32,7 +33,7 @@ export namespace IdentifierFactory {
32
33
  undefined,
33
34
  name,
34
35
  undefined,
35
- undefined,
36
+ type,
36
37
  init,
37
38
  );
38
39
  // eslint-disable-next-line
@@ -42,7 +43,7 @@ export namespace IdentifierFactory {
42
43
  undefined,
43
44
  name,
44
45
  undefined,
45
- undefined,
46
+ type,
46
47
  init,
47
48
  );
48
49
  }
@@ -11,6 +11,7 @@ export namespace TypeFactory {
11
11
  export function isFunction(type: ts.Type): boolean {
12
12
  return getFunction(type) !== null;
13
13
  }
14
+
14
15
  function getFunction(type: ts.Type) {
15
16
  const node = type.symbol?.declarations?.[0];
16
17
  if (node === undefined) return null;
@@ -98,4 +99,31 @@ export namespace TypeFactory {
98
99
  ? explore_name(symbol.escapedName.toString(), parent)
99
100
  : "__type";
100
101
  }
102
+
103
+ export const keyword = (
104
+ type:
105
+ | "void"
106
+ | "any"
107
+ | "unknown"
108
+ | "boolean"
109
+ | "number"
110
+ | "bigint"
111
+ | "string",
112
+ ) => {
113
+ return ts.factory.createKeywordTypeNode(
114
+ type === "void"
115
+ ? ts.SyntaxKind.VoidKeyword
116
+ : type === "any"
117
+ ? ts.SyntaxKind.AnyKeyword
118
+ : type === "unknown"
119
+ ? ts.SyntaxKind.UnknownKeyword
120
+ : type === "boolean"
121
+ ? ts.SyntaxKind.BooleanKeyword
122
+ : type === "number"
123
+ ? ts.SyntaxKind.NumberKeyword
124
+ : type === "bigint"
125
+ ? ts.SyntaxKind.BigIntKeyword
126
+ : ts.SyntaxKind.StringKeyword,
127
+ );
128
+ };
101
129
  }
@@ -0,0 +1,126 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import ts from "typescript";
4
+
5
+ import transform from "../transform";
6
+
7
+ export namespace TypiaGenerator {
8
+ export interface IProps {
9
+ input: string;
10
+ output: string;
11
+ project: string;
12
+ }
13
+
14
+ export async function generate(
15
+ props: TypiaGenerator.IProps,
16
+ ): Promise<void> {
17
+ props.input = path.resolve(props.input);
18
+ props.output = path.resolve(props.output);
19
+
20
+ if ((await is_directory(props.input)) === false)
21
+ throw new Error(
22
+ "Error on TypiaGenerator.generate(): input path is not a directory.",
23
+ );
24
+ else if ((await is_directory(props.output)) === false) {
25
+ const parent: string = path.join(props.output, "..");
26
+ if ((await is_directory(parent)) === false)
27
+ throw new Error(
28
+ "Error on TypiaGenerator.generate(): output path is not a directory.",
29
+ );
30
+ await fs.promises.mkdir(props.output);
31
+ }
32
+
33
+ // CREATE PROGRAM
34
+ const { config } = ts.readConfigFile(props.project, ts.sys.readFile);
35
+
36
+ const program: ts.Program = ts.createProgram(
37
+ await gather(
38
+ await (async () => {
39
+ const container: string[] = [];
40
+ await gather(container)(props.input);
41
+ return container;
42
+ })(),
43
+ )(props.input),
44
+ config,
45
+ );
46
+
47
+ // DO TRANSFORM
48
+ // const others = await get_other_transformers(config);
49
+ const result: ts.TransformationResult<ts.SourceFile> = ts.transform(
50
+ program
51
+ .getSourceFiles()
52
+ .filter(
53
+ (file) =>
54
+ !file.isDeclarationFile &&
55
+ path.resolve(file.fileName).indexOf(props.input) !== -1,
56
+ ),
57
+ [
58
+ // ...others.map((o) => o(program)),
59
+ transform(program),
60
+ ],
61
+ program.getCompilerOptions(),
62
+ );
63
+
64
+ // ARCHIVE TRANSFORMED FILES
65
+ const printer: ts.Printer = ts.createPrinter();
66
+ for (const file of result.transformed) {
67
+ const to: string = path
68
+ .resolve(file.fileName)
69
+ .replace(props.input, props.output);
70
+ const content: string = printer.printFile(file);
71
+
72
+ await fs.promises.writeFile(to, content, "utf8");
73
+ }
74
+ }
75
+
76
+ // const get_other_transformers = async (
77
+ // config: any,
78
+ // ): Promise<
79
+ // Array<(program: ts.Program) => ts.TransformerFactory<ts.SourceFile>>
80
+ // > => {
81
+ // if (
82
+ // typeof config.compilerOptions !== "object" ||
83
+ // !Array.isArray(config.compilerOptions?.plugins)
84
+ // )
85
+ // return [];
86
+
87
+ // const plugins: string[] = config.compilerOptions.plugins
88
+ // .filter(
89
+ // (p: any) =>
90
+ // typeof p === "object" && typeof p?.transform === "string",
91
+ // )
92
+ // .map((p: any) => p.transform)
93
+ // .filter(
94
+ // (str: string) =>
95
+ // str.indexOf("typia/lib/transform") === -1 &&
96
+ // str.indexOf("./src/transform.ts") === -1,
97
+ // );
98
+
99
+ // return Promise.all(
100
+ // plugins.map(async (path: string) => {
101
+ // const module: any = await import(path);
102
+ // return module.default;
103
+ // }),
104
+ // );
105
+ // };
106
+
107
+ const is_directory = async (current: string): Promise<boolean> => {
108
+ const stat: fs.Stats = await fs.promises.stat(current);
109
+ return stat.isDirectory();
110
+ };
111
+
112
+ const gather = (container: string[]) => async (current: string) => {
113
+ const directory: string[] = await fs.promises.readdir(current);
114
+ for (const file of directory) {
115
+ const next: string = path.join(current, file);
116
+ const stat: fs.Stats = await fs.promises.stat(next);
117
+
118
+ if (stat.isDirectory()) {
119
+ await gather(container)(next);
120
+ continue;
121
+ } else if (file.substring(file.length - 3) === ".ts")
122
+ container.push(next);
123
+ }
124
+ return container;
125
+ };
126
+ }
package/src/module.ts CHANGED
@@ -3,6 +3,7 @@ import { Namespace } from "./functional/Namespace";
3
3
  import { IMetadataApplication } from "./metadata/IMetadataApplication";
4
4
  import { IJsonApplication } from "./schemas/IJsonApplication";
5
5
 
6
+ import { IRandomGenerator } from "./IRandomGenerator";
6
7
  import { IValidation } from "./IValidation";
7
8
  import { Primitive } from "./Primitive";
8
9
  import { TypeGuardError } from "./TypeGuardError";
@@ -10,9 +11,10 @@ import { TypeGuardError } from "./TypeGuardError";
10
11
  export * from "./schemas/IJsonApplication";
11
12
  export * from "./schemas/IJsonComponents";
12
13
  export * from "./schemas/IJsonSchema";
14
+ export * from "./IRandomGenerator";
15
+ export * from "./IValidation";
13
16
  export * from "./Primitive";
14
17
  export * from "./TypeGuardError";
15
- export * from "./IValidation";
16
18
 
17
19
  /* ===========================================================
18
20
  SINGLE FUNCTIONS
@@ -853,11 +855,12 @@ export function metadata(): never {
853
855
  * would be generated instead.
854
856
  *
855
857
  * @template T Type of data to generate
858
+ * @param generator Random data generator
856
859
  * @return Randomly generated data
857
860
  *
858
861
  * @author Jeongho Nam - https://github.com/samchon
859
862
  */
860
- export function random(): never;
863
+ export function random(generator?: IRandomGenerator): never;
861
864
 
862
865
  /**
863
866
  * Generate random data.
@@ -870,11 +873,12 @@ export function random(): never;
870
873
  * would be generated instead.
871
874
  *
872
875
  * @template T Type of data to generate
876
+ * generator Random data generator
873
877
  * @return Randomly generated data
874
878
  *
875
879
  * @author Jeongho Nam - https://github.com/samchon
876
880
  */
877
- export function random<T>(): Primitive<T>;
881
+ export function random<T>(generator?: IRandomGenerator): Primitive<T>;
878
882
 
879
883
  /**
880
884
  * @internal
@@ -1466,12 +1470,12 @@ export function createIsParse(): never;
1466
1470
  *
1467
1471
  * @author Jeongho Nam - https://github.com/samchon
1468
1472
  */
1469
- export function createIsParse<T>(): (input: string) => T | null;
1473
+ export function createIsParse<T>(): (input: string) => Primitive<T> | null;
1470
1474
 
1471
1475
  /**
1472
1476
  * @internal
1473
1477
  */
1474
- export function createIsParse<T>(): (input: string) => T | null {
1478
+ export function createIsParse<T>(): (input: string) => Primitive<T> | null {
1475
1479
  halt("createIsParse");
1476
1480
  }
1477
1481
  Object.assign(createIsParse, isParse);
@@ -1495,12 +1499,12 @@ export function createAssertParse(): never;
1495
1499
  *
1496
1500
  * @author Jeongho Nam - https://github.com/samchon
1497
1501
  */
1498
- export function createAssertParse<T>(): (input: string) => T;
1502
+ export function createAssertParse<T>(): (input: string) => Primitive<T>;
1499
1503
 
1500
1504
  /**
1501
1505
  * @internal
1502
1506
  */
1503
- export function createAssertParse<T>(): (input: string) => T {
1507
+ export function createAssertParse<T>(): (input: string) => Primitive<T> {
1504
1508
  halt("createAssertParse");
1505
1509
  }
1506
1510
  Object.assign(createAssertParse, assertParse);
@@ -1524,12 +1528,16 @@ export function createValidateParse(): never;
1524
1528
  *
1525
1529
  * @author Jeongho Nam - https://github.com/samchon
1526
1530
  */
1527
- export function createValidateParse<T>(): (input: string) => IValidation<T>;
1531
+ export function createValidateParse<T>(): (
1532
+ input: string,
1533
+ ) => IValidation<Primitive<T>>;
1528
1534
 
1529
1535
  /**
1530
1536
  * @internal
1531
1537
  */
1532
- export function createValidateParse<T>(): (input: string) => IValidation<T> {
1538
+ export function createValidateParse<T>(): (
1539
+ input: string,
1540
+ ) => IValidation<Primitive<T>> {
1533
1541
  halt("createValidateParse");
1534
1542
  }
1535
1543
  Object.assign(createValidateParse, validateParse);
@@ -1661,22 +1669,26 @@ Object.assign(createValidateStringify, validateStringify);
1661
1669
  * Creates a reusable {@link random} function.
1662
1670
  *
1663
1671
  * @danger You have to specify the generic argument `T`
1672
+ * generator Random data generator
1664
1673
  * @return Nothing until specifying the generic argument `T`
1665
1674
  * @throws compile error
1666
1675
  *
1667
1676
  * @author Jeongho Nam - https://github.com/samchon
1668
1677
  */
1669
- export function createRandom(): never;
1678
+ export function createRandom(generator?: IRandomGenerator): never;
1670
1679
 
1671
1680
  /**
1672
1681
  * Creates a resuable {@link random} function.
1673
1682
  *
1674
1683
  * @template T Type of the input value
1684
+ * generator Random data generator
1675
1685
  * @returns A reusable `random` function
1676
1686
  *
1677
1687
  * @author Jeongho Nam - https://github.com/samchon
1678
1688
  */
1679
- export function createRandom<T>(): () => Primitive<T>;
1689
+ export function createRandom<T>(
1690
+ generator?: IRandomGenerator,
1691
+ ): () => Primitive<T>;
1680
1692
 
1681
1693
  /**
1682
1694
  * @internal
@@ -2,6 +2,7 @@ import ts from "typescript";
2
2
 
3
3
  import { IdentifierFactory } from "../factories/IdentifierFactory";
4
4
  import { StatementFactory } from "../factories/StatementFactory";
5
+ import { TypeFactory } from "../factories/TypeFactory";
5
6
 
6
7
  import { IProject } from "../transformers/IProject";
7
8
 
@@ -15,8 +16,19 @@ export namespace AssertCloneProgrammer {
15
16
  ts.factory.createArrowFunction(
16
17
  undefined,
17
18
  undefined,
18
- [IdentifierFactory.parameter("input")],
19
- undefined,
19
+ [
20
+ IdentifierFactory.parameter(
21
+ "input",
22
+ TypeFactory.keyword("any"),
23
+ ),
24
+ ],
25
+ ts.factory.createTypeReferenceNode("typia.Primitive", [
26
+ project.checker.typeToTypeNode(
27
+ type,
28
+ undefined,
29
+ undefined,
30
+ ) ?? TypeFactory.keyword("any"),
31
+ ]),
20
32
  undefined,
21
33
  ts.factory.createBlock([
22
34
  StatementFactory.constant(
@@ -53,7 +65,14 @@ export namespace AssertCloneProgrammer {
53
65
  ),
54
66
  ),
55
67
  ts.factory.createReturnStatement(
56
- ts.factory.createIdentifier("output"),
68
+ ts.factory.createAsExpression(
69
+ ts.factory.createIdentifier("output"),
70
+ project.checker.typeToTypeNode(
71
+ type,
72
+ undefined,
73
+ undefined,
74
+ ) ?? TypeFactory.keyword("any"),
75
+ ),
57
76
  ),
58
77
  ]),
59
78
  );
@@ -2,6 +2,7 @@ import ts from "typescript";
2
2
 
3
3
  import { IdentifierFactory } from "../factories/IdentifierFactory";
4
4
  import { StatementFactory } from "../factories/StatementFactory";
5
+ import { TypeFactory } from "../factories/TypeFactory";
5
6
 
6
7
  import { IProject } from "../transformers/IProject";
7
8
 
@@ -14,8 +15,19 @@ export namespace AssertParseProgrammer {
14
15
  ts.factory.createArrowFunction(
15
16
  undefined,
16
17
  undefined,
17
- [IdentifierFactory.parameter("input")],
18
- undefined,
18
+ [
19
+ IdentifierFactory.parameter(
20
+ "input",
21
+ TypeFactory.keyword("string"),
22
+ ),
23
+ ],
24
+ ts.factory.createTypeReferenceNode("typia.Primitive", [
25
+ project.checker.typeToTypeNode(
26
+ type,
27
+ undefined,
28
+ undefined,
29
+ ) ?? TypeFactory.keyword("any"),
30
+ ]),
19
31
  undefined,
20
32
  ts.factory.createBlock([
21
33
  StatementFactory.constant(