typia 5.2.6 → 5.2.7-dev.20231109

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 (125) hide show
  1. package/lib/factories/ExpressionFactory.js +14 -16
  2. package/lib/factories/ExpressionFactory.js.map +1 -1
  3. package/lib/factories/JsonMetadataFactory.d.ts +1 -1
  4. package/lib/factories/JsonMetadataFactory.js +2 -2
  5. package/lib/factories/JsonMetadataFactory.js.map +1 -1
  6. package/lib/factories/LiteralFactory.js +2 -0
  7. package/lib/factories/LiteralFactory.js.map +1 -1
  8. package/lib/factories/MetadataFactory.d.ts +1 -1
  9. package/lib/factories/MetadataFactory.js +233 -168
  10. package/lib/factories/MetadataFactory.js.map +1 -1
  11. package/lib/factories/NumericRangeFactory.d.ts +2 -2
  12. package/lib/factories/NumericRangeFactory.js +41 -21
  13. package/lib/factories/NumericRangeFactory.js.map +1 -1
  14. package/lib/factories/ProtobufFactory.d.ts +1 -1
  15. package/lib/factories/ProtobufFactory.js +2 -2
  16. package/lib/factories/ProtobufFactory.js.map +1 -1
  17. package/lib/programmers/CheckerProgrammer.js +11 -16
  18. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  19. package/lib/programmers/RandomProgrammer.js +1 -1
  20. package/lib/programmers/RandomProgrammer.js.map +1 -1
  21. package/lib/programmers/http/HttpHeadersProgrammer.js +1 -1
  22. package/lib/programmers/http/HttpHeadersProgrammer.js.map +1 -1
  23. package/lib/programmers/http/HttpParameterProgrammer.js +1 -1
  24. package/lib/programmers/http/HttpParameterProgrammer.js.map +1 -1
  25. package/lib/programmers/http/HttpQueryProgrammer.js +1 -1
  26. package/lib/programmers/http/HttpQueryProgrammer.js.map +1 -1
  27. package/lib/programmers/internal/application_array.js +8 -0
  28. package/lib/programmers/internal/application_array.js.map +1 -1
  29. package/lib/programmers/internal/application_number.js +8 -1
  30. package/lib/programmers/internal/application_number.js.map +1 -1
  31. package/lib/programmers/internal/application_string.js +8 -1
  32. package/lib/programmers/internal/application_string.js.map +1 -1
  33. package/lib/programmers/internal/check_array_length.js +7 -4
  34. package/lib/programmers/internal/check_array_length.js.map +1 -1
  35. package/lib/programmers/internal/check_bigint.js +7 -4
  36. package/lib/programmers/internal/check_bigint.js.map +1 -1
  37. package/lib/programmers/internal/check_number.js +7 -4
  38. package/lib/programmers/internal/check_number.js.map +1 -1
  39. package/lib/programmers/internal/check_string.js.map +1 -1
  40. package/lib/programmers/json/JsonAssertParseProgrammer.js +1 -1
  41. package/lib/programmers/json/JsonAssertParseProgrammer.js.map +1 -1
  42. package/lib/programmers/json/JsonIsParseProgrammer.js +1 -1
  43. package/lib/programmers/json/JsonIsParseProgrammer.js.map +1 -1
  44. package/lib/programmers/json/JsonStringifyProgrammer.js +3 -8
  45. package/lib/programmers/json/JsonStringifyProgrammer.js.map +1 -1
  46. package/lib/programmers/json/JsonValidateParseProgrammer.js +1 -1
  47. package/lib/programmers/json/JsonValidateParseProgrammer.js.map +1 -1
  48. package/lib/programmers/misc/MiscCloneProgrammer.js +19 -24
  49. package/lib/programmers/misc/MiscCloneProgrammer.js.map +1 -1
  50. package/lib/programmers/misc/MiscLiteralsProgrammer.js +1 -1
  51. package/lib/programmers/misc/MiscLiteralsProgrammer.js.map +1 -1
  52. package/lib/programmers/misc/MiscPruneProgrammer.js +11 -16
  53. package/lib/programmers/misc/MiscPruneProgrammer.js.map +1 -1
  54. package/lib/programmers/notations/NotationGeneralProgrammer.js +11 -16
  55. package/lib/programmers/notations/NotationGeneralProgrammer.js.map +1 -1
  56. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js +1 -1
  57. package/lib/programmers/protobuf/ProtobufDecodeProgrammer.js.map +1 -1
  58. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js +38 -42
  59. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js.map +1 -1
  60. package/lib/programmers/protobuf/ProtobufMessageProgrammer.d.ts +1 -1
  61. package/lib/programmers/protobuf/ProtobufMessageProgrammer.js +22 -25
  62. package/lib/programmers/protobuf/ProtobufMessageProgrammer.js.map +1 -1
  63. package/lib/schemas/json/IJsonSchema.d.ts +1 -0
  64. package/lib/schemas/metadata/Metadata.js +1 -6
  65. package/lib/schemas/metadata/Metadata.js.map +1 -1
  66. package/lib/schemas/metadata/MetadataAtomic.d.ts +2 -0
  67. package/lib/schemas/metadata/MetadataAtomic.js +15 -0
  68. package/lib/schemas/metadata/MetadataAtomic.js.map +1 -1
  69. package/lib/transformers/features/json/JsonApplicationTransformer.d.ts +1 -1
  70. package/lib/transformers/features/json/JsonApplicationTransformer.js +4 -5
  71. package/lib/transformers/features/json/JsonApplicationTransformer.js.map +1 -1
  72. package/lib/transformers/features/misc/MetadataTransformer.d.ts +1 -1
  73. package/lib/transformers/features/misc/MetadataTransformer.js +3 -4
  74. package/lib/transformers/features/misc/MetadataTransformer.js.map +1 -1
  75. package/package.json +2 -2
  76. package/src/Primitive.ts +135 -135
  77. package/src/executable/TypiaSetupWizard.ts +142 -142
  78. package/src/executable/setup/CommandExecutor.ts +8 -8
  79. package/src/factories/ExpressionFactory.ts +12 -13
  80. package/src/factories/JsonMetadataFactory.ts +53 -50
  81. package/src/factories/LiteralFactory.ts +2 -0
  82. package/src/factories/MetadataCollection.ts +282 -282
  83. package/src/factories/MetadataFactory.ts +48 -18
  84. package/src/factories/NumericRangeFactory.ts +56 -17
  85. package/src/factories/ProtobufFactory.ts +5 -2
  86. package/src/factories/internal/metadata/emplace_metadata_object.ts +178 -178
  87. package/src/functional/$stoll.ts +8 -8
  88. package/src/functional/Namespace.ts +168 -168
  89. package/src/programmers/AssertProgrammer.ts +322 -322
  90. package/src/programmers/CheckerProgrammer.ts +16 -17
  91. package/src/programmers/IsProgrammer.ts +258 -258
  92. package/src/programmers/RandomProgrammer.ts +4 -1
  93. package/src/programmers/ValidateProgrammer.ts +350 -350
  94. package/src/programmers/helpers/AtomicPredicator.ts +31 -31
  95. package/src/programmers/http/HttpHeadersProgrammer.ts +4 -1
  96. package/src/programmers/http/HttpParameterProgrammer.ts +4 -1
  97. package/src/programmers/http/HttpQueryProgrammer.ts +4 -1
  98. package/src/programmers/internal/application_array.ts +8 -0
  99. package/src/programmers/internal/application_number.ts +8 -1
  100. package/src/programmers/internal/application_string.ts +8 -1
  101. package/src/programmers/internal/check_array_length.ts +5 -2
  102. package/src/programmers/internal/check_bigint.ts +5 -2
  103. package/src/programmers/internal/check_dynamic_key.ts +178 -178
  104. package/src/programmers/internal/check_dynamic_properties.ts +202 -202
  105. package/src/programmers/internal/check_number.ts +5 -2
  106. package/src/programmers/internal/check_object.ts +62 -62
  107. package/src/programmers/internal/check_string.ts +0 -1
  108. package/src/programmers/json/JsonAssertParseProgrammer.ts +1 -0
  109. package/src/programmers/json/JsonIsParseProgrammer.ts +1 -0
  110. package/src/programmers/json/JsonStringifyProgrammer.ts +959 -960
  111. package/src/programmers/json/JsonValidateParseProgrammer.ts +1 -0
  112. package/src/programmers/misc/MiscCloneProgrammer.ts +787 -786
  113. package/src/programmers/misc/MiscLiteralsProgrammer.ts +4 -1
  114. package/src/programmers/misc/MiscPruneProgrammer.ts +549 -548
  115. package/src/programmers/notations/NotationGeneralProgrammer.ts +717 -716
  116. package/src/programmers/protobuf/ProtobufDecodeProgrammer.ts +1 -0
  117. package/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +872 -882
  118. package/src/programmers/protobuf/ProtobufMessageProgrammer.ts +21 -21
  119. package/src/schemas/json/IJsonSchema.ts +1 -0
  120. package/src/schemas/metadata/IMetadataTypeTag.ts +7 -0
  121. package/src/schemas/metadata/Metadata.ts +1 -6
  122. package/src/schemas/metadata/MetadataAtomic.ts +17 -0
  123. package/src/transform.ts +35 -35
  124. package/src/transformers/features/json/JsonApplicationTransformer.ts +7 -4
  125. package/src/transformers/features/misc/MetadataTransformer.ts +6 -3
