@polkadot/types-codec 9.14.2 → 10.0.1
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/abstract/Array.js +140 -155
- package/abstract/Base.js +95 -112
- package/abstract/Int.js +212 -220
- package/abstract/Object.js +34 -45
- package/abstract/index.js +3 -6
- package/base/Compact.js +149 -165
- package/base/DoNotConstruct.js +61 -64
- package/base/Enum.js +345 -382
- package/base/Int.js +14 -18
- package/base/Null.js +71 -82
- package/base/Option.js +217 -226
- package/base/Result.js +54 -67
- package/base/Tuple.js +96 -101
- package/base/UInt.js +11 -15
- package/base/Vec.js +84 -89
- package/base/VecAny.js +8 -12
- package/base/VecFixed.js +59 -70
- package/base/index.js +12 -15
- package/bundle.js +7 -10
- package/cjs/abstract/Array.js +138 -159
- package/cjs/abstract/Base.js +96 -117
- package/cjs/abstract/Int.js +215 -238
- package/cjs/abstract/Object.js +30 -49
- package/cjs/abstract/index.js +8 -25
- package/cjs/base/Compact.js +151 -173
- package/cjs/base/DoNotConstruct.js +63 -70
- package/cjs/base/Enum.js +350 -396
- package/cjs/base/Int.js +16 -24
- package/cjs/base/Null.js +70 -86
- package/cjs/base/Option.js +220 -234
- package/cjs/base/Result.js +56 -71
- package/cjs/base/Tuple.js +103 -109
- package/cjs/base/UInt.js +13 -19
- package/cjs/base/Vec.js +94 -101
- package/cjs/base/VecAny.js +10 -16
- package/cjs/base/VecFixed.js +66 -79
- package/cjs/base/index.js +26 -88
- package/cjs/bundle.js +11 -86
- package/cjs/detectOther.js +2 -10
- package/cjs/detectPackage.js +6 -11
- package/cjs/extended/BTreeMap.js +10 -16
- package/cjs/extended/BTreeSet.js +162 -178
- package/cjs/extended/BitVec.js +70 -77
- package/cjs/extended/Bytes.js +59 -62
- package/cjs/extended/HashMap.js +10 -16
- package/cjs/extended/Linkage.js +50 -60
- package/cjs/extended/Map.js +176 -181
- package/cjs/extended/OptionBool.js +65 -68
- package/cjs/extended/Range.js +37 -46
- package/cjs/extended/RangeInclusive.js +13 -21
- package/cjs/extended/Type.js +14 -22
- package/cjs/extended/U8aFixed.js +33 -43
- package/cjs/extended/WrapperKeepOpaque.js +99 -99
- package/cjs/extended/WrapperOpaque.js +19 -28
- package/cjs/extended/index.js +31 -108
- package/cjs/index.js +3 -15
- package/cjs/native/Bool.js +101 -116
- package/cjs/native/Date.js +125 -151
- package/cjs/native/Float.js +95 -114
- package/cjs/native/Json.js +102 -124
- package/cjs/native/Raw.js +128 -150
- package/cjs/native/Set.js +200 -220
- package/cjs/native/Struct.data.js +2 -9
- package/cjs/native/Struct.js +238 -251
- package/cjs/native/Text.js +137 -149
- package/cjs/native/index.js +21 -78
- package/cjs/packageInfo.js +2 -16
- package/cjs/primitive/F32.js +8 -11
- package/cjs/primitive/F64.js +8 -11
- package/cjs/primitive/I128.js +8 -11
- package/cjs/primitive/I16.js +8 -11
- package/cjs/primitive/I256.js +8 -11
- package/cjs/primitive/I32.js +8 -11
- package/cjs/primitive/I64.js +8 -11
- package/cjs/primitive/I8.js +8 -11
- package/cjs/primitive/U128.js +8 -11
- package/cjs/primitive/U16.js +8 -11
- package/cjs/primitive/U256.js +8 -11
- package/cjs/primitive/U32.js +8 -11
- package/cjs/primitive/U64.js +8 -11
- package/cjs/primitive/U8.js +8 -11
- package/cjs/primitive/USize.js +7 -13
- package/cjs/primitive/index.js +47 -199
- package/cjs/types/codec.js +2 -1
- package/cjs/types/helpers.js +2 -1
- package/cjs/types/index.js +6 -48
- package/cjs/types/interfaces.js +2 -1
- package/cjs/types/registry.js +2 -1
- package/cjs/utils/compareArray.js +12 -17
- package/cjs/utils/compareMap.js +23 -26
- package/cjs/utils/compareSet.js +17 -23
- package/cjs/utils/decodeU8a.js +63 -74
- package/cjs/utils/index.js +24 -91
- package/cjs/utils/mapToTypeMap.js +13 -18
- package/cjs/utils/sanitize.js +198 -204
- package/cjs/utils/sortValues.js +39 -49
- package/cjs/utils/typeToConstructor.js +8 -11
- package/cjs/utils/typesToMap.js +10 -16
- package/cjs/utils/util.js +6 -11
- package/detectOther.js +0 -5
- package/detectPackage.js +2 -7
- package/extended/BTreeMap.js +8 -11
- package/extended/BTreeSet.js +159 -171
- package/extended/BitVec.js +63 -70
- package/extended/Bytes.js +56 -57
- package/extended/HashMap.js +8 -11
- package/extended/Linkage.js +46 -51
- package/extended/Map.js +173 -173
- package/extended/OptionBool.js +62 -62
- package/extended/Range.js +31 -39
- package/extended/RangeInclusive.js +11 -16
- package/extended/Type.js +12 -17
- package/extended/U8aFixed.js +30 -36
- package/extended/WrapperKeepOpaque.js +92 -91
- package/extended/WrapperOpaque.js +17 -23
- package/extended/index.js +14 -17
- package/index.js +2 -5
- package/native/Bool.js +102 -111
- package/native/Date.js +126 -144
- package/native/Float.js +94 -107
- package/native/Json.js +104 -114
- package/native/Raw.js +130 -146
- package/native/Set.js +194 -209
- package/native/Struct.data.js +0 -3
- package/native/Struct.js +233 -241
- package/native/Text.js +135 -143
- package/native/index.js +8 -11
- package/package.json +8 -5
- package/packageInfo.js +1 -11
- package/primitive/F32.js +3 -7
- package/primitive/F64.js +3 -7
- package/primitive/I128.js +3 -7
- package/primitive/I16.js +3 -7
- package/primitive/I256.js +3 -7
- package/primitive/I32.js +3 -7
- package/primitive/I64.js +3 -7
- package/primitive/I8.js +3 -7
- package/primitive/U128.js +3 -7
- package/primitive/U16.js +3 -7
- package/primitive/U256.js +3 -7
- package/primitive/U32.js +3 -7
- package/primitive/U64.js +3 -7
- package/primitive/U8.js +3 -7
- package/primitive/USize.js +5 -9
- package/primitive/index.js +15 -18
- package/types/index.js +4 -7
- package/utils/compareArray.js +7 -11
- package/utils/compareMap.js +18 -19
- package/utils/compareSet.js +12 -16
- package/utils/decodeU8a.js +54 -61
- package/utils/index.js +9 -12
- package/utils/mapToTypeMap.js +9 -13
- package/utils/sanitize.js +182 -185
- package/utils/sortValues.js +32 -36
- package/utils/typeToConstructor.js +3 -4
- package/utils/typesToMap.js +5 -8
- package/utils/util.js +1 -4
package/utils/sanitize.js
CHANGED
|
@@ -1,222 +1,219 @@
|
|
|
1
|
-
// Copyright 2017-2023 @polkadot/types-codec authors & contributors
|
|
2
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
|
|
4
1
|
const BOUNDED = ['BTreeMap', 'BTreeSet', 'HashMap', 'Vec'];
|
|
5
2
|
const ALLOWED_BOXES = BOUNDED.concat(['Compact', 'DoNotConstruct', 'Int', 'Linkage', 'Range', 'RangeInclusive', 'Result', 'Opaque', 'Option', 'UInt', 'WrapperKeepOpaque', 'WrapperOpaque']);
|
|
6
3
|
const BOX_PRECEDING = ['<', '(', '[', '"', ',', ' ']; // start of vec, tuple, fixed array, part of struct def or in tuple
|
|
7
|
-
|
|
8
4
|
const mappings = [
|
|
9
|
-
// alias <T::InherentOfflineReport as InherentOfflineReport>::Inherent -> InherentOfflineReport
|
|
10
|
-
alias('<T::InherentOfflineReport as InherentOfflineReport>::Inherent', 'InherentOfflineReport', false),
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
alias
|
|
27
|
-
|
|
28
|
-
alias
|
|
29
|
-
|
|
30
|
-
alias('
|
|
31
|
-
|
|
32
|
-
alias
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
//
|
|
38
|
-
|
|
39
|
-
//
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
5
|
+
// alias <T::InherentOfflineReport as InherentOfflineReport>::Inherent -> InherentOfflineReport
|
|
6
|
+
alias('<T::InherentOfflineReport as InherentOfflineReport>::Inherent', 'InherentOfflineReport', false),
|
|
7
|
+
alias('VecDeque<', 'Vec<', false),
|
|
8
|
+
// <T::Balance as HasCompact>
|
|
9
|
+
cleanupCompact(),
|
|
10
|
+
// Change BoundedVec<Type, Size> to Vec<Type>
|
|
11
|
+
removeExtensions('Bounded', true),
|
|
12
|
+
// Change WeakVec<Type> to Vec<Type>
|
|
13
|
+
removeExtensions('Weak', false),
|
|
14
|
+
// Remove all the trait prefixes
|
|
15
|
+
removeTraits(),
|
|
16
|
+
// remove PairOf<T> -> (T, T)
|
|
17
|
+
removePairOf(),
|
|
18
|
+
// remove boxing, `Box<Proposal>` -> `Proposal`
|
|
19
|
+
removeWrap('Box<'),
|
|
20
|
+
// remove generics, `MisbehaviorReport<Hash, BlockNumber>` -> `MisbehaviorReport`
|
|
21
|
+
removeGenerics(),
|
|
22
|
+
// alias String -> Text (compat with jsonrpc methods)
|
|
23
|
+
alias('String', 'Text'),
|
|
24
|
+
// alias Vec<u8> -> Bytes
|
|
25
|
+
alias('Vec<u8>', 'Bytes'),
|
|
26
|
+
alias('&\\[u8\\]', 'Bytes'),
|
|
27
|
+
alias("&'static\\[u8\\]", 'Bytes'),
|
|
28
|
+
// alias RawAddress -> Address
|
|
29
|
+
alias('RawAddress', 'Address'),
|
|
30
|
+
// lookups, mapped to Address/AccountId as appropriate in runtime
|
|
31
|
+
alias('Lookup::Source', 'LookupSource'),
|
|
32
|
+
alias('Lookup::Target', 'LookupTarget'),
|
|
33
|
+
// HACK duplication between contracts & primitives, however contracts prefixed with exec
|
|
34
|
+
alias('exec::StorageKey', 'ContractStorageKey'),
|
|
35
|
+
// flattens tuples with one value, `(AccountId)` -> `AccountId`
|
|
36
|
+
flattenSingleTuple(),
|
|
37
|
+
// converts ::Type to Type, <T as Trait<I>>::Proposal -> Proposal
|
|
38
|
+
removeColons(),
|
|
39
|
+
// remove all trailing spaces - this should always be the last
|
|
40
|
+
trim()
|
|
41
|
+
];
|
|
43
42
|
export function trim() {
|
|
44
|
-
|
|
43
|
+
return (value) => value.trim();
|
|
45
44
|
}
|
|
46
|
-
|
|
47
|
-
// given a starting index, find the closing >
|
|
48
45
|
export function findClosing(value, start) {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
46
|
+
let depth = 0;
|
|
47
|
+
for (let index = start; index < value.length; index++) {
|
|
48
|
+
if (value[index] === '>') {
|
|
49
|
+
if (!depth) {
|
|
50
|
+
return index;
|
|
51
|
+
}
|
|
52
|
+
depth--;
|
|
53
|
+
}
|
|
54
|
+
else if (value[index] === '<') {
|
|
55
|
+
depth++;
|
|
56
|
+
}
|
|
58
57
|
}
|
|
59
|
-
|
|
60
|
-
throw new Error(`Unable to find closing matching <> on '${value}' (start ${start})`);
|
|
58
|
+
throw new Error(`Unable to find closing matching <> on '${value}' (start ${start})`);
|
|
61
59
|
}
|
|
62
60
|
export function alias(src, dest, withChecks = true) {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
61
|
+
const from = new RegExp(`(^${src}|${BOX_PRECEDING.map((box) => `\\${box}${src}`).join('|')})`, 'g');
|
|
62
|
+
const to = (src) => {
|
|
63
|
+
from.lastIndex = 0;
|
|
64
|
+
return withChecks && BOX_PRECEDING.includes(src[0])
|
|
65
|
+
? `${src[0]}${dest}`
|
|
66
|
+
: dest;
|
|
67
|
+
};
|
|
68
|
+
return (value) => value.replace(from, to);
|
|
69
69
|
}
|
|
70
70
|
export function cleanupCompact() {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
71
|
+
return (value) => {
|
|
72
|
+
if (value.includes(' as HasCompact')) {
|
|
73
|
+
for (let index = 0; index < value.length; index++) {
|
|
74
|
+
if (value[index] === '<') {
|
|
75
|
+
const end = findClosing(value, index + 1) - 14;
|
|
76
|
+
if (value.substring(end, end + 14) === ' as HasCompact') {
|
|
77
|
+
value = `Compact<${value.substring(index + 1, end)}>`;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
79
81
|
}
|
|
80
|
-
|
|
81
|
-
}
|
|
82
|
-
return value;
|
|
83
|
-
};
|
|
82
|
+
return value;
|
|
83
|
+
};
|
|
84
84
|
}
|
|
85
85
|
export function flattenSingleTuple() {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
86
|
+
const from1 = /,\)/g;
|
|
87
|
+
const from2 = /\(([^,]+)\)/;
|
|
88
|
+
return (value) => {
|
|
89
|
+
from1.lastIndex = 0;
|
|
90
|
+
return value
|
|
91
|
+
// tuples may have trailing commas, e.g. (u32, BlockNumber, )
|
|
92
|
+
.replace(from1, ')')
|
|
93
|
+
// change (u32) -> u32
|
|
94
|
+
.replace(from2, '$1');
|
|
95
|
+
};
|
|
96
96
|
}
|
|
97
97
|
function replaceTagWith(value, matcher, replacer) {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
98
|
+
let index = -1;
|
|
99
|
+
while (true) {
|
|
100
|
+
index = value.indexOf(matcher, index + 1);
|
|
101
|
+
if (index === -1) {
|
|
102
|
+
return value;
|
|
103
|
+
}
|
|
104
|
+
const start = index + matcher.length;
|
|
105
|
+
const end = findClosing(value, start);
|
|
106
|
+
value = `${value.substring(0, index)}${replacer(value.substring(start, end))}${value.substring(end + 1)}`;
|
|
103
107
|
}
|
|
104
|
-
const start = index + matcher.length;
|
|
105
|
-
const end = findClosing(value, start);
|
|
106
|
-
value = `${value.substring(0, index)}${replacer(value.substring(start, end))}${value.substring(end + 1)}`;
|
|
107
|
-
}
|
|
108
108
|
}
|
|
109
|
-
|
|
110
|
-
// remove the Bounded* or Weak* wrappers
|
|
111
109
|
export function removeExtensions(type, isSized) {
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
110
|
+
return (value) => {
|
|
111
|
+
for (let i = 0; i < BOUNDED.length; i++) {
|
|
112
|
+
const tag = BOUNDED[i];
|
|
113
|
+
value = replaceTagWith(value, `${type}${tag}<`, (v) => {
|
|
114
|
+
const parts = v
|
|
115
|
+
.split(',')
|
|
116
|
+
.map((s) => s.trim())
|
|
117
|
+
.filter((s) => s);
|
|
118
|
+
if (isSized) {
|
|
119
|
+
parts.pop();
|
|
120
|
+
}
|
|
121
|
+
return `${tag}<${parts.join(',')}>`;
|
|
122
|
+
});
|
|
119
123
|
}
|
|
120
|
-
return
|
|
121
|
-
|
|
122
|
-
}
|
|
123
|
-
return value;
|
|
124
|
-
};
|
|
124
|
+
return value;
|
|
125
|
+
};
|
|
125
126
|
}
|
|
126
127
|
export function removeColons() {
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
128
|
+
return (value) => {
|
|
129
|
+
let index = 0;
|
|
130
|
+
while (index !== -1) {
|
|
131
|
+
index = value.indexOf('::');
|
|
132
|
+
if (index === 0) {
|
|
133
|
+
value = value.substring(2);
|
|
134
|
+
}
|
|
135
|
+
else if (index !== -1) {
|
|
136
|
+
let start = index;
|
|
137
|
+
while (start !== -1 && !BOX_PRECEDING.includes(value[start])) {
|
|
138
|
+
start--;
|
|
139
|
+
}
|
|
140
|
+
value = `${value.substring(0, start + 1)}${value.substring(index + 2)}`;
|
|
141
|
+
}
|
|
137
142
|
}
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
}
|
|
141
|
-
return value;
|
|
142
|
-
};
|
|
143
|
+
return value;
|
|
144
|
+
};
|
|
143
145
|
}
|
|
144
146
|
export function removeGenerics() {
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
147
|
+
return (value) => {
|
|
148
|
+
for (let index = 0; index < value.length; index++) {
|
|
149
|
+
if (value[index] === '<') {
|
|
150
|
+
// check against the allowed wrappers, be it Vec<..>, Option<...> ...
|
|
151
|
+
const box = ALLOWED_BOXES.find((box) => {
|
|
152
|
+
const start = index - box.length;
|
|
153
|
+
return ((start >= 0 &&
|
|
154
|
+
value.substring(start, index) === box) && (
|
|
155
|
+
// make sure it is stand-alone, i.e. don't catch ElectionResult<...> as Result<...>
|
|
156
|
+
start === 0 ||
|
|
157
|
+
BOX_PRECEDING.includes(value[start - 1])));
|
|
158
|
+
});
|
|
159
|
+
// we have not found anything, unwrap generic innards
|
|
160
|
+
if (!box) {
|
|
161
|
+
const end = findClosing(value, index + 1);
|
|
162
|
+
value = `${value.substring(0, index)}${value.substring(end + 1)}`;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
160
165
|
}
|
|
161
|
-
|
|
162
|
-
}
|
|
163
|
-
return value;
|
|
164
|
-
};
|
|
166
|
+
return value;
|
|
167
|
+
};
|
|
165
168
|
}
|
|
166
|
-
|
|
167
|
-
// remove the PairOf wrappers
|
|
168
169
|
export function removePairOf() {
|
|
169
|
-
|
|
170
|
-
|
|
170
|
+
const replacer = (v) => `(${v},${v})`;
|
|
171
|
+
return (value) => replaceTagWith(value, 'PairOf<', replacer);
|
|
171
172
|
}
|
|
172
|
-
|
|
173
|
-
// remove the type traits
|
|
174
173
|
export function removeTraits() {
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
174
|
+
const from1 = /\s/g;
|
|
175
|
+
const from2 = /(T|Self)::/g;
|
|
176
|
+
const from3 = /<(T|Self)asTrait>::/g;
|
|
177
|
+
const from4 = /<Tas[a-z]+::Trait>::/g;
|
|
178
|
+
const from5 = /<LookupasStaticLookup>/g;
|
|
179
|
+
const from6 = /::Type/g;
|
|
180
|
+
return (value) => {
|
|
181
|
+
from1.lastIndex = 0;
|
|
182
|
+
from2.lastIndex = 0;
|
|
183
|
+
from3.lastIndex = 0;
|
|
184
|
+
from4.lastIndex = 0;
|
|
185
|
+
from5.lastIndex = 0;
|
|
186
|
+
from6.lastIndex = 0;
|
|
187
|
+
return value
|
|
188
|
+
// remove all whitespaces
|
|
189
|
+
.replace(from1, '')
|
|
190
|
+
// anything `T::<type>` to end up as `<type>`
|
|
191
|
+
.replace(from2, '')
|
|
192
|
+
// replace `<T as Trait>::` (whitespaces were removed above)
|
|
193
|
+
.replace(from3, '')
|
|
194
|
+
// replace `<T as something::Trait>::` (whitespaces were removed above)
|
|
195
|
+
.replace(from4, '')
|
|
196
|
+
// replace <Lookup as StaticLookup>
|
|
197
|
+
.replace(from5, 'Lookup')
|
|
198
|
+
// replace `<...>::Type`
|
|
199
|
+
.replace(from6, '');
|
|
200
|
+
};
|
|
202
201
|
}
|
|
203
|
-
|
|
204
|
-
// remove wrapping values, i.e. Box<Proposal> -> Proposal
|
|
205
202
|
export function removeWrap(check) {
|
|
206
|
-
|
|
207
|
-
|
|
203
|
+
const replacer = (v) => v;
|
|
204
|
+
return (value) => replaceTagWith(value, check, replacer);
|
|
208
205
|
}
|
|
209
206
|
const sanitizeMap = new Map();
|
|
210
207
|
export function sanitize(value) {
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
208
|
+
const startValue = value.toString();
|
|
209
|
+
const memoized = sanitizeMap.get(startValue);
|
|
210
|
+
if (memoized) {
|
|
211
|
+
return memoized;
|
|
212
|
+
}
|
|
213
|
+
let result = startValue;
|
|
214
|
+
for (let i = 0; i < mappings.length; i++) {
|
|
215
|
+
result = mappings[i](result);
|
|
216
|
+
}
|
|
217
|
+
sanitizeMap.set(startValue, result);
|
|
218
|
+
return result;
|
|
222
219
|
}
|
package/utils/sortValues.js
CHANGED
|
@@ -1,64 +1,60 @@
|
|
|
1
|
-
// Copyright 2017-2023 @polkadot/types-codec authors & contributors
|
|
2
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
|
|
4
1
|
import { bnToBn, isBigInt, isBn, isFunction, isNumber, stringify } from '@polkadot/util';
|
|
5
2
|
/** @internal **/
|
|
6
3
|
function isArrayLike(arg) {
|
|
7
|
-
|
|
4
|
+
return arg instanceof Uint8Array || Array.isArray(arg);
|
|
8
5
|
}
|
|
9
|
-
|
|
10
6
|
/** @internal **/
|
|
11
7
|
function isCodec(arg) {
|
|
12
|
-
|
|
8
|
+
return isFunction(arg && arg.toU8a);
|
|
13
9
|
}
|
|
14
|
-
|
|
15
10
|
/** @internal **/
|
|
16
11
|
function isEnum(arg) {
|
|
17
|
-
|
|
12
|
+
return isCodec(arg) && isNumber(arg.index) && isCodec(arg.value);
|
|
18
13
|
}
|
|
19
|
-
|
|
20
14
|
/** @internal */
|
|
21
15
|
function isNumberLike(arg) {
|
|
22
|
-
|
|
16
|
+
return isNumber(arg) || isBn(arg) || isBigInt(arg);
|
|
23
17
|
}
|
|
24
|
-
|
|
25
18
|
/** @internal */
|
|
26
19
|
function sortArray(a, b) {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
20
|
+
// Vec, Tuple, Bytes etc.
|
|
21
|
+
let sortRes = 0;
|
|
22
|
+
const minLen = Math.min(a.length, b.length);
|
|
23
|
+
for (let i = 0; i < minLen; ++i) {
|
|
24
|
+
sortRes = sortAsc(a[i], b[i]);
|
|
25
|
+
if (sortRes !== 0) {
|
|
26
|
+
return sortRes;
|
|
27
|
+
}
|
|
34
28
|
}
|
|
35
|
-
|
|
36
|
-
return a.length - b.length;
|
|
29
|
+
return a.length - b.length;
|
|
37
30
|
}
|
|
38
|
-
|
|
39
31
|
/**
|
|
40
32
|
* Sort keys/values of BTreeSet/BTreeMap in ascending order for encoding compatibility with Rust's BTreeSet/BTreeMap
|
|
41
33
|
* (https://doc.rust-lang.org/stable/std/collections/struct.BTreeSet.html)
|
|
42
34
|
* (https://doc.rust-lang.org/stable/std/collections/struct.BTreeMap.html)
|
|
43
35
|
*/
|
|
44
36
|
export function sortAsc(a, b) {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
37
|
+
if (isNumberLike(a) && isNumberLike(b)) {
|
|
38
|
+
return bnToBn(a).cmp(bnToBn(b));
|
|
39
|
+
}
|
|
40
|
+
else if (a instanceof Map && b instanceof Map) {
|
|
41
|
+
return sortAsc(Array.from(a.values()), Array.from(b.values()));
|
|
42
|
+
}
|
|
43
|
+
else if (isEnum(a) && isEnum(b)) {
|
|
44
|
+
return sortAsc(a.index, b.index) || sortAsc(a.value, b.value);
|
|
45
|
+
}
|
|
46
|
+
else if (isArrayLike(a) && isArrayLike(b)) {
|
|
47
|
+
return sortArray(a, b);
|
|
48
|
+
}
|
|
49
|
+
else if (isCodec(a) && isCodec(b)) {
|
|
50
|
+
// Text, Bool etc.
|
|
51
|
+
return sortAsc(a.toU8a(true), b.toU8a(true));
|
|
52
|
+
}
|
|
53
|
+
throw new Error(`Attempting to sort unrecognized values: ${stringify(a)} (typeof ${typeof a}) <-> ${stringify(b)} (typeof ${typeof b})`);
|
|
58
54
|
}
|
|
59
55
|
export function sortSet(set) {
|
|
60
|
-
|
|
56
|
+
return new Set(Array.from(set).sort(sortAsc));
|
|
61
57
|
}
|
|
62
58
|
export function sortMap(map) {
|
|
63
|
-
|
|
59
|
+
return new Map(Array.from(map.entries()).sort(([keyA], [keyB]) => sortAsc(keyA, keyB)));
|
|
64
60
|
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
// Copyright 2017-2023 @polkadot/types-codec authors & contributors
|
|
2
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
|
|
4
1
|
import { isString } from '@polkadot/util';
|
|
5
2
|
export function typeToConstructor(registry, type) {
|
|
6
|
-
|
|
3
|
+
return (isString(type)
|
|
4
|
+
? registry.createClassUnsafe(type)
|
|
5
|
+
: type);
|
|
7
6
|
}
|
package/utils/typesToMap.js
CHANGED
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
// Copyright 2017-2023 @polkadot/types-codec authors & contributors
|
|
2
|
-
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
|
|
4
1
|
export function typesToMap(registry, [Types, keys]) {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
2
|
+
const result = {};
|
|
3
|
+
for (let i = 0; i < keys.length; i++) {
|
|
4
|
+
result[keys[i]] = registry.getClassName(Types[i]) || new Types[i](registry).toRawType();
|
|
5
|
+
}
|
|
6
|
+
return result;
|
|
10
7
|
}
|
package/utils/util.js
CHANGED