typia 3.5.0-dev.20221219 → 3.5.0-dev.20221222

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 (216) hide show
  1. package/README.md +58 -16
  2. package/lib/executable/internal/TypiaSetupWizard.js +2 -1
  3. package/lib/executable/internal/TypiaSetupWizard.js.map +1 -1
  4. package/lib/factories/MetadataCollection.d.ts +1 -9
  5. package/lib/factories/MetadataCollection.js +2 -77
  6. package/lib/factories/MetadataCollection.js.map +1 -1
  7. package/lib/factories/MetadataTagFactory.js +4 -1
  8. package/lib/factories/MetadataTagFactory.js.map +1 -1
  9. package/lib/factories/ProtocolFactory.d.ts +0 -1
  10. package/lib/factories/ProtocolFactory.js +0 -6
  11. package/lib/factories/ProtocolFactory.js.map +1 -1
  12. package/lib/factories/internal/metadata/iterate_metadata_object.js +4 -2
  13. package/lib/factories/internal/metadata/iterate_metadata_object.js.map +1 -1
  14. package/lib/factories/internal/protocols/iterate_protocol_main.js +2 -3
  15. package/lib/factories/internal/protocols/iterate_protocol_main.js.map +1 -1
  16. package/lib/factories/internal/protocols/iterate_protocol_map.js +3 -4
  17. package/lib/factories/internal/protocols/iterate_protocol_map.js.map +1 -1
  18. package/lib/factories/internal/protocols/iterate_protocol_metadata.js +2 -0
  19. package/lib/factories/internal/protocols/iterate_protocol_metadata.js.map +1 -1
  20. package/lib/factories/internal/protocols/iterate_protocol_repeated.js +3 -4
  21. package/lib/factories/internal/protocols/iterate_protocol_repeated.js.map +1 -1
  22. package/lib/factories/internal/protocols/iterate_protocol_tuple.js +3 -4
  23. package/lib/factories/internal/protocols/iterate_protocol_tuple.js.map +1 -1
  24. package/lib/functional/$number.js +2 -9
  25. package/lib/functional/$number.js.map +1 -1
  26. package/lib/programmers/AssertParseProgrammer.js +12 -1
  27. package/lib/programmers/AssertParseProgrammer.js.map +1 -1
  28. package/lib/programmers/AssertProgrammer.js +2 -1
  29. package/lib/programmers/AssertProgrammer.js.map +1 -1
  30. package/lib/programmers/AssertStringifyProgrammer.js +13 -2
  31. package/lib/programmers/AssertStringifyProgrammer.js.map +1 -1
  32. package/lib/programmers/CheckerProgrammer.js +6 -0
  33. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  34. package/lib/programmers/IsParseProgrammer.js +12 -1
  35. package/lib/programmers/IsParseProgrammer.js.map +1 -1
  36. package/lib/programmers/IsProgrammer.js +5 -2
  37. package/lib/programmers/IsProgrammer.js.map +1 -1
  38. package/lib/programmers/IsStringifyProgrammer.js +13 -2
  39. package/lib/programmers/IsStringifyProgrammer.js.map +1 -1
  40. package/lib/programmers/MessageProgrammer.js +11 -6
  41. package/lib/programmers/MessageProgrammer.js.map +1 -1
  42. package/lib/programmers/StringifyProgrammer.js +6 -1
  43. package/lib/programmers/StringifyProgrammer.js.map +1 -1
  44. package/lib/programmers/ValidateParseProgrammer.js +12 -1
  45. package/lib/programmers/ValidateParseProgrammer.js.map +1 -1
  46. package/lib/programmers/ValidateProgrammer.js +2 -1
  47. package/lib/programmers/ValidateProgrammer.js.map +1 -1
  48. package/lib/programmers/ValidateStringifyProgrammer.js +13 -2
  49. package/lib/programmers/ValidateStringifyProgrammer.js.map +1 -1
  50. package/lib/programmers/helpers/OptionPredicator.d.ts +2 -1
  51. package/lib/programmers/helpers/OptionPredicator.js +8 -6
  52. package/lib/programmers/helpers/OptionPredicator.js.map +1 -1
  53. package/lib/programmers/internal/application_object.js +9 -9
  54. package/lib/programmers/internal/application_object.js.map +1 -1
  55. package/lib/programmers/internal/application_schema.js +12 -6
  56. package/lib/programmers/internal/application_schema.js.map +1 -1
  57. package/lib/programmers/internal/check_bigint.d.ts +3 -0
  58. package/lib/programmers/internal/check_bigint.js +97 -0
  59. package/lib/programmers/internal/check_bigint.js.map +1 -0
  60. package/lib/programmers/internal/check_number.js +21 -23
  61. package/lib/programmers/internal/check_number.js.map +1 -1
  62. package/lib/schemas/IJsonSchema.d.ts +3 -5
  63. package/lib/transformers/ITransformOptions.d.ts +43 -2
  64. package/lib/transformers/features/miscellaneous/ApplicationTransformer.js +5 -3
  65. package/lib/transformers/features/miscellaneous/ApplicationTransformer.js.map +1 -1
  66. package/lib/transformers/features/stringifiers/StringifyTransformer.js +12 -1
  67. package/lib/transformers/features/stringifiers/StringifyTransformer.js.map +1 -1
  68. package/lib/utils/NameEncoder.d.ts +4 -0
  69. package/lib/utils/NameEncoder.js +89 -0
  70. package/lib/utils/NameEncoder.js.map +1 -0
  71. package/package.json +3 -2
  72. package/src/IValidation.ts +21 -21
  73. package/src/Primitive.ts +82 -82
  74. package/src/TypeGuardError.ts +36 -36
  75. package/src/executable/internal/CommandParser.ts +15 -15
  76. package/src/executable/internal/TypiaSetupWizard.ts +7 -3
  77. package/src/executable/typia.ts +46 -46
  78. package/src/factories/CommentFactory.ts +10 -10
  79. package/src/factories/ExpressionFactory.ts +66 -66
  80. package/src/factories/IdentifierFactory.ts +72 -72
  81. package/src/factories/LiteralFactory.ts +44 -44
  82. package/src/factories/MetadataCollection.ts +2 -43
  83. package/src/factories/MetadataTagFactory.ts +5 -1
  84. package/src/factories/ProtocolFactory.ts +0 -5
  85. package/src/factories/StatementFactory.ts +60 -60
  86. package/src/factories/TemplateFactory.ts +56 -56
  87. package/src/factories/TypeFactory.ts +101 -101
  88. package/src/factories/ValueFactory.ts +12 -12
  89. package/src/factories/internal/metadata/iterate_metadata_object.ts +6 -3
  90. package/src/factories/internal/protocols/iterate_protocol_main.ts +2 -3
  91. package/src/factories/internal/protocols/iterate_protocol_map.ts +3 -5
  92. package/src/factories/internal/protocols/iterate_protocol_metadata.ts +1 -0
  93. package/src/factories/internal/protocols/iterate_protocol_repeated.ts +3 -6
  94. package/src/factories/internal/protocols/iterate_protocol_tuple.ts +3 -6
  95. package/src/functional/$every.ts +11 -11
  96. package/src/functional/$guard.ts +35 -35
  97. package/src/functional/$is_email.ts +5 -5
  98. package/src/functional/$is_ipv4.ts +5 -5
  99. package/src/functional/$is_ipv6.ts +5 -5
  100. package/src/functional/$is_url.ts +5 -5
  101. package/src/functional/$is_uuid.ts +5 -5
  102. package/src/functional/$join.ts +50 -50
  103. package/src/functional/$number.ts +2 -9
  104. package/src/functional/$report.ts +15 -15
  105. package/src/functional/$rest.ts +3 -3
  106. package/src/functional/$string.ts +37 -37
  107. package/src/functional/$tail.ts +6 -6
  108. package/src/index.ts +4 -4
  109. package/src/metadata/IJsDocTagInfo.ts +10 -10
  110. package/src/metadata/IMetadata.ts +25 -25
  111. package/src/metadata/IMetadataApplication.ts +7 -7
  112. package/src/metadata/IMetadataConstant.ts +16 -16
  113. package/src/metadata/IMetadataEntry.ts +6 -6
  114. package/src/metadata/IMetadataObject.ts +29 -29
  115. package/src/metadata/IMetadataProperty.ts +11 -11
  116. package/src/metadata/MetadataConstant.ts +3 -3
  117. package/src/metadata/MetadataObject.ts +131 -131
  118. package/src/metadata/MetadataProperty.ts +64 -64
  119. package/src/programmers/ApplicationProgrammer.ts +55 -55
  120. package/src/programmers/AssertParseProgrammer.ts +11 -1
  121. package/src/programmers/AssertProgrammer.ts +3 -2
  122. package/src/programmers/AssertStringifyProgrammer.ts +22 -2
  123. package/src/programmers/CheckerProgrammer.ts +6 -0
  124. package/src/programmers/FeatureProgrammer.ts +327 -327
  125. package/src/programmers/IsParseProgrammer.ts +11 -1
  126. package/src/programmers/IsProgrammer.ts +5 -2
  127. package/src/programmers/IsStringifyProgrammer.ts +22 -2
  128. package/src/programmers/MessageProgrammer.ts +12 -6
  129. package/src/programmers/StringifyProgrammer.ts +7 -1
  130. package/src/programmers/ValidateParseProgrammer.ts +11 -1
  131. package/src/programmers/ValidateProgrammer.ts +2 -1
  132. package/src/programmers/ValidateStringifyProgrammer.ts +22 -2
  133. package/src/programmers/helpers/AtomicPredicator.ts +15 -15
  134. package/src/programmers/helpers/FunctionImporeter.ts +31 -31
  135. package/src/programmers/helpers/IExpressionEntry.ts +10 -10
  136. package/src/programmers/helpers/OptionPredicator.ts +7 -10
  137. package/src/programmers/helpers/StringifyJoinder.ts +111 -111
  138. package/src/programmers/helpers/StringifyPredicator.ts +18 -18
  139. package/src/programmers/helpers/UnionExplorer.ts +437 -437
  140. package/src/programmers/helpers/UnionPredicator.ts +81 -81
  141. package/src/programmers/internal/application_array.ts +45 -45
  142. package/src/programmers/internal/application_boolean.ts +17 -17
  143. package/src/programmers/internal/application_constant.ts +29 -29
  144. package/src/programmers/internal/application_default.ts +1 -1
  145. package/src/programmers/internal/application_default_string.ts +32 -32
  146. package/src/programmers/internal/application_native.ts +29 -29
  147. package/src/programmers/internal/application_number.ts +76 -76
  148. package/src/programmers/internal/application_object.ts +103 -103
  149. package/src/programmers/internal/application_schema.ts +15 -5
  150. package/src/programmers/internal/application_string.ts +49 -49
  151. package/src/programmers/internal/application_templates.ts +27 -27
  152. package/src/programmers/internal/application_tuple.ts +25 -25
  153. package/src/programmers/internal/check_array.ts +44 -44
  154. package/src/programmers/internal/check_bigint.ts +85 -0
  155. package/src/programmers/internal/check_dynamic_properties.ts +146 -146
  156. package/src/programmers/internal/check_everything.ts +25 -25
  157. package/src/programmers/internal/check_length.ts +46 -46
  158. package/src/programmers/internal/check_native.ts +9 -9
  159. package/src/programmers/internal/check_number.ts +45 -51
  160. package/src/programmers/internal/check_object.ts +42 -42
  161. package/src/programmers/internal/check_string.ts +24 -24
  162. package/src/programmers/internal/check_string_tags.ts +63 -63
  163. package/src/programmers/internal/check_template.ts +50 -50
  164. package/src/programmers/internal/decode_union_object.ts +73 -73
  165. package/src/programmers/internal/feature_object_entries.ts +49 -49
  166. package/src/programmers/internal/metadata_to_pattern.ts +31 -31
  167. package/src/programmers/internal/stringify_dynamic_properties.ts +164 -164
  168. package/src/programmers/internal/stringify_native.ts +8 -8
  169. package/src/programmers/internal/stringify_regular_properties.ts +81 -81
  170. package/src/programmers/internal/template_to_pattern.ts +15 -15
  171. package/src/schemas/IJsonApplication.ts +9 -9
  172. package/src/schemas/IJsonComponents.ts +24 -24
  173. package/src/schemas/IJsonSchema.ts +4 -6
  174. package/src/transform.ts +20 -20
  175. package/src/transformers/ExpressionWithArgumentTransformer.ts +66 -66
  176. package/src/transformers/FileTransformer.ts +49 -49
  177. package/src/transformers/IProject.ts +11 -11
  178. package/src/transformers/ITransformOptions.ts +45 -2
  179. package/src/transformers/NodeTransformer.ts +19 -19
  180. package/src/transformers/features/miscellaneous/ApplicationTransformer.ts +6 -3
  181. package/src/transformers/features/miscellaneous/MetadataTransformer.ts +55 -55
  182. package/src/transformers/features/parsers/AssertParseTransformer.ts +36 -36
  183. package/src/transformers/features/parsers/CreateAssertParseTransformer.ts +32 -32
  184. package/src/transformers/features/parsers/CreateIsParseTransformer.ts +32 -32
  185. package/src/transformers/features/parsers/CreateValidateParseTransformer.ts +32 -32
  186. package/src/transformers/features/parsers/IsParseTransformer.ts +36 -36
  187. package/src/transformers/features/parsers/ValidateParseTransformer.ts +36 -36
  188. package/src/transformers/features/stringifiers/AssertStringifyTransformer.ts +38 -38
  189. package/src/transformers/features/stringifiers/CreateAssertStringifyTransformer.ts +32 -32
  190. package/src/transformers/features/stringifiers/CreateIsStringifyTransformer.ts +32 -32
  191. package/src/transformers/features/stringifiers/CreateStringifyTransformer.ts +31 -31
  192. package/src/transformers/features/stringifiers/CreateValidateStringifyProgrammer.ts +32 -32
  193. package/src/transformers/features/stringifiers/IsStringifyTransformer.ts +38 -38
  194. package/src/transformers/features/stringifiers/StringifyTransformer.ts +11 -1
  195. package/src/transformers/features/stringifiers/ValidateStringifyTransformer.ts +38 -38
  196. package/src/transformers/features/validators/AssertTransformer.ts +43 -43
  197. package/src/transformers/features/validators/CreateAssertTransformer.ts +35 -35
  198. package/src/transformers/features/validators/CreateIsTransformer.ts +35 -35
  199. package/src/transformers/features/validators/CreateValidateTransformer.ts +35 -35
  200. package/src/transformers/features/validators/IsTransformer.ts +43 -43
  201. package/src/transformers/features/validators/ValidateTransformer.ts +43 -43
  202. package/src/typings/Atomic.ts +17 -17
  203. package/src/typings/ClassProperties.ts +5 -5
  204. package/src/typings/OmitNever.ts +3 -3
  205. package/src/typings/SpecialFields.ts +3 -3
  206. package/src/typings/Writable.ts +11 -11
  207. package/src/utils/ArrayUtil.ts +49 -49
  208. package/src/utils/Escaper.ts +50 -50
  209. package/src/utils/MapUtil.ts +14 -14
  210. package/src/utils/NameEncoder.ts +32 -0
  211. package/src/utils/PatternUtil.ts +30 -30
  212. package/src/utils/Singleton.ts +17 -17
  213. package/lib/transformers/features/miscellaneous/CreateInstanceTransformer.d.ts +0 -5
  214. package/lib/transformers/features/miscellaneous/CreateInstanceTransformer.js +0 -29
  215. package/lib/transformers/features/miscellaneous/CreateInstanceTransformer.js.map +0 -1
  216. package/src/transformers/features/miscellaneous/CreateInstanceTransformer.ts +0 -41
