typia 3.6.6 → 3.7.0-dev.20230310

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 (148) hide show
  1. package/README.md +44 -15
  2. package/lib/factories/MetadataCollection.d.ts +1 -9
  3. package/lib/factories/MetadataCollection.js +2 -75
  4. package/lib/factories/MetadataCollection.js.map +1 -1
  5. package/lib/factories/ProtocolFactory.d.ts +8 -0
  6. package/lib/factories/ProtocolFactory.js +112 -0
  7. package/lib/factories/ProtocolFactory.js.map +1 -0
  8. package/lib/factories/internal/protocols/ProtocolMetadataUtil.d.ts +16 -0
  9. package/lib/factories/internal/protocols/ProtocolMetadataUtil.js +156 -0
  10. package/lib/factories/internal/protocols/ProtocolMetadataUtil.js.map +1 -0
  11. package/lib/factories/internal/protocols/emplace_protocol_object.d.ts +3 -0
  12. package/lib/factories/internal/protocols/emplace_protocol_object.js +47 -0
  13. package/lib/factories/internal/protocols/emplace_protocol_object.js.map +1 -0
  14. package/lib/factories/internal/protocols/emplace_protocol_property.d.ts +4 -0
  15. package/lib/factories/internal/protocols/emplace_protocol_property.js +20 -0
  16. package/lib/factories/internal/protocols/emplace_protocol_property.js.map +1 -0
  17. package/lib/factories/internal/protocols/iterate_protocol_atomic.d.ts +3 -0
  18. package/lib/factories/internal/protocols/iterate_protocol_atomic.js +69 -0
  19. package/lib/factories/internal/protocols/iterate_protocol_atomic.js.map +1 -0
  20. package/lib/factories/internal/protocols/iterate_protocol_constant.d.ts +2 -0
  21. package/lib/factories/internal/protocols/iterate_protocol_constant.js +30 -0
  22. package/lib/factories/internal/protocols/iterate_protocol_constant.js.map +1 -0
  23. package/lib/factories/internal/protocols/iterate_protocol_main.d.ts +3 -0
  24. package/lib/factories/internal/protocols/iterate_protocol_main.js +17 -0
  25. package/lib/factories/internal/protocols/iterate_protocol_main.js.map +1 -0
  26. package/lib/factories/internal/protocols/iterate_protocol_map.d.ts +4 -0
  27. package/lib/factories/internal/protocols/iterate_protocol_map.js +75 -0
  28. package/lib/factories/internal/protocols/iterate_protocol_map.js.map +1 -0
  29. package/lib/factories/internal/protocols/iterate_protocol_metadata.d.ts +5 -0
  30. package/lib/factories/internal/protocols/iterate_protocol_metadata.js +190 -0
  31. package/lib/factories/internal/protocols/iterate_protocol_metadata.js.map +1 -0
  32. package/lib/factories/internal/protocols/iterate_protocol_native.d.ts +2 -0
  33. package/lib/factories/internal/protocols/iterate_protocol_native.js +33 -0
  34. package/lib/factories/internal/protocols/iterate_protocol_native.js.map +1 -0
  35. package/lib/factories/internal/protocols/iterate_protocol_never.d.ts +1 -0
  36. package/lib/factories/internal/protocols/iterate_protocol_never.js +6 -0
  37. package/lib/factories/internal/protocols/iterate_protocol_never.js.map +1 -0
  38. package/lib/factories/internal/protocols/iterate_protocol_object.d.ts +4 -0
  39. package/lib/factories/internal/protocols/iterate_protocol_object.js +157 -0
  40. package/lib/factories/internal/protocols/iterate_protocol_object.js.map +1 -0
  41. package/lib/factories/internal/protocols/iterate_protocol_repeated.d.ts +5 -0
  42. package/lib/factories/internal/protocols/iterate_protocol_repeated.js +25 -0
  43. package/lib/factories/internal/protocols/iterate_protocol_repeated.js.map +1 -0
  44. package/lib/factories/internal/protocols/iterate_protocol_tuple.d.ts +3 -0
  45. package/lib/factories/internal/protocols/iterate_protocol_tuple.js +46 -0
  46. package/lib/factories/internal/protocols/iterate_protocol_tuple.js.map +1 -0
  47. package/lib/functional/$proto_bytes.d.ts +2 -0
  48. package/lib/functional/$proto_bytes.js +37 -0
  49. package/lib/functional/$proto_bytes.js.map +1 -0
  50. package/lib/functional/$proto_field.d.ts +10 -0
  51. package/lib/functional/$proto_field.js +42 -0
  52. package/lib/functional/$proto_field.js.map +1 -0
  53. package/lib/functional/$proto_float.d.ts +4 -0
  54. package/lib/functional/$proto_float.js +28 -0
  55. package/lib/functional/$proto_float.js.map +1 -0
  56. package/lib/functional/$proto_i32.d.ts +2 -0
  57. package/lib/functional/$proto_i32.js +23 -0
  58. package/lib/functional/$proto_i32.js.map +1 -0
  59. package/lib/functional/$proto_i64.d.ts +2 -0
  60. package/lib/functional/$proto_i64.js +31 -0
  61. package/lib/functional/$proto_i64.js.map +1 -0
  62. package/lib/functional/$proto_size.d.ts +6 -0
  63. package/lib/functional/$proto_size.js +76 -0
  64. package/lib/functional/$proto_size.js.map +1 -0
  65. package/lib/functional/$proto_string.d.ts +2 -0
  66. package/lib/functional/$proto_string.js +34 -0
  67. package/lib/functional/$proto_string.js.map +1 -0
  68. package/lib/functional/$varint.d.ts +6 -0
  69. package/lib/functional/$varint.js +99 -0
  70. package/lib/functional/$varint.js.map +1 -0
  71. package/lib/functional/$zigzag.d.ts +4 -0
  72. package/lib/functional/$zigzag.js +34 -0
  73. package/lib/functional/$zigzag.js.map +1 -0
  74. package/lib/messages/IProtocolMap.d.ts +5 -0
  75. package/lib/messages/IProtocolMap.js +3 -0
  76. package/lib/messages/IProtocolMap.js.map +1 -0
  77. package/lib/messages/IProtocolMessage.d.ts +5 -0
  78. package/lib/messages/IProtocolMessage.js +3 -0
  79. package/lib/messages/IProtocolMessage.js.map +1 -0
  80. package/lib/messages/IProtocolProperty.d.ts +12 -0
  81. package/lib/messages/IProtocolProperty.js +3 -0
  82. package/lib/messages/IProtocolProperty.js.map +1 -0
  83. package/lib/metadata/IMetadataTag.d.ts +7 -3
  84. package/lib/metadata/Metadata.js +2 -2
  85. package/lib/metadata/Metadata.js.map +1 -1
  86. package/lib/module.d.ts +2 -0
  87. package/lib/module.js +5 -1
  88. package/lib/module.js.map +1 -1
  89. package/lib/programmers/MessageProgrammer.d.ts +5 -0
  90. package/lib/programmers/MessageProgrammer.js +141 -0
  91. package/lib/programmers/MessageProgrammer.js.map +1 -0
  92. package/lib/programmers/internal/application_number.js +20 -14
  93. package/lib/programmers/internal/application_number.js.map +1 -1
  94. package/lib/programmers/internal/application_object.js +11 -11
  95. package/lib/programmers/internal/application_object.js.map +1 -1
  96. package/lib/programmers/internal/application_schema.js +5 -3
  97. package/lib/programmers/internal/application_schema.js.map +1 -1
  98. package/lib/schemas/IJsonSchema.d.ts +4 -10
  99. package/lib/transformers/CallExpressionTransformer.js +3 -1
  100. package/lib/transformers/CallExpressionTransformer.js.map +1 -1
  101. package/lib/transformers/features/miscellaneous/ApplicationTransformer.js +1 -3
  102. package/lib/transformers/features/miscellaneous/ApplicationTransformer.js.map +1 -1
  103. package/lib/transformers/features/protocols/MessageTransformer.d.ts +5 -0
  104. package/lib/transformers/features/protocols/MessageTransformer.js +17 -0
  105. package/lib/transformers/features/protocols/MessageTransformer.js.map +1 -0
  106. package/lib/utils/NameEncoder.d.ts +4 -0
  107. package/lib/utils/NameEncoder.js +89 -0
  108. package/lib/utils/NameEncoder.js.map +1 -0
  109. package/package.json +3 -2
  110. package/src/factories/MetadataCollection.ts +2 -41
  111. package/src/factories/ProtocolFactory.ts +79 -0
  112. package/src/factories/internal/protocols/ProtocolMetadataUtil.ts +163 -0
  113. package/src/factories/internal/protocols/emplace_protocol_object.ts +25 -0
  114. package/src/factories/internal/protocols/emplace_protocol_property.ts +12 -0
  115. package/src/factories/internal/protocols/iterate_protocol_atomic.ts +34 -0
  116. package/src/factories/internal/protocols/iterate_protocol_constant.ts +27 -0
  117. package/src/factories/internal/protocols/iterate_protocol_main.ts +19 -0
  118. package/src/factories/internal/protocols/iterate_protocol_map.ts +58 -0
  119. package/src/factories/internal/protocols/iterate_protocol_metadata.ts +96 -0
  120. package/src/factories/internal/protocols/iterate_protocol_native.ts +34 -0
  121. package/src/factories/internal/protocols/iterate_protocol_never.ts +1 -0
  122. package/src/factories/internal/protocols/iterate_protocol_object.ts +110 -0
  123. package/src/factories/internal/protocols/iterate_protocol_repeated.ts +34 -0
  124. package/src/factories/internal/protocols/iterate_protocol_tuple.ts +29 -0
  125. package/src/functional/$proto_bytes.ts +25 -0
  126. package/src/functional/$proto_field.ts +30 -0
  127. package/src/functional/$proto_float.ts +37 -0
  128. package/src/functional/$proto_i32.ts +29 -0
  129. package/src/functional/$proto_i64.ts +37 -0
  130. package/src/functional/$proto_size.ts +82 -0
  131. package/src/functional/$proto_string.ts +24 -0
  132. package/src/functional/$varint.ts +130 -0
  133. package/src/functional/$zigzag.ts +39 -0
  134. package/src/messages/IProtocolMap.ts +5 -0
  135. package/src/messages/IProtocolMessage.ts +6 -0
  136. package/src/messages/IProtocolProperty.ts +13 -0
  137. package/src/metadata/IMetadataTag.ts +20 -4
  138. package/src/metadata/Metadata.ts +6 -3
  139. package/src/module.ts +11 -0
  140. package/src/programmers/MessageProgrammer.ts +126 -0
  141. package/src/programmers/internal/application_number.ts +19 -16
  142. package/src/programmers/internal/application_object.ts +5 -5
  143. package/src/programmers/internal/application_schema.ts +7 -3
  144. package/src/schemas/IJsonSchema.ts +4 -10
  145. package/src/transformers/CallExpressionTransformer.ts +16 -9
  146. package/src/transformers/features/miscellaneous/ApplicationTransformer.ts +1 -3
  147. package/src/transformers/features/protocols/MessageTransformer.ts +32 -0
  148. package/src/utils/NameEncoder.ts +32 -0
