typia 5.0.0-dev.20230814 → 5.0.0-dev.20230818

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 (72) hide show
  1. package/lib/factories/ExpressionFactory.d.ts +1 -0
  2. package/lib/factories/ExpressionFactory.js +33 -0
  3. package/lib/factories/ExpressionFactory.js.map +1 -1
  4. package/lib/factories/StatementFactory.d.ts +2 -0
  5. package/lib/factories/StatementFactory.js +11 -0
  6. package/lib/factories/StatementFactory.js.map +1 -1
  7. package/lib/functional/$ProtobufReader.d.ts +33 -0
  8. package/lib/functional/$ProtobufReader.js +155 -0
  9. package/lib/functional/$ProtobufReader.js.map +1 -0
  10. package/lib/functional/$ProtobufSizer.d.ts +36 -0
  11. package/lib/functional/$ProtobufSizer.js +105 -0
  12. package/lib/functional/$ProtobufSizer.js.map +1 -0
  13. package/lib/functional/$ProtobufWriter.d.ts +45 -0
  14. package/lib/functional/$ProtobufWriter.js +107 -0
  15. package/lib/functional/$ProtobufWriter.js.map +1 -0
  16. package/lib/functional/IProtobufWriter.d.ts +15 -0
  17. package/lib/functional/IProtobufWriter.js +3 -0
  18. package/lib/functional/IProtobufWriter.js.map +1 -0
  19. package/lib/functional/Namespace.js +13 -6
  20. package/lib/functional/Namespace.js.map +1 -1
  21. package/lib/programmers/FeatureProgrammer.js +2 -2
  22. package/lib/programmers/FeatureProgrammer.js.map +1 -1
  23. package/lib/programmers/helpers/CloneJoiner.js +1 -7
  24. package/lib/programmers/helpers/CloneJoiner.js.map +1 -1
  25. package/lib/programmers/helpers/ProtobufWire.d.ts +16 -12
  26. package/lib/programmers/helpers/RandomRanger.js +1 -1
  27. package/lib/programmers/helpers/RandomRanger.js.map +1 -1
  28. package/lib/programmers/json/JsonStringifyProgrammer.js +3 -0
  29. package/lib/programmers/json/JsonStringifyProgrammer.js.map +1 -1
  30. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js +269 -127
  31. package/lib/programmers/protobuf/ProtobufEncodeProgrammer.js.map +1 -1
  32. package/lib/programmers/protobuf/ProtobufMessageProgrammer.js +8 -2
  33. package/lib/programmers/protobuf/ProtobufMessageProgrammer.js.map +1 -1
  34. package/lib/protobuf.js +23 -9
  35. package/lib/protobuf.js.map +1 -1
  36. package/lib/schemas/metadata/MetadataObject.js +4 -0
  37. package/lib/schemas/metadata/MetadataObject.js.map +1 -1
  38. package/lib/transformers/CallExpressionTransformer.js +0 -4
  39. package/lib/transformers/CallExpressionTransformer.js.map +1 -1
  40. package/lib/transformers/features/json/JsonApplicationTransformer.js +6 -3
  41. package/lib/transformers/features/json/JsonApplicationTransformer.js.map +1 -1
  42. package/package.json +1 -1
  43. package/src/factories/ExpressionFactory.ts +20 -0
  44. package/src/factories/StatementFactory.ts +32 -0
  45. package/src/functional/$ProtobufReader.ts +189 -0
  46. package/src/functional/$ProtobufSizer.ts +144 -0
  47. package/src/functional/$ProtobufWriter.ts +152 -0
  48. package/src/functional/IProtobufWriter.ts +18 -0
  49. package/src/functional/Namespace.ts +14 -7
  50. package/src/programmers/FeatureProgrammer.ts +2 -2
  51. package/src/programmers/helpers/CloneJoiner.ts +1 -25
  52. package/src/programmers/helpers/ProtobufWire.ts +18 -12
  53. package/src/programmers/helpers/RandomRanger.ts +1 -1
  54. package/src/programmers/json/JsonStringifyProgrammer.ts +8 -0
  55. package/src/programmers/protobuf/ProtobufEncodeProgrammer.ts +544 -201
  56. package/src/programmers/protobuf/ProtobufMessageProgrammer.ts +4 -1
  57. package/src/protobuf.ts +23 -29
  58. package/src/schemas/metadata/MetadataObject.ts +10 -0
  59. package/src/transformers/CallExpressionTransformer.ts +0 -4
  60. package/src/transformers/features/json/JsonApplicationTransformer.ts +12 -3
  61. package/lib/programmers/protobuf/ProtobufSizeProgrammer.d.ts +0 -5
  62. package/lib/programmers/protobuf/ProtobufSizeProgrammer.js +0 -409
  63. package/lib/programmers/protobuf/ProtobufSizeProgrammer.js.map +0 -1
  64. package/lib/transformers/features/protobuf/CreateProtobufSizeTransformer.d.ts +0 -3
  65. package/lib/transformers/features/protobuf/CreateProtobufSizeTransformer.js +0 -10
  66. package/lib/transformers/features/protobuf/CreateProtobufSizeTransformer.js.map +0 -1
  67. package/lib/transformers/features/protobuf/ProtobufSizeTransformer.d.ts +0 -3
  68. package/lib/transformers/features/protobuf/ProtobufSizeTransformer.js +0 -10
  69. package/lib/transformers/features/protobuf/ProtobufSizeTransformer.js.map +0 -1
  70. package/src/programmers/protobuf/ProtobufSizeProgrammer.ts +0 -716
  71. package/src/transformers/features/protobuf/CreateProtobufSizeTransformer.ts +0 -9
  72. package/src/transformers/features/protobuf/ProtobufSizeTransformer.ts +0 -9
