@pezkuwi/typegen 16.5.5 → 16.5.6

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 (193) hide show
  1. package/LICENSE +201 -0
  2. package/augment.js +2 -0
  3. package/bundle.js +2 -0
  4. package/cjs/augment.d.ts +2 -0
  5. package/cjs/augment.js +4 -0
  6. package/cjs/bundle.d.ts +2 -0
  7. package/cjs/bundle.js +7 -0
  8. package/cjs/extractChain.js +44 -0
  9. package/cjs/fromChain.js +95 -0
  10. package/cjs/fromDefs.js +82 -0
  11. package/cjs/generate/consts.js +91 -0
  12. package/cjs/generate/errors.js +59 -0
  13. package/cjs/generate/events.js +139 -0
  14. package/cjs/generate/index.js +23 -0
  15. package/cjs/generate/interfaceRegistry.js +64 -0
  16. package/cjs/generate/lookup.js +240 -0
  17. package/cjs/generate/query.js +140 -0
  18. package/cjs/generate/rpc.js +115 -0
  19. package/cjs/generate/runtime.js +233 -0
  20. package/{build → cjs}/generate/tsDef.d.ts +1 -1
  21. package/cjs/generate/tsDef.js +254 -0
  22. package/cjs/generate/tx.js +121 -0
  23. package/cjs/generate/types.js +16 -0
  24. package/cjs/index.js +5 -0
  25. package/cjs/interfacesTs.js +28 -0
  26. package/cjs/metadataMd.js +652 -0
  27. package/cjs/package.json +3 -0
  28. package/cjs/packageDetect.js +8 -0
  29. package/cjs/packageInfo.js +4 -0
  30. package/cjs/util/assert.js +15 -0
  31. package/cjs/util/derived.js +128 -0
  32. package/cjs/util/docs.js +10 -0
  33. package/cjs/util/file.js +33 -0
  34. package/{build → cjs}/util/formatting.d.ts +1 -1
  35. package/cjs/util/formatting.js +237 -0
  36. package/cjs/util/imports.js +126 -0
  37. package/{build → cjs}/util/index.d.ts +1 -0
  38. package/cjs/util/index.js +39 -0
  39. package/cjs/util/initMeta.js +22 -0
  40. package/cjs/util/register.js +10 -0
  41. package/cjs/util/wsMeta.js +60 -0
  42. package/extractChain.d.ts +1 -0
  43. package/extractChain.js +40 -0
  44. package/fromChain.d.ts +1 -0
  45. package/fromChain.js +91 -0
  46. package/fromDefs.d.ts +1 -0
  47. package/fromDefs.js +78 -0
  48. package/generate/consts.d.ts +5 -0
  49. package/generate/consts.js +87 -0
  50. package/generate/errors.d.ts +4 -0
  51. package/generate/errors.js +55 -0
  52. package/generate/events.d.ts +5 -0
  53. package/generate/events.js +135 -0
  54. package/{src/generate/index.ts → generate/index.d.ts} +0 -3
  55. package/generate/index.js +10 -0
  56. package/generate/interfaceRegistry.d.ts +4 -0
  57. package/generate/interfaceRegistry.js +59 -0
  58. package/generate/lookup.d.ts +4 -0
  59. package/generate/lookup.js +235 -0
  60. package/generate/query.d.ts +5 -0
  61. package/generate/query.js +136 -0
  62. package/generate/rpc.d.ts +6 -0
  63. package/generate/rpc.js +110 -0
  64. package/generate/runtime.d.ts +7 -0
  65. package/generate/runtime.js +228 -0
  66. package/generate/tsDef.d.ts +16 -0
  67. package/generate/tsDef.js +246 -0
  68. package/generate/tx.d.ts +5 -0
  69. package/generate/tx.js +117 -0
  70. package/generate/types.d.ts +12 -0
  71. package/generate/types.js +13 -0
  72. package/index.d.ts +2 -0
  73. package/index.js +2 -0
  74. package/interfacesTs.d.ts +1 -0
  75. package/interfacesTs.js +24 -0
  76. package/metadataMd.d.ts +1 -0
  77. package/metadataMd.js +648 -0
  78. package/package.json +520 -24
  79. package/packageDetect.d.ts +1 -0
  80. package/{src/packageDetect.ts → packageDetect.js} +0 -8
  81. package/packageInfo.d.ts +6 -0
  82. package/packageInfo.js +1 -0
  83. package/scripts/{polkadot-types-chain-info.mjs → pezkuwi-types-chain-info.mjs} +1 -1
  84. package/scripts/{polkadot-types-from-chain.mjs → pezkuwi-types-from-chain.mjs} +1 -1
  85. package/scripts/{polkadot-types-from-defs.mjs → pezkuwi-types-from-defs.mjs} +1 -1
  86. package/{build/scripts/polkadot-types-internal-interfaces.mjs → scripts/pezkuwi-types-internal-interfaces.mjs} +1 -1
  87. package/{build/scripts/polkadot-types-internal-metadata.mjs → scripts/pezkuwi-types-internal-metadata.mjs} +1 -1
  88. package/{src/templates → templates}/calls.hbs +2 -2
  89. package/{src/templates → templates}/consts.hbs +2 -2
  90. package/{src/templates → templates}/errors.hbs +2 -2
  91. package/{src/templates → templates}/events.hbs +2 -2
  92. package/{src/templates → templates}/interfaceRegistry.hbs +2 -2
  93. package/{src/templates → templates}/lookup/types.hbs +2 -2
  94. package/{src/templates → templates}/query.hbs +2 -2
  95. package/{src/templates → templates}/rpc.hbs +2 -2
  96. package/{src/templates → templates}/tx.hbs +2 -2
  97. package/util/assert.d.ts +2 -0
  98. package/util/assert.js +10 -0
  99. package/util/derived.d.ts +4 -0
  100. package/util/derived.js +125 -0
  101. package/util/docs.d.ts +1 -0
  102. package/util/docs.js +6 -0
  103. package/util/file.d.ts +2 -0
  104. package/util/file.js +28 -0
  105. package/util/formatting.d.ts +11 -0
  106. package/util/formatting.js +230 -0
  107. package/util/imports.d.ts +23 -0
  108. package/util/imports.js +121 -0
  109. package/{src/util/index.ts → util/index.d.ts} +6 -8
  110. package/util/index.js +34 -0
  111. package/util/initMeta.d.ts +12 -0
  112. package/util/initMeta.js +19 -0
  113. package/util/register.d.ts +4 -0
  114. package/util/register.js +7 -0
  115. package/util/wsMeta.d.ts +4 -0
  116. package/util/wsMeta.js +55 -0
  117. package/build/scripts/polkadot-types-chain-info.mjs +0 -7
  118. package/build/scripts/polkadot-types-from-chain.mjs +0 -7
  119. package/build/scripts/polkadot-types-from-defs.mjs +0 -7
  120. package/scripts/polkadot-types-internal-interfaces.mjs +0 -7
  121. package/scripts/polkadot-types-internal-metadata.mjs +0 -7
  122. package/src/augment.ts +0 -5
  123. package/src/bundle.ts +0 -5
  124. package/src/extractChain.ts +0 -54
  125. package/src/fromChain.ts +0 -123
  126. package/src/fromDefs.ts +0 -106
  127. package/src/generate/consts.ts +0 -112
  128. package/src/generate/errors.ts +0 -75
  129. package/src/generate/events.ts +0 -165
  130. package/src/generate/interfaceRegistry.ts +0 -85
  131. package/src/generate/lookup.ts +0 -294
  132. package/src/generate/query.ts +0 -169
  133. package/src/generate/rpc.ts +0 -158
  134. package/src/generate/runtime.ts +0 -284
  135. package/src/generate/tsDef.ts +0 -321
  136. package/src/generate/tx.ts +0 -152
  137. package/src/generate/types.ts +0 -26
  138. package/src/index.ts +0 -6
  139. package/src/interfacesTs.ts +0 -35
  140. package/src/metadataMd.ts +0 -844
  141. package/src/packageInfo.ts +0 -6
  142. package/src/util/assert.ts +0 -18
  143. package/src/util/derived.spec.ts +0 -58
  144. package/src/util/derived.ts +0 -133
  145. package/src/util/docs.ts +0 -13
  146. package/src/util/file.ts +0 -42
  147. package/src/util/formatting.spec.ts +0 -30
  148. package/src/util/formatting.ts +0 -295
  149. package/src/util/imports.ts +0 -164
  150. package/src/util/initMeta.ts +0 -37
  151. package/src/util/register.ts +0 -12
  152. package/src/util/wsMeta.ts +0 -70
  153. package/tsconfig.build.json +0 -28
  154. package/tsconfig.build.tsbuildinfo +0 -1
  155. package/tsconfig.scripts.json +0 -19
  156. package/tsconfig.spec.json +0 -17
  157. /package/{build/augment.d.ts → augment.d.ts} +0 -0
  158. /package/{build/bundle.d.ts → bundle.d.ts} +0 -0
  159. /package/{build → cjs}/extractChain.d.ts +0 -0
  160. /package/{build → cjs}/fromChain.d.ts +0 -0
  161. /package/{build → cjs}/fromDefs.d.ts +0 -0
  162. /package/{build → cjs}/generate/consts.d.ts +0 -0
  163. /package/{build → cjs}/generate/errors.d.ts +0 -0
  164. /package/{build → cjs}/generate/events.d.ts +0 -0
  165. /package/{build → cjs}/generate/index.d.ts +0 -0
  166. /package/{build → cjs}/generate/interfaceRegistry.d.ts +0 -0
  167. /package/{build → cjs}/generate/lookup.d.ts +0 -0
  168. /package/{build → cjs}/generate/query.d.ts +0 -0
  169. /package/{build → cjs}/generate/rpc.d.ts +0 -0
  170. /package/{build → cjs}/generate/runtime.d.ts +0 -0
  171. /package/{build → cjs}/generate/tx.d.ts +0 -0
  172. /package/{build → cjs}/generate/types.d.ts +0 -0
  173. /package/{build → cjs}/index.d.ts +0 -0
  174. /package/{build → cjs}/interfacesTs.d.ts +0 -0
  175. /package/{build → cjs}/metadataMd.d.ts +0 -0
  176. /package/{build → cjs}/packageDetect.d.ts +0 -0
  177. /package/{build → cjs}/packageInfo.d.ts +0 -0
  178. /package/{build → cjs}/util/assert.d.ts +0 -0
  179. /package/{build → cjs}/util/derived.d.ts +0 -0
  180. /package/{build → cjs}/util/docs.d.ts +0 -0
  181. /package/{build → cjs}/util/file.d.ts +0 -0
  182. /package/{build → cjs}/util/imports.d.ts +0 -0
  183. /package/{build → cjs}/util/initMeta.d.ts +0 -0
  184. /package/{build → cjs}/util/register.d.ts +0 -0
  185. /package/{build → cjs}/util/wsMeta.d.ts +0 -0
  186. /package/{src/templates → templates}/docs.hbs +0 -0
  187. /package/{src/templates → templates}/header.hbs +0 -0
  188. /package/{src/templates → templates}/lookup/defs-named.hbs +0 -0
  189. /package/{src/templates → templates}/lookup/defs.hbs +0 -0
  190. /package/{src/templates → templates}/lookup/index.hbs +0 -0
  191. /package/{src/templates → templates}/tsDef/index.hbs +0 -0
  192. /package/{src/templates → templates}/tsDef/moduleTypes.hbs +0 -0
  193. /package/{src/templates → templates}/tsDef/types.hbs +0 -0