@@ -23,10 +23,13 @@ export const application_number = (
23
23
  // RANGE TAG
24
24
  else if (tag.kind === "minimum") output.minimum = tag.value;
25
25
  else if (tag.kind === "maximum") output.maximum = tag.value;
26
- else if (tag.kind === "exclusiveMinimum")
27
- output.exclusiveMinimum = tag.value;
28
- else if (tag.kind === "exclusiveMaximum")
29
- output.exclusiveMaximum = tag.value;
26
+ else if (tag.kind === "exclusiveMinimum") {
27
+ output.minimum = tag.value;
28
+ output.exclusiveMinimum = true;
29
+ } else if (tag.kind === "exclusiveMaximum") {
30
+ output.maximum = tag.value;
31
+ output.exclusiveMaximum = true;
32
+ }
30
33
  // MULTIPLE-OF
31
34
  else if (tag.kind === "multipleOf") output.multipleOf = tag.value;
32
35
  }
@@ -38,14 +41,14 @@ export const application_number = (
38
41
  (tag) => tag.kind === "type" && tag.value === "uint",
39
42
  )
40
43
  )
41
- if (output.minimum === undefined || output.minimum < 0)
44
+ if (
45
+ output.minimum === undefined ||
46
+ (output.exclusiveMaximum !== true && output.minimum < 0)
47
+ )
42
48
  output.minimum = 0;