@@ -0,0 +1,152 @@
1
+ import { $ProtobufSizer } from "./$ProtobufSizer";
2
+ import { IProtobufWriter } from "./IProtobufWriter";
3
+
4
+ export class $ProtobufWriter implements IProtobufWriter {
5
+ /**
6
+ * Related sizer
7
+ */
8
+ private readonly sizer: $ProtobufSizer;
9
+
10
+ /**
11
+ * Current pointer.
12
+ */
13
+ private ptr: number;
14
+
15
+ /**
16
+ * Protobuf buffer.
17
+ */
18
+ private buf: Uint8Array;
19
+
20
+ /**
21
+ * DataView for buffer.
22
+ */
23
+ private view: DataView;
24
+
25
+ /**
26
+ * Index in varlen array from sizer.
27
+ */
28
+ private varlenidx: number;
29
+
30
+ constructor(sizer: $ProtobufSizer) {
31
+ this.sizer = sizer;
32
+ this.buf = new Uint8Array(sizer.len);
33
+ this.view = new DataView(this.buf.buffer);
34
+ this.ptr = 0;
35
+ this.varlenidx = 0;
36
+ }
37
+
38
+ buffer(): Uint8Array {
39
+ return this.buf;
40
+ }
41
+
42
+ bool(value: boolean): void {
43
+ this.byte(value ? 1 : 0);
44
+ }
45
+
46
+ byte(value: number): void {
47
+ this.buf[this.ptr++] = value & 255;
48
+ }
49
+
50
+ int32(value: number): void {
51
+ if (value < 0) this.int64(value);
52
+ else this.variant32(value >>> 0);
53
+ }
54
+
55
+ sint32(value: number): void {
56
+ this.variant32((value << 1) ^ (value >> 31));
57
+ }
58
+
59
+ uint32(value: number): void {
60
+ this.variant32(value);
61
+ }
62
+
63
+ sint64(value: number | bigint): void {
64
+ value = BigInt(value);
65
+ this.variant64((value << ND01) ^ (value >> ND63));
66
+ }
67
+
68
+ int64(value: number | bigint): void {
69
+ this.variant64(BigInt(value));
70
+ }
71
+
72
+ uint64(value: number | bigint): void {
73
+ this.variant64(BigInt(value));
74
+ }
75
+
76
+ float(val: number): void {
77
+ this.view.setFloat32(this.ptr, val, true);
78
+ this.ptr += 4;
79
+ }
80
+
81
+ double(val: number): void {
82
+ this.view.setFloat64(this.ptr, val, true);
83
+ this.ptr += 8;
84
+ }
85
+
86
+ bytes(value: Uint8Array): void {
87
+ this.fork();
88
+ this.uint32(value.byteLength);
89
+ for (let i = 0; i < value.byteLength; i++)
90
+ this.buf[this.ptr++] = value[i]!;
91
+ }
92
+
93
+ string(value: string): void {
94
+ const len: number = this.varlen(); // use precomputed length
95
+ this.uint32(len);
96
+
97
+ const binary: Uint8Array = utf8.encode(value);
98
+ for (let i = 0; i < binary.byteLength; i++)
99
+ this.buf[this.ptr++] = binary[i]!;
100
+ }
101
+
102
+ fork(): void {
103
+ this.uint32(this.varlen()); // use precomputed length
104
+ }
105
+
106
+ ldelim(): void {
107
+ // nothing to do - all dirty work done by sizer
108
+ }
109
+
110
+ finish(): Uint8Array {
111
+ return this.buf;
112
+ }
113
+
114
+ reset(): void {
115
+ this.buf = new Uint8Array(this.sizer.len);
116
+ this.view = new DataView(this.buf.buffer);
117
+ this.ptr = 0;
118
+ this.varlenidx = 0;
119
+ }
120
+
121
+ private variant32(val: number): void {
122
+ while (val > 0x7f) {
123
+ this.buf[this.ptr++] = (val & 0x7f) | 0x80;
124
+ val = val >>> 7;
125
+ }
126
+ this.buf[this.ptr++] = val;
127
+ }
128
+
129
+ private variant64(val: bigint): void {
130
+ val = BigInt.asUintN(64, val);
131
+ while (val > NX7F) {
132
+ this.buf[this.ptr++] = Number((val & NX7F) | NX80);
133
+ val = val >> ND07; // @todo
134
+ // (val / (128n) % 2n === 1n)
135
+ }
136
+ this.buf[this.ptr++] = Number(val);
137
+ }
138
+
139
+ private varlen(): number {
140
+ return this.varlenidx >= this.sizer.varlen.length
141
+ ? 0
142
+ : this.sizer.varlen[this.varlenidx++]!;
143
+ }
144
+ }
145
+
146
+ const utf8 = new TextEncoder();
147
+
148
+ const ND01 = BigInt(1);
149
+ const ND07 = BigInt(7);
150
+ const ND63 = BigInt(63);
151
+ const NX7F = BigInt(0x7f);
152
+ const NX80 = BigInt(0x80);
@@ -0,0 +1,18 @@
1
+ export interface IProtobufWriter {
2
+ bool(value: boolean): void;
3
+ int32(value: number): void;
4
+ sint32(value: number): void;
5
+ uint32(value: number): void;
6
+
7
+ int64(value: bigint | number): void;
8
+ sint64(value: bigint | number): void;
9
+ uint64(value: bigint | number): void;
10
+
11
+ float(value: number): void;
12
+ double(value: number): void;
13
+ bytes(value: Uint8Array): void;
14
+ string(value: string): void;
15
+
16
+ fork(): void;
17
+ ldelim(): void;
18
+ }
@@ -1,9 +1,10 @@
1
- import { Writer } from "protobufjs";
2
-
3
1
  import { RandomGenerator } from "../utils/RandomGenerator";