@@ -0,0 +1,24 @@
1
+ import assetHubDicle from '@pezkuwi/types-support/metadata/v15/asset-hub-dicle-hex';
2
+ import assetHubPezkuwi from '@pezkuwi/types-support/metadata/v15/asset-hub-pezkuwi-hex';
3
+ import dicle from '@pezkuwi/types-support/metadata/v15/dicle-hex';
4
+ import pezkuwi from '@pezkuwi/types-support/metadata/v15/pezkuwi-hex';
5
+ import bizinikiwi from '@pezkuwi/types-support/metadata/v15/bizinikiwi-hex';
6
+ import { generateDefaultConsts, generateDefaultErrors, generateDefaultEvents, generateDefaultInterface, generateDefaultLookup, generateDefaultQuery, generateDefaultRpc, generateDefaultRuntime, generateDefaultTsDef, generateDefaultTx } from './generate/index.js';
7
+ const BASE = 'packages/api-augment/src';
8
+ const METAS = Object.entries({ assetHubDicle, assetHubPezkuwi, dicle, pezkuwi, bizinikiwi });
9
+ export function main() {
10
+ generateDefaultInterface();
11
+ generateDefaultLookup();
12
+ generateDefaultRpc();
13
+ generateDefaultTsDef();
14
+ for (const [name, staticMeta] of METAS) {
15
+ console.log();
16
+ console.log(`*** Generating for ${name}`);
17
+ generateDefaultConsts(`${BASE}/${name}/consts.ts`, staticMeta);
18
+ generateDefaultErrors(`${BASE}/${name}/errors.ts`, staticMeta);
19
+ generateDefaultEvents(`${BASE}/${name}/events.ts`, staticMeta);
20
+ generateDefaultQuery(`${BASE}/${name}/query.ts`, staticMeta);
21
+ generateDefaultRuntime(`${BASE}/${name}/runtime.ts`, staticMeta);
22
+ generateDefaultTx(`${BASE}/${name}/tx.ts`, staticMeta);
23
+ }
24
+ }
@@ -0,0 +1 @@
1
+ export declare function main(): void;
package/metadataMd.js ADDED
@@ -0,0 +1,648 @@
1
+ import { parse } from 'comment-parser';
2
+ import fs from 'node:fs';
3
+ import path, { dirname, resolve } from 'node:path';
4
+ import process from 'node:process';
5
+ import { fileURLToPath } from 'node:url';
6
+ import yargs from 'yargs';
7
+ import { hideBin } from 'yargs/helpers';
8
+ import { derive } from '@pezkuwi/api-derive';
9
+ import { Metadata, TypeRegistry, Vec } from '@pezkuwi/types';
10
+ import * as definitions from '@pezkuwi/types/interfaces/definitions';
11
+ import { getStorage as getBizinikiwiStorage } from '@pezkuwi/types/metadata/decorate/storage/getStorage';
12
+ import { unwrapStorageType } from '@pezkuwi/types/util';
13
+ import assetHubDicleMeta from '@pezkuwi/types-support/metadata/v15/asset-hub-dicle-hex';
14
+ import assetHubDicleRpc from '@pezkuwi/types-support/metadata/v15/asset-hub-dicle-rpc';
15
+ import assetHubDicleVer from '@pezkuwi/types-support/metadata/v15/asset-hub-dicle-ver';
16
+ import assetHubPezkuwiMeta from '@pezkuwi/types-support/metadata/v15/asset-hub-pezkuwi-hex';
17
+ import assetHubPezkuwiRpc from '@pezkuwi/types-support/metadata/v15/asset-hub-pezkuwi-rpc';
18
+ import assetHubPezkuwiVer from '@pezkuwi/types-support/metadata/v15/asset-hub-pezkuwi-ver';
19
+ import dicleMeta from '@pezkuwi/types-support/metadata/v15/dicle-hex';
20
+ import dicleRpc from '@pezkuwi/types-support/metadata/v15/dicle-rpc';
21
+ import dicleVer from '@pezkuwi/types-support/metadata/v15/dicle-ver';
22
+ import pezkuwiMeta from '@pezkuwi/types-support/metadata/v15/pezkuwi-hex';
23
+ import pezkuwiRpc from '@pezkuwi/types-support/metadata/v15/pezkuwi-rpc';
24
+ import pezkuwiVer from '@pezkuwi/types-support/metadata/v15/pezkuwi-ver';
25
+ import bizinikiwiMeta from '@pezkuwi/types-support/metadata/v15/bizinikiwi-hex';
26
+ import { isHex, stringCamelCase, stringLowerFirst } from '@pezkuwi/util';
27
+ import { blake2AsHex } from '@pezkuwi/util-crypto';
28
+ import { assertFile, getMetadataViaWs, getRpcMethodsViaWs, getRuntimeVersionViaWs } from './util/index.js';
29
+ const headerFn = (runtimeDesc) => `\n\n(NOTE: These were generated from a static/snapshot view of a recent ${runtimeDesc}. Some items may not be available in older nodes, or in any customized implementations.)`;
30
+ const ALL_STATIC = {
31
+ 'asset-hub-dicle': {
32
+ meta: assetHubDicleMeta,
33
+ rpc: assetHubDicleRpc,
34
+ ver: assetHubDicleVer
35
+ },
36
+ 'asset-hub-pezkuwi': {
37
+ meta: assetHubPezkuwiMeta,
38
+ rpc: assetHubPezkuwiRpc,
39
+ ver: assetHubPezkuwiVer
40
+ },
41
+ dicle: {
42
+ meta: dicleMeta,
43
+ rpc: dicleRpc,
44
+ ver: dicleVer
45
+ },
46
+ pezkuwi: {
47
+ meta: pezkuwiMeta,
48
+ rpc: pezkuwiRpc,
49
+ ver: pezkuwiVer
50
+ },
51
+ bizinikiwi: {
52
+ meta: bizinikiwiMeta
53
+ }
54
+ };
55
+ /** @internal */
56
+ function docsVecToMarkdown(docLines, indent = 0) {
57
+ const md = docLines
58
+ .map((docLine) => docLine
59
+ .toString()
60
+ .trimStart()
61
+ .replace(/^r"/g, '')
62
+ .trimStart())
63
+ .reduce((md, docLine) => // generate paragraphs
64
+ !docLine.length
65
+ ? `${md}\n\n` // empty line
66
+ : /^[*-]/.test(docLine.trimStart()) && !md.endsWith('\n\n')
67
+ ? `${md}\n\n${docLine}` // line calling for a preceding linebreak
68
+ : `${md} ${docLine.replace(/^#{1,3} /, '#### ')} `, '')
69
+ .replace(/#### <weight>/g, '<weight>')
70
+ .replace(/<weight>(.|\n)*?<\/weight>/g, '')
71
+ .replace(/#### Weight:/g, 'Weight:');
72
+ // prefix each line with indentation
73
+ return md?.split('\n\n').map((line) => `${' '.repeat(indent)}${line}`).join('\n\n');
74
+ }
75
+ function renderPage(page) {
76
+ let md = `---\ntitle: ${page.title}\n---\n\n`;
77
+ if (page.description) {
78
+ md += `${page.description}\n\n`;
79
+ }
80
+ // index
81
+ page.sections.forEach((section) => {
82
+ md += `- **[${stringCamelCase(section.name)}](#${stringCamelCase(section.name).toLowerCase()})**\n\n`;
83
+ });
84
+ // contents
85
+ page.sections.forEach((section) => {
86
+ md += '\n___\n\n\n';
87
+ md += section.link
88
+ ? `<h2 id="#${section.link}">${section.name}</h2>\n`
89
+ : `## ${section.name}\n`;
90
+ if (section.description) {
91
+ md += `\n_${section.description}_\n`;
92
+ }
93
+ section.items.forEach((item) => {
94
+ md += ' \n';
95
+ md += item.link
96
+ ? `<h3 id="#${item.link}">${item.name}</h3>`
97
+ : `### ${item.name}`;
98
+ Object
99
+ .keys(item)
100
+ .filter((key) => !['link', 'name'].includes(key))
101
+ .forEach((bullet) => {
102
+ md += `\n- **${bullet}**: ${
103
+ // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
104
+ item[bullet] instanceof Vec
105
+ ? docsVecToMarkdown(item[bullet], 2).toString()
106
+ : item[bullet]}`;
107
+ });
108
+ md += '\n';
109
+ });
110
+ });
111
+ return md;
112
+ }
113
+ function sortByName(a, b) {
114
+ // case insensitive (all-uppercase) sorting
115
+ return a.name.toString().toUpperCase().localeCompare(b.name.toString().toUpperCase());
116
+ }
117
+ function getSiName(lookup, type) {
118
+ const typeDef = lookup.getTypeDef(type);
119
+ return typeDef.lookupName || typeDef.type;
120
+ }
121
+ /** @internal */
122
+ function addRpc(_runtimeDesc, rpcMethods) {
123
+ return renderPage({
124
+ description: 'The following sections contain known RPC methods that may be available on specific nodes (depending on configuration and available pallets) and allow you to interact with the actual node, query, and submit.',
125
+ sections: Object
126
+ .keys(definitions)
127
+ .filter((key) => Object.keys(definitions[key].rpc || {}).length !== 0)
128
+ .sort()
129
+ .reduce((all, _sectionName) => {
130
+ const section = definitions[_sectionName];
131
+ Object
132
+ .keys(section.rpc || {})
133
+ .sort()
134
+ .forEach((methodName) => {
135
+ const method = section.rpc?.[methodName];
136
+ if (!method) {
137
+ throw new Error(`No ${methodName} RPC found in ${_sectionName}`);
138
+ }
139
+ const sectionName = method.aliasSection || _sectionName;
140
+ const jsonrpc = (method.endpoint || `${sectionName}_${methodName}`);
141
+ if (rpcMethods) {
142
+ // if we are passing the rpcMethods params and we cannot find this method, skip it
143
+ if (jsonrpc !== 'rpc_methods' && !rpcMethods.includes(jsonrpc)) {
144
+ return;
145
+ }
146
+ }
147
+ const topName = method.aliasSection ? `${_sectionName}/${method.aliasSection}` : _sectionName;
148
+ let container = all.find(({ name }) => name === topName);
149
+ if (!container) {
150
+ container = { items: [], name: topName };
151
+ all.push(container);
152
+ }
153
+ const args = method.params.map(({ isOptional, name, type }) => {
154
+ // eslint-disable-next-line @typescript-eslint/restrict-plus-operands
155
+ return name + (isOptional ? '?' : '') + ': `' + type + '`';
156
+ }).join(', ');
157
+ const type = '`' + method.type + '`';
158
+ container.items.push({
159
+ interface: '`' + `api.rpc.${sectionName}.${methodName}` + '`',
160
+ jsonrpc: '`' + jsonrpc + '`',
161
+ // link: jsonrpc,
162
+ name: `${methodName}(${args}): ${type}`,
163
+ ...((method.description && { summary: method.description }) || {}),
164
+ ...((method.deprecated && { deprecated: method.deprecated }) || {}),
165
+ ...((method.isUnsafe && { unsafe: 'This method is only active with appropriate flags' }) || {})
166
+ });
167
+ });
168
+ return all;
169
+ }, []).sort(sortByName),
170
+ title: 'JSON-RPC'
171
+ });
172
+ }
173
+ /** @internal */
174
+ function getMethods(registry, methods) {
175
+ const result = {};
176
+ methods.forEach((m) => {
177
+ const { docs, inputs, name, output } = m;
178
+ result[name.toString()] = {
179
+ description: docs.map((d) => d.toString()).join(),
180
+ params: inputs.map(({ name, type }) => {
181
+ return { name: name.toString(), type: registry.lookup.getName(type) || registry.lookup.getTypeDef(type).type };
182
+ }),
183
+ type: registry.lookup.getName(output) || registry.lookup.getTypeDef(output).type
184
+ };
185
+ });
186
+ return result;
187
+ }
188
+ /** @internal */
189
+ function getRuntimeDefViaMetadata(registry) {
190
+ const result = {};
191
+ const { apis } = registry.metadata;
192
+ for (let i = 0, count = apis.length; i < count; i++) {
193
+ const { methods, name } = apis[i];
194
+ result[name.toString()] = [{
195
+ methods: getMethods(registry, methods),
196
+ // We set the version to 0 here since it will not be relevant when we are grabbing the runtime apis
197
+ // from the Metadata.
198
+ version: 0
199
+ }];
200
+ }
201
+ return Object.entries(result);
202
+ }
203
+ function runtimeSections(registry) {
204
+ const sections = getRuntimeDefViaMetadata(registry);
205
+ const all = [];
206
+ for (let j = 0, jcount = sections.length; j < jcount; j++) {
207
+ const [_section, secs] = sections[j];
208
+ const sec = secs[0];
209
+ const section = stringCamelCase(_section);
210
+ const methods = Object.entries(sec.methods);
211
+ const container = { items: [], name: section };
212
+ all.push(container);
213
+ methods
214
+ .sort(([a], [b]) => a.localeCompare(b))
215
+ .forEach(([methodName, { description, params, type }]) => {
216
+ const args = params.map(({ name, type }) => {
217
+ // eslint-disable-next-line @typescript-eslint/restrict-plus-operands
218
+ return name + ': `' + type + '`';
219
+ }).join(', ');
220
+ container.items.push({
221
+ interface: '`' + `api.call.${stringCamelCase(section)}.${stringCamelCase(methodName)}` + '`',
222
+ name: `${stringCamelCase(methodName)}(${args}): ${'`' + type + '`'}`,
223
+ runtime: '`' + `${section}_${methodName}` + '`',
224
+ summary: description
225
+ });
226
+ });
227
+ }
228
+ return all.sort(sortByName);
229
+ }
230
+ /** @internal */
231
+ function addRuntime(_runtimeDesc, registry) {
232
+ return renderPage({
233
+ description: 'The following section contains known runtime calls that may be available on specific runtimes (depending on configuration and available pallets). These call directly into the WASM runtime for queries and operations.',
234
+ sections: runtimeSections(registry),
235
+ title: 'Runtime'
236
+ });
237
+ }
238
+ /** @internal */
239
+ function addLegacyRuntime(_runtimeDesc, _registry, apis) {
240
+ return renderPage({
241
+ description: 'The following section contains known runtime calls that may be available on specific runtimes (depending on configuration and available pallets). These call directly into the WASM runtime for queries and operations.',
242
+ sections: Object
243
+ .keys(definitions)
244
+ .filter((key) => Object.keys(definitions[key].runtime || {}).length !== 0)
245
+ .sort()
246
+ .reduce((all, _sectionName) => {
247
+ Object
248
+ .entries(definitions[_sectionName].runtime || {})
249
+ .forEach(([apiName, versions]) => {
250
+ versions
251
+ .sort((a, b) => b.version - a.version)
252
+ .forEach(({ methods, version }, index) => {
253
+ if (apis) {
254
+ // if we are passing the api hashes and we cannot find this one, skip it
255
+ const apiHash = blake2AsHex(apiName, 64);
256
+ const api = apis.find(([hash]) => hash === apiHash);
257
+ if (!api || api[1] !== version) {
258
+ return;
259
+ }
260
+ }
261
+ else if (index) {
262
+ // we only want the highest version
263
+ return;
264
+ }
265
+ const container = { items: [], name: apiName };
266
+ all.push(container);
267
+ Object
268
+ .entries(methods)
269
+ .sort(([a], [b]) => a.localeCompare(b))
270
+ .forEach(([methodName, { description, params, type }]) => {
271
+ const args = params.map(({ name, type }) => {
272
+ // eslint-disable-next-line @typescript-eslint/restrict-plus-operands
273
+ return name + ': `' + type + '`';
274
+ }).join(', ');
275
+ container.items.push({
276
+ interface: '`' + `api.call.${stringCamelCase(apiName)}.${stringCamelCase(methodName)}` + '`',
277
+ name: `${stringCamelCase(methodName)}(${args}): ${'`' + type + '`'}`,
278
+ runtime: '`' + `${apiName}_${methodName}` + '`',
279
+ summary: description
280
+ });
281
+ });
282
+ });
283
+ });
284
+ return all;
285
+ }, []).sort(sortByName),
286
+ title: 'Runtime'
287
+ });
288
+ }
289
+ /** @internal */
290
+ function addConstants(runtimeDesc, { lookup, pallets }) {
291
+ return renderPage({
292
+ description: `The following sections contain the module constants, also known as parameter types. These can only be changed as part of a runtime upgrade. On the api, these are exposed via \`api.consts.<module>.<method>\`. ${headerFn(runtimeDesc)}`,
293
+ sections: pallets
294
+ .sort(sortByName)
295
+ .filter(({ constants }) => !constants.isEmpty)
296
+ .map(({ constants, name }) => {
297
+ const sectionName = stringLowerFirst(name);
298
+ return {
299
+ items: constants
300
+ .sort(sortByName)
301
+ .map(({ docs, name, type }) => {
302
+ const methodName = stringCamelCase(name);
303
+ return {
304
+ interface: '`' + `api.consts.${sectionName}.${methodName}` + '`',
305
+ name: `${methodName}: ` + '`' + getSiName(lookup, type) + '`',
306
+ ...(docs.length && { summary: docs })
307
+ };
308
+ }),
309
+ name: sectionName
310
+ };
311
+ }),
312
+ title: 'Constants'
313
+ });
314
+ }
315
+ /** @internal */
316
+ function addStorage(runtimeDesc, { lookup, pallets, registry }) {
317
+ const { bizinikiwi } = getBizinikiwiStorage(registry);
318
+ const moduleSections = pallets
319
+ .sort(sortByName)
320
+ .filter((moduleMetadata) => !moduleMetadata.storage.isNone)
321
+ .map((moduleMetadata) => {
322
+ const sectionName = stringLowerFirst(moduleMetadata.name);
323
+ return {
324
+ items: moduleMetadata.storage.unwrap().items
325
+ .sort(sortByName)
326
+ .map((func) => {
327
+ let arg = '';
328
+ if (func.type.isMap) {
329
+ const { hashers, key } = func.type.asMap;
330
+ arg = '`' + (hashers.length === 1
331
+ ? getSiName(lookup, key)
332
+ : lookup.getSiType(key).def.asTuple.map((t) => getSiName(lookup, t)).join(', ')) + '`';
333
+ }
334
+ const methodName = stringLowerFirst(func.name);
335
+ const outputType = unwrapStorageType(registry, func.type, func.modifier.isOptional);
336
+ return {
337
+ interface: '`' + `api.query.${sectionName}.${methodName}` + '`',
338
+ name: `${methodName}(${arg}): ` + '`' + outputType + '`',
339
+ ...(func.docs.length && { summary: func.docs })
340
+ };
341
+ }),
342
+ name: sectionName
343
+ };
344
+ });
345
+ return renderPage({
346
+ description: `The following sections contain Storage methods are part of the ${runtimeDesc}. On the api, these are exposed via \`api.query.<module>.<method>\`. ${headerFn(runtimeDesc)}`,
347
+ sections: moduleSections.concat([{
348
+ description: 'These are well-known keys that are always available to the runtime implementation of any Bizinikiwi-based network.',
349
+ items: Object.entries(bizinikiwi).map(([name, { meta }]) => {
350
+ const arg = meta.type.isMap
351
+ ? ('`' + getSiName(lookup, meta.type.asMap.key) + '`')
352
+ : '';
353
+ const methodName = stringLowerFirst(name);
354
+ const outputType = unwrapStorageType(registry, meta.type, meta.modifier.isOptional);
355
+ return {
356
+ interface: '`' + `api.query.bizinikiwi.${methodName}` + '`',
357
+ name: `${methodName}(${arg}): ` + '`' + outputType + '`',
358
+ summary: meta.docs
359
+ };
360
+ }),
361
+ name: 'bizinikiwi'
362
+ }]).sort(sortByName),
363
+ title: 'Storage'
364
+ });
365
+ }
366
+ /** @internal */
367
+ function addExtrinsics(runtimeDesc, { lookup, pallets }) {
368
+ return renderPage({
369
+ description: `The following sections contain Extrinsics methods are part of the ${runtimeDesc}. On the api, these are exposed via \`api.tx.<module>.<method>\`. ${headerFn(runtimeDesc)}`,
370
+ sections: pallets
371
+ .sort(sortByName)
372
+ .filter(({ calls }) => calls.isSome)
373
+ .map(({ calls, name }) => {
374
+ const sectionName = stringCamelCase(name);
375
+ return {
376
+ items: lookup.getSiType(calls.unwrap().type).def.asVariant.variants
377
+ .sort(sortByName)
378
+ .map(({ docs, fields, name }, index) => {
379
+ const methodName = stringCamelCase(name);
380
+ const args = fields.map(({ name, type }) => `${name.isSome ? name.toString() : `param${index}`}: ` + '`' + getSiName(lookup, type) + '`').join(', ');
381
+ return {
382
+ interface: '`' + `api.tx.${sectionName}.${methodName}` + '`',
383
+ name: `${methodName}(${args})`,
384
+ ...(docs.length && { summary: docs })
385
+ };
386
+ }),
387
+ name: sectionName
388
+ };
389
+ }),
390
+ title: 'Extrinsics'
391
+ });
392
+ }
393
+ /** @internal */
394
+ function addEvents(runtimeDesc, { lookup, pallets }) {
395
+ return renderPage({
396
+ description: `Events are emitted for certain operations on the runtime. The following sections describe the events that are part of the ${runtimeDesc}. ${headerFn(runtimeDesc)}`,
397
+ sections: pallets
398
+ .sort(sortByName)
399
+ .filter(({ events }) => events.isSome)
400
+ .map((meta) => ({
401
+ items: lookup.getSiType(meta.events.unwrap().type).def.asVariant.variants
402
+ .sort(sortByName)
403
+ .map(({ docs, fields, name }) => {
404
+ const methodName = name.toString();
405
+ const args = fields.map(({ type }) => '`' + getSiName(lookup, type) + '`').join(', ');
406
+ return {
407
+ interface: '`' + `api.events.${stringCamelCase(meta.name)}.${methodName}.is` + '`',
408
+ name: `${methodName}(${args})`,
409
+ ...(docs.length && { summary: docs })
410
+ };
411
+ }),
412
+ name: stringCamelCase(meta.name)
413
+ })),
414
+ title: 'Events'
415
+ });
416
+ }
417
+ /** @internal */
418
+ function addErrors(runtimeDesc, { lookup, pallets }) {
419
+ return renderPage({
420
+ description: `This page lists the errors that can be encountered in the different modules. ${headerFn(runtimeDesc)}`,
421
+ sections: pallets
422
+ .sort(sortByName)
423
+ .filter(({ errors }) => errors.isSome)
424
+ .map((moduleMetadata) => ({
425
+ items: lookup.getSiType(moduleMetadata.errors.unwrap().type).def.asVariant.variants
426
+ .sort(sortByName)
427
+ .map((error) => ({
428
+ interface: '`' + `api.errors.${stringCamelCase(moduleMetadata.name)}.${error.name.toString()}.is` + '`',
429
+ name: error.name.toString(),
430
+ ...(error.docs.length && { summary: error.docs })
431
+ })),
432
+ name: stringLowerFirst(moduleMetadata.name)
433
+ })),
434
+ title: 'Errors'
435
+ });
436
+ }
437
+ function getDependencyBasePath(moduleName) {
438
+ const modulePath = import.meta.resolve(moduleName);
439
+ return resolve(dirname(fileURLToPath(modulePath)));
440
+ }
441
+ const BASE_DERIVE_PATH = getDependencyBasePath('@pezkuwi/api-derive');
442
+ const obtainDeriveFiles = (deriveModule) => {
443
+ const filePath = `${BASE_DERIVE_PATH}/${deriveModule}`;
444
+ const files = fs.readdirSync(filePath);
445
+ return files
446
+ .filter((file) => file.endsWith('.js'))
447
+ .map((file) => `${deriveModule}/${file}`);
448
+ };
449
+ function extractDeriveDescription(tags, name) {
450
+ const descriptionTag = tags.find((tag) => tag.tag === name);
451
+ return descriptionTag
452
+ ? `${descriptionTag.name ?? ''} ${descriptionTag.description ?? ''}`.trim()
453
+ : null;
454
+ }
455
+ function extractDeriveParams(tags) {
456
+ const descriptionTag = tags
457
+ .filter((tag) => tag.tag === 'param')
458
+ .map((param) => {
459
+ return {
460
+ description: param.description ?? null,
461
+ name: param.name ?? null,
462
+ type: param.type ?? null
463
+ };
464
+ });
465
+ return descriptionTag;
466
+ }
467
+ function extractDeriveExample(tags) {
468
+ const exampleTag = tags.find((tag) => tag.tag === 'example');
469
+ if (!exampleTag) {
470
+ return null;
471
+ }
472
+ let example = '';
473
+ const inCodeBlock = { done: false, found: false };
474
+ // Obtain code block from example tag.
475
+ exampleTag.source.forEach((line) => {
476
+ if (inCodeBlock.done) {
477
+ return;
478
+ }
479
+ if (line.source.indexOf('```') !== -1 && !inCodeBlock.found) {
480
+ inCodeBlock.found = true;
481
+ }
482
+ else if (line.source.indexOf('```') !== -1 && inCodeBlock.found) {
483
+ inCodeBlock.done = true;
484
+ }
485
+ if (!inCodeBlock.found) {
486
+ return;
487
+ }
488
+ example += line.source.slice(2, line.source.length);
489
+ if (!inCodeBlock.done) {
490
+ example += '\n';
491
+ }
492
+ });
493
+ return example;
494
+ }
495
+ const getDeriveDocs = (metadata, file) => {
496
+ const filePath = `${BASE_DERIVE_PATH}/${file}`;
497
+ const deriveModule = file.split('/')[0];
498
+ const fileContent = fs.readFileSync(filePath, 'utf8');
499
+ const comments = parse(fileContent);
500
+ const docs = comments
501
+ .filter((comment) => comment.tags)
502
+ .map((comment) => {
503
+ return {
504
+ description: extractDeriveDescription(comment.tags, 'description'),
505
+ example: extractDeriveExample(comment.tags),
506
+ name: comment.tags.find((tag) => tag.tag === 'name')?.name || null,
507
+ params: extractDeriveParams(comment.tags),
508
+ returns: extractDeriveDescription(comment.tags, 'returns')
509
+ };
510
+ });
511
+ metadata[deriveModule]
512
+ ? (metadata[deriveModule] = [...metadata[deriveModule], ...docs])
513
+ : (metadata[deriveModule] = [...docs]);
514
+ };
515
+ function renderDerives(metadata) {
516
+ let md = '---\ntitle: Derives\n---\n\nThis page lists the derives that can be encountered in the different modules. Designed to simplify the process of querying complex on-chain data by combining multiple RPC calls, storage queries, and runtime logic into a single, callable function. \n\nInstead of manually fetching and processing blockchain data, developers can use `api.derive.<module>.<method>()` to retrieve information.\n\n';
517
+ const deriveModules = Object.keys(metadata).filter((d) => metadata[d].length !== 0);
518
+ // index
519
+ deriveModules.forEach((deriveModule) => {
520
+ md += `- **[${deriveModule}](#${deriveModule})**\n\n`;
521
+ });
522
+ // contents
523
+ deriveModules.forEach((deriveModule) => {
524
+ md += `\n___\n## ${deriveModule}\n`;
525
+ metadata[deriveModule]
526
+ .filter((item) => item.name)
527
+ .forEach((item) => {
528
+ const { description, example, name, params, returns } = item;
529
+ md += ` \n### [${name}](#${name})`;
530
+ if (description) {
531
+ md += `\n${description}`;
532
+ }
533
+ md += `\n- **interface**: \`api.derive.${deriveModule}.${name}\``;
534
+ if (params.length) {
535
+ md += '\n- **params**:\n';
536
+ params.forEach((param) => (md += ` - ${param.name} \`${param.type}\`: ${param.description}\n`));
537
+ }
538
+ if (returns) {
539
+ md += `\n- **returns**: ${returns}`;
540
+ }
541
+ if (example) {
542
+ md += `\n- **example**: \n${example}`;
543
+ }
544
+ });
545
+ });
546
+ return md;
547
+ }
548
+ function generateDerives() {
549
+ let fileList = [];
550
+ Object.keys(derive).forEach((deriveModule) => {
551
+ fileList = [...fileList, ...obtainDeriveFiles(deriveModule)];
552
+ });
553
+ const metadata = {};
554
+ fileList.forEach((file) => {
555
+ getDeriveDocs(metadata, file);
556
+ });
557
+ return renderDerives(metadata);
558
+ }
559
+ /** @internal */
560
+ function writeFile(name, ...chunks) {
561
+ const writeStream = fs.createWriteStream(name, { encoding: 'utf8', flags: 'w' });
562
+ writeStream.on('finish', () => {
563
+ console.log(`Completed writing ${name}`);
564
+ });
565
+ chunks.forEach((chunk) => {
566
+ writeStream.write(chunk);
567
+ });
568
+ writeStream.end();
569
+ }
570
+ async function mainPromise() {
571
+ const { chain, endpoint, metadataVer } = yargs(hideBin(process.argv)).strict().options({
572
+ chain: {
573
+ description: 'The chain name to use for the output (defaults to "Bizinikiwi")',
574
+ type: 'string'
575
+ },
576
+ endpoint: {
577
+ description: 'The endpoint to connect to (e.g. wss://dicle-rpc.pezkuwi.io) or relative path to a file containing the JSON output of an RPC state_getMetadata call',
578
+ type: 'string'
579
+ },
580
+ metadataVer: {
581
+ description: 'The metadata version to use for generating type information. This will use state_call::Metadata_metadata_at_version to query metadata',
582
+ type: 'number'
583
+ }
584
+ }).argv;
585
+ /**
586
+ * This is unique to when the endpoint arg is used. Since the endpoint requires us to query the chain, it may query the chains
587
+ * rpc state_getMetadata method to get metadata, but this restricts us to v14 only. Therefore we must also check if the `metadataVer` is passed
588
+ * in as well. These checks will help us decide if we are using v14 or newer.
589
+ */
590
+ const useV14Metadata = endpoint && ((metadataVer && metadataVer < 15) || !metadataVer);
591
+ const chainName = chain || 'Bizinikiwi';
592
+ let metaHex;
593
+ let rpcMethods;
594
+ let runtimeApis;
595
+ if (endpoint) {
596
+ if (endpoint.startsWith('wss://') || endpoint.startsWith('ws://')) {
597
+ metaHex = await getMetadataViaWs(endpoint, metadataVer);
598
+ rpcMethods = await getRpcMethodsViaWs(endpoint);
599
+ runtimeApis = await getRuntimeVersionViaWs(endpoint);
600
+ }
601
+ else {
602
+ metaHex = JSON.parse(fs.readFileSync(assertFile(path.join(process.cwd(), endpoint)), 'utf-8')).result;
603
+ if (!isHex(metaHex)) {
604
+ throw new Error('Invalid metadata file');
605
+ }
606
+ }
607
+ }
608
+ else if (ALL_STATIC[chainName.toLowerCase()]) {
609
+ metaHex = ALL_STATIC[chainName.toLowerCase()].meta;
610
+ rpcMethods = ALL_STATIC[chainName.toLowerCase()].rpc?.methods;
611
+ }
612
+ else {
613
+ metaHex = bizinikiwiMeta;
614
+ }
615
+ let metadata;
616
+ const registry = new TypeRegistry();
617
+ if (useV14Metadata) {
618
+ metadata = new Metadata(registry, metaHex);
619
+ }
620
+ else {
621
+ const opaqueMetadata = registry.createType('Option<OpaqueMetadata>', registry.createType('Raw', metaHex).toU8a()).unwrap();
622
+ metadata = new Metadata(registry, opaqueMetadata.toHex());
623
+ }
624
+ registry.setMetadata(metadata);
625
+ const latest = metadata.asLatest;
626
+ const runtimeDesc = `default ${chainName} runtime`;
627
+ const docRoot = `docs/${chainName.toLowerCase()}`;
628
+ writeFile(`${docRoot}/rpc.md`, addRpc(runtimeDesc, rpcMethods));
629
+ useV14Metadata
630
+ ? writeFile(`${docRoot}/runtime.md`, addLegacyRuntime(runtimeDesc, registry, runtimeApis))
631
+ : writeFile(`${docRoot}/runtime.md`, addRuntime(runtimeDesc, registry));
632
+ writeFile(`${docRoot}/constants.md`, addConstants(runtimeDesc, latest));
633
+ writeFile(`${docRoot}/storage.md`, addStorage(runtimeDesc, latest));
634
+ writeFile(`${docRoot}/extrinsics.md`, addExtrinsics(runtimeDesc, latest));
635
+ writeFile(`${docRoot}/events.md`, addEvents(runtimeDesc, latest));
636
+ writeFile(`${docRoot}/errors.md`, addErrors(runtimeDesc, latest));
637
+ if (chainName === 'Bizinikiwi') {
638
+ writeFile('docs/derives/derives.md', generateDerives());
639
+ }
640
+ }
641
+ export function main() {
642
+ mainPromise().catch((error) => {
643
+ console.error();
644
+ console.error(error);
645
+ console.error();
646
+ process.exit(1);
647
+ });
648
+ }