@dedot/codegen 0.0.1-next.41a5fa17.16 → 0.0.1-next.49d80ab2.3

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 (149) hide show
  1. package/{generator → chaintypes/generator}/ApiGen.d.ts +13 -13
  2. package/chaintypes/generator/ConstsGen.d.ts +4 -0
  3. package/{generator → chaintypes/generator}/ConstsGen.js +6 -6
  4. package/{generator → chaintypes/generator}/ErrorsGen.d.ts +1 -1
  5. package/{generator → chaintypes/generator}/ErrorsGen.js +10 -10
  6. package/{generator → chaintypes/generator}/EventsGen.d.ts +1 -1
  7. package/{generator → chaintypes/generator}/EventsGen.js +10 -10
  8. package/chaintypes/generator/IndexGen.d.ts +5 -0
  9. package/chaintypes/generator/IndexGen.js +17 -0
  10. package/chaintypes/generator/JsonRpcGen.d.ts +8 -0
  11. package/chaintypes/generator/JsonRpcGen.js +55 -0
  12. package/chaintypes/generator/QueryGen.d.ts +5 -0
  13. package/{generator → chaintypes/generator}/QueryGen.js +27 -18
  14. package/chaintypes/generator/RuntimeApisGen.d.ts +9 -0
  15. package/{generator → chaintypes/generator}/RuntimeApisGen.js +95 -20
  16. package/{generator → chaintypes/generator}/TxGen.d.ts +1 -1
  17. package/{generator → chaintypes/generator}/TxGen.js +17 -15
  18. package/chaintypes/generator/TypesGen.d.ts +11 -0
  19. package/chaintypes/generator/TypesGen.js +55 -0
  20. package/{generator → chaintypes/generator}/index.d.ts +1 -1
  21. package/{generator → chaintypes/generator}/index.js +1 -1
  22. package/chaintypes/index.d.ts +3 -0
  23. package/chaintypes/index.js +49 -0
  24. package/chaintypes/templates/consts.hbs +7 -0
  25. package/chaintypes/templates/errors.hbs +7 -0
  26. package/chaintypes/templates/events.hbs +7 -0
  27. package/chaintypes/templates/index.hbs +27 -0
  28. package/chaintypes/templates/json-rpc.hbs +5 -0
  29. package/chaintypes/templates/query.hbs +7 -0
  30. package/chaintypes/templates/runtime.hbs +8 -0
  31. package/chaintypes/templates/tx.hbs +9 -0
  32. package/{cjs → chaintypes}/templates/types.hbs +1 -1
  33. package/cjs/{generator → chaintypes/generator}/ConstsGen.js +7 -7
  34. package/cjs/{generator → chaintypes/generator}/ErrorsGen.js +10 -10
  35. package/cjs/{generator → chaintypes/generator}/EventsGen.js +10 -10
  36. package/cjs/chaintypes/generator/IndexGen.js +21 -0
  37. package/cjs/chaintypes/generator/JsonRpcGen.js +59 -0
  38. package/cjs/{generator → chaintypes/generator}/QueryGen.js +28 -19
  39. package/cjs/{generator → chaintypes/generator}/RuntimeApisGen.js +97 -22
  40. package/cjs/{generator → chaintypes/generator}/TxGen.js +17 -15
  41. package/cjs/chaintypes/generator/TypesGen.js +59 -0
  42. package/cjs/{generator → chaintypes/generator}/index.js +1 -1
  43. package/cjs/chaintypes/index.js +77 -0
  44. package/cjs/chaintypes/templates/consts.hbs +7 -0
  45. package/cjs/chaintypes/templates/errors.hbs +7 -0
  46. package/cjs/chaintypes/templates/events.hbs +7 -0
  47. package/cjs/chaintypes/templates/index.hbs +27 -0
  48. package/cjs/chaintypes/templates/json-rpc.hbs +5 -0
  49. package/cjs/chaintypes/templates/query.hbs +7 -0
  50. package/cjs/chaintypes/templates/runtime.hbs +8 -0
  51. package/cjs/chaintypes/templates/tx.hbs +9 -0
  52. package/{templates → cjs/chaintypes/templates}/types.hbs +1 -1
  53. package/cjs/index.js +4 -62
  54. package/cjs/{generator/TypesGen.js → shared/BaseTypesGen.js} +112 -166
  55. package/cjs/{generator → shared}/TypeImports.js +29 -3
  56. package/cjs/shared/index.js +19 -0
  57. package/cjs/{generator → shared}/known-codecs.js +24 -5
  58. package/cjs/typink/generator/ConstructorQueryGen.js +24 -0
  59. package/cjs/typink/generator/ConstructorTxGen.js +24 -0
  60. package/cjs/typink/generator/IndexGen.js +24 -0
  61. package/cjs/typink/generator/QueryGen.js +72 -0
  62. package/cjs/typink/generator/TxGen.js +25 -0
  63. package/cjs/typink/generator/TypesGen.js +28 -0
  64. package/cjs/typink/generator/index.js +22 -0
  65. package/cjs/typink/index.js +37 -0
  66. package/cjs/typink/templates/constructor-query.hbs +7 -0
  67. package/cjs/typink/templates/constructor-tx.hbs +7 -0
  68. package/cjs/typink/templates/index.hbs +14 -0
  69. package/cjs/typink/templates/query.hbs +7 -0
  70. package/cjs/typink/templates/tx.hbs +7 -0
  71. package/cjs/typink/templates/types.hbs +5 -0
  72. package/cjs/{generator/utils.js → utils.js} +4 -4
  73. package/index.d.ts +2 -4
  74. package/index.js +2 -48
  75. package/package.json +15 -17
  76. package/{generator/TypesGen.d.ts → shared/BaseTypesGen.d.ts} +12 -11
  77. package/{generator/TypesGen.js → shared/BaseTypesGen.js} +109 -163
  78. package/{generator → shared}/TypeImports.d.ts +12 -1
  79. package/{generator → shared}/TypeImports.js +29 -3
  80. package/shared/index.d.ts +3 -0
  81. package/shared/index.js +3 -0
  82. package/{generator → shared}/known-codecs.d.ts +1 -1
  83. package/{generator → shared}/known-codecs.js +22 -3
  84. package/typink/generator/ConstructorQueryGen.d.ts +6 -0
  85. package/typink/generator/ConstructorQueryGen.js +20 -0
  86. package/typink/generator/ConstructorTxGen.d.ts +6 -0
  87. package/typink/generator/ConstructorTxGen.js +20 -0
  88. package/typink/generator/IndexGen.d.ts +6 -0
  89. package/typink/generator/IndexGen.js +20 -0
  90. package/typink/generator/QueryGen.d.ts +12 -0
  91. package/typink/generator/QueryGen.js +68 -0
  92. package/typink/generator/TxGen.d.ts +6 -0
  93. package/typink/generator/TxGen.js +21 -0
  94. package/typink/generator/TypesGen.d.ts +7 -0
  95. package/typink/generator/TypesGen.js +24 -0
  96. package/typink/generator/index.d.ts +6 -0
  97. package/typink/generator/index.js +6 -0
  98. package/typink/index.d.ts +2 -0
  99. package/typink/index.js +30 -0
  100. package/typink/templates/constructor-query.hbs +7 -0
  101. package/typink/templates/constructor-tx.hbs +7 -0
  102. package/typink/templates/index.hbs +14 -0
  103. package/typink/templates/query.hbs +7 -0
  104. package/typink/templates/tx.hbs +7 -0
  105. package/typink/templates/types.hbs +5 -0
  106. package/{generator/utils.d.ts → utils.d.ts} +1 -1
  107. package/{generator/utils.js → utils.js} +4 -4
  108. package/cjs/genSupportedChainTypes.js +0 -83
  109. package/cjs/generator/IndexGen.js +0 -18
  110. package/cjs/generator/RpcGen.js +0 -175
  111. package/cjs/generator/known-types.js +0 -33
  112. package/cjs/packageInfo.js +0 -5
  113. package/cjs/templates/consts.hbs +0 -7
  114. package/cjs/templates/errors.hbs +0 -7
  115. package/cjs/templates/events.hbs +0 -7
  116. package/cjs/templates/index.hbs +0 -22
  117. package/cjs/templates/query.hbs +0 -7
  118. package/cjs/templates/rpc.hbs +0 -7
  119. package/cjs/templates/runtime.hbs +0 -8
  120. package/cjs/templates/tx.hbs +0 -9
  121. package/cjs/types.js +0 -2
  122. package/genSupportedChainTypes.d.ts +0 -1
  123. package/genSupportedChainTypes.js +0 -78
  124. package/generator/ConstsGen.d.ts +0 -4
  125. package/generator/IndexGen.d.ts +0 -6
  126. package/generator/IndexGen.js +0 -14
  127. package/generator/QueryGen.d.ts +0 -5
  128. package/generator/RpcGen.d.ts +0 -10
  129. package/generator/RpcGen.js +0 -171
  130. package/generator/RuntimeApisGen.d.ts +0 -9
  131. package/generator/known-types.d.ts +0 -6
  132. package/generator/known-types.js +0 -30
  133. package/packageInfo.d.ts +0 -4
  134. package/packageInfo.js +0 -2
  135. package/templates/consts.hbs +0 -7
  136. package/templates/errors.hbs +0 -7
  137. package/templates/events.hbs +0 -7
  138. package/templates/index.hbs +0 -22
  139. package/templates/query.hbs +0 -7
  140. package/templates/rpc.hbs +0 -7
  141. package/templates/runtime.hbs +0 -8
  142. package/templates/tx.hbs +0 -9
  143. package/types.d.ts +0 -6
  144. package/types.js +0 -1
  145. /package/{generator → chaintypes/generator}/ApiGen.js +0 -0
  146. /package/cjs/{generator → chaintypes/generator}/ApiGen.js +0 -0
  147. /package/cjs/{generator/dirname.js → dirname.js} +0 -0
  148. /package/{generator/dirname.d.ts → dirname.d.ts} +0 -0
  149. /package/{generator/dirname.js → dirname.js} +0 -0
