seroval 1.0.0 → 1.0.2
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.
- package/dist/cjs/development/index.cjs +52 -64
- package/dist/cjs/development/index.cjs.map +2 -2
- package/dist/cjs/production/index.cjs +3 -3
- package/dist/esm/development/index.mjs +52 -64
- package/dist/esm/development/index.mjs.map +2 -2
- package/dist/esm/production/index.mjs +3 -3
- package/dist/types/core/context/parser/stream.d.ts.map +1 -1
- package/dist/types/core/context/parser/sync.d.ts.map +1 -1
- package/dist/types/core/context/parser.d.ts +10 -4
- package/dist/types/core/context/parser.d.ts.map +1 -1
- package/dist/types/core/context/serializer.d.ts +10 -5
- package/dist/types/core/context/serializer.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/core/context/parser/stream.ts +1 -14
- package/src/core/context/parser/sync.ts +1 -15
- package/src/core/context/parser.ts +38 -12
- package/src/core/context/serializer.ts +40 -48
|
@@ -48,29 +48,36 @@ import type {
|
|
|
48
48
|
} from '../types';
|
|
49
49
|
import { isValidIdentifier } from '../utils/is-valid-identifier';
|
|
50
50
|
|
|
51
|
+
const enum AssignmentType {
|
|
52
|
+
Index = 0,
|
|
53
|
+
Add = 1,
|
|
54
|
+
Set = 2,
|
|
55
|
+
Delete = 3,
|
|
56
|
+
}
|
|
57
|
+
|
|
51
58
|
interface IndexAssignment {
|
|
52
|
-
t:
|
|
59
|
+
t: AssignmentType.Index;
|
|
53
60
|
s: string;
|
|
54
61
|
k: undefined;
|
|
55
62
|
v: string;
|
|
56
63
|
}
|
|
57
64
|
|
|
58
65
|
interface SetAssignment {
|
|
59
|
-
t:
|
|
66
|
+
t: AssignmentType.Set;
|
|
60
67
|
s: string;
|
|
61
68
|
k: string;
|
|
62
69
|
v: string;
|
|
63
70
|
}
|
|
64
71
|
|
|
65
72
|
interface AddAssignment {
|
|
66
|
-
t:
|
|
73
|
+
t: AssignmentType.Add;
|
|
67
74
|
s: string;
|
|
68
75
|
k: undefined;
|
|
69
76
|
v: string;
|
|
70
77
|
}
|
|
71
78
|
|
|
72
79
|
interface DeleteAssignment {
|
|
73
|
-
t:
|
|
80
|
+
t: AssignmentType.Delete;
|
|
74
81
|
s: string;
|
|
75
82
|
k: string;
|
|
76
83
|
v: undefined;
|
|
@@ -90,16 +97,14 @@ export interface FlaggedObject {
|
|
|
90
97
|
|
|
91
98
|
function getAssignmentExpression(assignment: Assignment): string {
|
|
92
99
|
switch (assignment.t) {
|
|
93
|
-
case
|
|
100
|
+
case AssignmentType.Index:
|
|
94
101
|
return assignment.s + '=' + assignment.v;
|
|
95
|
-
case
|
|
102
|
+
case AssignmentType.Set:
|
|
96
103
|
return assignment.s + '.set(' + assignment.k + ',' + assignment.v + ')';
|
|
97
|
-
case
|
|
104
|
+
case AssignmentType.Add:
|
|
98
105
|
return assignment.s + '.add(' + assignment.v + ')';
|
|
99
|
-
case
|
|
106
|
+
case AssignmentType.Delete:
|
|
100
107
|
return assignment.s + '.delete(' + assignment.k + ')';
|
|
101
|
-
default:
|
|
102
|
-
return '';
|
|
103
108
|
}
|
|
104
109
|
}
|
|
105
110
|
|
|
@@ -112,35 +117,35 @@ function mergeAssignments(assignments: Assignment[]): Assignment[] {
|
|
|
112
117
|
i++
|
|
113
118
|
) {
|
|
114
119
|
item = assignments[i];
|
|
115
|
-
if (item.t ===
|
|
120
|
+
if (item.t === AssignmentType.Index && item.v === prev.v) {
|
|
116
121
|
// Merge if the right-hand value is the same
|
|
117
122
|
// saves at least 2 chars
|
|
118
123
|
current = {
|
|
119
|
-
t:
|
|
124
|
+
t: AssignmentType.Index,
|
|
120
125
|
s: item.s,
|
|
121
126
|
k: undefined,
|
|
122
127
|
v: getAssignmentExpression(current),
|
|
123
128
|
} as IndexAssignment;
|
|
124
|
-
} else if (item.t ===
|
|
129
|
+
} else if (item.t === AssignmentType.Set && item.s === prev.s) {
|
|
125
130
|
// Maps has chaining methods, merge if source is the same
|
|
126
131
|
current = {
|
|
127
|
-
t:
|
|
132
|
+
t: AssignmentType.Set,
|
|
128
133
|
s: getAssignmentExpression(current),
|
|
129
134
|
k: item.k,
|
|
130
135
|
v: item.v,
|
|
131
136
|
} as SetAssignment;
|
|
132
|
-
} else if (item.t ===
|
|
137
|
+
} else if (item.t === AssignmentType.Add && item.s === prev.s) {
|
|
133
138
|
// Sets has chaining methods too
|
|
134
139
|
current = {
|
|
135
|
-
t:
|
|
140
|
+
t: AssignmentType.Add,
|
|
136
141
|
s: getAssignmentExpression(current),
|
|
137
142
|
k: undefined,
|
|
138
143
|
v: item.v,
|
|
139
144
|
} as AddAssignment;
|
|
140
|
-
} else if (item.t ===
|
|
145
|
+
} else if (item.t === AssignmentType.Delete && item.s === prev.s) {
|
|
141
146
|
// Maps has chaining methods, merge if source is the same
|
|
142
147
|
current = {
|
|
143
|
-
t:
|
|
148
|
+
t: AssignmentType.Delete,
|
|
144
149
|
s: getAssignmentExpression(current),
|
|
145
150
|
k: item.k,
|
|
146
151
|
v: undefined,
|
|
@@ -319,7 +324,7 @@ export default abstract class BaseSerializerContext
|
|
|
319
324
|
*/
|
|
320
325
|
protected createAssignment(source: string, value: string): void {
|
|
321
326
|
this.assignments.push({
|
|
322
|
-
t:
|
|
327
|
+
t: AssignmentType.Index,
|
|
323
328
|
s: source,
|
|
324
329
|
k: undefined,
|
|
325
330
|
v: value,
|
|
@@ -328,7 +333,7 @@ export default abstract class BaseSerializerContext
|
|
|
328
333
|
|
|
329
334
|
protected createAddAssignment(ref: number, value: string): void {
|
|
330
335
|
this.assignments.push({
|
|
331
|
-
t:
|
|
336
|
+
t: AssignmentType.Add,
|
|
332
337
|
s: this.getRefParam(ref),
|
|
333
338
|
k: undefined,
|
|
334
339
|
v: value,
|
|
@@ -337,7 +342,7 @@ export default abstract class BaseSerializerContext
|
|
|
337
342
|
|
|
338
343
|
protected createSetAssignment(ref: number, key: string, value: string): void {
|
|
339
344
|
this.assignments.push({
|
|
340
|
-
t:
|
|
345
|
+
t: AssignmentType.Set,
|
|
341
346
|
s: this.getRefParam(ref),
|
|
342
347
|
k: key,
|
|
343
348
|
v: value,
|
|
@@ -346,7 +351,7 @@ export default abstract class BaseSerializerContext
|
|
|
346
351
|
|
|
347
352
|
protected createDeleteAssignment(ref: number, key: string): void {
|
|
348
353
|
this.assignments.push({
|
|
349
|
-
t:
|
|
354
|
+
t: AssignmentType.Delete,
|
|
350
355
|
s: this.getRefParam(ref),
|
|
351
356
|
k: key,
|
|
352
357
|
v: undefined,
|
|
@@ -416,11 +421,11 @@ export default abstract class BaseSerializerContext
|
|
|
416
421
|
const id = node.i;
|
|
417
422
|
if (node.l) {
|
|
418
423
|
this.stack.push(id);
|
|
424
|
+
const list = node.a;
|
|
425
|
+
let values = this.serializeArrayItem(id, list[0], 0);
|
|
419
426
|
// This is different than Map and Set
|
|
420
427
|
// because we also need to serialize
|
|
421
428
|
// the holes of the Array
|
|
422
|
-
const list = node.a;
|
|
423
|
-
let values = this.serializeArrayItem(id, list[0], 0);
|
|
424
429
|
let isHoley = values === '';
|
|
425
430
|
for (let i = 1, len = node.l, item: string; i < len; i++) {
|
|
426
431
|
item = this.serializeArrayItem(id, list[i], i);
|
|
@@ -469,9 +474,9 @@ export default abstract class BaseSerializerContext
|
|
|
469
474
|
): string {
|
|
470
475
|
const len = record.s;
|
|
471
476
|
if (len) {
|
|
472
|
-
this.stack.push(source.i);
|
|
473
477
|
const keys = record.k;
|
|
474
478
|
const values = record.v;
|
|
479
|
+
this.stack.push(source.i);
|
|
475
480
|
let result = this.serializeProperty(source, keys[0], values[0]);
|
|
476
481
|
for (let i = 1, item = result; i < len; i++) {
|
|
477
482
|
item = this.serializeProperty(source, keys[i], values[i]);
|
|
@@ -566,10 +571,10 @@ export default abstract class BaseSerializerContext
|
|
|
566
571
|
): string | undefined {
|
|
567
572
|
const len = node.s;
|
|
568
573
|
if (len) {
|
|
569
|
-
this.stack.push(source.i);
|
|
570
574
|
const mainAssignments: Assignment[] = [];
|
|
571
575
|
const keys = node.k;
|
|
572
576
|
const values = node.v;
|
|
577
|
+
this.stack.push(source.i);
|
|
573
578
|
for (let i = 0; i < len; i++) {
|
|
574
579
|
this.serializeAssignment(source, mainAssignments, keys[i], values[i]);
|
|
575
580
|
}
|
|
@@ -795,15 +800,17 @@ export default abstract class BaseSerializerContext
|
|
|
795
800
|
}
|
|
796
801
|
|
|
797
802
|
protected serializeAggregateError(node: SerovalAggregateErrorNode): string {
|
|
798
|
-
// Serialize the required arguments
|
|
799
803
|
const id = node.i;
|
|
800
|
-
this.stack.push(id);
|
|
801
|
-
const serialized = 'new AggregateError([],"' + node.m + '")';
|
|
802
|
-
this.stack.pop();
|
|
803
804
|
// `AggregateError` might've been extended
|
|
804
805
|
// either through class or custom properties
|
|
805
806
|
// Make sure to assign extra properties
|
|
806
|
-
|
|
807
|
+
this.stack.push(id);
|
|
808
|
+
const serialized = this.serializeDictionary(
|
|
809
|
+
node,
|
|
810
|
+
'new AggregateError([],"' + node.m + '")',
|
|
811
|
+
);
|
|
812
|
+
this.stack.pop();
|
|
813
|
+
return serialized;
|
|
807
814
|
}
|
|
808
815
|
|
|
809
816
|
protected serializeError(node: SerovalErrorNode): string {
|
|
@@ -846,21 +853,6 @@ export default abstract class BaseSerializerContext
|
|
|
846
853
|
return this.assignIndexedValue(node.i, SYMBOL_STRING[node.s]);
|
|
847
854
|
}
|
|
848
855
|
|
|
849
|
-
protected serializeFormDataEntry(
|
|
850
|
-
id: number,
|
|
851
|
-
key: string,
|
|
852
|
-
value: SerovalNode,
|
|
853
|
-
): string {
|
|
854
|
-
return (
|
|
855
|
-
this.getRefParam(id) +
|
|
856
|
-
'.append("' +
|
|
857
|
-
key +
|
|
858
|
-
'",' +
|
|
859
|
-
this.serialize(value) +
|
|
860
|
-
')'
|
|
861
|
-
);
|
|
862
|
-
}
|
|
863
|
-
|
|
864
856
|
protected serializeBoxed(node: SerovalBoxedNode): string {
|
|
865
857
|
return this.assignIndexedValue(
|
|
866
858
|
node.i,
|
|
@@ -943,10 +935,10 @@ export default abstract class BaseSerializerContext
|
|
|
943
935
|
case SpecialReference.StreamConstructor:
|
|
944
936
|
return this.createFunction(
|
|
945
937
|
['b', 'a', 's', 'l', 'p', 'f', 'e', 'n'],
|
|
946
|
-
'(b=[],a=!0,s=!1,l=[],
|
|
938
|
+
'(b=[],a=!0,s=!1,l=[],p=0,f=' +
|
|
947
939
|
this.createEffectfulFunction(
|
|
948
940
|
['v', 'm', 'x'],
|
|
949
|
-
'for(x=0;x<
|
|
941
|
+
'for(x=0;x<p;x++)l[x]&&l[x][m](v)',
|
|
950
942
|
) +
|
|
951
943
|
',n=' +
|
|
952
944
|
this.createEffectfulFunction(
|