package/src/transform.ts CHANGED
@@ -1,20 +1,20 @@
1
- import ts from "typescript";
2
-
3
- import { FileTransformer } from "./transformers/FileTransformer";
4
- import { IProject } from "./transformers/IProject";
5
- import { ITransformOptions } from "./transformers/ITransformOptions";
6
-
7
- export default function transform(
8
- program: ts.Program,
9
- options?: ITransformOptions,
10
- ): ts.TransformerFactory<ts.SourceFile> {
11
- const project: IProject = {
12
- program,
13
- compilerOptions: program.getCompilerOptions(),
14
- checker: program.getTypeChecker(),
15
- printer: ts.createPrinter(),
16
- options: options || {},
17
- };
18
- return (context) => (file) =>
19
- FileTransformer.transform(project, context, file);
20
- }
1
+ import ts from "typescript";
2
+
3
+ import { FileTransformer } from "./transformers/FileTransformer";
4
+ import { IProject } from "./transformers/IProject";
5
+ import { ITransformOptions } from "./transformers/ITransformOptions";
6
+
7
+ export default function transform(
8
+ program: ts.Program,
9
+ options?: ITransformOptions,
10
+ ): ts.TransformerFactory<ts.SourceFile> {
11
+ const project: IProject = {
12
+ program,
13
+ compilerOptions: program.getCompilerOptions(),
14
+ checker: program.getTypeChecker(),
15
+ printer: ts.createPrinter(),
16
+ options: options || {},
17
+ };
18
+ return (context) => (file) =>
19
+ FileTransformer.transform(project, context, file);
20
+ }
@@ -1,66 +1,66 @@
1
- // import path from "path";
2
- // import ts from "typescript";
3
- // import { AssertProgrammer } from "../programmers/AssertProgrammer";
4
- // import { IsProgrammer } from "../programmers/IsProgrammer";
5
- // import { StringifyProgrammer } from "../programmers/StringifyProgrammer";
6
- // import { IProject } from "../structures/IProject";
7
-
8
- // export namespace ExpressionWithArgumentTransformer {
9
- // export function transform(
10
- // project: IProject,
11
- // expression: ts.ExpressionWithTypeArguments,
12
- // ): ts.Expression {
13
- // //----
14
- // // VALIDATIONS
15
- // //----
16
- // // SYMBOL DECLARATION
17
- // const symbol: ts.Symbol | undefined =
18
- // project.checker.getSymbolAtLocation(expression.expression);
19
- // const declaration: ts.Declaration | undefined = symbol?.declarations
20
- // ? symbol.declarations[0]
21
- // : undefined;
22
- // if (!declaration) return expression;
23
-
24
- // // FILE PATH
25
- // const file: string = path.resolve(declaration.getSourceFile().fileName);
26
- // if (file !== LIB_PATH && file !== SRC_PATH) return expression;
27
-
28
- // // ARGUMENTS
29
- // if (expression.typeArguments?.length !== 1) return expression;
30
-
31
- // //----
32
- // // TRANSFORMATION
33
- // //----
34
- // // GET MODULO AND TYPE
35
- // const modulo: ts.LeftHandSideExpression = expression.expression;
36
- // const type: ts.Type = project.checker.getTypeFromTypeNode(
37
- // expression.typeArguments[0]!,
38
- // );
39
-
40
- // // FUNCTION NAME
41
- // const { name } = project.checker.getTypeAtLocation(declaration).symbol;
42
-
43
- // // FIND TRANSFORMER
44
- // const functor: (() => Task) | undefined = FUNCTORS[name];
45
- // if (functor === undefined) return expression;
46
-
47
- // // RETURNS WITH TRANSFORMATION
48
- // return functor()(project, modulo, type);
49
- // }
50
- // }
51
-
52
- // type Task = (
53
- // project: IProject,
54
- // modulo: ts.LeftHandSideExpression,
55
- // type: ts.Type,
56
- // ) => ts.ArrowFunction;
57
-
58
- // const LIB_PATH = path.resolve(path.join(__dirname, "..", "module.d.ts"));
59
- // const SRC_PATH = path.resolve(path.join(__dirname, "..", "module.ts"));
60
-
61
- // const FUNCTORS: Record<string, () => Task> = {
62
- // assert: () => AssertProgrammer.generate,
63
- // is: () => (project, _modulo, type) => IsProgrammer.generate(project, type),
64
- // stringify: () => (project, modulo, type) =>
65
- // StringifyProgrammer.generate(modulo)(project, type),
66
- // };
1
+ // import path from "path";
2
+ // import ts from "typescript";
3
+ // import { AssertProgrammer } from "../programmers/AssertProgrammer";
4
+ // import { IsProgrammer } from "../programmers/IsProgrammer";
5
+ // import { StringifyProgrammer } from "../programmers/StringifyProgrammer";
6
+ // import { IProject } from "../structures/IProject";
7
+
8
+ // export namespace ExpressionWithArgumentTransformer {
9
+ // export function transform(
10
+ // project: IProject,
11
+ // expression: ts.ExpressionWithTypeArguments,
12
+ // ): ts.Expression {
13
+ // //----
14
+ // // VALIDATIONS
15
+ // //----
16
+ // // SYMBOL DECLARATION
17
+ // const symbol: ts.Symbol | undefined =
18
+ // project.checker.getSymbolAtLocation(expression.expression);
19
+ // const declaration: ts.Declaration | undefined = symbol?.declarations
20
+ // ? symbol.declarations[0]
21
+ // : undefined;
22
+ // if (!declaration) return expression;
23
+
24
+ // // FILE PATH
25
+ // const file: string = path.resolve(declaration.getSourceFile().fileName);
26
+ // if (file !== LIB_PATH && file !== SRC_PATH) return expression;
27
+
28
+ // // ARGUMENTS
29
+ // if (expression.typeArguments?.length !== 1) return expression;
30
+
31
+ // //----
32
+ // // TRANSFORMATION
33
+ // //----
34
+ // // GET MODULO AND TYPE
35
+ // const modulo: ts.LeftHandSideExpression = expression.expression;
36
+ // const type: ts.Type = project.checker.getTypeFromTypeNode(
37
+ // expression.typeArguments[0]!,
38
+ // );
39
+
40
+ // // FUNCTION NAME
41
+ // const { name } = project.checker.getTypeAtLocation(declaration).symbol;
42
+
43
+ // // FIND TRANSFORMER
44
+ // const functor: (() => Task) | undefined = FUNCTORS[name];
45
+ // if (functor === undefined) return expression;
46
+
47
+ // // RETURNS WITH TRANSFORMATION
48
+ // return functor()(project, modulo, type);
49
+ // }
50
+ // }
51
+
52
+ // type Task = (
53
+ // project: IProject,
54
+ // modulo: ts.LeftHandSideExpression,
55
+ // type: ts.Type,
56
+ // ) => ts.ArrowFunction;
57
+
58
+ // const LIB_PATH = path.resolve(path.join(__dirname, "..", "module.d.ts"));
59
+ // const SRC_PATH = path.resolve(path.join(__dirname, "..", "module.ts"));
60
+
61
+ // const FUNCTORS: Record<string, () => Task> = {
62
+ // assert: () => AssertProgrammer.generate,
63
+ // is: () => (project, _modulo, type) => IsProgrammer.generate(project, type),
64
+ // stringify: () => (project, modulo, type) =>
65
+ // StringifyProgrammer.generate(modulo)(project, type),
66
+ // };
@@ -1,49 +1,49 @@
1
- import ts from "typescript";
2
-
3
- import { IProject } from "./IProject";
4
- import { NodeTransformer } from "./NodeTransformer";
5
-
6
- export namespace FileTransformer {
7
- export function transform(
8
- project: IProject,
9
- context: ts.TransformationContext,
10
- file: ts.SourceFile,
11
- ): ts.SourceFile {
12
- // DO NOT TRANSFORM D.TS FILE
13
- if (file.isDeclarationFile) return file;
14
-
15
- // ITERATE NODES
16
- return ts.visitEachChild(
17
- file,
18
- (node) => iterate_node(project, context, node),
19
- context,
20
- );
21
- }
22
-
23
- function iterate_node(
24
- project: IProject,
25
- context: ts.TransformationContext,
26
- node: ts.Node,
27
- ): ts.Node {
28
- return ts.visitEachChild(
29
- try_transform_node(project, node),
30
- (child) => iterate_node(project, context, child),
31
- context,
32
- );
33
- }
34
-
35
- function try_transform_node(project: IProject, node: ts.Node): ts.Node {
36
- try {
37
- return NodeTransformer.transform(project, node);
38
- } catch (exp) {
39
- if (!(exp instanceof Error)) throw exp;
40
-
41
- const file: ts.SourceFile = node.getSourceFile();
42
- const { line, character } = file.getLineAndCharacterOfPosition(
43
- node.pos,
44
- );
45
- exp.message += ` - ${file.fileName}:${line + 1}:${character + 1}`;
46
- throw exp;
47
- }
48
- }
49
- }
1
+ import ts from "typescript";
2
+
3
+ import { IProject } from "./IProject";
4
+ import { NodeTransformer } from "./NodeTransformer";
5
+
6
+ export namespace FileTransformer {
7
+ export function transform(
8
+ project: IProject,
9
+ context: ts.TransformationContext,
10
+ file: ts.SourceFile,
11
+ ): ts.SourceFile {
12
+ // DO NOT TRANSFORM D.TS FILE
13
+ if (file.isDeclarationFile) return file;
14
+
15
+ // ITERATE NODES
16
+ return ts.visitEachChild(
17
+ file,
18
+ (node) => iterate_node(project, context, node),
19
+ context,
20
+ );
21
+ }
22
+
23
+ function iterate_node(
24
+ project: IProject,
25
+ context: ts.TransformationContext,
26
+ node: ts.Node,
27
+ ): ts.Node {
28
+ return ts.visitEachChild(
29
+ try_transform_node(project, node),
30
+ (child) => iterate_node(project, context, child),
31
+ context,
32
+ );
33
+ }
34
+
35
+ function try_transform_node(project: IProject, node: ts.Node): ts.Node {
36
+ try {
37
+ return NodeTransformer.transform(project, node);
38
+ } catch (exp) {
39
+ if (!(exp instanceof Error)) throw exp;
40
+
41
+ const file: ts.SourceFile = node.getSourceFile();
42
+ const { line, character } = file.getLineAndCharacterOfPosition(
43
+ node.pos,
44
+ );
45
+ exp.message += ` - ${file.fileName}:${line + 1}:${character + 1}`;
46
+ throw exp;
47
+ }
48
+ }
49
+ }
@@ -1,11 +1,11 @@
1
- import ts from "typescript";
2
-
3
- import { ITransformOptions } from "./ITransformOptions";
4
-
5
- export interface IProject {
6
- program: ts.Program;
7
- compilerOptions: ts.CompilerOptions;
8
- checker: ts.TypeChecker;
9
- printer: ts.Printer;
10
- options: ITransformOptions;
11
- }
1
+ import ts from "typescript";
2
+
3
+ import { ITransformOptions } from "./ITransformOptions";
4
+
5
+ export interface IProject {
6
+ program: ts.Program;
7
+ compilerOptions: ts.CompilerOptions;
8
+ checker: ts.TypeChecker;
9
+ printer: ts.Printer;
10
+ options: ITransformOptions;
11
+ }
@@ -1,4 +1,47 @@
1
1
  export interface ITransformOptions {
2
- functional?: boolean | "checker" | "stringify";
3
- numeric?: boolean | "checker" | "stringify";
2
+ /**
3
+ * Whether to validate finite number or not.
4
+ *
5
+ * If configured true, number typed values would be validated by Number.isNaN().
6
+ *
7
+ * However, whatever you configure, it would be ignored when marshaling or parsing.
8
+ *
9
+ * - when marshaling, always be true
10
+ * - assertStringify()
11
+ * - validateEncode()
12
+ * - when parsing, always be false
13
+ * - assertParse()
14
+ * - isDecode()
15
+ *
16
+ * @default false
17
+ */
18
+ finite?: boolean;
19
+
20
+ /**
21
+ * Whether to validate finite number or not.
22
+ *
23
+ * If configured true, number typed values would be validated by Number.isFinite().
24
+ *
25
+ * However, whatever you configure, it can be ignored in below case.
26
+ *
27
+ * - when `finite` option is true, this option would be ignored
28
+ * - when marshaling, always be true
29
+ * - assertStringify()
30
+ * - validateEncode()
31
+ * - when parsing, always be false
32
+ * - assertParse()
33
+ * - isDecode()
34
+ *
35
+ * @default false
36
+ */
37
+ numeric?: boolean;
38
+
39
+ /**
40
+ * Whether to validate functional type or not.
41
+ *
42
+ * However, whatever you configure, it becomes false when marshaling or parsing.
43
+ *
44
+ * @default false
45
+ */
46
+ functional?: boolean;
4
47
  }