43
- else if (
44
- output.exclusiveMinimum !== undefined &&
45
- output.exclusiveMinimum < 0
46
- ) {
47
- delete output.exclusiveMinimum;
49
+ else if (output.exclusiveMinimum === true && output.minimum < -1) {
48
50
  output.maximum = 0;
51
+ delete output.exclusiveMinimum;
49
52
  }
50
53
 
51
54
  // DEFAULT CONFIGURATION
@@ -53,13 +56,13 @@ export const application_number = (
53
56
  const value: number = Number(str);
54
57
  const conditions: boolean[] = [!Number.isNaN(value)];
55
58
  if (output.minimum !== undefined)
56
- conditions.push(value >= output.minimum);
59
+ if (output.exclusiveMinimum === true)
60
+ conditions.push(value > output.minimum);
61
+ else conditions.push(value >= output.minimum);
57
62
  if (output.maximum !== undefined)
58
- conditions.push(value <= output.maximum);
59
- if (output.exclusiveMinimum !== undefined)
60
- conditions.push(value > output.exclusiveMinimum);
61
- if (output.exclusiveMaximum !== undefined)
62
- conditions.push(value < output.exclusiveMaximum);
63
+ if (output.exclusiveMaximum === true)
64
+ conditions.push(value < output.maximum);
65
+ else conditions.push(value <= output.maximum);
63
66
  if (output.multipleOf !== undefined)
64
67
  conditions.push(value % output.multipleOf === 0);
65
68
  return conditions.every((cond) => cond);
@@ -18,10 +18,10 @@ import { metadata_to_pattern } from "./metadata_to_pattern";
18
18
  export const application_object =
19
19
  (options: ApplicationProgrammer.IOptions) =>
20
20
  (components: IJsonComponents) =>
21
- (key: string, obj: MetadataObject, nullable: boolean): void => {
21
+ (id: string, obj: MetadataObject, nullable: boolean): void => {
22
22
  // TEMPORARY ASSIGNMENT
23
- if (components.schemas[key] !== undefined) return;
24
- components.schemas[key] = {} as any;
23
+ if (components.schemas[id] !== undefined) return;
24
+ components.schemas[id] = {} as any;
25
25
 
26
26
  // ITERATE PROPERTIES
27
27
  const properties: Record<string, any> = {};
@@ -97,7 +97,7 @@ export const application_object =
97
97
  const schema: IJsonComponents.IObject = {
98
98
  $id:
99
99
  options.purpose === "ajv"
100
- ? options.prefix + "/" + key
100
+ ? options.prefix + "/" + id
101
101
  : undefined,
102
102
  $recursiveAnchor:
103
103
  (options.purpose === "ajv" && obj.recursive) || undefined,
@@ -118,7 +118,7 @@ export const application_object =
118
118
  join(options)(components)(extraMeta),
119
119
  }),
120
120
  };
121
- components.schemas[key] = schema;
121
+ components.schemas[id] = schema;
122
122
  };
123
123
 
124
124
  const join =
@@ -2,6 +2,8 @@ import { Metadata } from "../../metadata/Metadata";
2
2
  import { IJsonComponents } from "../../schemas/IJsonComponents";
3
3
  import { IJsonSchema } from "../../schemas/IJsonSchema";
4
4
 
5
+ import { NameEncoder } from "../../utils/NameEncoder";
6
+
5
7
  import { ApplicationProgrammer } from "../ApplicationProgrammer";
6
8
  import { AtomicPredicator } from "../helpers/AtomicPredicator";
7
9
  import { application_array } from "./application_array";
@@ -142,12 +144,14 @@ export const application_schema =
142
144
 
143
145
  // OBJECT
144
146
  for (const obj of meta.objects) {
145
- const key: string = obj.name + (meta.nullable ? ".Nullable" : "");
146
- application_object(options)(components)(key, obj, meta.nullable);
147
+ const id: string =
148
+ NameEncoder.encode(obj.name) +
149
+ (meta.nullable ? ".Nullable" : "");
150
+ application_object(options)(components)(id, obj, meta.nullable);
147
151
  union.push(
148
152
  (options.purpose === "ajv" && obj.recursive
149
153
  ? recursive
150
- : reference)(`${options.prefix}/${key}`, attribute),
154
+ : reference)(`${options.prefix}/${id}`, attribute),
151
155
  );
152
156
  }