4
2
 
5
3
  import { IValidation } from "../IValidation";
6
4
  import { TypeGuardError } from "../TypeGuardError";
5
+ import { $ProtobufReader } from "./$ProtobufReader";
6
+ import { $ProtobufSizer } from "./$ProtobufSizer";
7
+ import { $ProtobufWriter } from "./$ProtobufWriter";
7
8
  import { $any } from "./$any";
8
9
  import { $every } from "./$every";
9
10
  import { $guard } from "./$guard";
@@ -101,14 +102,20 @@ export namespace Namespace {
101
102
  string: $string,
102
103
  tail: $tail,
103
104
  rest: $rest,
104
- throws: $throws(method),
105
+ throws: $throws(`json.${method}`),
105
106
  });
106
107
  }
107
108
 
108
109
  export namespace protobuf {
110
+ export const decode = (method: string) => ({
111
+ Reader: $ProtobufReader,
112
+ throws: $throws(`protobuf.${method}`),
113
+ });
114
+
109
115
  export const encode = (method: string) => ({
110
- Writer: Writer,
111
- strl: $strlen,
116
+ Sizer: $ProtobufSizer,
117
+ Writer: $ProtobufWriter,
118
+ strlen: $strlen,
112
119
  throws: $throws(method),
113
120
  });
114
121
  }