@@ -16,27 +16,27 @@ import { NameEncoder } from "../../utils/NameEncoder";
16
16
  import { ProtobufUtil } from "../helpers/ProtobufUtil";
17
17
 
18
18
  export namespace ProtobufMessageProgrammer {
19
- export const write =
20
- ({ checker }: IProject) =>
21
- (type: ts.Type) => {
22
- // PARSE TARGET TYPE
23
- const collection: MetadataCollection = new MetadataCollection();
24
- ProtobufFactory.metadata("message")(checker)(collection)(type);
25
-
26
- // STRINGIFY
27
- const hierarchies: Map<string, Hierarchy> = new Map();
28
- for (const obj of collection.objects())
29
- if (is_dynamic_object(obj) === false) emplace(hierarchies)(obj);
30
-
31
- const content: string =
32
- `syntax = "proto3";\n\n` +
33
- [...hierarchies.values()]
34
- .map((hier) => write_hierarchy(hier))
35
- .join("\n\n");
36
-
37
- // RETURNS
38
- return ts.factory.createStringLiteral(content);
39
- };
19
+ export const write = (project: IProject) => (type: ts.Type) => {
20
+ // PARSE TARGET TYPE
21
+ const collection: MetadataCollection = new MetadataCollection();
22
+ ProtobufFactory.metadata("message")(project.checker, project.context)(
23
+ collection,
24
+ )(type);
25
+
26
+ // STRINGIFY
27
+ const hierarchies: Map<string, Hierarchy> = new Map();
28
+ for (const obj of collection.objects())
29
+ if (is_dynamic_object(obj) === false) emplace(hierarchies)(obj);
30
+
31
+ const content: string =
32
+ `syntax = "proto3";\n\n` +
33
+ [...hierarchies.values()]
34
+ .map((hier) => write_hierarchy(hier))
35
+ .join("\n\n");
36
+
37
+ // RETURNS
38
+ return ts.factory.createStringLiteral(content);
39
+ };
40
40
 
41
41
  const emplace = (dict: Map<string, Hierarchy>) => (obj: MetadataObject) => {
42
42
  const accessors: string[] = obj.name.split(".");
@@ -72,6 +72,7 @@ export namespace IJsonSchema {
72
72
  minItems?: undefined | (number & Type<"uint32">);
73
73
  maxItems?: undefined | (number & Type<"uint32">);
74
74
  "x-typia-tuple"?: undefined | ITuple;
75
+ "x-typia-typeTags"?: undefined | IMetadataTypeTag[];
75
76
  }
76
77
  export interface ITuple extends ISignificant<"array"> {
77
78
  items: IJsonSchema[];
@@ -1,3 +1,5 @@
1
+ import type ts from "typescript";
2
+
1
3
  export interface IMetadataTypeTag {
2
4
  target: "boolean" | "bigint" | "number" | "string" | "array";
3
5
  name: string;
@@ -5,4 +7,9 @@ export interface IMetadataTypeTag {
5
7
  value: any;
6
8
  validate: string | undefined;
7
9
  exclusive: boolean | string[];
10
+
11
+ /**
12
+ * @internal
13
+ */
14
+ predicate?: (input: ts.Expression) => ts.Expression;
8
15
  }
@@ -119,12 +119,7 @@ export class Metadata {
119
119
  nullable: this.nullable,
120
120
  functional: this.functional,
121
121
 
122
- atomics: this.atomics.map((a) =>
123
- MetadataAtomic.create({
124
- type: a.type,
125
- tags: a.tags.map((r) => r.slice()),
126
- }),
127
- ),
122
+ atomics: this.atomics.map((a) => a.toJSON()),
128
123
  constants: this.constants.map((c) => ({
129
124
  type: c.type,
130
125
  values: c.values.slice() as any,
@@ -1,5 +1,6 @@
1
1
  import { ClassProperties } from "../../typings/ClassProperties";
2
2
 
3
+ import { IMetadataAtomic } from "./IMetadataAtomic";
3
4
  import { IMetadataTypeTag } from "./IMetadataTypeTag";
4
5
 
5
6
  export class MetadataAtomic {
@@ -39,4 +40,20 @@ export class MetadataAtomic {
39
40
  return `(${this.type} & (${rows.join(" | ")}))`;
40
41
  })());
41
42
  }
43
+
44
+ public toJSON(): IMetadataAtomic {
45
+ return {
46
+ type: this.type,
47
+ tags: this.tags.map((row) =>
48
+ row.map((tag) => ({
49
+ target: tag.target,
50
+ name: tag.name,
51
+ kind: tag.kind,
52
+ value: tag.value,
53
+ validate: tag.validate,
54
+ exclusive: tag.exclusive,
55
+ })),
56
+ ),
57
+ };
58
+ }
42
59
  }
package/src/transform.ts CHANGED
@@ -1,35 +1,35 @@
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 const transform = (
8
- program: ts.Program,
9
- options: ITransformOptions | undefined,
10
- extras: IProject["extras"],
11
- ): ts.TransformerFactory<ts.SourceFile> => {
12
- const compilerOptions: ts.CompilerOptions = program.getCompilerOptions();
13
- const strict: boolean =
14
- compilerOptions.strictNullChecks !== undefined
15
- ? !!compilerOptions.strictNullChecks
16
- : !!compilerOptions.strict;
17
- if (strict === false)
18
- extras.addDiagnostic({
19
- category: ts.DiagnosticCategory.Error,
20
- code: "(typia)" as any,
21
- file: undefined,
22
- start: undefined,
23
- length: undefined,
24
- messageText: "strict mode is required.",
25
- });
26
- return FileTransformer.transform({
27
- program,
28
- compilerOptions,
29
- checker: program.getTypeChecker(),
30
- printer: ts.createPrinter(),
31
- options: options ?? {},
32
- extras,
33
- });
34
- };
35
- export default transform;
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 const transform = (
8
+ program: ts.Program,
9
+ options: ITransformOptions | undefined,
10
+ extras: IProject["extras"],
11
+ ): ts.TransformerFactory<ts.SourceFile> => {
12
+ const compilerOptions: ts.CompilerOptions = program.getCompilerOptions();
13
+ const strict: boolean =
14
+ compilerOptions.strictNullChecks !== undefined
15
+ ? !!compilerOptions.strictNullChecks
16
+ : !!compilerOptions.strict;
17
+ if (strict === false)
18
+ extras.addDiagnostic({
19
+ category: ts.DiagnosticCategory.Error,
20
+ code: "(typia)" as any,
21
+ file: undefined,
22
+ start: undefined,
23
+ length: undefined,
24
+ messageText: "strict mode is required.",
25
+ });
26
+ return FileTransformer.transform({
27
+ program,
28
+ compilerOptions,
29
+ checker: program.getTypeChecker(),
30
+ printer: ts.createPrinter(),
31
+ options: options ?? {},
32
+ extras,
33
+ });
34
+ };
35
+ export default transform;
@@ -17,7 +17,7 @@ import { TransformerError } from "../../TransformerError";
17
17
 
18
18
  export namespace JsonApplicationTransformer {
19
19
  export const transform =
20
- ({ checker }: IProject) =>
20
+ (project: IProject) =>
21
21
  (expression: ts.CallExpression): ts.Expression => {
22
22
  if (!expression.typeArguments?.length)
23
23
  throw new TransformerError({
@@ -36,7 +36,7 @@ export namespace JsonApplicationTransformer {
36
36
 
37
37
  // GET TYPES
38
38
  const types: ts.Type[] = top.elements.map((child) =>
39
- checker.getTypeFromTypeNode(child as ts.TypeNode),
39
+ project.checker.getTypeFromTypeNode(child as ts.TypeNode),
40
40
  );
41
41
  if (types.some((t) => t.isTypeParameter()))
42
42
  throw new TransformerError({
@@ -46,7 +46,7 @@ export namespace JsonApplicationTransformer {
46
46
 
47
47
  // ADDITIONAL PARAMETERS
48
48
  const purpose: "swagger" | "ajv" = get_parameter(
49
- checker,
49
+ project.checker,
50
50
  "Purpose",
51
51
  expression.typeArguments[1],
52
52
  (str) => str === "swagger" || str === "ajv",
@@ -62,7 +62,10 @@ export namespace JsonApplicationTransformer {
62
62
  });
63
63
  const results: ValidationPipe<Metadata, MetadataFactory.IError>[] =
64
64
  types.map((type) =>
65
- MetadataFactory.analyze(checker)({
65
+ MetadataFactory.analyze(
66
+ project.checker,
67
+ project.context,
68
+ )({
66
69
  escape: true,
67
70
  constant: true,
68
71
  absorb: false,
@@ -12,7 +12,7 @@ import { TransformerError } from "../../TransformerError";
12
12
 
13
13
  export namespace MetadataTransformer {
14
14
  export const transform =
15
- ({ checker }: IProject) =>
15
+ (project: IProject) =>
16
16
  (expression: ts.CallExpression): ts.Expression => {
17
17
  if (!expression.typeArguments?.length)
18
18
  throw new TransformerError({
@@ -28,7 +28,7 @@ export namespace MetadataTransformer {
28
28
 
29
29
  // GET TYPES
30
30
  const types: ts.Type[] = top.elements.map((child) =>
31
- checker.getTypeFromTypeNode(child as ts.TypeNode),
31
+ project.checker.getTypeFromTypeNode(child as ts.TypeNode),
32
32
  );
33
33
  if (types.some((t) => t.isTypeParameter()))
34
34
  throw new TransformerError({
@@ -39,7 +39,10 @@ export namespace MetadataTransformer {
39
39
  // METADATA
40
40
  const collection: MetadataCollection = new MetadataCollection();
41
41
  const metadatas: Array<Metadata> = types.map((type) => {
42
- const result = MetadataFactory.analyze(checker)({
42
+ const result = MetadataFactory.analyze(
43
+ project.checker,
44
+ project.context,
45
+ )({
43
46
  escape: true,
44
47
  constant: true,
45
48
  absorb: true,