153
157
 
@@ -47,8 +47,8 @@ export namespace IJsonSchema {
47
47
  export interface INumber extends IAtomic<"number"> {
48
48
  minimum?: number;
49
49
  maximum?: number;
50
- exclusiveMinimum?: number;
51
- exclusiveMaximum?: number;
50
+ exclusiveMinimum?: boolean;
51
+ exclusiveMaximum?: boolean;
52
52
  multipleOf?: number;
53
53
  }
54
54
  export interface IInteger extends IAtomic<"integer"> {
@@ -60,14 +60,8 @@ export namespace IJsonSchema {
60
60
  * @type int
61
61
  */
62
62
  maximum?: number;
63
- /**
64
- * @type int
65
- */
66
- exclusiveMinimum?: number;
67
- /**
68
- * @type int
69
- */
70
- exclusiveMaximum?: number;
63
+ exclusiveMinimum?: boolean;
64
+ exclusiveMaximum?: boolean;
71
65
  /**
72
66
  * @type int
73
67
  */
@@ -28,6 +28,7 @@ import { CreateIsParseTransformer } from "./features/parsers/CreateIsParseTransf
28
28
  import { CreateValidateParseTransformer } from "./features/parsers/CreateValidateParseTransformer";
29
29
  import { IsParseTransformer } from "./features/parsers/IsParseTransformer";
30
30
  import { ValidateParseTransformer } from "./features/parsers/ValidateParseTransformer";
31
+ import { MessageTransformer } from "./features/protocols/MessageTransformer";
31
32
  import { AssertStringifyTransformer } from "./features/stringifiers/AssertStringifyTransformer";
32
33
  import { CreateAssertStringifyTransformer } from "./features/stringifiers/CreateAssertStringifyTransformer";
33
34
  import { CreateIsStringifyTransformer } from "./features/stringifiers/CreateIsStringifyTransformer";
@@ -94,7 +95,7 @@ const CLI_PATH = path.resolve(
94
95
 
95
96
  const FUNCTORS: Record<string, () => Task> = {
96
97
  //----
97
- // SINGLE FUNCTIONS
98
+ // VALIDATORS
98
99
  //----
99
100
  // BASIC VALIDATORS
100
101
  assert: () => AssertTransformer.transform(false),
@@ -107,13 +108,23 @@ const FUNCTORS: Record<string, () => Task> = {
107
108
  equals: () => IsTransformer.transform(true),
108
109
  validateEquals: () => ValidateTransformer.transform(true),
109
110
 
110
- // PARSE FUNCTIONS
111
+ //----
112
+ // PROTOCOL BUFFER
113
+ //----
114
+ message: () => MessageTransformer.transform,
115
+
116
+ //----
117
+ // JSON FUNCTIONS
118
+ //----
119
+ // SCHEMA DEFINITION
120
+ application: () => ApplicationTransformer.transform,
121
+
122
+ // PARSER FUNCTIONS
111
123
  isParse: () => IsParseTransformer.transform,
112
124
  assertParse: () => AssertParseTransformer.transform,
113
125
  validateParse: () => ValidateParseTransformer.transform,
114
126
 
115
127
  // STRINGIFY FUNCTIONS
116
- application: () => ApplicationTransformer.transform,
117
128
  stringify: () => StringifyTransformer.transform,
118
129
  assertStringify: () => AssertStringifyTransformer.transform,
119
130
  isStringify: () => IsStringifyTransformer.transform,
@@ -136,23 +147,19 @@ const FUNCTORS: Record<string, () => Task> = {
136
147
  //----
137
148
  // FACTORY FUNCTIONS
138
149
  //----
139
- // BASIC VALIDATORS
150
+ // VALIDATORS
140
151
  createAssert: () => CreateAssertTransformer.transform(false),
141
152
  createAssertType: () => CreateAssertTransformer.transform(false),
142
153
  createIs: () => CreateIsTransformer.transform(false),
143
154
  createValidate: () => CreateValidateTransformer.transform(false),
144
-
145
- // STRICT VALIDATORS
146
155
  createAssertEquals: () => CreateAssertTransformer.transform(true),
147
156
  createEquals: () => CreateIsTransformer.transform(true),
148
157
  createValidateEquals: () => CreateValidateTransformer.transform(true),
149
158
 
150
- // PARSE FUNCTIONS
159
+ // JSON FUNCTIONS
151
160
  createIsParse: () => CreateIsParseTransformer.transform,
152
161
  createAssertParse: () => CreateAssertParseTransformer.transform,
153
162
  createValidateParse: () => CreateValidateParseTransformer.transform,
154
-
155
- // STRINGIFY FUNCTIONS
156
163
  createStringify: () => CreateStringifyTransformer.transform,
157
164
  createAssertStringify: () => CreateAssertStringifyTransformer.transform,
158
165
  createIsStringify: () => CreateIsStringifyTransformer.transform,
@@ -59,9 +59,7 @@ 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,
@@ -0,0 +1,32 @@
1
+ import ts from "typescript";
2
+
3
+ import { MessageProgrammer } from "../../../programmers/MessageProgrammer";
4
+
5
+ import { IProject } from "../../IProject";
6
+
7
+ export namespace MessageTransformer {
8
+ export function transform(
9
+ project: IProject,
10
+ _modulo: ts.LeftHandSideExpression,
11
+ expression: ts.CallExpression,
12
+ ): ts.Expression {
13
+ // CHECK GENERIC ARGUMENT EXISTENCE
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 MessageProgrammer.generate(project)(type);
26
+ }
27
+ }
28
+
29
+ const enum ErrorMessages {
30
+ NOT_SPECIFIED = "Error on typia.message(): generic argument is not specified.",
31
+ GENERIC_ARGUMENT = "Error on typia.message(): non-specified generic argument.",
32
+ }
@@ -0,0 +1,32 @@
1
+ export namespace NameEncoder {
2
+ export function encode(str: string): string {
3
+ for (const [before, after] of REPLACERS)
4
+ str = str.split(before).join(after);
5
+ return str;
6
+ }
7
+
8
+ export function decode(str: string): string {
9
+ for (const [before, after] of REPLACERS)
10
+ if (after !== "") str = str.split(after).join(before);
11
+ return str;
12
+ }
13
+ }
14
+
15
+ const REPLACERS: [string, string][] = [
16
+ ["$", "_dollar_"],
17
+ ["&", "_and_"],
18
+ ["|", "_or_"],
19
+ ["{", "_blt_"],
20
+ ["}", "_bgt_"],
21
+ ["<", "_lt_"],
22
+ [">", "_gt_"],
23
+ ["(", "_lp_"],
24
+ [")", "_rp_"],
25
+ ["[", "_alt_"],
26
+ ["]", "_agt_"],
27
+ [",", "_comma_"],
28
+ ["`", "_backquote_"],
29
+ ["'", "_singlequote_"],
30
+ ['"', "_doublequote_"],
31
+ [" ", "_space_"],
32
+ ];