typia 3.4.10 → 3.5.0-dev.20221219

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 (213) hide show
  1. package/lib/factories/ExpressionFactory.d.ts +4 -1
  2. package/lib/factories/ExpressionFactory.js +7 -4
  3. package/lib/factories/ExpressionFactory.js.map +1 -1
  4. package/lib/factories/MetadataCollection.js +2 -0
  5. package/lib/factories/MetadataCollection.js.map +1 -1
  6. package/lib/factories/MetadataFactory.d.ts +1 -0
  7. package/lib/factories/MetadataFactory.js +1 -1
  8. package/lib/factories/MetadataFactory.js.map +1 -1
  9. package/lib/factories/ProtocolFactory.d.ts +9 -0
  10. package/lib/factories/ProtocolFactory.js +125 -0
  11. package/lib/factories/ProtocolFactory.js.map +1 -0
  12. package/lib/factories/internal/{MetadataHelper.d.ts → metadata/MetadataHelper.d.ts} +1 -1
  13. package/lib/factories/internal/{MetadataHelper.js → metadata/MetadataHelper.js} +1 -1
  14. package/lib/factories/internal/metadata/MetadataHelper.js.map +1 -0
  15. package/lib/factories/internal/{emplace_metadata_object.d.ts → metadata/emplace_metadata_object.d.ts} +3 -3
  16. package/lib/factories/internal/{emplace_metadata_object.js → metadata/emplace_metadata_object.js} +5 -5
  17. package/lib/factories/internal/metadata/emplace_metadata_object.js.map +1 -0
  18. package/lib/factories/internal/{explore_metadata.d.ts → metadata/explore_metadata.d.ts} +3 -3
  19. package/lib/factories/internal/{explore_metadata.js → metadata/explore_metadata.js} +5 -3
  20. package/lib/factories/internal/metadata/explore_metadata.js.map +1 -0
  21. package/lib/factories/internal/{iterate_metadata.d.ts → metadata/iterate_metadata.d.ts} +3 -3
  22. package/lib/factories/internal/{iterate_metadata.js → metadata/iterate_metadata.js} +1 -1
  23. package/lib/factories/internal/metadata/iterate_metadata.js.map +1 -0
  24. package/lib/factories/internal/{iterate_metadata_array.d.ts → metadata/iterate_metadata_array.d.ts} +3 -3
  25. package/lib/factories/internal/{iterate_metadata_array.js → metadata/iterate_metadata_array.js} +1 -1
  26. package/lib/factories/internal/metadata/iterate_metadata_array.js.map +1 -0
  27. package/lib/factories/internal/{iterate_metadata_atomic.d.ts → metadata/iterate_metadata_atomic.d.ts} +1 -1
  28. package/lib/factories/internal/{iterate_metadata_atomic.js → metadata/iterate_metadata_atomic.js} +1 -1
  29. package/lib/factories/internal/metadata/iterate_metadata_atomic.js.map +1 -0
  30. package/lib/factories/internal/{iterate_metadata_coalesce.d.ts → metadata/iterate_metadata_coalesce.d.ts} +1 -1
  31. package/lib/factories/internal/{iterate_metadata_coalesce.js → metadata/iterate_metadata_coalesce.js} +2 -2
  32. package/lib/factories/internal/metadata/iterate_metadata_coalesce.js.map +1 -0
  33. package/lib/factories/internal/{iterate_metadata_constant.d.ts → metadata/iterate_metadata_constant.d.ts} +2 -2
  34. package/lib/factories/internal/{iterate_metadata_constant.js → metadata/iterate_metadata_constant.js} +1 -1
  35. package/lib/factories/internal/metadata/iterate_metadata_constant.js.map +1 -0
  36. package/lib/factories/internal/{iterate_metadata_map.d.ts → metadata/iterate_metadata_map.d.ts} +3 -3
  37. package/lib/factories/internal/{iterate_metadata_map.js → metadata/iterate_metadata_map.js} +2 -2
  38. package/lib/factories/internal/metadata/iterate_metadata_map.js.map +1 -0
  39. package/lib/factories/internal/{iterate_metadata_native.d.ts → metadata/iterate_metadata_native.d.ts} +1 -1
  40. package/lib/factories/internal/{iterate_metadata_native.js → metadata/iterate_metadata_native.js} +2 -2
  41. package/lib/factories/internal/metadata/iterate_metadata_native.js.map +1 -0
  42. package/lib/factories/internal/{iterate_metadata_object.d.ts → metadata/iterate_metadata_object.d.ts} +3 -3
  43. package/lib/factories/internal/{iterate_metadata_object.js → metadata/iterate_metadata_object.js} +3 -3
  44. package/lib/factories/internal/metadata/iterate_metadata_object.js.map +1 -0
  45. package/lib/factories/internal/{iterate_metadata_resolve.d.ts → metadata/iterate_metadata_resolve.d.ts} +3 -3
  46. package/lib/factories/internal/{iterate_metadata_resolve.js → metadata/iterate_metadata_resolve.js} +2 -2
  47. package/lib/factories/internal/metadata/iterate_metadata_resolve.js.map +1 -0
  48. package/lib/factories/internal/{iterate_metadata_set.d.ts → metadata/iterate_metadata_set.d.ts} +3 -3
  49. package/lib/factories/internal/{iterate_metadata_set.js → metadata/iterate_metadata_set.js} +2 -2
  50. package/lib/factories/internal/metadata/iterate_metadata_set.js.map +1 -0
  51. package/lib/factories/internal/{iterate_metadata_template.d.ts → metadata/iterate_metadata_template.d.ts} +3 -3
  52. package/lib/factories/internal/{iterate_metadata_template.js → metadata/iterate_metadata_template.js} +0 -0
  53. package/lib/factories/internal/metadata/iterate_metadata_template.js.map +1 -0
  54. package/lib/factories/internal/{iterate_metadata_tuple.d.ts → metadata/iterate_metadata_tuple.d.ts} +3 -3
  55. package/lib/factories/internal/{iterate_metadata_tuple.js → metadata/iterate_metadata_tuple.js} +3 -3
  56. package/lib/factories/internal/metadata/iterate_metadata_tuple.js.map +1 -0
  57. package/lib/factories/internal/{iterate_metadata_union.d.ts → metadata/iterate_metadata_union.d.ts} +3 -3
  58. package/lib/factories/internal/{iterate_metadata_union.js → metadata/iterate_metadata_union.js} +3 -3
  59. package/lib/factories/internal/metadata/iterate_metadata_union.js.map +1 -0
  60. package/lib/factories/internal/protocols/ProtocolMetadataUtil.d.ts +11 -0
  61. package/lib/factories/internal/protocols/ProtocolMetadataUtil.js +76 -0
  62. package/lib/factories/internal/protocols/ProtocolMetadataUtil.js.map +1 -0
  63. package/lib/factories/internal/protocols/emplace_protocol_object.d.ts +3 -0
  64. package/lib/factories/internal/protocols/emplace_protocol_object.js +47 -0
  65. package/lib/factories/internal/protocols/emplace_protocol_object.js.map +1 -0
  66. package/lib/factories/internal/protocols/emplace_protocol_property.d.ts +4 -0
  67. package/lib/factories/internal/protocols/emplace_protocol_property.js +20 -0
  68. package/lib/factories/internal/protocols/emplace_protocol_property.js.map +1 -0
  69. package/lib/factories/internal/protocols/iterate_protocol_atomic.d.ts +3 -0
  70. package/lib/factories/internal/protocols/iterate_protocol_atomic.js +69 -0
  71. package/lib/factories/internal/protocols/iterate_protocol_atomic.js.map +1 -0
  72. package/lib/factories/internal/protocols/iterate_protocol_constant.d.ts +2 -0
  73. package/lib/factories/internal/protocols/iterate_protocol_constant.js +30 -0
  74. package/lib/factories/internal/protocols/iterate_protocol_constant.js.map +1 -0
  75. package/lib/factories/internal/protocols/iterate_protocol_main.d.ts +3 -0
  76. package/lib/factories/internal/protocols/iterate_protocol_main.js +18 -0
  77. package/lib/factories/internal/protocols/iterate_protocol_main.js.map +1 -0
  78. package/lib/factories/internal/protocols/iterate_protocol_map.d.ts +3 -0
  79. package/lib/factories/internal/protocols/iterate_protocol_map.js +72 -0
  80. package/lib/factories/internal/protocols/iterate_protocol_map.js.map +1 -0
  81. package/lib/factories/internal/protocols/iterate_protocol_metadata.d.ts +5 -0
  82. package/lib/factories/internal/protocols/iterate_protocol_metadata.js +190 -0
  83. package/lib/factories/internal/protocols/iterate_protocol_metadata.js.map +1 -0
  84. package/lib/factories/internal/protocols/iterate_protocol_native.d.ts +2 -0
  85. package/lib/factories/internal/protocols/iterate_protocol_native.js +33 -0
  86. package/lib/factories/internal/protocols/iterate_protocol_native.js.map +1 -0
  87. package/lib/factories/internal/protocols/iterate_protocol_repeated.d.ts +4 -0
  88. package/lib/factories/internal/protocols/iterate_protocol_repeated.js +25 -0
  89. package/lib/factories/internal/protocols/iterate_protocol_repeated.js.map +1 -0
  90. package/lib/factories/internal/protocols/iterate_protocol_tuple.d.ts +3 -0
  91. package/lib/factories/internal/protocols/iterate_protocol_tuple.js +47 -0
  92. package/lib/factories/internal/protocols/iterate_protocol_tuple.js.map +1 -0
  93. package/lib/functional/$proto_bytes.d.ts +2 -0
  94. package/lib/functional/$proto_bytes.js +37 -0
  95. package/lib/functional/$proto_bytes.js.map +1 -0
  96. package/lib/functional/$proto_field.d.ts +10 -0
  97. package/lib/functional/$proto_field.js +42 -0
  98. package/lib/functional/$proto_field.js.map +1 -0
  99. package/lib/functional/$proto_float.d.ts +4 -0
  100. package/lib/functional/$proto_float.js +28 -0
  101. package/lib/functional/$proto_float.js.map +1 -0
  102. package/lib/functional/$proto_i32.d.ts +2 -0
  103. package/lib/functional/$proto_i32.js +23 -0
  104. package/lib/functional/$proto_i32.js.map +1 -0
  105. package/lib/functional/$proto_i64.d.ts +2 -0
  106. package/lib/functional/$proto_i64.js +31 -0
  107. package/lib/functional/$proto_i64.js.map +1 -0
  108. package/lib/functional/$proto_size.d.ts +6 -0
  109. package/lib/functional/$proto_size.js +76 -0
  110. package/lib/functional/$proto_size.js.map +1 -0
  111. package/lib/functional/$proto_string.d.ts +2 -0
  112. package/lib/functional/$proto_string.js +34 -0
  113. package/lib/functional/$proto_string.js.map +1 -0
  114. package/lib/functional/$varint.d.ts +6 -0
  115. package/lib/functional/$varint.js +99 -0
  116. package/lib/functional/$varint.js.map +1 -0
  117. package/lib/functional/$zigzag.d.ts +4 -0
  118. package/lib/functional/$zigzag.js +34 -0
  119. package/lib/functional/$zigzag.js.map +1 -0
  120. package/lib/messages/IProtocolMessage.d.ts +5 -0
  121. package/lib/messages/IProtocolMessage.js +3 -0
  122. package/lib/messages/IProtocolMessage.js.map +1 -0
  123. package/lib/messages/IProtocolProperty.d.ts +11 -0
  124. package/lib/messages/IProtocolProperty.js +3 -0
  125. package/lib/messages/IProtocolProperty.js.map +1 -0
  126. package/lib/metadata/IMetadataTag.d.ts +7 -3
  127. package/lib/metadata/Metadata.js +1 -1
  128. package/lib/metadata/Metadata.js.map +1 -1
  129. package/lib/module.d.ts +2 -0
  130. package/lib/module.js +5 -1
  131. package/lib/module.js.map +1 -1
  132. package/lib/programmers/CheckerProgrammer.js +9 -1
  133. package/lib/programmers/CheckerProgrammer.js.map +1 -1
  134. package/lib/programmers/IsProgrammer.js +4 -1
  135. package/lib/programmers/IsProgrammer.js.map +1 -1
  136. package/lib/programmers/MessageProgrammer.d.ts +5 -0
  137. package/lib/programmers/MessageProgrammer.js +129 -0
  138. package/lib/programmers/MessageProgrammer.js.map +1 -0
  139. package/lib/programmers/StringifyProgrammer.js +11 -1
  140. package/lib/programmers/StringifyProgrammer.js.map +1 -1
  141. package/lib/transformers/CallExpressionTransformer.js +3 -1
  142. package/lib/transformers/CallExpressionTransformer.js.map +1 -1
  143. package/lib/transformers/features/protocols/MessageTransformer.d.ts +5 -0
  144. package/lib/transformers/features/protocols/MessageTransformer.js +17 -0
  145. package/lib/transformers/features/protocols/MessageTransformer.js.map +1 -0
  146. package/package.json +4 -4
  147. package/src/factories/ExpressionFactory.ts +18 -12
  148. package/src/factories/MetadataCollection.ts +2 -0
  149. package/src/factories/MetadataFactory.ts +2 -1
  150. package/src/factories/ProtocolFactory.ts +97 -0
  151. package/src/factories/internal/{MetadataHelper.ts → metadata/MetadataHelper.ts} +1 -1
  152. package/src/factories/internal/{emplace_metadata_object.ts → metadata/emplace_metadata_object.ts} +9 -9
  153. package/src/factories/internal/{explore_metadata.ts → metadata/explore_metadata.ts} +7 -6
  154. package/src/factories/internal/{iterate_metadata.ts → metadata/iterate_metadata.ts} +4 -4
  155. package/src/factories/internal/{iterate_metadata_array.ts → metadata/iterate_metadata_array.ts} +4 -4
  156. package/src/factories/internal/{iterate_metadata_atomic.ts → metadata/iterate_metadata_atomic.ts} +3 -3
  157. package/src/factories/internal/{iterate_metadata_coalesce.ts → metadata/iterate_metadata_coalesce.ts} +3 -3
  158. package/src/factories/internal/{iterate_metadata_constant.ts → metadata/iterate_metadata_constant.ts} +4 -4
  159. package/src/factories/internal/{iterate_metadata_map.ts → metadata/iterate_metadata_map.ts} +5 -5
  160. package/src/factories/internal/{iterate_metadata_native.ts → metadata/iterate_metadata_native.ts} +3 -3
  161. package/src/factories/internal/{iterate_metadata_object.ts → metadata/iterate_metadata_object.ts} +5 -5
  162. package/src/factories/internal/{iterate_metadata_resolve.ts → metadata/iterate_metadata_resolve.ts} +5 -5
  163. package/src/factories/internal/{iterate_metadata_set.ts → metadata/iterate_metadata_set.ts} +5 -5
  164. package/src/factories/internal/{iterate_metadata_template.ts → metadata/iterate_metadata_template.ts} +3 -3
  165. package/src/factories/internal/{iterate_metadata_tuple.ts → metadata/iterate_metadata_tuple.ts} +5 -5
  166. package/src/factories/internal/{iterate_metadata_union.ts → metadata/iterate_metadata_union.ts} +5 -5
  167. package/src/factories/internal/protocols/ProtocolMetadataUtil.ts +81 -0
  168. package/src/factories/internal/protocols/emplace_protocol_object.ts +25 -0
  169. package/src/factories/internal/protocols/emplace_protocol_property.ts +12 -0
  170. package/src/factories/internal/protocols/iterate_protocol_atomic.ts +34 -0
  171. package/src/factories/internal/protocols/iterate_protocol_constant.ts +27 -0
  172. package/src/factories/internal/protocols/iterate_protocol_main.ts +20 -0
  173. package/src/factories/internal/protocols/iterate_protocol_map.ts +40 -0
  174. package/src/factories/internal/protocols/iterate_protocol_metadata.ts +75 -0
  175. package/src/factories/internal/protocols/iterate_protocol_native.ts +34 -0
  176. package/src/factories/internal/protocols/iterate_protocol_repeated.ts +28 -0
  177. package/src/factories/internal/protocols/iterate_protocol_tuple.ts +28 -0
  178. package/src/functional/$proto_bytes.ts +25 -0
  179. package/src/functional/$proto_field.ts +30 -0
  180. package/src/functional/$proto_float.ts +37 -0
  181. package/src/functional/$proto_i32.ts +29 -0
  182. package/src/functional/$proto_i64.ts +37 -0
  183. package/src/functional/$proto_size.ts +82 -0
  184. package/src/functional/$proto_string.ts +24 -0
  185. package/src/functional/$varint.ts +130 -0
  186. package/src/functional/$zigzag.ts +39 -0
  187. package/src/messages/IProtocolMessage.ts +6 -0
  188. package/src/messages/IProtocolProperty.ts +11 -0
  189. package/src/metadata/IMetadataTag.ts +19 -4
  190. package/src/metadata/Metadata.ts +4 -2
  191. package/src/module.ts +12 -0
  192. package/src/programmers/CheckerProgrammer.ts +10 -4
  193. package/src/programmers/IsProgrammer.ts +4 -1
  194. package/src/programmers/MessageProgrammer.ts +110 -0
  195. package/src/programmers/StringifyProgrammer.ts +11 -1
  196. package/src/transformers/CallExpressionTransformer.ts +16 -9
  197. package/src/transformers/features/protocols/MessageTransformer.ts +32 -0
  198. package/lib/factories/internal/MetadataHelper.js.map +0 -1
  199. package/lib/factories/internal/emplace_metadata_object.js.map +0 -1
  200. package/lib/factories/internal/explore_metadata.js.map +0 -1
  201. package/lib/factories/internal/iterate_metadata.js.map +0 -1
  202. package/lib/factories/internal/iterate_metadata_array.js.map +0 -1
  203. package/lib/factories/internal/iterate_metadata_atomic.js.map +0 -1
  204. package/lib/factories/internal/iterate_metadata_coalesce.js.map +0 -1
  205. package/lib/factories/internal/iterate_metadata_constant.js.map +0 -1
  206. package/lib/factories/internal/iterate_metadata_map.js.map +0 -1
  207. package/lib/factories/internal/iterate_metadata_native.js.map +0 -1
  208. package/lib/factories/internal/iterate_metadata_object.js.map +0 -1
  209. package/lib/factories/internal/iterate_metadata_resolve.js.map +0 -1
  210. package/lib/factories/internal/iterate_metadata_set.js.map +0 -1
  211. package/lib/factories/internal/iterate_metadata_template.js.map +0 -1
  212. package/lib/factories/internal/iterate_metadata_tuple.js.map +0 -1
  213. package/lib/factories/internal/iterate_metadata_union.js.map +0 -1