@@ -116,13 +123,13 @@ export namespace Namespace {
116
123
  export namespace misc {
117
124
  export const clone = (method: string) => ({
118
125
  ...is(),
119
- throws: $throws(method),
126
+ throws: $throws(`misc.${method}`),
120
127
  any: $any,
121
128
  });
122
129
 
123
130
  export const prune = (method: string) => ({
124
131
  ...is(),
125
- throws: $throws(method),
132
+ throws: $throws(`misc.${method}`),
126
133
  });
127
134
  }
128
135
 
@@ -278,9 +278,9 @@ export namespace FeatureProgrammer {
278
278
  (collection: MetadataCollection) =>
279
279
  collection
280
280
  .objects()
281
- .map((obj, i) =>
281
+ .map((obj) =>
282
282
  StatementFactory.constant(
283
- `${config.prefix}o${i}`,
283
+ `${config.prefix}o${obj.index}`,
284
284
  ts.factory.createArrowFunction(
285
285
  undefined,
286
286
  undefined,
@@ -32,7 +32,6 @@ export namespace CloneJoiner {
32
32
  if (dynamic.length === 0) return literal;
33
33
 
34
34
  const key = ts.factory.createIdentifier("key");
35
- const value = ts.factory.createIdentifier("value");
36
35
  const output = ts.factory.createIdentifier("output");
37
36
 
38
37
  const statements: ts.Statement[] = dynamic.map((entry) =>
@@ -72,30 +71,7 @@ export namespace CloneJoiner {
72
71
  ),
73
72
  ts.factory.createForOfStatement(
74
73
  undefined,
75
- ts.factory.createVariableDeclarationList(
76
- [
77
- ts.factory.createVariableDeclaration(
78
- ts.factory.createArrayBindingPattern([
79
- ts.factory.createBindingElement(
80
- undefined,
81
- undefined,
82
- key,
83
- undefined,
84
- ),
85
- ts.factory.createBindingElement(
86
- undefined,
87
- undefined,
88
- value,
89
- undefined,
90
- ),
91
- ]),
92
- undefined,
93
- undefined,
94
- undefined,
95
- ),
96
- ],
97
- ts.NodeFlags.Const,
98
- ),
74
+ StatementFactory.entry("key")("value"),
99
75
  ts.factory.createCallExpression(
100
76
  ts.factory.createIdentifier("Object.entries"),
101
77
  undefined,
@@ -1,28 +1,34 @@
1
1
  export const enum ProtobufWire {
2
2
  /**
3
- * integers
4
- * bool
5
- * enum
3
+ * - integers
4
+ * - bool
5
+ * - enum
6
6
  */
7
- VARINT = 0,
7
+ VARIANT = 0,
8
8
 
9
9
  /**
10
- * fixed64
11
- * sfixed64
12
- * double
10
+ * - fixed64
11
+ * - sfixed64
12
+ * - double
13
13
  */
14
14
  I64 = 1,
15
15
 
16
16
  /**
17
- * string
18
- * bytes
19
- * mebedded messages
20
- * packed repeated fields
17
+ * - string
18
+ * - bytes
19
+ * - mebedded messages
20
+ * - packed repeated fields
21
21
  */
22
22
  LEN = 2,
23
23
 
24
+ START_GROUP = 3,
25
+
26
+ END_GROUP = 4,
27
+
24
28
  /**
25
- * fixed, sfixed32, float
29
+ * - fixed
30
+ * - sfixed32
31
+ * - float
26
32
  */
27
33
  I32 = 5,
28
34
  }
@@ -26,7 +26,7 @@ export namespace RandomRanger {
26
26
 
27
27
  props.minimum ??= defs.minimum;
28
28
  props.maximum ??= defs.maximum;
29
- if (props.maximum <= props.minimum)
29
+ if (props.maximum < props.minimum)
30
30
  (props.maximum as number) += defs.gap;
31
31
 
32
32
  return ts.factory.createCallExpression(
@@ -937,6 +937,12 @@ export namespace JsonStringifyProgrammer {
937
937
  validate: (meta) => {
938
938
  if (meta.atomics.find((str) => str === "bigint"))
939
939
  throw new Error(NO_BIGINT);
940
+ else if (
941
+ meta.arrays.some(
942
+ (array) => array.value.isRequired() === false,
943
+ )
944
+ )
945
+ throw new Error(NO_UNDEFINED_IN_ARRAY);
940
946
  },
941
947
  })(collection)(type);
942
948
  return [collection, meta];
@@ -977,3 +983,5 @@ interface IUnion {
977
983
 
978
984
  const NO_BIGINT =
979
985
  "Error on typia.json.stringify(): does not allow bigint type.";
986
+ const NO_UNDEFINED_IN_ARRAY =
987
+ "Error on typia.json.stringify(): does not allow undefined type in array.";