@@ -1,66 +1,93 @@
1
- import { PortableRegistry } from '@dedot/codecs';
2
1
  import { normalizeName, stringPascalCase } from '@dedot/utils';
3
- import { isNativeType, beautifySourceCode, commentBlock, compileTemplate } from './utils.js';
4
- import { knownTypes } from './known-types.js';
2
+ import { commentBlock, isNativeType, WRAPPER_TYPE_REGEX } from '../utils.js';
5
3
  import { TypeImports } from './TypeImports.js';
6
- import { findKnownCodec, findKnownCodecType, isKnownCodecType } from './known-codecs.js';
7
- // Skip generate types for these
8
- // as we do have native types for them
9
- const SKIP_TYPES = [
10
- 'BoundedBTreeMap',
11
- 'BoundedBTreeSet',
12
- 'BoundedVec',
13
- 'Box',
14
- 'BTreeMap',
15
- 'BTreeSet',
16
- 'Cow',
17
- 'Option',
18
- 'Range',
19
- 'RangeInclusive',
20
- 'Result',
21
- 'WeakBoundedVec',
22
- 'WrapperKeepOpaque',
23
- 'WrapperOpaque',
24
- ];
4
+ import { checkKnownCodecType, findKnownCodec, findKnownCodecType } from './known-codecs.js';
25
5
  // These are common & generic types, so we'll remove these from all paths at index 1