@@ -1,19 +1,19 @@
1
- import ts from "typescript";
2
-
3
- import { CallExpressionTransformer } from "./CallExpressionTransformer";
4
- import { IProject } from "./IProject";
5
-
6
- // import { ExpressionWithArgumentTransformer } from "./ExpressionWithArgumentTransformer";
7
-
8
- export namespace NodeTransformer {
9
- export function transform(project: IProject, expression: ts.Node): ts.Node {
10
- if (ts.isCallExpression(expression))
11
- return CallExpressionTransformer.transform(project, expression);
12
- // else if (ts.isExpressionWithTypeArguments(expression))
13
- // return ExpressionWithArgumentTransformer.transform(
14
- // project,
15
- // expression,
16
- // );
17
- return expression;
18
- }
19
- }
1
+ import ts from "typescript";
2
+
3
+ import { CallExpressionTransformer } from "./CallExpressionTransformer";
4
+ import { IProject } from "./IProject";
5
+
6
+ // import { ExpressionWithArgumentTransformer } from "./ExpressionWithArgumentTransformer";
7
+
8
+ export namespace NodeTransformer {
9
+ export function transform(project: IProject, expression: ts.Node): ts.Node {
10
+ if (ts.isCallExpression(expression))
11
+ return CallExpressionTransformer.transform(project, expression);
12
+ // else if (ts.isExpressionWithTypeArguments(expression))
13
+ // return ExpressionWithArgumentTransformer.transform(
14
+ // project,
15
+ // expression,
16
+ // );
17
+ return expression;
18
+ }
19
+ }
@@ -59,13 +59,15 @@ export namespace ApplicationTransformer {
59
59
  // GENERATORS
60
60
  //----
61
61
  // METADATA
62
- const collection: MetadataCollection = new MetadataCollection({
63
- replace: MetadataCollection.replace,
64
- });
62
+ const collection: MetadataCollection = new MetadataCollection();
65
63
  const metadatas: Array<Metadata> = types.map((type) =>
66
64
  MetadataFactory.generate(checker, collection, type, {
67
65
  resolve: true,
68
66
  constant: true,
67
+ validate: (meta) => {
68
+ if (meta.atomics.find((str) => str === "bigint"))
69
+ throw new Error(ErrorMessages.NO_BIGIT);
70
+ },
69
71
  }),
70
72
  );
71
73
 
@@ -111,4 +113,5 @@ export namespace ApplicationTransformer {
111
113
  const enum ErrorMessages {
112
114
  NO_GENERIC_ARGUMENT = "Error on typia.application(): no generic argument.",
113
115
  GENERIC_ARGUMENT = "Error on typia.application(): non-specified generic argument(s).",
116
+ NO_BIGIT = "Error on typia.application(): does not allow bigint type.",
114
117
  }
@@ -1,55 +1,55 @@
1
- import ts from "typescript";
2
-
3
- import { LiteralFactory } from "../../../factories/LiteralFactory";
4
- import { MetadataCollection } from "../../../factories/MetadataCollection";
5
- import { MetadataFactory } from "../../../factories/MetadataFactory";
6
-
7
- import { IMetadataApplication } from "../../../metadata/IMetadataApplication";
8
- import { Metadata } from "../../../metadata/Metadata";
9
-
10
- import { IProject } from "../../IProject";
11
-
12
- export namespace MetadataTransformer {
13
- export function transform(
14
- { checker }: IProject,
15
- _modulo: ts.LeftHandSideExpression,
16
- expression: ts.CallExpression,
17
- ): ts.Expression {
18
- if (!expression.typeArguments?.length)
19
- throw new Error(ErrorMessages.NO_GENERIC_ARGUMENT);
20
-
21
- // VALIDATE TUPLE ARGUMENTS
22
- const top: ts.Node = expression.typeArguments[0]!;
23
- if (!ts.isTupleTypeNode(top)) return expression;
24
- else if (top.elements.some((child) => !ts.isTypeNode(child)))
25
- return expression;
26
-
27
- // GET TYPES
28
- const types: ts.Type[] = top.elements.map((child) =>
29
- checker.getTypeFromTypeNode(child as ts.TypeNode),
30
- );
31
- if (types.some((t) => t.isTypeParameter()))
32
- throw new Error(ErrorMessages.GENERIC_ARGUMENT);
33
-
34
- // METADATA
35
- const collection: MetadataCollection = new MetadataCollection();
36
- const metadatas: Array<Metadata> = types.map((type) =>
37
- MetadataFactory.generate(checker, collection, type, {
38
- resolve: false,
39
- constant: true,
40
- }),
41
- );
42
-
43
- // CONVERT TO PRIMITIVE TYPE
44
- const app: IMetadataApplication = {
45
- metadatas: metadatas.map((metadata) => metadata.toJSON()),
46
- collection: collection.objects().map((obj) => obj.toJSON()),
47
- };
48
- return LiteralFactory.generate(app);
49
- }
50
- }
51
-
52
- const enum ErrorMessages {
53
- NO_GENERIC_ARGUMENT = "Error on typia.metadata(): no generic argument.",
54
- GENERIC_ARGUMENT = "Error on typia.metadata(): non-specified generic argument(s).",
55
- }
1
+ import ts from "typescript";
2
+
3
+ import { LiteralFactory } from "../../../factories/LiteralFactory";
4
+ import { MetadataCollection } from "../../../factories/MetadataCollection";
5
+ import { MetadataFactory } from "../../../factories/MetadataFactory";
6
+
7
+ import { IMetadataApplication } from "../../../metadata/IMetadataApplication";
8
+ import { Metadata } from "../../../metadata/Metadata";
9
+
10
+ import { IProject } from "../../IProject";
11
+
12
+ export namespace MetadataTransformer {
13
+ export function transform(
14
+ { checker }: IProject,
15
+ _modulo: ts.LeftHandSideExpression,
16
+ expression: ts.CallExpression,
17
+ ): ts.Expression {
18
+ if (!expression.typeArguments?.length)
19
+ throw new Error(ErrorMessages.NO_GENERIC_ARGUMENT);
20
+
21
+ // VALIDATE TUPLE ARGUMENTS
22
+ const top: ts.Node = expression.typeArguments[0]!;
23
+ if (!ts.isTupleTypeNode(top)) return expression;
24
+ else if (top.elements.some((child) => !ts.isTypeNode(child)))
25
+ return expression;
26
+
27
+ // GET TYPES
28
+ const types: ts.Type[] = top.elements.map((child) =>
29
+ checker.getTypeFromTypeNode(child as ts.TypeNode),
30
+ );
31
+ if (types.some((t) => t.isTypeParameter()))
32
+ throw new Error(ErrorMessages.GENERIC_ARGUMENT);
33
+
34
+ // METADATA
35
+ const collection: MetadataCollection = new MetadataCollection();
36
+ const metadatas: Array<Metadata> = types.map((type) =>
37
+ MetadataFactory.generate(checker, collection, type, {
38
+ resolve: false,
39
+ constant: true,
40
+ }),
41
+ );
42
+
43
+ // CONVERT TO PRIMITIVE TYPE
44
+ const app: IMetadataApplication = {
45
+ metadatas: metadatas.map((metadata) => metadata.toJSON()),
46
+ collection: collection.objects().map((obj) => obj.toJSON()),
47
+ };
48
+ return LiteralFactory.generate(app);
49
+ }
50
+ }
51
+
52
+ const enum ErrorMessages {
53
+ NO_GENERIC_ARGUMENT = "Error on typia.metadata(): no generic argument.",
54
+ GENERIC_ARGUMENT = "Error on typia.metadata(): non-specified generic argument(s).",
55
+ }
@@ -1,36 +1,36 @@
1
- import ts from "typescript";
2
-
3
- import { AssertParseProgrammer } from "../../../programmers/AssertParseProgrammer";
4
-
5
- import { IProject } from "../../IProject";
6
-
7
- export namespace AssertParseTransformer {
8
- export function transform(
9
- project: IProject,
10
- modulo: ts.LeftHandSideExpression,
11
- expression: ts.CallExpression,
12
- ): ts.Expression {
13
- // CHECK GENERIC ARGUMENT EXVALIDATETENCE
14
- if (!expression.typeArguments || !expression.typeArguments[0])
15
- throw new Error(ErrorMessages.NOT_SPECIFIED);
16
-
17
- // GET TYPE INFO
18
- const type: ts.Type = project.checker.getTypeFromTypeNode(
19
- expression.typeArguments[0],
20
- );
21
- if (type.isTypeParameter())
22
- throw new Error(ErrorMessages.GENERIC_ARGUMENT);
23
-
24
- // DO TRANSFORM
25
- return ts.factory.createCallExpression(
26
- AssertParseProgrammer.generate(project, modulo)(type),
27
- undefined,
28
- [expression.arguments[0]!],
29
- );
30
- }
31
- }
32
-
33
- const enum ErrorMessages {
34
- NOT_SPECIFIED = "Error on typia.assertParse(): generic argument is not specified",
35
- GENERIC_ARGUMENT = "Error on typia.assertParse(): non-specified generic argument.",
36
- }
1
+ import ts from "typescript";
2
+
3
+ import { AssertParseProgrammer } from "../../../programmers/AssertParseProgrammer";
4
+
5
+ import { IProject } from "../../IProject";
6
+
7
+ export namespace AssertParseTransformer {
8
+ export function transform(
9
+ project: IProject,
10
+ modulo: ts.LeftHandSideExpression,
11
+ expression: ts.CallExpression,
12
+ ): ts.Expression {
13
+ // CHECK GENERIC ARGUMENT EXVALIDATETENCE
14
+ if (!expression.typeArguments || !expression.typeArguments[0])
15
+ throw new Error(ErrorMessages.NOT_SPECIFIED);
16
+
17
+ // GET TYPE INFO
18
+ const type: ts.Type = project.checker.getTypeFromTypeNode(
19
+ expression.typeArguments[0],
20
+ );
21
+ if (type.isTypeParameter())
22
+ throw new Error(ErrorMessages.GENERIC_ARGUMENT);
23
+
24
+ // DO TRANSFORM
25
+ return ts.factory.createCallExpression(
26
+ AssertParseProgrammer.generate(project, modulo)(type),
27
+ undefined,
28
+ [expression.arguments[0]!],
29
+ );
30
+ }
31
+ }
32
+
33
+ const enum ErrorMessages {
34
+ NOT_SPECIFIED = "Error on typia.assertParse(): generic argument is not specified",
35
+ GENERIC_ARGUMENT = "Error on typia.assertParse(): non-specified generic argument.",
36
+ }