@pezkuwi/types-create 16.5.5
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/README.md +3 -0
- package/build/bundle.d.ts +3 -0
- package/build/create/class.d.ts +5 -0
- package/build/create/index.d.ts +2 -0
- package/build/create/type.d.ts +3 -0
- package/build/exports.d.ts +2 -0
- package/build/index.d.ts +2 -0
- package/build/packageDetect.d.ts +1 -0
- package/build/packageInfo.d.ts +6 -0
- package/build/types/augmentRegistry.d.ts +11 -0
- package/build/types/index.d.ts +4 -0
- package/build/types/lookup.d.ts +14 -0
- package/build/types/types.d.ts +43 -0
- package/build/util/encodeTypes.d.ts +11 -0
- package/build/util/getTypeDef.d.ts +8 -0
- package/build/util/index.d.ts +4 -0
- package/build/util/typeSplit.d.ts +1 -0
- package/build/util/xcm.d.ts +2 -0
- package/package.json +31 -0
- package/src/bundle.ts +9 -0
- package/src/create/class.ts +257 -0
- package/src/create/index.ts +5 -0
- package/src/create/type.ts +94 -0
- package/src/exports.ts +6 -0
- package/src/index.ts +6 -0
- package/src/mod.ts +4 -0
- package/src/packageDetect.ts +12 -0
- package/src/packageInfo.ts +6 -0
- package/src/types/augmentRegistry.ts +19 -0
- package/src/types/index.ts +11 -0
- package/src/types/lookup.ts +21 -0
- package/src/types/types.ts +47 -0
- package/src/util/encodeTypes.spec.ts +217 -0
- package/src/util/encodeTypes.ts +205 -0
- package/src/util/getTypeDef.spec.ts +704 -0
- package/src/util/getTypeDef.ts +279 -0
- package/src/util/index.ts +7 -0
- package/src/util/typeSplit.spec.ts +50 -0
- package/src/util/typeSplit.ts +56 -0
- package/src/util/xcm.ts +12 -0
- package/tsconfig.build.json +15 -0
- package/tsconfig.build.tsbuildinfo +1 -0
- package/tsconfig.spec.json +17 -0
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
// Copyright 2017-2025 @polkadot/types-create authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import type { AnyString } from '@pezkuwi/types-codec/types';
|
|
5
|
+
import type { TypeDef } from '@pezkuwi/types-create/types';
|
|
6
|
+
|
|
7
|
+
import { sanitize } from '@pezkuwi/types-codec';
|
|
8
|
+
import { isNumber, isString, objectSpread, stringify } from '@pezkuwi/util';
|
|
9
|
+
|
|
10
|
+
import { TypeDefInfo } from '../types/index.js';
|
|
11
|
+
import { typeSplit } from './typeSplit.js';
|
|
12
|
+
|
|
13
|
+
interface TypeDefOptions {
|
|
14
|
+
name?: string;
|
|
15
|
+
displayName?: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
interface SetDetails {
|
|
19
|
+
_bitLength: number;
|
|
20
|
+
index: number;
|
|
21
|
+
|
|
22
|
+
[key: string]: number;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
interface ParsedDef {
|
|
26
|
+
_alias: string;
|
|
27
|
+
_enum?: string[];
|
|
28
|
+
_fallback?: string;
|
|
29
|
+
_set?: SetDetails;
|
|
30
|
+
|
|
31
|
+
[key: string]: unknown;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const KNOWN_INTERNALS = ['_alias', '_fallback'];
|
|
35
|
+
|
|
36
|
+
function getTypeString (typeOrObj: any): string {
|
|
37
|
+
return isString(typeOrObj)
|
|
38
|
+
? typeOrObj.toString()
|
|
39
|
+
: stringify(typeOrObj);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function isRustEnum (details: Record<string, string> | Record<string, number>): details is Record<string, string> {
|
|
43
|
+
const values = Object.values(details);
|
|
44
|
+
|
|
45
|
+
if (values.some((v) => isNumber(v))) {
|
|
46
|
+
if (!values.every((v) => isNumber(v) && v >= 0 && v <= 255)) {
|
|
47
|
+
throw new Error('Invalid number-indexed enum definition');
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// decode an enum of either of the following forms
|
|
57
|
+
// { _enum: ['A', 'B', 'C'] }
|
|
58
|
+
// { _enum: { A: AccountId, B: Balance, C: u32 } }
|
|
59
|
+
// { _enum: { A: 1, B: 2 } }
|
|
60
|
+
function _decodeEnum (value: TypeDef, details: string[] | Record<string, string> | Record<string, number>, count: number, fallbackType?: string): TypeDef {
|
|
61
|
+
value.info = TypeDefInfo.Enum;
|
|
62
|
+
value.fallbackType = fallbackType;
|
|
63
|
+
|
|
64
|
+
// not as pretty, but remain compatible with oo7 for both struct and Array types
|
|
65
|
+
if (Array.isArray(details)) {
|
|
66
|
+
value.sub = details.map((name, index): TypeDef => ({
|
|
67
|
+
index,
|
|
68
|
+
info: TypeDefInfo.Plain,
|
|
69
|
+
name,
|
|
70
|
+
type: 'Null'
|
|
71
|
+
}));
|
|
72
|
+
} else if (isRustEnum(details)) {
|
|
73
|
+
value.sub = Object.entries(details).map(([name, typeOrObj], index): TypeDef =>
|
|
74
|
+
objectSpread({}, getTypeDef(getTypeString(typeOrObj || 'Null'), { name }, count), { index })
|
|
75
|
+
);
|
|
76
|
+
} else {
|
|
77
|
+
value.sub = Object.entries(details).map(([name, index]): TypeDef => ({
|
|
78
|
+
index,
|
|
79
|
+
info: TypeDefInfo.Plain,
|
|
80
|
+
name,
|
|
81
|
+
type: 'Null'
|
|
82
|
+
}));
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
return value;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// decode a set of the form
|
|
89
|
+
// { _set: { A: 0b0001, B: 0b0010, C: 0b0100 } }
|
|
90
|
+
function _decodeSet (value: TypeDef, details: SetDetails, fallbackType: string | undefined): TypeDef {
|
|
91
|
+
value.info = TypeDefInfo.Set;
|
|
92
|
+
value.fallbackType = fallbackType;
|
|
93
|
+
value.length = details._bitLength;
|
|
94
|
+
value.sub = Object
|
|
95
|
+
.entries(details)
|
|
96
|
+
.filter(([name]): boolean => !name.startsWith('_'))
|
|
97
|
+
.map(([name, index]): TypeDef => ({
|
|
98
|
+
index,
|
|
99
|
+
info: TypeDefInfo.Plain,
|
|
100
|
+
name,
|
|
101
|
+
type: 'Null'
|
|
102
|
+
}));
|
|
103
|
+
|
|
104
|
+
return value;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// decode a struct, set or enum
|
|
108
|
+
function _decodeStruct (value: TypeDef, type: string, _: string, count: number): TypeDef {
|
|
109
|
+
const parsed = JSON.parse(type) as ParsedDef;
|
|
110
|
+
const keys = Object.keys(parsed);
|
|
111
|
+
|
|
112
|
+
if (parsed._enum) {
|
|
113
|
+
return _decodeEnum(value, parsed._enum, count, parsed._fallback);
|
|
114
|
+
} else if (parsed._set) {
|
|
115
|
+
return _decodeSet(value, parsed._set, parsed._fallback);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
value.alias = parsed._alias
|
|
119
|
+
? new Map(Object.entries(parsed._alias))
|
|
120
|
+
: undefined;
|
|
121
|
+
value.fallbackType = parsed._fallback;
|
|
122
|
+
value.sub = keys
|
|
123
|
+
.filter((name) => !KNOWN_INTERNALS.includes(name))
|
|
124
|
+
.map((name) =>
|
|
125
|
+
getTypeDef(getTypeString(parsed[name]), { name }, count)
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
return value;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// decode a fixed vector, e.g. [u8;32]
|
|
132
|
+
function _decodeFixedVec (value: TypeDef, type: string, _: string, count: number): TypeDef {
|
|
133
|
+
const max = type.length - 1;
|
|
134
|
+
let index = -1;
|
|
135
|
+
let inner = 0;
|
|
136
|
+
|
|
137
|
+
for (let i = 1; (i < max) && (index === -1); i++) {
|
|
138
|
+
switch (type[i]) {
|
|
139
|
+
case ';': {
|
|
140
|
+
if (inner === 0) {
|
|
141
|
+
index = i;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
break;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
case '[':
|
|
148
|
+
case '(':
|
|
149
|
+
case '<':
|
|
150
|
+
inner++;
|
|
151
|
+
break;
|
|
152
|
+
|
|
153
|
+
case ']':
|
|
154
|
+
case ')':
|
|
155
|
+
case '>':
|
|
156
|
+
inner--;
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
if (index === -1) {
|
|
162
|
+
throw new Error(`${type}: Unable to extract location of ';'`);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
const vecType = type.substring(1, index);
|
|
166
|
+
const [strLength, displayName] = type.substring(index + 1, max).split(';');
|
|
167
|
+
const length = parseInt(strLength.trim(), 10);
|
|
168
|
+
|
|
169
|
+
if (length > 2048) {
|
|
170
|
+
throw new Error(`${type}: Only support for [Type; <length>], where length <= 2048`);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
value.displayName = displayName;
|
|
174
|
+
value.length = length;
|
|
175
|
+
value.sub = getTypeDef(vecType, {}, count);
|
|
176
|
+
|
|
177
|
+
return value;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// decode a tuple
|
|
181
|
+
function _decodeTuple (value: TypeDef, _: string, subType: string, count: number): TypeDef {
|
|
182
|
+
value.sub = subType.length === 0
|
|
183
|
+
? []
|
|
184
|
+
: typeSplit(subType).map((inner) => getTypeDef(inner, {}, count));
|
|
185
|
+
|
|
186
|
+
return value;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// decode a Int/UInt<bitLength[, name]>
|
|
190
|
+
function _decodeAnyInt (value: TypeDef, type: string, _: string, clazz: 'Int' | 'UInt'): TypeDef {
|
|
191
|
+
const [strLength, displayName] = type.substring(clazz.length + 1, type.length - 1).split(',');
|
|
192
|
+
const length = parseInt(strLength.trim(), 10);
|
|
193
|
+
|
|
194
|
+
if ((length > 8192) || (length % 8)) {
|
|
195
|
+
throw new Error(`${type}: Only support for ${clazz}<bitLength>, where length <= 8192 and a power of 8, found ${length}`);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
value.displayName = displayName;
|
|
199
|
+
value.length = length;
|
|
200
|
+
|
|
201
|
+
return value;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
function _decodeInt (value: TypeDef, type: string, subType: string): TypeDef {
|
|
205
|
+
return _decodeAnyInt(value, type, subType, 'Int');
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
function _decodeUInt (value: TypeDef, type: string, subType: string): TypeDef {
|
|
209
|
+
return _decodeAnyInt(value, type, subType, 'UInt');
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
function _decodeDoNotConstruct (value: TypeDef, type: string, _: string): TypeDef {
|
|
213
|
+
const NAME_LENGTH = 'DoNotConstruct'.length;
|
|
214
|
+
|
|
215
|
+
value.displayName = type.substring(NAME_LENGTH + 1, type.length - 1);
|
|
216
|
+
|
|
217
|
+
return value;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
function hasWrapper (type: string, [start, end]: [string, string, TypeDefInfo, any?]): boolean {
|
|
221
|
+
return (type.startsWith(start)) && (type.slice(-1 * end.length) === end);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
const nestedExtraction: [string, string, TypeDefInfo, (value: TypeDef, type: string, subType: string, count: number) => TypeDef][] = [
|
|
225
|
+
['[', ']', TypeDefInfo.VecFixed, _decodeFixedVec],
|
|
226
|
+
['{', '}', TypeDefInfo.Struct, _decodeStruct],
|
|
227
|
+
['(', ')', TypeDefInfo.Tuple, _decodeTuple],
|
|
228
|
+
// the inner for these are the same as tuple, multiple values
|
|
229
|
+
['BTreeMap<', '>', TypeDefInfo.BTreeMap, _decodeTuple],
|
|
230
|
+
['HashMap<', '>', TypeDefInfo.HashMap, _decodeTuple],
|
|
231
|
+
['Int<', '>', TypeDefInfo.Int, _decodeInt],
|
|
232
|
+
['Result<', '>', TypeDefInfo.Result, _decodeTuple],
|
|
233
|
+
['UInt<', '>', TypeDefInfo.UInt, _decodeUInt],
|
|
234
|
+
['DoNotConstruct<', '>', TypeDefInfo.DoNotConstruct, _decodeDoNotConstruct]
|
|
235
|
+
];
|
|
236
|
+
|
|
237
|
+
const wrappedExtraction: [string, string, TypeDefInfo][] = [
|
|
238
|
+
['BTreeSet<', '>', TypeDefInfo.BTreeSet],
|
|
239
|
+
['Compact<', '>', TypeDefInfo.Compact],
|
|
240
|
+
['Linkage<', '>', TypeDefInfo.Linkage],
|
|
241
|
+
['Opaque<', '>', TypeDefInfo.WrapperOpaque],
|
|
242
|
+
['Option<', '>', TypeDefInfo.Option],
|
|
243
|
+
['Range<', '>', TypeDefInfo.Range],
|
|
244
|
+
['RangeInclusive<', '>', TypeDefInfo.RangeInclusive],
|
|
245
|
+
['Vec<', '>', TypeDefInfo.Vec],
|
|
246
|
+
['WrapperKeepOpaque<', '>', TypeDefInfo.WrapperKeepOpaque],
|
|
247
|
+
['WrapperOpaque<', '>', TypeDefInfo.WrapperOpaque]
|
|
248
|
+
];
|
|
249
|
+
|
|
250
|
+
function extractSubType (type: string, [start, end]: [string, string, TypeDefInfo, any?]): string {
|
|
251
|
+
return type.substring(start.length, type.length - end.length);
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
export function getTypeDef (_type: AnyString, { displayName, name }: TypeDefOptions = {}, count = 0): TypeDef {
|
|
255
|
+
// create the type via Type, allowing types to be sanitized
|
|
256
|
+
const type = sanitize(_type);
|
|
257
|
+
const value: TypeDef = { displayName, info: TypeDefInfo.Plain, name, type };
|
|
258
|
+
|
|
259
|
+
if (++count > 64) {
|
|
260
|
+
throw new Error('getTypeDef: Maximum nested limit reached');
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
const nested = nestedExtraction.find((nested) => hasWrapper(type, nested));
|
|
264
|
+
|
|
265
|
+
if (nested) {
|
|
266
|
+
value.info = nested[2];
|
|
267
|
+
|
|
268
|
+
return nested[3](value, type, extractSubType(type, nested), count);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
const wrapped = wrappedExtraction.find((wrapped) => hasWrapper(type, wrapped));
|
|
272
|
+
|
|
273
|
+
if (wrapped) {
|
|
274
|
+
value.info = wrapped[2];
|
|
275
|
+
value.sub = getTypeDef(extractSubType(type, wrapped), {}, count);
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
return value;
|
|
279
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// Copyright 2017-2025 @polkadot/types authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
/// <reference types="@pezkuwi/dev-test/globals.d.ts" />
|
|
5
|
+
|
|
6
|
+
import { typeSplit } from '@pezkuwi/types-create';
|
|
7
|
+
|
|
8
|
+
describe('typeSplit', (): void => {
|
|
9
|
+
it('splits simple types into an array', (): void => {
|
|
10
|
+
expect(
|
|
11
|
+
typeSplit('Text, u32, u64')
|
|
12
|
+
).toEqual(['Text', 'u32', 'u64']);
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it('splits nested combinations', (): void => {
|
|
16
|
+
expect(
|
|
17
|
+
typeSplit('Text, (u32), Vec<u64>')
|
|
18
|
+
).toEqual(['Text', '(u32)', 'Vec<u64>']);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it('keeps nested tuples together', (): void => {
|
|
22
|
+
expect(
|
|
23
|
+
typeSplit('Text, (u32, u128), Vec<u64>')
|
|
24
|
+
).toEqual(['Text', '(u32, u128)', 'Vec<u64>']);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it('keeps nested vector tuples together', (): void => {
|
|
28
|
+
expect(
|
|
29
|
+
typeSplit('Text, (u32, u128), Vec<(u64, u32)>')
|
|
30
|
+
).toEqual(['Text', '(u32, u128)', 'Vec<(u64, u32)>']);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it('allows for deep nesting', (): void => {
|
|
34
|
+
expect(
|
|
35
|
+
typeSplit('Text, (u32, (u128, u8)), Vec<(u64, (u32, u32))>')
|
|
36
|
+
).toEqual(['Text', '(u32, (u128, u8))', 'Vec<(u64, (u32, u32))>']);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('checks for unclosed vec', (): void => {
|
|
40
|
+
expect(
|
|
41
|
+
() => typeSplit('Text, Vec<u64')
|
|
42
|
+
).toThrow(/Invalid definition/);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it('checks for unclosed tuple', (): void => {
|
|
46
|
+
expect(
|
|
47
|
+
() => typeSplit('Text, (u64, u32')
|
|
48
|
+
).toThrow(/Invalid definition/);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
// Copyright 2017-2025 @polkadot/types-create authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
// safely split a string on ', ' while taking care of any nested occurences
|
|
5
|
+
export function typeSplit (type: string): string[] {
|
|
6
|
+
const result: string[] = [];
|
|
7
|
+
|
|
8
|
+
// these are the depths of the various tokens: <, [, {, (
|
|
9
|
+
let c = 0;
|
|
10
|
+
let f = 0;
|
|
11
|
+
let s = 0;
|
|
12
|
+
let t = 0;
|
|
13
|
+
|
|
14
|
+
// current start position
|
|
15
|
+
let start = 0;
|
|
16
|
+
|
|
17
|
+
for (let i = 0, count = type.length; i < count; i++) {
|
|
18
|
+
switch (type[i]) {
|
|
19
|
+
// if we are not nested, add the type
|
|
20
|
+
case ',': {
|
|
21
|
+
if (!(c || f || s || t)) {
|
|
22
|
+
result.push(type.substring(start, i).trim());
|
|
23
|
+
start = i + 1;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
break;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// adjust compact/vec (and friends) depth
|
|
30
|
+
case '<': c++; break;
|
|
31
|
+
case '>': c--; break;
|
|
32
|
+
|
|
33
|
+
// adjust fixed vec depths
|
|
34
|
+
case '[': f++; break;
|
|
35
|
+
case ']': f--; break;
|
|
36
|
+
|
|
37
|
+
// adjust struct depth
|
|
38
|
+
case '{': s++; break;
|
|
39
|
+
case '}': s--; break;
|
|
40
|
+
|
|
41
|
+
// adjust tuple depth
|
|
42
|
+
case '(': t++; break;
|
|
43
|
+
case ')': t--; break;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// ensure we have all the terminators taken care of
|
|
48
|
+
if (c || f || s || t) {
|
|
49
|
+
throw new Error(`Invalid definition (missing terminators) found in ${type}`);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// the final leg of the journey
|
|
53
|
+
result.push(type.substring(start, type.length).trim());
|
|
54
|
+
|
|
55
|
+
return result;
|
|
56
|
+
}
|
package/src/util/xcm.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// Copyright 2017-2025 @polkadot/types-create authors & contributors
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import { objectSpread } from '@pezkuwi/util';
|
|
5
|
+
|
|
6
|
+
export const XCM_MAPPINGS = ['AssetInstance', 'Fungibility', 'Junction', 'Junctions', 'MultiAsset', 'MultiAssetFilter', 'MultiLocation', 'Response', 'WildFungibility', 'WildMultiAsset', 'Xcm', 'XcmError'];
|
|
7
|
+
|
|
8
|
+
export function mapXcmTypes (version: 'V0' | 'V1' | 'V2' | 'V3' | 'V4' | 'V5'): Record<string, string> {
|
|
9
|
+
return XCM_MAPPINGS.reduce<Record<string, string>>((all, key) =>
|
|
10
|
+
objectSpread(all, { [key]: `${key}${version}` }), {}
|
|
11
|
+
);
|
|
12
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"extends": "../../tsconfig.base.json",
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
"baseUrl": "..",
|
|
5
|
+
"outDir": "./build",
|
|
6
|
+
"rootDir": "./src"
|
|
7
|
+
},
|
|
8
|
+
"exclude": [
|
|
9
|
+
"**/*.spec.ts",
|
|
10
|
+
"**/mod.ts"
|
|
11
|
+
],
|
|
12
|
+
"references": [
|
|
13
|
+
{ "path": "../types-codec/tsconfig.build.json" }
|
|
14
|
+
]
|
|
15
|
+
}
|