26
6
  // This helps make the type name shorter
27
7
  const PATH_RM_INDEX_1 = ['generic', 'misc', 'pallet', 'traits', 'types'];
28
8
  export const BASIC_KNOWN_TYPES = ['BitSequence', 'Bytes', 'BytesLike', 'FixedBytes', 'FixedArray', 'Result'];
29
- const WRAPPER_TYPE_REGEX = /^(\w+)(<.*>)$/g;
30
- export class TypesGen {
31
- metadata;
32
- /**
33
- * Types will be generated its definition out.
34
- */
9
+ export class BaseTypesGen {
10
+ types;
35
11
  includedTypes;
36
- registry;
37
12
  typeImports;
38
- constructor(metadata) {
39
- this.metadata = metadata;
40
- this.registry = new PortableRegistry(this.metadata);
41
- this.includedTypes = this.#includedTypes();
13
+ skipTypes;
14
+ constructor(types) {
15
+ this.types = types;
16
+ this.includedTypes = {};
42
17
  this.typeImports = new TypeImports();
18
+ this.skipTypes = [];
43
19
  }
44
- generate() {
45
- this.clearCache();
46
- let defTypeOut = '';
47
- Object.values(this.includedTypes)
48
- .filter(({ skip, knownType }) => !(skip || knownType))
49
- .forEach(({ name, nameOut, id, docs }) => {
50
- defTypeOut += `${commentBlock(docs)}export type ${nameOut} = ${this.generateType(id, 0, true)};\n\n`;
51
- if (this.#shouldGenerateTypeIn(id)) {
52
- defTypeOut += `export type ${name} = ${this.generateType(id)};\n\n`;
53
- }
54
- });
55
- const importTypes = this.typeImports.toImports('./types');
56
- const template = compileTemplate('types.hbs');
57
- return beautifySourceCode(template({ importTypes, defTypeOut }));
20
+ shouldGenerateTypeIn(_id) {
21
+ return false;
58
22
  }
59
23
  typeCache = {};
60
24
  clearCache() {
61
25
  this.typeCache = {};
62
26
  this.typeImports.clear();
63
27
  }
28
+ includeTypes() {
29
+ const pathsCount = new Map();
30
+ const typesWithPath = this.types.filter((one) => one.path.length > 0);
31
+ const skipIds = [];
32
+ const typeSuffixes = new Map();
33
+ typesWithPath.forEach(({ path, id }) => {
34
+ const joinedPath = path.join('::');
35
+ if (pathsCount.has(joinedPath)) {
36
+ // We compare 2 types with the same path here,
37
+ // if they are the same type -> skip the current one, keep the first occurrence
38
+ // if they are not the same type but has the same path -> we'll try to calculate & add a suffix for the current type name
39
+ const firstOccurrenceTypeId = pathsCount.get(joinedPath)[0];
40
+ const sameType = this.typeEql(firstOccurrenceTypeId, id);
41
+ if (sameType) {
42
+ skipIds.push(id);
43
+ }
44
+ else {
45
+ pathsCount.get(joinedPath).push(id);
46
+ typeSuffixes.set(id, this.extractDupTypeSuffix(id, firstOccurrenceTypeId, pathsCount.get(joinedPath).length));
47
+ }
48
+ }
49
+ else {
50
+ pathsCount.set(joinedPath, [id]);
51
+ }
52
+ });
53
+ return typesWithPath.reduce((o, type) => {
54
+ const { path, id } = type;
55
+ const joinedPath = path.join('::');
56
+ if (this.skipTypes.includes(joinedPath) || this.skipTypes.includes(path.at(-1))) {
57
+ return o;
58
+ }
59
+ const suffix = typeSuffixes.get(id) || '';
60
+ let knownType = false;
61
+ let name, nameOut;
62
+ const [isKnownCodecType, codecName] = checkKnownCodecType(joinedPath);
63
+ if (isKnownCodecType) {
64
+ const codecType = findKnownCodecType(codecName);
65
+ name = codecType.typeIn;
66
+ nameOut = codecType.typeOut;
67
+ knownType = true;
68
+ }
69
+ else if (PATH_RM_INDEX_1.includes(path[1])) {
70
+ const newPath = path.slice();
71
+ newPath.splice(1, 1);
72
+ name = this.cleanPath(newPath);
73
+ }
74
+ else {
75
+ name = this.cleanPath(path);
76
+ }
77
+ if (this.shouldGenerateTypeIn(id)) {
78
+ nameOut = name;
79
+ name = name.endsWith('Like') ? name : `${name}Like`;
80
+ }
81
+ o[id] = {
82
+ name: `${name}${suffix}`,
83
+ nameOut: nameOut ? `${nameOut}${suffix}` : `${name}${suffix}`,
84
+ knownType,
85
+ skip: skipIds.includes(id),
86
+ ...type,
87
+ };
88
+ return o;
89
+ }, {});
90
+ }
64
91
  generateType(typeId, nestedLevel = 0, typeOut = false) {
65
92
  if (nestedLevel > 0) {
66
93
  const includedDef = this.includedTypes[typeId];
@@ -91,13 +118,13 @@ export class TypesGen {
91
118
  return type;
92
119
  }
93
120
  #generateType(typeId, nestedLevel = 0, typeOut = false) {
94
- const def = this.metadata.types[typeId];
121
+ const def = this.types[typeId];
95
122
  if (!def) {
96
123
  throw new Error(`Type def not found ${JSON.stringify(def)}`);
97
124
  }
98
- const { type, path, docs } = def;
99
- const { tag, value } = type;
100
- switch (tag) {
125
+ const { typeDef, path, docs } = def;
126
+ const { type, value } = typeDef;
127
+ switch (type) {
101
128
  case 'Primitive':
102
129
  const $codec = findKnownCodec(value.kind);
103
130
  if ($codec.nativeType) {
@@ -168,14 +195,14 @@ export class TypesGen {
168
195
  membersType.push([keyName, this.generateObjectType(fields, nestedLevel + 1, typeOut), docs]);
169
196
  }
170
197
  }
171
- const { tagKey, valueKey } = this.registry.getEnumOptions(typeId);
198
+ const { tagKey, valueKey } = this.getEnumOptions(typeId);
172
199
  return membersType
173
200
  .map(([keyName, valueType, docs]) => ({
174
- tag: `${tagKey}: '${keyName}'`,
201
+ type: `${tagKey}: '${keyName}'`,
175
202
  value: valueType ? `, ${valueKey}${this.#isOptionalType(valueType) ? '?' : ''}: ${valueType} ` : '',
176
203
  docs,
177
204
  }))
178
- .map(({ tag, value, docs }) => `${commentBlock(docs)}{ ${tag}${value} }`)
205
+ .map(({ type, value, docs }) => `${commentBlock(docs)}{ ${type}${value} }`)
179
206
  .join(' | ');
180
207
  }
181
208
  }
@@ -197,9 +224,9 @@ export class TypesGen {
197
224
  return this.generateType(value.typeParam, nestedLevel + 1, typeOut);
198
225
  case 'Sequence':
199
226
  case 'SizedVec': {
200
- const fixedSize = tag === 'SizedVec' ? `${value.len}` : null;
201
- const $innerType = this.metadata.types[value.typeParam].type;
202
- if ($innerType.tag === 'Primitive' && $innerType.value.kind === 'u8') {
227
+ const fixedSize = type === 'SizedVec' ? `${value.len}` : null;
228
+ const $innerType = this.types[value.typeParam].typeDef;
229
+ if ($innerType.type === 'Primitive' && $innerType.value.kind === 'u8') {
203
230
  return fixedSize ? `FixedBytes<${fixedSize}>` : typeOut ? 'Bytes' : 'BytesLike';
204
231
  }
205
232
  else {
@@ -208,7 +235,7 @@ export class TypesGen {
208
235
  }
209
236
  }
210
237
  default:
211
- throw new Error(`Invalid type! ${tag}`);
238
+ throw new Error(`Invalid type! ${type}`);
212
239
  }
213
240
  }
214
241
  generateObjectType(fields, nestedLevel = 0, typeOut = false) {
@@ -228,69 +255,6 @@ export class TypesGen {
228
255
  #isOptionalType(type) {
229
256
  return type.endsWith('| undefined');
230
257
  }
231
- #includedTypes() {
232
- const { types } = this.metadata;
233
- const pathsCount = new Map();
234
- const typesWithPath = types.filter((one) => one.path.length > 0);
235
- const skipIds = [];
236
- const typeSuffixes = new Map();
237
- typesWithPath.forEach(({ path, id }) => {
238
- const joinedPath = path.join('::');
239
- if (pathsCount.has(joinedPath)) {
240
- // We compare 2 types with the same path here,
241
- // if they are the same type -> skip the current one, keep the first occurrence
242
- // if they are not the same type but has the same path -> we'll try to calculate & add a suffix for the current type name
243
- const firstOccurrenceTypeId = pathsCount.get(joinedPath)[0];
244
- const sameType = this.typeEql(firstOccurrenceTypeId, id);
245
- if (sameType) {
246
- skipIds.push(id);
247
- }
248
- else {
249
- pathsCount.get(joinedPath).push(id);
250
- typeSuffixes.set(id, this.#extractDupTypeSuffix(id, firstOccurrenceTypeId, pathsCount.get(joinedPath).length));
251
- }
252
- }
253
- else {
254
- pathsCount.set(joinedPath, [id]);
255
- }
256
- });
257
- return typesWithPath.reduce((o, type) => {
258
- const { path, id } = type;
259
- const joinedPath = path.join('::');
260
- if (SKIP_TYPES.includes(joinedPath) || SKIP_TYPES.includes(path.at(-1))) {
261
- return o;
262
- }
263
- const suffix = typeSuffixes.get(id) || '';
264
- let knownType = false;
265
- let name, nameOut;
266
- if (isKnownCodecType(joinedPath)) {
267
- const codecType = findKnownCodecType(path.at(-1));
268
- name = codecType.typeIn;
269
- nameOut = codecType.typeOut;
270
- knownType = true;
271
- }
272
- else if (PATH_RM_INDEX_1.includes(path[1])) {
273
- const newPath = path.slice();
274
- newPath.splice(1, 1);
275
- name = this.#cleanPath(newPath);
276
- }
277
- else {
278
- name = this.#cleanPath(path);
279
- }
280
- if (this.#shouldGenerateTypeIn(id)) {
281
- nameOut = name;
282
- name = name.endsWith('Like') ? name : `${name}Like`;
283
- }
284
- o[id] = {
285
- name: `${name}${suffix}`,
286
- nameOut: nameOut ? `${nameOut}${suffix}` : `${name}${suffix}`,
287
- knownType,
288
- skip: skipIds.includes(id),
289
- ...type,
290
- };
291
- return o;
292
- }, {});
293
- }
294
258
  #removeGenericPart(typeName) {
295
259
  if (typeName.match(WRAPPER_TYPE_REGEX)) {
296
260
  return typeName.replace(WRAPPER_TYPE_REGEX, (_, $1) => $1);
@@ -299,27 +263,12 @@ export class TypesGen {
299
263
  return typeName;
300
264
  }
301
265
  }
302
- /**
303
- * @description Remove duplicated part of the path
304
- *
305
- * Example:
306
- * ["pallet_staking", "pallet", "pallet", "Event"]
307
- * => ["pallet_staking", "pallet", "Event"]
308
- *
309
- * @param path
310
- * @private
311
- */
312
- #cleanPath(path) {
266
+ cleanPath(path) {
313
267
  return path
314
268
  .map((one) => stringPascalCase(one))
315
269
  .filter((one, idx, currentPath) => idx === 0 || one !== currentPath[idx - 1])
316
270
  .join('');
317
271
  }
318
- #shouldGenerateTypeIn(id) {
319
- const { callTypeId } = this.metadata.extrinsic;
320
- const palletCallTypeIds = this.registry.getPalletCallTypeIds();
321
- return callTypeId === id || palletCallTypeIds.includes(id);
322
- }
323
272
  eqlCache = new Map();
324
273
  typeEql(idA, idB, level = 0) {
325
274
  const cacheKey = `${idA}==${idB}`;
@@ -332,36 +281,36 @@ export class TypesGen {
332
281
  #typeEql(idA, idB, lvl = 0) {
333
282
  if (idA === idB)
334
283
  return true;
335
- const { types } = this.metadata;
336
- const typeA = types[idA];
337
- const typeB = types[idB];
284
+ const typeA = this.types[idA];
285
+ const typeB = this.types[idB];
338
286
  if (typeA.path.join('::') !== typeB.path.join('::'))
339
287
  return false;
340
- const { type: defA, params: paramsA } = typeA;
341
- const { type: defB, params: paramsB } = typeB;
288
+ const { typeDef: defA, params: paramsA } = typeA;
289
+ const { typeDef: defB, params: paramsB } = typeB;
342
290
  if (!this.#eqlArray(paramsA, paramsB, (valA, valB) => this.#eqlTypeParam(valA, valB))) {
343
291
  return false;
344
292
  }
345
- if (defA.tag !== defB.tag)
293
+ if (defA.type !== defB.type)
346
294
  return false;
347
- if (defA.tag === 'BitSequence')
295
+ if (defA.type === 'BitSequence')
348
296
  return true;
349
- if (defA.tag === 'Primitive' && defB.tag === 'Primitive') {
297
+ if (defA.type === 'Primitive' && defB.type === 'Primitive') {
350
298
  return defA.value.kind === defB.value.kind;
351
299
  }
352
- if ((defA.tag === 'Compact' && defB.tag === 'Compact') || (defA.tag === 'Sequence' && defB.tag === 'Sequence')) {
300
+ if ((defA.type === 'Compact' && defB.type === 'Compact') ||
301
+ (defA.type === 'Sequence' && defB.type === 'Sequence')) {
353
302
  return this.typeEql(defA.value.typeParam, defB.value.typeParam, lvl + 1);
354
303
  }
355
- if (defA.tag === 'SizedVec' && defB.tag === 'SizedVec') {
304
+ if (defA.type === 'SizedVec' && defB.type === 'SizedVec') {
356
305
  return defA.value.len === defB.value.len && this.typeEql(defA.value.typeParam, defB.value.typeParam, lvl + 1);
357
306
  }
358
- if (defA.tag === 'Tuple' && defB.tag === 'Tuple') {
307
+ if (defA.type === 'Tuple' && defB.type === 'Tuple') {
359
308
  return this.#eqlArray(defA.value.fields, defB.value.fields, (val1, val2) => this.typeEql(val1, val2, lvl + 1));
360
309
  }
361
- if (defA.tag === 'Struct' && defB.tag === 'Struct') {
310
+ if (defA.type === 'Struct' && defB.type === 'Struct') {
362
311
  return this.#eqlFields(defA.value.fields, defB.value.fields, lvl);
363
312
  }
364
- if (defA.tag === 'Enum' && defB.tag === 'Enum') {
313
+ if (defA.type === 'Enum' && defB.type === 'Enum') {
365
314
  return this.#eqlArray(defA.value.members, defB.value.members, (val1, val2) => val1.name === val2.name && val1.index === val2.index && this.#eqlFields(val1.fields, val2.fields, lvl));
366
315
  }
367
316
  return false;
@@ -377,19 +326,18 @@ export class TypesGen {
377
326
  (param1.typeId === undefined) === (param2.typeId === undefined) &&
378
327
  (param1.typeId === undefined || this.#typeEql(param1.typeId, param2.typeId)));
379
328
  }
380
- #extractDupTypeSuffix(dupTypeId, originalTypeId, dupCount) {
381
- const { types } = this.metadata;
382
- const originalTypeParams = types[originalTypeId].params;
383
- const dupTypeParams = types[dupTypeId].params;
329
+ extractDupTypeSuffix(dupTypeId, originalTypeId, dupCount) {
330
+ const originalTypeParams = this.types[originalTypeId].params;
331
+ const dupTypeParams = this.types[dupTypeId].params;
384
332
  const diffParam = dupTypeParams.find((one, idx) => !this.#eqlTypeParam(one, originalTypeParams[idx]));
385
333
  // TODO make sure these suffix is unique if a type is duplicated more than 2 times
386
334
  if (diffParam?.typeId) {
387
- const diffType = types[diffParam.typeId];
335
+ const diffType = this.types[diffParam.typeId];
388
336
  if (diffType.path.length > 0) {
389
337
  return stringPascalCase(diffType.path.at(-1));
390
338
  }
391
- else if (diffType.type.tag === 'Primitive') {
392
- return stringPascalCase(diffType.type.value.kind);
339
+ else if (diffType.typeDef.type === 'Primitive') {
340
+ return stringPascalCase(diffType.typeDef.value.kind);
393
341
  }
394
342
  }
395
343
  // Last resort!
@@ -422,11 +370,9 @@ export class TypesGen {
422
370
  this.typeImports.addCodecType(typeName);
423
371
  return;
424
372
  }
425
- if (knownTypes.includes(typeName)) {
426
- this.typeImports.addKnownType(typeName);
427
- }
428
- else {
429
- this.typeImports.addOutType(typeName);
430
- }
373
+ this.typeImports.addOutType(typeName);
374
+ }
375
+ getEnumOptions(_typeId) {
376
+ return { tagKey: 'type', valueKey: 'value' };
431
377
  }
432
378
  }
@@ -1,14 +1,25 @@
1
+ type ImportConfig = {
2
+ excludeModules?: string[];
3
+ useSubPaths?: boolean;
4
+ };
1
5
  export declare class TypeImports {
2
6
  #private;
3
7
  portableTypes: Set<string>;
4
8
  codecTypes: Set<string>;
5
9
  knownTypes: Set<string>;
10
+ knownJsonRpcTypes: Set<string>;
6
11
  outTypes: Set<string>;
12
+ contractTypes: Set<string>;
13
+ chainTypes: Set<string>;
7
14
  constructor();
8
15
  clear(): void;
9
- toImports(...excludeModules: string[]): string;
16
+ toImports(config?: ImportConfig): string;
10
17
  addPortableType(...types: string[]): void;
11
18
  addCodecType(...types: string[]): void;
12
19
  addKnownType(...types: string[]): void;
20
+ addKnownJsonRpcType(...types: string[]): void;
13
21
  addOutType(...types: string[]): void;
22
+ addContractType(...types: string[]): void;
23
+ addChainType(...types: string[]): void;
14
24
  }
25
+ export {};
@@ -5,30 +5,47 @@ export class TypeImports {
5
5
  codecTypes;
6
6
  // Known types that're not codecs or chain/portable types defined in @dedot/types
7
7
  knownTypes;
8
+ knownJsonRpcTypes;
8
9
  // External types to define explicitly
9
10
  outTypes;
11
+ // Know types defined in @dedot/contracts
12
+ contractTypes;
13
+ // Know types defined in @dedot/api/chaintypes or dedot/chaintypes
14
+ chainTypes;
10
15
  constructor() {
11
16
  this.portableTypes = new Set();
12
17
  this.codecTypes = new Set();
13
18
  this.knownTypes = new Set();
19
+ this.knownJsonRpcTypes = new Set();
14
20
  this.outTypes = new Set();
21
+ this.contractTypes = new Set();
22
+ this.chainTypes = new Set();
15
23
  }
16
24
  clear() {
17
25
  this.portableTypes.clear();
18
26
  this.codecTypes.clear();
19
27
  this.knownTypes.clear();
28
+ this.knownJsonRpcTypes.clear();
20
29
  this.outTypes.clear();
30
+ this.contractTypes.clear();
31
+ this.chainTypes.clear();
21
32
  }
22
- toImports(...excludeModules) {
33
+ toImports(config) {
34
+ const { excludeModules = [], useSubPaths = false } = config || {};
23
35
  // TODO generate outTypes!
36
+ const prefix = useSubPaths ? '' : '@';
24
37
  const toImports = [
25
- [this.knownTypes, '@dedot/types'],
26
- [this.codecTypes, '@dedot/codecs'],
38
+ [this.knownTypes, `${prefix}dedot/types`],
39
+ [this.knownJsonRpcTypes, `${prefix}dedot/types/json-rpc`],
40
+ [this.codecTypes, `${prefix}dedot/codecs`],
41
+ [this.contractTypes, `${prefix}dedot/contracts`],
42
+ [this.chainTypes, prefix ? '@dedot/api/chaintypes' : 'dedot/chaintypes'],
27
43
  [this.portableTypes, './types'],
28
44
  ];
29
45
  return toImports
30
46
  .filter(([_, module]) => !excludeModules.includes(module))
31
47
  .map(([types, module]) => this.#toImportLine(types, module))
48
+ .filter((line) => line.length > 0)
32
49
  .join('\n');
33
50
  }
34
51
  #toImportLine(types, module) {
@@ -46,7 +63,16 @@ export class TypeImports {
46
63
  addKnownType(...types) {
47
64
  types.forEach((one) => this.knownTypes.add(one));
48
65
  }
66
+ addKnownJsonRpcType(...types) {
67
+ types.forEach((one) => this.knownJsonRpcTypes.add(one));
68
+ }
49
69
  addOutType(...types) {
50
70
  types.forEach((one) => this.outTypes.add(one));
51
71
  }
72
+ addContractType(...types) {
73
+ types.forEach((one) => this.contractTypes.add(one));
74
+ }
75
+ addChainType(...types) {
76
+ types.forEach((one) => this.chainTypes.add(one));
77
+ }
52
78
  }
@@ -0,0 +1,3 @@
1
+ export * from './BaseTypesGen.js';
2
+ export * from './known-codecs.js';
3
+ export * from './TypeImports.js';
@@ -0,0 +1,3 @@
1
+ export * from './BaseTypesGen.js';
2
+ export * from './known-codecs.js';
3
+ export * from './TypeImports.js';
@@ -20,4 +20,4 @@ export declare const looseTypeCodecs: Record<string, AnyShape>;
20
20
  export declare function findKnownCodecType(name: string): CodecType;
21
21
  export declare function findKnownCodec<I = unknown, O = I>(typeName: string): $.Shape<I, O>;
22
22
  export declare function findKnownWrapperCodec(typeName: string): $.AnyShape | undefined;
23
- export declare function isKnownCodecType(path: string | string[]): boolean;
23
+ export declare function checkKnownCodecType(path: string | string[]): [boolean, string];
@@ -1,6 +1,6 @@
1
- import * as $ from '@dedot/shape';
2
1
  import * as Codecs from '@dedot/codecs';
3
2
  import { $AccountId20, $AccountId32, $Bytes, $ConsensusEngineId, $Era, $EthereumAddress, $MultiAddress, $OpaqueExtrinsic, $PrefixedStorageKey, $RawBytes, $StorageData, $StorageKey, $UncheckedExtrinsic, } from '@dedot/codecs';
3
+ import * as $ from '@dedot/shape';
4
4
  import { assert } from '@dedot/utils';
5
5
  export const normalizeCodecName = (name) => {
6
6
  return name.startsWith('$') ? name : `$${name}`;
@@ -30,6 +30,8 @@ const KNOWN_PATHS = [
30
30
  /^primitive_types::\w+$/,
31
31
  /^sp_arithmetic::per_things::\w+$/,
32
32
  /^sp_arithmetic::fixed_point::\w+$/,
33
+ 'ink_primitives::types::Hash',
34
+ { path: 'ink_primitives::types::AccountId', codec: 'AccountId32' },
33
35
  ];
34
36
  const WRAPPER_TYPE_REGEX = /^(\w+)<(.*)>$/;
35
37
  const TUPLE_TYPE_REGEX = /^\[(.*)]$/;
@@ -114,7 +116,24 @@ export function findKnownWrapperCodec(typeName) {
114
116
  return $.Tuple(...$inner);
115
117
  }
116
118
  }
117
- export function isKnownCodecType(path) {
119
+ export function checkKnownCodecType(path) {
118
120
  const joinedPath = Array.isArray(path) ? path.join('::') : path;
119
- return KNOWN_PATHS.some((one) => joinedPath.match(one));
121
+ const knownPath = KNOWN_PATHS.find((one) => {
122
+ if (typeof one === 'string') {
123
+ return one === joinedPath;
124
+ }
125
+ else if (one instanceof RegExp) {
126
+ return one.test(joinedPath);
127
+ }
128
+ else {
129
+ return one.path === joinedPath;
130
+ }
131
+ });
132
+ if (!knownPath) {
133
+ return [false, ''];
134
+ }
135
+ if (typeof knownPath === 'string' || knownPath instanceof RegExp) {
136
+ return [true, joinedPath.split('::').at(-1)];
137
+ }
138
+ return [true, knownPath.codec];
120
139
  }
@@ -0,0 +1,6 @@
1
+ import { ContractConstructorMessage } from '@dedot/contracts';
2
+ import { QueryGen } from './QueryGen.js';
3
+ export declare class ConstructorQueryGen extends QueryGen {
4
+ generate(useSubPaths?: boolean): Promise<string>;
5
+ generateMethodDef(def: ContractConstructorMessage): string;
6
+ }
@@ -0,0 +1,20 @@
1
+ import { beautifySourceCode, compileTemplate } from '../../utils.js';
2
+ import { QueryGen } from './QueryGen.js';
3
+ export class ConstructorQueryGen extends QueryGen {
4
+ generate(useSubPaths = false) {
5
+ this.typesGen.clearCache();
6
+ this.typesGen.typeImports.addKnownType('GenericSubstrateApi');
7
+ this.typesGen.typeImports.addContractType('GenericConstructorQuery', 'GenericConstructorQueryCall', 'ConstructorCallOptions', 'ContractInstantiateResult');
8
+ const { constructors } = this.contractMetadata.spec;
9
+ const constructorsOut = this.doGenerate(constructors, 'ConstructorCallOptions');
10
+ const importTypes = this.typesGen.typeImports.toImports({ useSubPaths });
11
+ const template = compileTemplate('typink/templates/constructor-query.hbs');
12
+ return beautifySourceCode(template({ importTypes, constructorsOut }));
13
+ }
14
+ generateMethodDef(def) {
15
+ const { args } = def;
16
+ args.forEach(({ type: { type } }) => this.importType(type));
17
+ const paramsOut = this.generateParamsOut(args);
18
+ return `GenericConstructorQueryCall<ChainApi, (${paramsOut && `${paramsOut},`} options: ConstructorCallOptions) => Promise<ContractInstantiateResult<ChainApi>>>`;
19
+ }
20
+ }
@@ -0,0 +1,6 @@
1
+ import { ContractConstructorMessage } from '@dedot/contracts';
2
+ import { QueryGen } from './QueryGen.js';
3
+ export declare class ConstructorTxGen extends QueryGen {
4
+ generate(useSubPaths?: boolean): Promise<string>;
5
+ generateMethodDef(def: ContractConstructorMessage): string;
6
+ }
@@ -0,0 +1,20 @@
1
+ import { beautifySourceCode, compileTemplate } from '../../utils.js';
2
+ import { QueryGen } from './QueryGen.js';
3
+ export class ConstructorTxGen extends QueryGen {
4
+ generate(useSubPaths = false) {
5
+ this.typesGen.clearCache();
6
+ this.typesGen.typeImports.addKnownType('GenericSubstrateApi');
7
+ this.typesGen.typeImports.addContractType('GenericConstructorTx', 'GenericConstructorTxCall', 'ConstructorTxOptions', 'GenericInstantiateSubmittableExtrinsic');
8
+ const { constructors } = this.contractMetadata.spec;
9
+ const constructorsOut = this.doGenerate(constructors, 'ConstructorTxOptions');
10
+ const importTypes = this.typesGen.typeImports.toImports({ useSubPaths });
11
+ const template = compileTemplate('typink/templates/constructor-tx.hbs');
12
+ return beautifySourceCode(template({ importTypes, constructorsOut }));
13
+ }
14
+ generateMethodDef(def) {
15
+ const { args } = def;
16
+ args.forEach(({ type: { type } }) => this.importType(type));
17
+ const paramsOut = this.generateParamsOut(args);
18
+ return `GenericConstructorTxCall<ChainApi, (${paramsOut && `${paramsOut},`} options: ConstructorTxOptions) => GenericInstantiateSubmittableExtrinsic<ChainApi>>`;
19
+ }
20
+ }
@@ -0,0 +1,6 @@
1
+ import { ContractMetadata } from '@dedot/contracts';
2
+ export declare class IndexGen {
3
+ contractMetadata: ContractMetadata;
4
+ constructor(contractMetadata: ContractMetadata);
5
+ generate(useSubPaths?: boolean): Promise<string>;
6
+ }
@@ -0,0 +1,20 @@
1
+ import { stringPascalCase } from '@dedot/utils';
2
+ import { TypeImports } from '../../shared/index.js';
3
+ import { beautifySourceCode, compileTemplate } from '../../utils.js';
4
+ const SUFFIX = 'contract_api';
5
+ export class IndexGen {
6
+ contractMetadata;
7
+ constructor(contractMetadata) {
8
+ this.contractMetadata = contractMetadata;
9
+ }
10
+ generate(useSubPaths = false) {
11
+ const contractName = stringPascalCase(`${this.contractMetadata.contract.name}_${SUFFIX}`);
12
+ const typeImports = new TypeImports();
13
+ typeImports.addKnownType('VersionedGenericSubstrateApi', 'RpcVersion', 'RpcV2');
14
+ typeImports.addContractType('GenericContractApi');
15
+ typeImports.addChainType('SubstrateApi');
16
+ const importTypes = typeImports.toImports({ useSubPaths });
17
+ const template = compileTemplate('typink/templates/index.hbs');
18
+ return beautifySourceCode(template({ contractName, importTypes }));
19
+ }
20
+ }
@@ -0,0 +1,12 @@
1
+ import { ContractMetadata, ContractMessage, ContractMessageArg } from '@dedot/contracts';
2
+ import { TypesGen } from './TypesGen.js';
3
+ export declare class QueryGen {
4
+ contractMetadata: ContractMetadata;
5
+ typesGen: TypesGen;
6
+ constructor(contractMetadata: ContractMetadata, typeGen: TypesGen);
7
+ generate(useSubPaths?: boolean): Promise<string>;
8
+ doGenerate(messages: ContractMessage[], optionsTypeName?: string): string;
9
+ generateMethodDef(def: ContractMessage): string;
10
+ generateParamsOut(args: ContractMessageArg[]): string;
11
+ importType(typeId: number): any;
12
+ }