@@ -0,0 +1,37 @@
1
+ export function $proto_float32_encode(
2
+ dst: Uint8Array,
3
+ offset: number,
4
+ value: number,
5
+ ): number {
6
+ new DataView(dst).setFloat32(offset, value, true);
7
+ offset += 4;
8
+ return offset;
9
+ }
10
+
11
+ export function $proto_float32_decode(
12
+ src: Uint8Array,
13
+ offset: number,
14
+ ): [value: number, offset: number] {
15
+ const value = new DataView(src).getFloat32(offset, true);
16
+ offset += 4;
17
+ return [value, offset];
18
+ }
19
+
20
+ export function $proto_float64_encode(
21
+ dst: Uint8Array,
22
+ offset: number,
23
+ value: number,
24
+ ): number {
25
+ new DataView(dst).setFloat64(offset, value, true);
26
+ offset += 8;
27
+ return offset;
28
+ }
29
+
30
+ export function $proto_float64_decode(
31
+ src: Uint8Array,
32
+ offset: number,
33
+ ): [value: number, offset: number] {
34
+ const value = new DataView(src).getFloat64(offset, true);
35
+ offset += 8;
36
+ return [value, offset];
37
+ }
@@ -0,0 +1,29 @@
1
+ export function $proto_i32_encode(
2
+ dst: Uint8Array,
3
+ offset: number,
4
+ value: number,
5
+ ): number {
6
+ value = (value | 0) >>> 0;
7
+
8
+ dst[offset] = value & 0xff;
9
+ dst[offset + 1] = (value >>> 8) & 0xff;
10
+ dst[offset + 2] = (value >>> 16) & 0xff;
11
+ dst[offset + 3] = (value >>> 24) & 0xff;
12
+ offset += 4;
13
+
14
+ return offset;
15
+ }
16
+
17
+ export function $proto_i32_decode(
18
+ buf: Uint8Array,
19
+ offset: number,
20
+ ): [value: number, offset: number] {
21
+ const value =
22
+ (buf[offset]! << 0) |
23
+ (buf[offset + 1]! << 8) |
24
+ (buf[offset + 2]! << 16) |
25
+ (buf[offset + 3]! << 24);
26
+ offset += 4;
27
+
28
+ return [value, offset];
29
+ }
@@ -0,0 +1,37 @@
1
+ export function $proto_i64_encode(
2
+ dst: Uint8Array,
3
+ offset: number,
4
+ value: bigint,
5
+ ): number {
6
+ value = BigInt.asUintN(64, value);
7
+
8
+ dst[offset] = Number(value & BigInt(0xff));
9
+ dst[offset + 1] = Number((value >> BigInt(8)) & BigInt(0xff));
10
+ dst[offset + 2] = Number((value >> BigInt(16)) & BigInt(0xff));
11
+ dst[offset + 3] = Number((value >> BigInt(24)) & BigInt(0xff));
12
+ dst[offset + 4] = Number((value >> BigInt(32)) & BigInt(0xff));
13
+ dst[offset + 5] = Number((value >> BigInt(40)) & BigInt(0xff));
14
+ dst[offset + 6] = Number((value >> BigInt(48)) & BigInt(0xff));
15
+ dst[offset + 7] = Number((value >> BigInt(56)) & BigInt(0xff));
16
+ offset += 8;
17
+
18
+ return offset;
19
+ }
20
+
21
+ export function $proto_i64_decode(
22
+ buf: Uint8Array,
23
+ offset: number,
24
+ ): [value: bigint, offset: number] {
25
+ const value =
26
+ (BigInt(buf[offset]!) << BigInt(0)) |
27
+ (BigInt(buf[offset + 1]!) << BigInt(8)) |
28
+ (BigInt(buf[offset + 2]!) << BigInt(16)) |
29
+ (BigInt(buf[offset + 3]!) << BigInt(24)) |
30
+ (BigInt(buf[offset + 4]!) << BigInt(32)) |
31
+ (BigInt(buf[offset + 5]!) << BigInt(40)) |
32
+ (BigInt(buf[offset + 6]!) << BigInt(48)) |
33
+ (BigInt(buf[offset + 7]!) << BigInt(56));
34
+ offset += 8;
35
+
36
+ return [BigInt.asIntN(64, value), offset];
37
+ }
@@ -0,0 +1,82 @@
1
+ import { $proto_field_wiretype } from "./$proto_field";
2
+
3
+ export function $proto_size_varint(n: number): number;
4
+ export function $proto_size_varint(n: bigint): number;
5
+
6
+ export function $proto_size_varint(n: number | bigint): number {
7
+ if (typeof n === "number") {
8
+ if (n < 0) {
9
+ return SizeVarInt64(BigInt(n));
10
+ }
11
+ return SizeVarInt32(n);
12
+ }
13
+
14
+ return SizeVarInt64(n);
15
+ }
16
+
17
+ export function $proto_size_field(
18
+ fieldNumber: number,
19
+ wireType: $proto_field_wiretype,
20
+ ): number {
21
+ const tag = (fieldNumber << 3) | Number(wireType);
22
+ return $proto_size_varint(tag);
23
+ }
24
+
25
+ export function $proto_size_bytes(len: number): number {
26
+ return $proto_size_varint(len) + len;
27
+ }
28
+
29
+ const utf8_encoder = new TextEncoder();
30
+
31
+ export function $proto_size_string(value: string): number {
32
+ // TODO: optimize (DON'T ENCODE TEXT TWICE)
33
+ const bytes = utf8_encoder.encode(value);
34
+ return $proto_size_bytes(bytes.length);
35
+ }
36
+
37
+ function SizeVarInt32(value: number): number {
38
+ value = (value | 0) >>> 0; // 32-bit integer
39
+ // TODO: optimize ( branchless solution exists )
40
+ // TODO: try lookup table based solution
41
+
42
+ if (value <= 127) {
43
+ return 1;
44
+ } else if (value <= 16383) {
45
+ return 2;
46
+ } else if (value <= 2097151) {
47
+ return 3;
48
+ } else if (value <= 268435455) {
49
+ return 4;
50
+ }
51
+
52
+ // < 34359738367
53
+ return 5;
54
+ }
55
+
56
+ function SizeVarInt64(value: bigint): number {
57
+ value = BigInt.asUintN(64, value);
58
+ // TODO: optimize ( branchless solution exists )
59
+ // TODO: try lookup table based solution
60
+
61
+ if (value <= BigInt("127")) {
62
+ return 1;
63
+ } else if (value <= BigInt("16383")) {
64
+ return 2;
65
+ } else if (value <= BigInt("2097151")) {
66
+ return 3;
67
+ } else if (value <= BigInt("268435455")) {
68
+ return 4;
69
+ } else if (value <= BigInt("34359738367")) {
70
+ return 5;
71
+ } else if (value <= BigInt("4398046511103")) {
72
+ return 6;
73
+ } else if (value <= BigInt("562949953421311")) {
74
+ return 7;
75
+ } else if (value <= BigInt("72057594037927935")) {
76
+ return 8;
77
+ } else if (value <= BigInt("9223372036854775807")) {
78
+ return 9;
79
+ }
80
+
81
+ return 10;
82
+ }
@@ -0,0 +1,24 @@
1
+ import { $proto_bytes_decode, $proto_bytes_encode } from "./$proto_bytes";
2
+
3
+ const utf8_encoder = new TextEncoder();
4
+
5
+ export function $proto_string_encode(
6
+ dst: Uint8Array,
7
+ offset: number,
8
+ value: string,
9
+ ): number {
10
+ // TODO: optimize (DON'T ENCODE TEXT TWICE)
11
+
12
+ const bytes = utf8_encoder.encode(value);
13
+ return $proto_bytes_encode(dst, offset, bytes);
14
+ }
15
+
16
+ export function $proto_string_decode(
17
+ src: Uint8Array,
18
+ offset: number,
19
+ ): [value: string, offset: number] {
20
+ const utf8_decoder = new TextDecoder("utf-8");
21
+ const [bytes, o] = $proto_bytes_decode(src, offset);
22
+ const value = utf8_decoder.decode(bytes);
23
+ return [value, o];
24
+ }
@@ -0,0 +1,130 @@
1
+ function EncodeVarNumber(
2
+ dst: Uint8Array,
3
+ offset: number,
4
+ value: number,
5
+ ): number {
6
+ value = (value | 0) >>> 0; // 32-bit integer
7
+
8
+ while (value > 127) {
9
+ dst[offset++] = (value & 0b01111111) | 0b10000000;
10
+ value >>>= 7;
11
+ }
12
+ dst[offset++] = value;
13
+
14
+ return offset;
15
+ }
16
+
17
+ function DecodeVarNumber(
18
+ buf: Uint8Array,
19
+ offset: number,
20
+ ): [value: number, offset: number] {
21
+ let value = 0;
22
+ let shift = 0;
23
+
24
+ while (true) {
25
+ const byte = buf[offset++]!;
26
+ value |= (byte & 0b01111111) << shift;
27
+ if (byte < 128) {
28
+ break;
29
+ }
30
+ shift += 7;
31
+ }
32
+
33
+ return [value | 0, offset];
34
+ }
35
+
36
+ function DecodeVarBigInt(
37
+ buf: Uint8Array,
38
+ offset: number,
39
+ ): [value: bigint, offset: number] {
40
+ let value = BigInt(0);
41
+ let shift = BigInt(0);
42
+
43
+ while (true) {
44
+ const byte = buf[offset++]!;
45
+ value |= BigInt(byte & 0b01111111) << shift;
46
+ if (byte < 128) {
47
+ break;
48
+ }
49
+ shift += BigInt(7);
50
+ }
51
+
52
+ return [BigInt.asIntN(64, value), offset];
53
+ }
54
+
55
+ export function $varint_decode_i32(
56
+ buf: Uint8Array,
57
+ offset: number,
58
+ ): [value: number, offset: number] {
59
+ const [v, o] = DecodeVarNumber(buf, offset);
60
+ return [v, o];
61
+ }
62
+
63
+ export function $varint_decode_u32(
64
+ buf: Uint8Array,
65
+ offset: number,
66
+ ): [value: number, offset: number] {
67
+ const [v, o] = DecodeVarNumber(buf, offset);
68
+ return [v >>> 0, o];
69
+ }
70
+
71
+ export function $varint_decode_i64(
72
+ buf: Uint8Array,
73
+ offset: number,
74
+ ): [value: bigint, offset: number] {
75
+ const [v, o] = DecodeVarBigInt(buf, offset);
76
+ return [v, o];
77
+ }
78
+
79
+ export function $varint_decode_u64(
80
+ buf: Uint8Array,
81
+ offset: number,
82
+ ): [value: bigint, offset: number] {
83
+ const [v, o] = DecodeVarBigInt(buf, offset);
84
+ return [BigInt.asUintN(64, v), o];
85
+ }
86
+
87
+ function EncodeVarBigInt(
88
+ dst: Uint8Array,
89
+ offset: number,
90
+ value: bigint,
91
+ ): number {
92
+ value = BigInt.asUintN(64, value);
93
+
94
+ while (value > BigInt(127)) {
95
+ dst[offset++] = Number(value & BigInt(0b01111111)) | 0b10000000;
96
+ value >>= BigInt(7);
97
+ }
98
+ dst[offset++] = Number(value);
99
+
100
+ return offset;
101
+ }
102
+
103
+ export function $varint_encode(
104
+ dst: Uint8Array,
105
+ offset: number,
106
+ value: number,
107
+ ): number;
108
+ export function $varint_encode(
109
+ dst: Uint8Array,
110
+ offset: number,
111
+ value: bigint,
112
+ ): number;
113
+
114
+ export function $varint_encode(
115
+ dst: Uint8Array,
116
+ offset: number,
117
+ value: number | bigint,
118
+ ): number {
119
+ if (typeof value === "bigint") {
120
+ offset = EncodeVarBigInt(dst, offset, value);
121
+ } else {
122
+ if (value < 0) {
123
+ // NOTE: Protocol Buffers signed varint encoding uses two's complement of 64-bit unsigned integers.
124
+ offset = EncodeVarBigInt(dst, offset, BigInt(value));
125
+ } else {
126
+ offset = EncodeVarNumber(dst, offset, value);
127
+ }
128
+ }
129
+ return offset;
130
+ }
@@ -0,0 +1,39 @@
1
+ export function $zigzag_encode(value: number): number;
2
+ export function $zigzag_encode(value: bigint): bigint;
3
+ export function $zigzag_encode(value: number | bigint): any {
4
+ // TODO: optimize (branchless solution exists)
5
+
6
+ if (typeof value === "bigint") {
7
+ if (value < BigInt(0)) {
8
+ value = -value;
9
+ return value * BigInt(2) - BigInt(1);
10
+ }
11
+ return value * BigInt(2);
12
+ }
13
+
14
+ if (value < 0) {
15
+ value = -value;
16
+ return value * 2 - 1;
17
+ }
18
+ return value * 2;
19
+ }
20
+
21
+ export function $zigzag_decode(value: number): number;
22
+ export function $zigzag_decode(value: bigint): bigint;
23
+ export function $zigzag_decode(value: number | bigint): any {
24
+ // TODO: optimize (branchless solution exists)
25
+
26
+ if (typeof value === "bigint") {
27
+ value = BigInt.asUintN(64, value);
28
+ if (value & BigInt(1)) {
29
+ return -(value + BigInt(1)) / BigInt(2);
30
+ }
31
+ return value / BigInt(2);
32
+ }
33
+
34
+ value = value >>> 0;
35
+ if (value & 1) {
36
+ return -(value + 1) / 2;
37
+ }
38
+ return value / 2;
39
+ }
@@ -0,0 +1,6 @@
1
+ import { IProtocolProperty } from "./IProtocolProperty";
2
+
3
+ export interface IProtocolMessage {
4
+ name: string;
5
+ properties: IProtocolProperty[];
6
+ }
@@ -0,0 +1,11 @@
1
+ export interface IProtocolProperty {
2
+ key: string;
3
+ oneOf: IProtocolProperty.IOneOf[];
4
+ required: boolean;
5
+ repeated: boolean;
6
+ }
7
+ export namespace IProtocolProperty {
8
+ export interface IOneOf {
9
+ type: string;
10
+ }
11
+ }
@@ -10,14 +10,16 @@ export type IMetadataTag =
10
10
  | IMetadataTag.IMinLength
11
11
  | IMetadataTag.IMaxLength
12
12
  // NUMBER
13
- | IMetadataTag.IType
13
+ | IMetadataTag.INumberType
14
14
  | IMetadataTag.IRange
15
15
  | IMetadataTag.IMinimum
16
16
  | IMetadataTag.IMaximum
17
17
  | IMetadataTag.IExclusiveMinimum
18
18
  | IMetadataTag.IExclusiveMaximum
19
19
  | IMetadataTag.IMultipleOf
20
- | IMetadataTag.IStep;
20
+ | IMetadataTag.IStep
21
+ // BIGINT
22
+ | IMetadataTag.IBigintType;
21
23
 
22
24
  export namespace IMetadataTag {
23
25
  /* -----------------------------------------------------------
@@ -71,9 +73,17 @@ export namespace IMetadataTag {
71
73
  /* -----------------------------------------------------------
72
74
  NUMBER
73
75
  ----------------------------------------------------------- */
74
- export interface IType {
76
+ export interface INumberType {
75
77
  kind: "type";
76
- value: "int" | "uint";
78
+ value:
79
+ | "int"
80
+ | "uint"
81
+ | "int32"
82
+ | "uint32"
83
+ | "int64"
84
+ | "uint64"
85
+ | "float"
86
+ | "double";
77
87
  }
78
88
 
79
89
  export interface IRange {
@@ -115,6 +125,11 @@ export namespace IMetadataTag {
115
125
  /* -----------------------------------------------------------
116
126
  MISCELLANEOUS
117
127
  ----------------------------------------------------------- */
128
+ export interface IBigintType {
129
+ kind: "type";
130
+ value: "int64" | "uint64";
131
+ }
132
+
118
133
  export interface ISign {
119
134
  include: boolean;
120
135
  value: number;
@@ -203,6 +203,7 @@ export class Metadata {
203
203
  public empty(): boolean {
204
204
  return this.bucket() === 0 || this.size() === 0;
205
205
  }
206
+
206
207
  public size(): number {
207
208
  return (
208
209
  (this.resolved ? 1 : 0) +
@@ -221,6 +222,7 @@ export class Metadata {
221
222
  this.maps.length
222
223
  );
223
224
  }
225
+
224
226
  public bucket(): number {
225
227
  return (
226
228
  (this.resolved ? 1 : 0) +
@@ -237,6 +239,7 @@ export class Metadata {
237
239
  (this.maps.length ? 1 : 0)
238
240
  );
239
241
  }
242
+
240
243
  public isConstant(): boolean {
241
244
  return this.bucket() === (this.constants.length ? 1 : 0);
242
245
  }
@@ -452,8 +455,7 @@ function getName(metadata: Metadata): string {
452
455
  elements.push(`Array<${array.getName()}>`);
453
456
 
454
457
  // OBJECT
455
- for (const object of metadata.objects)
456
- elements.push(`Resolve<${object.name}>`);
458
+ for (const object of metadata.objects) elements.push(object.name);
457
459
  if (metadata.resolved !== null) elements.push(metadata.resolved.getName());
458
460
 
459
461
  // NATIVES
package/src/module.ts CHANGED
@@ -29,7 +29,9 @@ export * from "./IValidation";
29
29
  SINGLE FUNCTIONS
30
30
  - BASIC VALIDATORS
31
31
  - STRICT VALIDATORS
32
+ - PROTOCOL BUFFER FUNCTIONS
32
33
  - JSON FUNCTIONS
34
+ - MISC
33
35
  ==============================================================
34
36
  BASIC VALIDATORS
35
37
  ----------------------------------------------------------- */
@@ -587,6 +589,16 @@ export namespace validateEquals {
587
589
  };
588
590
  }
589
591
 
592
+ /* -----------------------------------------------------------
593
+ PROTOCOL BUFFER FUNCTIONS
594
+ ----------------------------------------------------------- */
595
+ export function message(): never;
596
+ export function message<T>(): string;
597
+
598
+ export function message(): string {
599
+ halt("message");
600
+ }
601
+
590
602
  /* -----------------------------------------------------------
591
603
  JSON FUNCTIONS
592
604
  ----------------------------------------------------------- */
@@ -415,10 +415,16 @@ export namespace CheckerProgrammer {
415
415
  input,
416
416
  [
417
417
  {
418
- expression: ExpressionFactory.isObject(
419
- input,
420
- true,
421
- ),
418
+ expression: ExpressionFactory.isObject(input, {
419
+ checkNull: true,
420
+ checkArray: meta.objects.some((obj) =>
421
+ obj.properties.every(
422
+ (prop) =>
423
+ !prop.key.isSoleLiteral() ||
424
+ !prop.value.required,
425
+ ),
426
+ ),
427
+ }),
422
428
  combined: false,
423
429
  },
424
430
  {
@@ -106,7 +106,10 @@ export namespace IsProgrammer {
106
106
  const obj: MetadataObject = target.objects[0]!;
107
107
  if (obj._Is_simple())
108
108
  return ts.factory.createLogicalAnd(
109
- ExpressionFactory.isObject(input, true),
109
+ ExpressionFactory.isObject(input, {
110
+ checkNull: true,
111
+ checkArray: false,
112
+ }),
110
113
  config.joiner.object(
111
114
  feature_object_entries(config as any)(obj)(
112
115
  input,
@@ -0,0 +1,110 @@
1
+ import ts from "typescript";
2
+
3
+ import { MetadataCollection } from "../factories/MetadataCollection";
4
+ import { ProtocolFactory } from "../factories/ProtocolFactory";
5
+
6
+ import { Metadata } from "../metadata/Metadata";
7
+
8
+ import { IProject } from "../transformers/IProject";
9
+
10
+ import { MapUtil } from "../utils/MapUtil";
11
+
12
+ import { IProtocolMessage } from "../messages/IProtocolMessage";
13
+
14
+ export namespace MessageProgrammer {
15
+ export const generate =
16
+ ({ checker }: IProject) =>
17
+ (type: ts.Type) => {
18
+ // PARSE TARGET TYPE
19
+ const collection: MetadataCollection = ProtocolFactory.collection();
20
+ const metadata: Metadata =
21
+ ProtocolFactory.metadata(checker)(collection)(type);
22
+
23
+ // CONVERT TO PROTOCOL MESSAGES
24
+ const dict: Map<string, IProtocolMessage> = new Map();
25
+ ProtocolFactory.generate(collection)(dict)(metadata);
26
+
27
+ // STRINGIFY
28
+ const hierarchies: Map<string, Hierarchy> = new Map();
29
+ for (const msg of dict.values()) emplace(hierarchies)(msg);
30
+
31
+ const content: string =
32
+ `syntax = "proto3";\n\n` +
33
+ [...hierarchies.values()]
34
+ .map((hier) => stringify(hier))
35
+ .join("\n\n");
36
+
37
+ // RETURNS
38
+ return ts.factory.createStringLiteral(content);
39
+ };
40
+
41
+ const stringify = (hierarchy: Hierarchy): string => {
42
+ const { key, message, children } = hierarchy;
43
+ let index: number = 1;
44
+
45
+ const elements: string[] = [`message ${key} {`];
46
+ if (message !== null)
47
+ elements.push(
48
+ ...message.properties.map((property) => {
49
+ if (property.oneOf.length === 1)
50
+ return [
51
+ TAB,
52
+ property.required ? "" : "optional ",
53
+ property.repeated ? "repeated " : "",
54
+ property.oneOf[0]!.type + " ",
55
+ property.key + " ",
56
+ "= ",
57
+ `${index++};`,
58
+ ].join("");
59
+ return (
60
+ `${TAB}oneof ${property.key} {\n` +
61
+ property.oneOf
62
+ .map(
63
+ (o, i) =>
64
+ `${TAB}${TAB}${o.type} o${i} = ${index++};`,
65
+ )
66
+ .join("\n") +
67
+ `\n${TAB}}`
68
+ );
69
+ }),
70
+ );
71
+ if (message !== null && children.size) elements.push("\n");
72
+ if (children.size)
73
+ elements.push(
74
+ [...children.values()]
75
+ .map((child) => stringify(child))
76
+ .map((body) =>
77
+ body
78
+ .split("\n")
79
+ .map((line) => `${TAB}${line}`)
80
+ .join("\n"),
81
+ )
82
+ .join("\n\n"),
83
+ );
84
+ elements.push("}");
85
+
86
+ return elements.join("\n");
87
+ };
88
+
89
+ const emplace =
90
+ (dict: Map<string, Hierarchy>) => (message: IProtocolMessage) => {
91
+ const accessors: string[] = message.name.split(".");
92
+ accessors.forEach((access, i) => {
93
+ const hierarchy: Hierarchy = MapUtil.take(dict, access, () => ({
94
+ key: access,
95
+ message: null!,
96
+ children: new Map(),
97
+ }));
98
+ dict = hierarchy.children;
99
+ if (i === accessors.length - 1) hierarchy.message = message;
100
+ });
101
+ };
102
+ }
103
+
104
+ interface Hierarchy {
105
+ key: string;
106
+ message: IProtocolMessage | null;
107
+ children: Map<string, Hierarchy>;
108
+ }
109
+
110
+ const TAB = " ".repeat(4);
@@ -339,7 +339,17 @@ export namespace StringifyProgrammer {
339
339
  if (meta.objects.length)
340
340
  unions.push({
341
341
  type: "object",
342
- is: () => ExpressionFactory.isObject(input, true),
342
+ is: () =>
343
+ ExpressionFactory.isObject(input, {
344
+ checkNull: true,
345
+ checkArray: meta.objects.some((obj) =>
346
+ obj.properties.every(
347
+ (prop) =>
348
+ !prop.key.isSoleLiteral() ||
349
+ !prop.value.required,
350
+ ),
351
+ ),
352
+ }),
343
353
  value: () =>
344
354
  meta.isParentResolved() === false &&
345
355
  meta.objects.length === 1 &&