@polkadot-api/cli 0.6.1 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-XXMZBBBD.js → chunk-F4ZKQC36.js} +254 -168
- package/dist/chunk-F4ZKQC36.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/main.js +1 -1
- package/package.json +21 -19
- package/dist/chunk-XXMZBBBD.js.map +0 -1
|
@@ -6,7 +6,7 @@ function getCli({ add: add2, generate: generate2, remove: remove2, update: updat
|
|
|
6
6
|
const config = new Option("--config <filename>", "Source for the config file");
|
|
7
7
|
program.command("generate", {
|
|
8
8
|
isDefault: true
|
|
9
|
-
}).description("Generate descriptor files").addOption(config).option(
|
|
9
|
+
}).description("Generate descriptor files").addOption(config).option(
|
|
10
10
|
"--whitelist <filename>",
|
|
11
11
|
"Use whitelist file to reduce descriptor size"
|
|
12
12
|
).action(generate2);
|
|
@@ -14,12 +14,12 @@ function getCli({ add: add2, generate: generate2, remove: remove2, update: updat
|
|
|
14
14
|
new Option("-n, --name <name>", "Source from a well-known chain").choices(
|
|
15
15
|
Object.keys(knownChains)
|
|
16
16
|
)
|
|
17
|
-
).option("--wasm <filename>", "Source from runtime wasm file").option("--no-persist", "Do not persist the metadata as a file").action(add2);
|
|
17
|
+
).option("--wasm <filename>", "Source from runtime wasm file").option("--no-persist", "Do not persist the metadata as a file").option("--skip-codegen", "Skip running codegen after adding").action(add2);
|
|
18
18
|
program.command("update").description("Update the metadata files and generate descriptor files").argument(
|
|
19
19
|
"[keys]",
|
|
20
20
|
"Keys of the metadata files to update, separated by commas. Leave empty for all"
|
|
21
|
-
).addOption(config).action(update2);
|
|
22
|
-
program.command("remove").description("Remove a chain spec from the list").argument("<key>", "Key identifier for the chain spec").addOption(config).action(remove2);
|
|
21
|
+
).addOption(config).option("--skip-codegen", "Skip running codegen after updating").action(update2);
|
|
22
|
+
program.command("remove").description("Remove a chain spec from the list").argument("<key>", "Key identifier for the chain spec").addOption(config).option("--skip-codegen", "Skip running codegen after removing").action(remove2);
|
|
23
23
|
return program;
|
|
24
24
|
}
|
|
25
25
|
|
|
@@ -141,130 +141,94 @@ async function writeMetadataToDisk(metadataRaw, outFile) {
|
|
|
141
141
|
// src/papiConfig.ts
|
|
142
142
|
import fsExists from "fs.promises.exists";
|
|
143
143
|
import { readPackage } from "read-pkg";
|
|
144
|
-
import {
|
|
145
|
-
import {
|
|
144
|
+
import { mkdir as mkdir2, readFile as readFile2, writeFile as writeFile2 } from "node:fs/promises";
|
|
145
|
+
import { join } from "node:path";
|
|
146
|
+
import { existsSync } from "node:fs";
|
|
147
|
+
var papiFolder = ".papi";
|
|
146
148
|
var papiCfgDefaultFile = "polkadot-api.json";
|
|
147
149
|
var packageJsonKey = "polkadot-api";
|
|
150
|
+
var defaultConfig = {
|
|
151
|
+
version: 0,
|
|
152
|
+
descriptorPath: join(papiFolder, "descriptors"),
|
|
153
|
+
entries: {}
|
|
154
|
+
};
|
|
148
155
|
async function readPapiConfig(configFile) {
|
|
149
156
|
if (configFile) return readFromFile(configFile);
|
|
150
|
-
const
|
|
151
|
-
|
|
152
|
-
|
|
157
|
+
const currentVersionLocation = join(papiFolder, papiCfgDefaultFile);
|
|
158
|
+
const currentVersionLocationExists = await fsExists(currentVersionLocation);
|
|
159
|
+
const readConfig = await (currentVersionLocationExists ? readFromFile(currentVersionLocation) : readFromFile(papiCfgDefaultFile)) ?? await readFromPackageJson();
|
|
160
|
+
if (readConfig && !currentVersionLocationExists) {
|
|
161
|
+
await writePapiConfig(void 0, readConfig);
|
|
162
|
+
}
|
|
163
|
+
return readConfig;
|
|
153
164
|
}
|
|
154
165
|
async function writePapiConfig(configFile, config) {
|
|
155
166
|
if (configFile) return writeToFile(configFile, config);
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
const packageCfg = await readFromFile("package.json");
|
|
159
|
-
if (packageCfg) {
|
|
160
|
-
return writeToFile("package.json", config);
|
|
167
|
+
if (!existsSync(papiFolder)) {
|
|
168
|
+
await mkdir2(papiFolder);
|
|
161
169
|
}
|
|
162
|
-
return writeToFile(papiCfgDefaultFile, config);
|
|
170
|
+
return writeToFile(join(papiFolder, papiCfgDefaultFile), config);
|
|
163
171
|
}
|
|
164
172
|
async function readFromFile(file) {
|
|
165
173
|
const fileExists = await fsExists(file);
|
|
166
174
|
if (!fileExists) return null;
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
175
|
+
return migrate(JSON.parse(await readFile2(file, "utf8")));
|
|
176
|
+
}
|
|
177
|
+
async function readFromPackageJson() {
|
|
178
|
+
const packageJson = await readPackage();
|
|
179
|
+
if (!(packageJsonKey in packageJson)) return null;
|
|
180
|
+
console.warn("Papi config in package.json is deprecated");
|
|
181
|
+
return migrate(packageJson[packageJsonKey]);
|
|
182
|
+
}
|
|
183
|
+
function migrate(content) {
|
|
184
|
+
if (typeof content.version === "number") {
|
|
185
|
+
return content;
|
|
170
186
|
}
|
|
171
|
-
return
|
|
187
|
+
return {
|
|
188
|
+
...defaultConfig,
|
|
189
|
+
entries: content
|
|
190
|
+
};
|
|
172
191
|
}
|
|
173
192
|
async function writeToFile(file, config) {
|
|
174
193
|
if (file === "package.json") {
|
|
175
|
-
|
|
176
|
-
[packageJsonKey]: null
|
|
177
|
-
});
|
|
178
|
-
return updatePackage({
|
|
179
|
-
[packageJsonKey]: config
|
|
180
|
-
});
|
|
194
|
+
throw new Error("Papi config in package.json is deprecated");
|
|
181
195
|
}
|
|
182
196
|
return writeFile2(file, JSON.stringify(config, null, 2));
|
|
183
197
|
}
|
|
184
198
|
|
|
185
|
-
// src/commands/add.ts
|
|
186
|
-
import { compactNumber } from "@polkadot-api/substrate-bindings";
|
|
187
|
-
import { fromHex } from "@polkadot-api/utils";
|
|
188
|
-
import { getMetadataFromRuntime } from "@polkadot-api/wasm-executor";
|
|
189
|
-
import * as fs2 from "node:fs/promises";
|
|
190
|
-
import ora from "ora";
|
|
191
|
-
async function add(key, options) {
|
|
192
|
-
const entries = await readPapiConfig(options.config) ?? {};
|
|
193
|
-
if (key in entries) {
|
|
194
|
-
console.warn(`Replacing existing ${key} config`);
|
|
195
|
-
}
|
|
196
|
-
if (options.file) {
|
|
197
|
-
entries[key] = {
|
|
198
|
-
metadata: options.file
|
|
199
|
-
};
|
|
200
|
-
} else if (options.wasm) {
|
|
201
|
-
const spinner = ora(`Loading metadata from runtime`).start();
|
|
202
|
-
const metadataHex = (await fs2.readFile(options.wasm)).toString("hex");
|
|
203
|
-
const opaqueMeta = fromHex(getMetadataFromRuntime(`0x${metadataHex}`));
|
|
204
|
-
const metadataLen = compactNumber.dec(opaqueMeta);
|
|
205
|
-
const compactLen = compactNumber.enc(metadataLen).length;
|
|
206
|
-
if (opaqueMeta.length - compactLen !== metadataLen)
|
|
207
|
-
throw new Error("Not able to retrieve runtime metadata");
|
|
208
|
-
spinner.text = "Writing metadata";
|
|
209
|
-
const metadataRaw = opaqueMeta.slice(compactLen);
|
|
210
|
-
const filename = `${key}.scale`;
|
|
211
|
-
await writeMetadataToDisk(metadataRaw, filename);
|
|
212
|
-
spinner.succeed(`Metadata saved as ${filename}`);
|
|
213
|
-
entries[key] = {
|
|
214
|
-
metadata: filename
|
|
215
|
-
};
|
|
216
|
-
} else {
|
|
217
|
-
const entry = entryFromOptions(options);
|
|
218
|
-
entries[key] = entry;
|
|
219
|
-
if (!options.noPersist) {
|
|
220
|
-
const spinner = ora(`Loading metadata`).start();
|
|
221
|
-
const { metadataRaw } = await getMetadata(entry);
|
|
222
|
-
spinner.text = "Writing metadata";
|
|
223
|
-
const filename = `${key}.scale`;
|
|
224
|
-
await writeMetadataToDisk(metadataRaw, filename);
|
|
225
|
-
spinner.succeed(`Metadata saved as ${filename}`);
|
|
226
|
-
entry.metadata = filename;
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
await writePapiConfig(options.config, entries);
|
|
230
|
-
return console.log(`Saved new spec "${key}"`);
|
|
231
|
-
}
|
|
232
|
-
var entryFromOptions = (options) => {
|
|
233
|
-
if (options.wsUrl) {
|
|
234
|
-
return {
|
|
235
|
-
wsUrl: options.wsUrl
|
|
236
|
-
};
|
|
237
|
-
}
|
|
238
|
-
if (options.chainSpec) {
|
|
239
|
-
return {
|
|
240
|
-
chainSpec: options.chainSpec
|
|
241
|
-
};
|
|
242
|
-
}
|
|
243
|
-
if (options.name) {
|
|
244
|
-
return {
|
|
245
|
-
chain: options.name
|
|
246
|
-
};
|
|
247
|
-
}
|
|
248
|
-
throw new Error(
|
|
249
|
-
"add command needs one source, specified by options -f -w -c or -n"
|
|
250
|
-
);
|
|
251
|
-
};
|
|
252
|
-
|
|
253
199
|
// src/commands/generate.ts
|
|
254
200
|
import { generateMultipleDescriptors } from "@polkadot-api/codegen";
|
|
255
|
-
import {
|
|
256
|
-
|
|
257
|
-
|
|
201
|
+
import {
|
|
202
|
+
EntryPointCodec,
|
|
203
|
+
TypedefCodec
|
|
204
|
+
} from "@polkadot-api/metadata-compatibility";
|
|
205
|
+
import {
|
|
206
|
+
Binary,
|
|
207
|
+
h64,
|
|
208
|
+
Tuple,
|
|
209
|
+
Vector
|
|
210
|
+
} from "@polkadot-api/substrate-bindings";
|
|
211
|
+
import { existsSync as existsSync2 } from "fs";
|
|
212
|
+
import fsExists2 from "fs.promises.exists";
|
|
213
|
+
import fs2, { mkdtemp, rm } from "fs/promises";
|
|
214
|
+
import { tmpdir } from "os";
|
|
215
|
+
import path, { join as join2 } from "path";
|
|
258
216
|
import process from "process";
|
|
259
217
|
import tsc from "tsc-prog";
|
|
260
218
|
import tsup, { build } from "tsup";
|
|
261
|
-
import
|
|
262
|
-
import {
|
|
263
|
-
import {
|
|
264
|
-
import {
|
|
265
|
-
import { TypedefCodec } from "@polkadot-api/metadata-compatibility";
|
|
219
|
+
import { updatePackage } from "write-package";
|
|
220
|
+
import { spawn } from "child_process";
|
|
221
|
+
import { readPackage as readPackage2 } from "read-pkg";
|
|
222
|
+
import { detect } from "detect-package-manager";
|
|
266
223
|
async function generate(opts) {
|
|
267
|
-
|
|
224
|
+
if (process.env.PAPI_SKIP_GENERATE) {
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
const config = await readPapiConfig(opts.config);
|
|
228
|
+
if (!config) {
|
|
229
|
+
throw new Error("Can't find the Polkadot-API configuration");
|
|
230
|
+
}
|
|
231
|
+
const sources = config.entries;
|
|
268
232
|
if (Object.keys(sources).length == 0) {
|
|
269
233
|
console.log("No chains defined in config file");
|
|
270
234
|
}
|
|
@@ -276,41 +240,59 @@ async function generate(opts) {
|
|
|
276
240
|
knownTypes: {}
|
|
277
241
|
}))
|
|
278
242
|
);
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
"node_modules",
|
|
282
|
-
"@polkadot-api",
|
|
283
|
-
"descriptors"
|
|
284
|
-
);
|
|
243
|
+
await cleanDescriptorsPackage(config.descriptorPath);
|
|
244
|
+
const descriptorsDir = join2(process.cwd(), config.descriptorPath);
|
|
285
245
|
const clientPath = opts.clientLibrary ?? "polkadot-api";
|
|
286
|
-
if (existsSync(descriptorsDir))
|
|
287
|
-
await fs3.rm(descriptorsDir, { recursive: true });
|
|
288
|
-
await fs3.mkdir(descriptorsDir, { recursive: true });
|
|
289
|
-
await generatePackageJson(join(descriptorsDir, "package.json"));
|
|
290
246
|
const whitelist = opts.whitelist ? await readWhitelist(opts.whitelist) : null;
|
|
291
|
-
await outputCodegen(
|
|
247
|
+
const hash = await outputCodegen(
|
|
292
248
|
chains,
|
|
293
|
-
|
|
249
|
+
join2(descriptorsDir, "src"),
|
|
294
250
|
clientPath,
|
|
295
251
|
whitelist
|
|
296
252
|
);
|
|
253
|
+
await replacePackageJson(descriptorsDir, hash);
|
|
297
254
|
await compileCodegen(descriptorsDir);
|
|
298
|
-
await
|
|
255
|
+
await fs2.rm(join2(descriptorsDir, "src"), { recursive: true });
|
|
256
|
+
await runInstall();
|
|
299
257
|
}
|
|
300
|
-
async function
|
|
301
|
-
const
|
|
302
|
-
if (!
|
|
303
|
-
|
|
258
|
+
async function cleanDescriptorsPackage(path2) {
|
|
259
|
+
const descriptorsDir = join2(process.cwd(), path2);
|
|
260
|
+
if (!existsSync2(descriptorsDir)) {
|
|
261
|
+
await fs2.mkdir(descriptorsDir, { recursive: true });
|
|
262
|
+
await fs2.writeFile(
|
|
263
|
+
join2(descriptorsDir, ".gitignore"),
|
|
264
|
+
"*\n!.gitignore\n!package.json"
|
|
265
|
+
);
|
|
304
266
|
}
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
267
|
+
const packageJson = await readPackage2();
|
|
268
|
+
const packageSource = `file:${path2}`;
|
|
269
|
+
const currentSource = packageJson.dependencies?.["@polkadot-api/descriptors"];
|
|
270
|
+
if (currentSource !== packageSource) {
|
|
271
|
+
await updatePackage({
|
|
272
|
+
dependencies: {
|
|
273
|
+
"@polkadot-api/descriptors": packageSource
|
|
274
|
+
}
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
const distDir = join2(descriptorsDir, "dist");
|
|
278
|
+
if (existsSync2(distDir)) {
|
|
279
|
+
await fs2.rm(distDir, { recursive: true });
|
|
312
280
|
}
|
|
313
|
-
|
|
281
|
+
}
|
|
282
|
+
async function getPackageManager() {
|
|
283
|
+
return process.env.npm_execpath ?? await detect();
|
|
284
|
+
}
|
|
285
|
+
async function runInstall() {
|
|
286
|
+
const path2 = await getPackageManager();
|
|
287
|
+
console.log(`${path2} install`);
|
|
288
|
+
const child = spawn(await getPackageManager(), ["install"], {
|
|
289
|
+
stdio: "inherit",
|
|
290
|
+
env: {
|
|
291
|
+
...process.env,
|
|
292
|
+
PAPI_SKIP_GENERATE: "true"
|
|
293
|
+
}
|
|
294
|
+
});
|
|
295
|
+
await new Promise((resolve) => child.on("close", resolve));
|
|
314
296
|
}
|
|
315
297
|
async function outputCodegen(chains, outputFolder, clientPath, whitelist) {
|
|
316
298
|
const {
|
|
@@ -331,15 +313,20 @@ async function outputCodegen(chains, outputFolder, clientPath, whitelist) {
|
|
|
331
313
|
whitelist: whitelist ?? void 0
|
|
332
314
|
}
|
|
333
315
|
);
|
|
316
|
+
const hash = h64(
|
|
317
|
+
Binary.fromText(
|
|
318
|
+
Array.from(metadataTypes.checksumToIdx.keys()).join("")
|
|
319
|
+
).asBytes()
|
|
320
|
+
);
|
|
334
321
|
const EntryPointsCodec = Vector(EntryPointCodec);
|
|
335
322
|
const TypedefsCodec = Vector(TypedefCodec);
|
|
336
323
|
const TypesCodec = Tuple(EntryPointsCodec, TypedefsCodec);
|
|
337
|
-
await
|
|
338
|
-
await
|
|
324
|
+
await fs2.mkdir(outputFolder, { recursive: true });
|
|
325
|
+
await fs2.writeFile(
|
|
339
326
|
path.join(outputFolder, "metadataTypes.scale"),
|
|
340
327
|
TypesCodec.enc([metadataTypes.entryPoints, metadataTypes.typedefs])
|
|
341
328
|
);
|
|
342
|
-
await
|
|
329
|
+
await fs2.writeFile(
|
|
343
330
|
path.join(outputFolder, "scale-import.d.ts"),
|
|
344
331
|
`declare module "*.scale" {
|
|
345
332
|
const content: string;
|
|
@@ -347,19 +334,19 @@ async function outputCodegen(chains, outputFolder, clientPath, whitelist) {
|
|
|
347
334
|
}
|
|
348
335
|
`
|
|
349
336
|
);
|
|
350
|
-
await
|
|
337
|
+
await fs2.writeFile(
|
|
351
338
|
path.join(outputFolder, "descriptors.ts"),
|
|
352
339
|
`///<reference path="./scale-import.d.ts"/>
|
|
353
340
|
${descriptorsFileContent}`
|
|
354
341
|
);
|
|
355
|
-
await
|
|
342
|
+
await fs2.writeFile(
|
|
356
343
|
path.join(outputFolder, "common-types.ts"),
|
|
357
344
|
typesFileContent
|
|
358
345
|
);
|
|
359
346
|
await Promise.all(
|
|
360
347
|
chains.map(
|
|
361
|
-
(chain, i) =>
|
|
362
|
-
|
|
348
|
+
(chain, i) => fs2.writeFile(
|
|
349
|
+
join2(outputFolder, `${chain.key}.ts`),
|
|
363
350
|
descriptorTypesFileContent[i]
|
|
364
351
|
)
|
|
365
352
|
)
|
|
@@ -369,12 +356,13 @@ ${descriptorsFileContent}`
|
|
|
369
356
|
chains.map((chain) => chain.key),
|
|
370
357
|
publicTypes
|
|
371
358
|
);
|
|
359
|
+
return hash;
|
|
372
360
|
}
|
|
373
361
|
async function compileCodegen(packageDir) {
|
|
374
|
-
const srcDir =
|
|
375
|
-
const outDir =
|
|
362
|
+
const srcDir = join2(packageDir, "src");
|
|
363
|
+
const outDir = join2(packageDir, "dist");
|
|
376
364
|
if (await fsExists2(outDir)) {
|
|
377
|
-
await
|
|
365
|
+
await fs2.rm(outDir, { recursive: true });
|
|
378
366
|
}
|
|
379
367
|
await tsup.build({
|
|
380
368
|
format: ["cjs", "esm"],
|
|
@@ -413,38 +401,43 @@ var generateIndex = async (path2, keys, publicTypes) => {
|
|
|
413
401
|
publicTypes.join(", "),
|
|
414
402
|
`} from './common-types';`
|
|
415
403
|
].join("\n");
|
|
416
|
-
await
|
|
404
|
+
await fs2.writeFile(join2(path2, "index.ts"), indexTs);
|
|
417
405
|
};
|
|
418
|
-
|
|
419
|
-
await
|
|
420
|
-
|
|
406
|
+
async function replacePackageJson(descriptorsDir, version) {
|
|
407
|
+
await fs2.writeFile(
|
|
408
|
+
join2(descriptorsDir, "package.json"),
|
|
421
409
|
`{
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
},
|
|
430
|
-
"./package.json": "./package.json"
|
|
431
|
-
},
|
|
432
|
-
"main": "./dist/index.js",
|
|
410
|
+
"version": "0.1.0-autogenerated.${version}",
|
|
411
|
+
"name": "@polkadot-api/descriptors",
|
|
412
|
+
"files": [
|
|
413
|
+
"dist"
|
|
414
|
+
],
|
|
415
|
+
"exports": {
|
|
416
|
+
".": {
|
|
433
417
|
"module": "./dist/index.mjs",
|
|
434
|
-
"
|
|
435
|
-
"
|
|
436
|
-
"
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
418
|
+
"import": "./dist/index.mjs",
|
|
419
|
+
"require": "./dist/index.js",
|
|
420
|
+
"default": "./dist/index.js"
|
|
421
|
+
},
|
|
422
|
+
"./package.json": "./package.json"
|
|
423
|
+
},
|
|
424
|
+
"main": "./dist/index.js",
|
|
425
|
+
"module": "./dist/index.mjs",
|
|
426
|
+
"browser": "./dist/index.mjs",
|
|
427
|
+
"types": "./dist/index.d.ts",
|
|
428
|
+
"sideEffects": false,
|
|
429
|
+
"peerDependencies": {
|
|
430
|
+
"polkadot-api": "*"
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
`
|
|
441
434
|
);
|
|
442
|
-
}
|
|
435
|
+
}
|
|
443
436
|
async function readWhitelist(filename) {
|
|
444
437
|
if (!await fsExists2(filename)) {
|
|
445
438
|
throw new Error("Whitelist file not found: " + filename);
|
|
446
439
|
}
|
|
447
|
-
const tmpDir = await mkdtemp(
|
|
440
|
+
const tmpDir = await mkdtemp(join2(tmpdir(), "papi-"));
|
|
448
441
|
try {
|
|
449
442
|
await build({
|
|
450
443
|
format: "esm",
|
|
@@ -457,29 +450,116 @@ async function readWhitelist(filename) {
|
|
|
457
450
|
},
|
|
458
451
|
silent: true
|
|
459
452
|
});
|
|
460
|
-
const { whitelist } = await import(
|
|
453
|
+
const { whitelist } = await import(join2(tmpDir, "index.mjs"));
|
|
461
454
|
return whitelist;
|
|
462
455
|
} finally {
|
|
463
456
|
await rm(tmpDir, { recursive: true }).catch(console.error);
|
|
464
457
|
}
|
|
465
458
|
}
|
|
466
459
|
|
|
460
|
+
// src/commands/add.ts
|
|
461
|
+
import { compactNumber } from "@polkadot-api/substrate-bindings";
|
|
462
|
+
import { fromHex } from "@polkadot-api/utils";
|
|
463
|
+
import { getMetadataFromRuntime } from "@polkadot-api/wasm-executor";
|
|
464
|
+
import * as fs3 from "node:fs/promises";
|
|
465
|
+
import ora from "ora";
|
|
466
|
+
import { join as join3 } from "node:path";
|
|
467
|
+
import { existsSync as existsSync3 } from "node:fs";
|
|
468
|
+
async function add(key, options) {
|
|
469
|
+
const config = await readPapiConfig(options.config) ?? defaultConfig;
|
|
470
|
+
const entries = config.entries;
|
|
471
|
+
if (key in entries) {
|
|
472
|
+
console.warn(`Replacing existing ${key} config`);
|
|
473
|
+
}
|
|
474
|
+
if (options.file) {
|
|
475
|
+
entries[key] = {
|
|
476
|
+
metadata: options.file
|
|
477
|
+
};
|
|
478
|
+
} else if (options.wasm) {
|
|
479
|
+
const spinner = ora(`Loading metadata from runtime`).start();
|
|
480
|
+
const metadataHex = (await fs3.readFile(options.wasm)).toString("hex");
|
|
481
|
+
const opaqueMeta = fromHex(getMetadataFromRuntime(`0x${metadataHex}`));
|
|
482
|
+
const metadataLen = compactNumber.dec(opaqueMeta);
|
|
483
|
+
const compactLen = compactNumber.enc(metadataLen).length;
|
|
484
|
+
if (opaqueMeta.length - compactLen !== metadataLen)
|
|
485
|
+
throw new Error("Not able to retrieve runtime metadata");
|
|
486
|
+
spinner.text = "Writing metadata";
|
|
487
|
+
const metadataRaw = opaqueMeta.slice(compactLen);
|
|
488
|
+
const filename = await storeMetadata(metadataRaw, key);
|
|
489
|
+
entries[key] = {
|
|
490
|
+
metadata: filename
|
|
491
|
+
};
|
|
492
|
+
} else {
|
|
493
|
+
const entry = entryFromOptions(options);
|
|
494
|
+
entries[key] = entry;
|
|
495
|
+
if (!options.noPersist) {
|
|
496
|
+
const spinner = ora(`Loading metadata`).start();
|
|
497
|
+
const { metadataRaw } = await getMetadata(entry);
|
|
498
|
+
spinner.text = "Writing metadata";
|
|
499
|
+
const filename = await storeMetadata(metadataRaw, key);
|
|
500
|
+
spinner.succeed(`Metadata saved as ${filename}`);
|
|
501
|
+
entry.metadata = filename;
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
await writePapiConfig(options.config, config);
|
|
505
|
+
console.log(`Saved new spec "${key}"`);
|
|
506
|
+
if (!options.skipCodegen) {
|
|
507
|
+
generate({
|
|
508
|
+
config: options.config
|
|
509
|
+
});
|
|
510
|
+
}
|
|
511
|
+
}
|
|
512
|
+
async function storeMetadata(metadata2, key) {
|
|
513
|
+
const defaultFolder = join3(papiFolder, "metadata");
|
|
514
|
+
if (!existsSync3(defaultFolder)) {
|
|
515
|
+
await fs3.mkdir(defaultFolder, { recursive: true });
|
|
516
|
+
}
|
|
517
|
+
const filename = join3(defaultFolder, `${key}.scale`);
|
|
518
|
+
await writeMetadataToDisk(metadata2, filename);
|
|
519
|
+
return filename;
|
|
520
|
+
}
|
|
521
|
+
var entryFromOptions = (options) => {
|
|
522
|
+
if (options.wsUrl) {
|
|
523
|
+
return {
|
|
524
|
+
wsUrl: options.wsUrl
|
|
525
|
+
};
|
|
526
|
+
}
|
|
527
|
+
if (options.chainSpec) {
|
|
528
|
+
return {
|
|
529
|
+
chainSpec: options.chainSpec
|
|
530
|
+
};
|
|
531
|
+
}
|
|
532
|
+
if (options.name) {
|
|
533
|
+
return {
|
|
534
|
+
chain: options.name
|
|
535
|
+
};
|
|
536
|
+
}
|
|
537
|
+
throw new Error(
|
|
538
|
+
"add command needs one source, specified by options -f -w -c or -n"
|
|
539
|
+
);
|
|
540
|
+
};
|
|
541
|
+
|
|
467
542
|
// src/commands/remove.ts
|
|
468
543
|
async function remove(key, options) {
|
|
469
|
-
const
|
|
544
|
+
const config = await readPapiConfig(options.config) ?? defaultConfig;
|
|
545
|
+
const entries = config.entries;
|
|
470
546
|
if (!(key in entries)) {
|
|
471
547
|
throw new Error(`Key ${key} not set in polkadot-api config`);
|
|
472
548
|
}
|
|
473
|
-
const entry = entries[key];
|
|
474
549
|
delete entries[key];
|
|
475
|
-
await writePapiConfig(options.config,
|
|
550
|
+
await writePapiConfig(options.config, config);
|
|
476
551
|
console.log(`Removed chain "${key}" from config`);
|
|
552
|
+
if (!options.skipCodegen) {
|
|
553
|
+
generate({
|
|
554
|
+
config: options.config
|
|
555
|
+
});
|
|
556
|
+
}
|
|
477
557
|
}
|
|
478
558
|
|
|
479
559
|
// src/commands/update.ts
|
|
480
560
|
import ora2 from "ora";
|
|
481
561
|
async function update(keysInput, options) {
|
|
482
|
-
const entries = await readPapiConfig(options.config) ??
|
|
562
|
+
const entries = (await readPapiConfig(options.config) ?? defaultConfig).entries;
|
|
483
563
|
const keys = keysInput === void 0 ? Object.keys(entries) : keysInput.split(",");
|
|
484
564
|
const updateByKey = async (key) => {
|
|
485
565
|
if (!(key in entries)) {
|
|
@@ -510,13 +590,19 @@ async function update(keysInput, options) {
|
|
|
510
590
|
console.log(`Updating descriptors`);
|
|
511
591
|
await generate({ config: options.config });
|
|
512
592
|
spinner.stop();
|
|
593
|
+
console.log(`Updated chain(s) "${keys.join(", ")}"`);
|
|
594
|
+
if (!options.skipCodegen) {
|
|
595
|
+
generate({
|
|
596
|
+
config: options.config
|
|
597
|
+
});
|
|
598
|
+
}
|
|
513
599
|
}
|
|
514
600
|
|
|
515
601
|
export {
|
|
516
602
|
getCli,
|
|
517
|
-
add,
|
|
518
603
|
generate,
|
|
604
|
+
add,
|
|
519
605
|
remove,
|
|
520
606
|
update
|
|
521
607
|
};
|
|
522
|
-
//# sourceMappingURL=chunk-
|
|
608
|
+
//# sourceMappingURL=chunk-F4ZKQC36.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/metadata.ts","../src/papiConfig.ts","../src/commands/generate.ts","../src/commands/add.ts","../src/commands/remove.ts","../src/commands/update.ts"],"sourcesContent":["import { Option, program } from \"@commander-js/extra-typings\"\nimport type { add, generate, remove, update } from \"./commands\"\nimport * as knownChains from \"@polkadot-api/known-chains\"\n\nexport type Commands = {\n add: typeof add\n generate: typeof generate\n remove: typeof remove\n update: typeof update\n}\n\nexport function getCli({ add, generate, remove, update }: Commands) {\n program.name(\"polkadot-api\").description(\"Polkadot API CLI\")\n\n const config = new Option(\"--config <filename>\", \"Source for the config file\")\n\n program\n .command(\"generate\", {\n isDefault: true,\n })\n .description(\"Generate descriptor files\")\n .addOption(config)\n .option(\n \"--whitelist <filename>\",\n \"Use whitelist file to reduce descriptor size\",\n )\n .action(generate)\n\n program\n .command(\"add\")\n .description(\"Add a new chain spec to the list\")\n .argument(\"<key>\", \"Key identifier for the chain spec\")\n .addOption(config)\n .option(\"-f, --file <filename>\", \"Source from metadata encoded file\")\n .option(\"-w, --wsUrl <URL>\", \"Source from websocket url\")\n .option(\"-c, --chainSpec <filename>\", \"Source from chain spec file\")\n .addOption(\n new Option(\"-n, --name <name>\", \"Source from a well-known chain\").choices(\n Object.keys(knownChains),\n ),\n )\n .option(\"--wasm <filename>\", \"Source from runtime wasm file\")\n .option(\"--no-persist\", \"Do not persist the metadata as a file\")\n .option(\"--skip-codegen\", \"Skip running codegen after adding\")\n .action(add)\n\n program\n .command(\"update\")\n .description(\"Update the metadata files and generate descriptor files\")\n .argument(\n \"[keys]\",\n \"Keys of the metadata files to update, separated by commas. Leave empty for all\",\n )\n .addOption(config)\n .option(\"--skip-codegen\", \"Skip running codegen after updating\")\n .action(update)\n\n program\n .command(\"remove\")\n .description(\"Remove a chain spec from the list\")\n .argument(\"<key>\", \"Key identifier for the chain spec\")\n .addOption(config)\n .option(\"--skip-codegen\", \"Skip running codegen after removing\")\n .action(remove)\n\n return program\n}\n","import { createClient } from \"@polkadot-api/substrate-client\"\nimport type { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport * as fs from \"node:fs/promises\"\nimport { V14, V15, metadata, v15 } from \"@polkadot-api/substrate-bindings\"\nimport { WebSocketProvider } from \"@polkadot-api/ws-provider/node\"\nimport { Worker } from \"node:worker_threads\"\nimport { getObservableClient } from \"@polkadot-api/observable-client\"\nimport { filter, firstValueFrom } from \"rxjs\"\nimport { EntryConfig } from \"./papiConfig\"\nimport { dirname } from \"path\"\nimport { fileURLToPath } from \"url\"\nimport * as knownChains from \"@polkadot-api/known-chains\"\nimport compatEnhancer from \"@polkadot-api/polkadot-sdk-compat\"\nimport type {\n MetadataWithRaw,\n WorkerRequestMessage,\n WorkerResponseMessage,\n} from \"./metadataWorker\"\n\nconst workerPath = fileURLToPath(import.meta.resolve(\"./metadataWorker.js\"))\n\nlet metadataWorker: Worker | null\nlet workerRefCount = 0\nasync function getMetadataWorker() {\n if (!metadataWorker) {\n metadataWorker = new Worker(workerPath, {\n stdout: true,\n stderr: true,\n })\n await new Promise((resolve) => {\n metadataWorker?.once(\"message\", resolve)\n metadataWorker?.postMessage(\"ready\")\n })\n }\n return metadataWorker\n}\n\nconst getMetadataCall = async (provider: JsonRpcProvider) => {\n const client = getObservableClient(createClient(provider))\n const { runtime$, unfollow } = client.chainHead$()\n const runtime = await firstValueFrom(runtime$.pipe(filter(Boolean)))\n\n unfollow()\n client.destroy()\n\n return { metadata: runtime.lookup.metadata, metadataRaw: runtime.metadataRaw }\n}\n\nconst getWorkerMessage = (chain: string): Omit<WorkerRequestMessage, \"id\"> => {\n if (!(chain in knownChains)) {\n const relayChainName = JSON.parse(chain).relay_chain\n return {\n potentialRelayChainSpecs:\n relayChainName in knownChains\n ? [knownChains[relayChainName as keyof typeof knownChains]]\n : [],\n chainSpec: chain,\n }\n }\n\n const relayChainName = Object.keys(knownChains).find(\n (c) => c !== chain && chain.startsWith(c),\n )\n const potentialRelayChainSpecs = relayChainName\n ? [knownChains[relayChainName as keyof typeof knownChains]]\n : []\n const chainSpec = knownChains[chain as keyof typeof knownChains]\n\n return {\n potentialRelayChainSpecs,\n chainSpec,\n }\n}\n\nlet id = 0\nconst getMetadataFromSmoldot = async (chain: string) => {\n workerRefCount++\n try {\n const reqId = id++\n const metadataWorker = await getMetadataWorker()\n const message: WorkerRequestMessage = {\n ...getWorkerMessage(chain),\n id: reqId,\n }\n const metadata = await new Promise<MetadataWithRaw>((resolve) => {\n const listener = (data: WorkerResponseMessage) => {\n if (data.id !== reqId) return\n metadataWorker.off(\"message\", listener)\n resolve(data.metadata)\n }\n metadataWorker.on(\"message\", listener)\n metadataWorker.postMessage(message)\n })\n return metadata\n } finally {\n workerRefCount--\n if (workerRefCount === 0) {\n metadataWorker?.terminate()\n metadataWorker = null\n }\n }\n}\n\nconst getMetadataFromWsURL = async (wsURL: string) =>\n getMetadataCall(compatEnhancer(WebSocketProvider(wsURL)))\n\nexport async function getMetadata(\n entry: EntryConfig,\n): Promise<{ metadata: V15 | V14; metadataRaw: Uint8Array } | null> {\n // metadata file always prevails over other entries.\n // cli's update will update the metadata file when the user requests it.\n if (entry.metadata) {\n const data = await fs.readFile(entry.metadata)\n const metadataRaw = new Uint8Array(data)\n\n let meta: V14 | V15\n try {\n meta = metadata.dec(metadataRaw).metadata.value as V14 | V15\n } catch (_) {\n meta = v15.dec(metadataRaw)\n }\n\n return {\n metadata: meta,\n metadataRaw,\n }\n }\n\n if (\"chain\" in entry) {\n return getMetadataFromSmoldot(entry.chain)\n }\n\n if (\"chainSpec\" in entry) {\n const chainSpec = await fs.readFile(entry.chainSpec, \"utf8\")\n return getMetadataFromSmoldot(chainSpec)\n }\n\n if (\"wsUrl\" in entry) {\n return getMetadataFromWsURL(entry.wsUrl)\n }\n\n return null\n}\n\nexport async function writeMetadataToDisk(\n metadataRaw: Uint8Array,\n outFile: string,\n) {\n await fs.mkdir(dirname(outFile), { recursive: true })\n await fs.writeFile(outFile, metadataRaw)\n}\n","import fsExists from \"fs.promises.exists\"\nimport { readPackage } from \"read-pkg\"\nimport { mkdir, readFile, writeFile } from \"node:fs/promises\"\nimport { join } from \"node:path\"\nimport { existsSync } from \"node:fs\"\n\nexport type EntryConfig =\n | {\n metadata: string\n }\n | {\n chainSpec: string\n metadata?: string\n }\n | {\n wsUrl: string\n metadata?: string\n }\n | {\n chain: string\n metadata?: string\n }\ntype Entries = Record<string, EntryConfig>\nexport type PapiConfig = {\n version: 0\n descriptorPath: string\n entries: Record<string, EntryConfig>\n}\n\nexport const papiFolder = \".papi\"\nconst papiCfgDefaultFile = \"polkadot-api.json\"\nconst packageJsonKey = \"polkadot-api\"\n\nexport const defaultConfig: PapiConfig = {\n version: 0,\n descriptorPath: join(papiFolder, \"descriptors\"),\n entries: {},\n}\n\nexport async function readPapiConfig(\n configFile: string | undefined,\n): Promise<PapiConfig | null> {\n if (configFile) return readFromFile(configFile)\n\n const currentVersionLocation = join(papiFolder, papiCfgDefaultFile)\n const currentVersionLocationExists = await fsExists(currentVersionLocation)\n\n const readConfig =\n (await (currentVersionLocationExists\n ? readFromFile(currentVersionLocation)\n : readFromFile(papiCfgDefaultFile))) ?? (await readFromPackageJson())\n\n // Store into current version location if it wasn't there\n if (readConfig && !currentVersionLocationExists) {\n await writePapiConfig(undefined, readConfig)\n }\n return readConfig\n}\n\n/**\n * Writes config to configFile. If configFile is not specified, it writes to the\n * default path, by this priority order:\n *\n * 1. Default config file (polkadot-api.json)\n * 2. Package.json If no pre-existing config exists, then it creates a\n * polkadot-api.json file.\n */\nexport async function writePapiConfig(\n configFile: string | undefined,\n config: PapiConfig,\n) {\n if (configFile) return writeToFile(configFile, config)\n\n if (!existsSync(papiFolder)) {\n await mkdir(papiFolder)\n }\n return writeToFile(join(papiFolder, papiCfgDefaultFile), config)\n}\n\nasync function readFromFile(file: string) {\n const fileExists = await fsExists(file)\n if (!fileExists) return null\n\n return migrate(JSON.parse(await readFile(file, \"utf8\")))\n}\nasync function readFromPackageJson() {\n const packageJson = await readPackage()\n if (!(packageJsonKey in packageJson)) return null\n console.warn(\"Papi config in package.json is deprecated\")\n return migrate(packageJson[packageJsonKey])\n}\n\nfunction migrate(content: Entries | PapiConfig): PapiConfig {\n if (typeof content.version === \"number\") {\n return content as any\n }\n return {\n ...defaultConfig,\n entries: content as Entries,\n }\n}\n\nasync function writeToFile(file: string, config: PapiConfig) {\n if (file === \"package.json\") {\n throw new Error(\"Papi config in package.json is deprecated\")\n }\n return writeFile(file, JSON.stringify(config, null, 2))\n}\n","import { getMetadata } from \"@/metadata\"\nimport { readPapiConfig } from \"@/papiConfig\"\nimport { generateMultipleDescriptors } from \"@polkadot-api/codegen\"\nimport {\n EntryPointCodec,\n TypedefCodec,\n} from \"@polkadot-api/metadata-compatibility\"\nimport {\n Binary,\n h64,\n Tuple,\n V14,\n V15,\n Vector,\n} from \"@polkadot-api/substrate-bindings\"\nimport { existsSync } from \"fs\"\nimport fsExists from \"fs.promises.exists\"\nimport fs, { mkdtemp, rm } from \"fs/promises\"\nimport { tmpdir } from \"os\"\nimport path, { join } from \"path\"\nimport process from \"process\"\nimport tsc from \"tsc-prog\"\nimport tsup, { build } from \"tsup\"\nimport { updatePackage } from \"write-package\"\nimport { CommonOptions } from \"./commonOptions\"\nimport { spawn } from \"child_process\"\nimport { readPackage } from \"read-pkg\"\nimport { detect } from \"detect-package-manager\"\n\nexport interface GenerateOptions extends CommonOptions {\n clientLibrary?: string\n whitelist?: string\n}\n\nexport async function generate(opts: GenerateOptions) {\n if (process.env.PAPI_SKIP_GENERATE) {\n return\n }\n\n const config = await readPapiConfig(opts.config)\n if (!config) {\n throw new Error(\"Can't find the Polkadot-API configuration\")\n }\n const sources = config.entries\n\n if (Object.keys(sources).length == 0) {\n console.log(\"No chains defined in config file\")\n }\n\n console.log(`Reading metadata`)\n const chains = await Promise.all(\n Object.entries(sources).map(async ([key, source]) => ({\n key,\n metadata: (await getMetadata(source))!.metadata,\n knownTypes: {},\n })),\n )\n\n await cleanDescriptorsPackage(config.descriptorPath)\n const descriptorsDir = join(process.cwd(), config.descriptorPath)\n\n const clientPath = opts.clientLibrary ?? \"polkadot-api\"\n\n const whitelist = opts.whitelist ? await readWhitelist(opts.whitelist) : null\n const hash = await outputCodegen(\n chains,\n join(descriptorsDir, \"src\"),\n clientPath,\n whitelist,\n )\n await replacePackageJson(descriptorsDir, hash)\n\n await compileCodegen(descriptorsDir)\n await fs.rm(join(descriptorsDir, \"src\"), { recursive: true })\n await runInstall()\n}\n\nasync function cleanDescriptorsPackage(path: string) {\n const descriptorsDir = join(process.cwd(), path)\n if (!existsSync(descriptorsDir)) {\n await fs.mkdir(descriptorsDir, { recursive: true })\n\n // We have to keep the package.json in git because otherwise npm install on a fresh repo would fail\n await fs.writeFile(\n join(descriptorsDir, \".gitignore\"),\n \"*\\n!.gitignore\\n!package.json\",\n )\n }\n\n const packageJson = await readPackage()\n const packageSource = `file:${path}`\n const currentSource = packageJson.dependencies?.[\"@polkadot-api/descriptors\"]\n if (currentSource !== packageSource) {\n await updatePackage({\n dependencies: {\n \"@polkadot-api/descriptors\": packageSource,\n },\n })\n }\n\n const distDir = join(descriptorsDir, \"dist\")\n if (existsSync(distDir)) {\n await fs.rm(distDir, { recursive: true })\n }\n}\n\nasync function getPackageManager() {\n return process.env.npm_execpath ?? (await detect())\n}\nasync function runInstall() {\n const path = await getPackageManager()\n console.log(`${path} install`)\n const child = spawn(await getPackageManager(), [\"install\"], {\n stdio: \"inherit\",\n env: {\n ...process.env,\n PAPI_SKIP_GENERATE: \"true\",\n },\n })\n await new Promise((resolve) => child.on(\"close\", resolve))\n}\n\nasync function outputCodegen(\n chains: Array<{\n key: string\n metadata: V14 | V15\n knownTypes: Record<string, string>\n }>,\n outputFolder: string,\n clientPath: string,\n whitelist: string[] | null,\n) {\n const {\n descriptorsFileContent,\n descriptorTypesFileContent,\n metadataTypes,\n typesFileContent,\n publicTypes,\n } = generateMultipleDescriptors(\n chains,\n {\n client: clientPath,\n metadataTypes: \"./metadataTypes.scale\",\n types: \"./common-types\",\n descriptorValues: \"./descriptors\",\n },\n {\n whitelist: whitelist ?? undefined,\n },\n )\n const hash = h64(\n Binary.fromText(\n Array.from(metadataTypes.checksumToIdx.keys()).join(\"\"),\n ).asBytes(),\n )\n\n const EntryPointsCodec = Vector(EntryPointCodec)\n const TypedefsCodec = Vector(TypedefCodec)\n const TypesCodec = Tuple(EntryPointsCodec, TypedefsCodec)\n\n await fs.mkdir(outputFolder, { recursive: true })\n await fs.writeFile(\n path.join(outputFolder, \"metadataTypes.scale\"),\n TypesCodec.enc([metadataTypes.entryPoints, metadataTypes.typedefs]),\n )\n await fs.writeFile(\n path.join(outputFolder, \"scale-import.d.ts\"),\n `declare module \"*.scale\" {\n const content: string;\n export default content;\n }\n `,\n )\n await fs.writeFile(\n path.join(outputFolder, \"descriptors.ts\"),\n `///<reference path=\"./scale-import.d.ts\"/>\n${descriptorsFileContent}`,\n )\n await fs.writeFile(\n path.join(outputFolder, \"common-types.ts\"),\n typesFileContent,\n )\n await Promise.all(\n chains.map((chain, i) =>\n fs.writeFile(\n join(outputFolder, `${chain.key}.ts`),\n descriptorTypesFileContent[i],\n ),\n ),\n )\n await generateIndex(\n outputFolder,\n chains.map((chain) => chain.key),\n publicTypes,\n )\n\n return hash\n}\n\nasync function compileCodegen(packageDir: string) {\n const srcDir = join(packageDir, \"src\")\n const outDir = join(packageDir, \"dist\")\n\n if (await fsExists(outDir)) {\n await fs.rm(outDir, { recursive: true })\n }\n\n await tsup.build({\n format: [\"cjs\", \"esm\"],\n entry: [path.join(srcDir, \"index.ts\")],\n loader: {\n \".scale\": \"binary\",\n },\n platform: \"neutral\",\n outDir,\n outExtension: (ctx) => ({\n js: ctx.format === \"esm\" ? \".mjs\" : \".js\",\n }),\n })\n\n tsc.build({\n basePath: srcDir,\n compilerOptions: {\n skipLibCheck: true,\n declaration: true,\n emitDeclarationOnly: true,\n target: \"esnext\",\n module: \"esnext\",\n moduleResolution: \"node\",\n resolveJsonModule: true,\n allowSyntheticDefaultImports: true,\n outDir,\n },\n })\n}\n\nconst generateIndex = async (\n path: string,\n keys: string[],\n publicTypes: string[],\n) => {\n const indexTs = [\n ...keys.flatMap((key) => [\n `export { default as ${key} } from \"./${key}\";`,\n `export type * from \"./${key}\";`,\n ]),\n `export {`,\n publicTypes.join(\", \"),\n `} from './common-types';`,\n ].join(\"\\n\")\n await fs.writeFile(join(path, \"index.ts\"), indexTs)\n}\n\nasync function replacePackageJson(descriptorsDir: string, version: bigint) {\n await fs.writeFile(\n join(descriptorsDir, \"package.json\"),\n `{\n \"version\": \"0.1.0-autogenerated.${version}\",\n \"name\": \"@polkadot-api/descriptors\",\n \"files\": [\n \"dist\"\n ],\n \"exports\": {\n \".\": {\n \"module\": \"./dist/index.mjs\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.js\",\n \"default\": \"./dist/index.js\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.mjs\",\n \"browser\": \"./dist/index.mjs\",\n \"types\": \"./dist/index.d.ts\",\n \"sideEffects\": false,\n \"peerDependencies\": {\n \"polkadot-api\": \"*\"\n }\n}\n`,\n )\n}\n\nasync function readWhitelist(filename: string): Promise<string[] | null> {\n if (!(await fsExists(filename))) {\n throw new Error(\"Whitelist file not found: \" + filename)\n }\n\n const tmpDir = await mkdtemp(join(tmpdir(), \"papi-\"))\n try {\n await build({\n format: \"esm\",\n entry: {\n index: filename,\n },\n outDir: tmpDir,\n outExtension() {\n return { js: \".mjs\" }\n },\n silent: true,\n })\n const { whitelist } = await import(join(tmpDir, \"index.mjs\"))\n return whitelist\n } finally {\n await rm(tmpDir, { recursive: true }).catch(console.error)\n }\n}\n","import { getMetadata, writeMetadataToDisk } from \"@/metadata\"\nimport {\n defaultConfig,\n EntryConfig,\n papiFolder,\n readPapiConfig,\n writePapiConfig,\n} from \"@/papiConfig\"\nimport { compactNumber } from \"@polkadot-api/substrate-bindings\"\nimport { fromHex } from \"@polkadot-api/utils\"\nimport { getMetadataFromRuntime } from \"@polkadot-api/wasm-executor\"\nimport * as fs from \"node:fs/promises\"\nimport ora from \"ora\"\nimport { CommonOptions } from \"./commonOptions\"\nimport { generate } from \"./generate\"\nimport { join } from \"node:path\"\nimport { existsSync } from \"node:fs\"\n\nexport interface AddOptions extends CommonOptions {\n file?: string\n wsUrl?: string\n chainSpec?: string\n // well-known chains\n name?: string\n wasm?: string\n noPersist?: boolean\n}\n\nexport async function add(key: string, options: AddOptions) {\n const config = (await readPapiConfig(options.config)) ?? defaultConfig\n const entries = config.entries\n\n if (key in entries) {\n console.warn(`Replacing existing ${key} config`)\n }\n\n if (options.file) {\n entries[key] = {\n metadata: options.file,\n }\n } else if (options.wasm) {\n const spinner = ora(`Loading metadata from runtime`).start()\n const metadataHex = (await fs.readFile(options.wasm)).toString(\"hex\")\n const opaqueMeta = fromHex(getMetadataFromRuntime(`0x${metadataHex}`))\n\n // metadata comes with compact length prepended\n const metadataLen = compactNumber.dec(opaqueMeta)\n const compactLen = compactNumber.enc(metadataLen).length\n // verify we got all data\n if (opaqueMeta.length - compactLen !== metadataLen)\n throw new Error(\"Not able to retrieve runtime metadata\")\n\n spinner.text = \"Writing metadata\"\n const metadataRaw = opaqueMeta.slice(compactLen)\n const filename = await storeMetadata(metadataRaw, key)\n\n entries[key] = {\n metadata: filename,\n }\n } else {\n const entry = entryFromOptions(options)\n entries[key] = entry\n\n if (!options.noPersist) {\n const spinner = ora(`Loading metadata`).start()\n const { metadataRaw } = (await getMetadata(entry))!\n\n spinner.text = \"Writing metadata\"\n const filename = await storeMetadata(metadataRaw, key)\n\n spinner.succeed(`Metadata saved as ${filename}`)\n entry.metadata = filename\n }\n }\n\n await writePapiConfig(options.config, config)\n console.log(`Saved new spec \"${key}\"`)\n\n if (!options.skipCodegen) {\n generate({\n config: options.config,\n })\n }\n}\n\nasync function storeMetadata(metadata: Uint8Array, key: string) {\n const defaultFolder = join(papiFolder, \"metadata\")\n if (!existsSync(defaultFolder)) {\n await fs.mkdir(defaultFolder, { recursive: true })\n }\n const filename = join(defaultFolder, `${key}.scale`)\n await writeMetadataToDisk(metadata, filename)\n return filename\n}\n\nconst entryFromOptions = (options: AddOptions): EntryConfig => {\n if (options.wsUrl) {\n return {\n wsUrl: options.wsUrl,\n }\n }\n if (options.chainSpec) {\n return {\n chainSpec: options.chainSpec,\n }\n }\n if (options.name) {\n return {\n chain: options.name,\n }\n }\n\n throw new Error(\n \"add command needs one source, specified by options -f -w -c or -n\",\n )\n}\n","import { defaultConfig, readPapiConfig, writePapiConfig } from \"@/papiConfig\"\nimport { CommonOptions } from \"./commonOptions\"\nimport { generate } from \"./generate\"\n\nexport async function remove(key: string, options: CommonOptions) {\n const config = (await readPapiConfig(options.config)) ?? defaultConfig\n const entries = config.entries\n\n if (!(key in entries)) {\n throw new Error(`Key ${key} not set in polkadot-api config`)\n }\n\n delete entries[key]\n\n await writePapiConfig(options.config, config)\n console.log(`Removed chain \"${key}\" from config`)\n\n if (!options.skipCodegen) {\n generate({\n config: options.config,\n })\n }\n}\n","import { getMetadata, writeMetadataToDisk } from \"@/metadata\"\nimport { defaultConfig, EntryConfig, readPapiConfig } from \"@/papiConfig\"\nimport ora from \"ora\"\nimport { CommonOptions } from \"./commonOptions\"\nimport { generate } from \"./generate\"\n\nexport async function update(\n keysInput: string | undefined,\n options: CommonOptions,\n) {\n const entries = ((await readPapiConfig(options.config)) ?? defaultConfig)\n .entries\n const keys =\n keysInput === undefined ? Object.keys(entries) : keysInput.split(\",\")\n\n const updateByKey = async (key: string) => {\n if (!(key in entries)) {\n throw new Error(`Key ${key} not set in polkadot-api config`)\n }\n\n // Exclude metadata file from the entry, otherwise getMetadata would load from the file\n const { metadata: filename, ...entry } = entries[key]\n if (!filename) {\n if (keysInput !== undefined) {\n console.warn(`Key ${key} doesn't have a metadata file to update`)\n }\n\n return\n }\n\n const metadata = await getMetadata(entry as EntryConfig)\n // For those without other sources than metadata file, we get a null.\n if (!metadata) {\n if (keysInput !== undefined) {\n console.warn(\n `Key ${key} doesn't have any external source to update from`,\n )\n }\n return\n }\n\n spinner.text = `Writing ${key} metadata`\n await writeMetadataToDisk(metadata.metadataRaw, filename)\n spinner.succeed(`${key} metadata updated`)\n }\n\n const spinner = ora(`Updating`).start()\n await Promise.all(keys.map(updateByKey))\n\n console.log(`Updating descriptors`)\n await generate({ config: options.config })\n\n spinner.stop()\n console.log(`Updated chain(s) \"${keys.join(\", \")}\"`)\n\n if (!options.skipCodegen) {\n generate({\n config: options.config,\n })\n }\n}\n"],"mappings":"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","names":["add","generate","remove","update","knownChains","relayChainName","metadataWorker","metadata","mkdir","readFile","writeFile","existsSync","fsExists","fs","join","readPackage","path","fs","join","existsSync","metadata","ora","metadata","ora"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import * as _commander_js_extra_typings from '@commander-js/extra-typings';
|
|
|
2
2
|
|
|
3
3
|
interface CommonOptions {
|
|
4
4
|
config?: string;
|
|
5
|
+
skipCodegen?: boolean;
|
|
5
6
|
}
|
|
6
7
|
|
|
7
8
|
interface AddOptions extends CommonOptions {
|
|
@@ -15,7 +16,6 @@ interface AddOptions extends CommonOptions {
|
|
|
15
16
|
declare function add(key: string, options: AddOptions): Promise<void>;
|
|
16
17
|
|
|
17
18
|
interface GenerateOptions extends CommonOptions {
|
|
18
|
-
key?: string;
|
|
19
19
|
clientLibrary?: string;
|
|
20
20
|
whitelist?: string;
|
|
21
21
|
}
|
package/dist/index.js
CHANGED
package/dist/main.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@polkadot-api/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"author": "Victor Oliva (https://github.com/voliva)",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"sideEffects": true,
|
|
@@ -23,42 +23,44 @@
|
|
|
23
23
|
}
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"@commander-js/extra-typings": "^12.0
|
|
26
|
+
"@commander-js/extra-typings": "^12.1.0",
|
|
27
27
|
"@polkadot-api/wasm-executor": "^0.1.1",
|
|
28
|
-
"@types/node": "^20.12
|
|
29
|
-
"commander": "^12.
|
|
28
|
+
"@types/node": "^20.14.12",
|
|
29
|
+
"commander": "^12.1.0",
|
|
30
|
+
"detect-package-manager": "^3.0.2",
|
|
30
31
|
"fs.promises.exists": "^1.1.4",
|
|
31
32
|
"ora": "^8.0.1",
|
|
32
33
|
"read-pkg": "^9.0.1",
|
|
33
34
|
"rxjs": "^7.8.1",
|
|
34
35
|
"scale-ts": "^1.6.0",
|
|
35
36
|
"tsc-prog": "^2.3.0",
|
|
36
|
-
"tsup": "^8.
|
|
37
|
-
"typescript": "^5.4
|
|
37
|
+
"tsup": "^8.2.3",
|
|
38
|
+
"typescript": "^5.5.4",
|
|
38
39
|
"write-package": "^7.0.1",
|
|
39
|
-
"ws": "^8.
|
|
40
|
-
"@polkadot-api/codegen": "0.7.0",
|
|
40
|
+
"ws": "^8.18.0",
|
|
41
41
|
"@polkadot-api/json-rpc-provider": "0.0.2",
|
|
42
42
|
"@polkadot-api/json-rpc-provider-proxy": "0.2.0",
|
|
43
|
-
"@polkadot-api/
|
|
44
|
-
"@polkadot-api/
|
|
45
|
-
"@polkadot-api/metadata-
|
|
46
|
-
"@polkadot-api/
|
|
47
|
-
"@polkadot-api/observable-client": "0.
|
|
43
|
+
"@polkadot-api/metadata-builders": "0.4.1",
|
|
44
|
+
"@polkadot-api/known-chains": "0.3.0",
|
|
45
|
+
"@polkadot-api/metadata-compatibility": "0.1.1",
|
|
46
|
+
"@polkadot-api/codegen": "0.7.2",
|
|
47
|
+
"@polkadot-api/observable-client": "0.5.0",
|
|
48
48
|
"@polkadot-api/sm-provider": "0.1.1",
|
|
49
|
-
"@polkadot-api/
|
|
50
|
-
"@polkadot-api/
|
|
49
|
+
"@polkadot-api/polkadot-sdk-compat": "1.0.1",
|
|
50
|
+
"@polkadot-api/smoldot": "0.2.7",
|
|
51
|
+
"@polkadot-api/substrate-bindings": "0.6.2",
|
|
52
|
+
"@polkadot-api/substrate-client": "0.2.0",
|
|
51
53
|
"@polkadot-api/utils": "0.1.1",
|
|
52
|
-
"@polkadot-api/ws-provider": "0.1.1"
|
|
53
|
-
"@polkadot-api/substrate-client": "0.2.0"
|
|
54
|
+
"@polkadot-api/ws-provider": "0.1.1"
|
|
54
55
|
},
|
|
55
56
|
"devDependencies": {
|
|
56
|
-
"@types/ws": "^8.5.
|
|
57
|
+
"@types/ws": "^8.5.11",
|
|
57
58
|
"clet": "^1.0.1",
|
|
58
59
|
"@polkadot-api/json-rpc-provider": "0.0.2"
|
|
59
60
|
},
|
|
60
61
|
"scripts": {
|
|
61
|
-
"build": "tsc --noEmit && tsup-node src/main.ts src/index.ts src/metadataWorker.ts --clean --out-dir dist --dts --sourcemap --platform node --format esm",
|
|
62
|
+
"build-core": "tsc --noEmit && tsup-node src/main.ts src/index.ts src/metadataWorker.ts --clean --out-dir dist --dts --sourcemap --platform node --format esm",
|
|
63
|
+
"build": "pnpm build-core",
|
|
62
64
|
"start": "pnpm build && node --enable-source-maps dist/main.js",
|
|
63
65
|
"test": "echo 'no tests'",
|
|
64
66
|
"lint": "prettier --check README.md \"src/**/*.{js,jsx,ts,tsx,json,md}\"",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/metadata.ts","../src/papiConfig.ts","../src/commands/add.ts","../src/commands/generate.ts","../src/commands/remove.ts","../src/commands/update.ts"],"sourcesContent":["import { Option, program } from \"@commander-js/extra-typings\"\nimport type { add, generate, remove, update } from \"./commands\"\nimport * as knownChains from \"@polkadot-api/known-chains\"\n\nexport type Commands = {\n add: typeof add\n generate: typeof generate\n remove: typeof remove\n update: typeof update\n}\n\nexport function getCli({ add, generate, remove, update }: Commands) {\n program.name(\"polkadot-api\").description(\"Polkadot API CLI\")\n\n const config = new Option(\"--config <filename>\", \"Source for the config file\")\n\n program\n .command(\"generate\", {\n isDefault: true,\n })\n .description(\"Generate descriptor files\")\n .addOption(config)\n .option(\"-k, --key <key>\", \"Key of the descriptor to generate\")\n .option(\n \"--whitelist <filename>\",\n \"Use whitelist file to reduce descriptor size\",\n )\n .action(generate)\n\n program\n .command(\"add\")\n .description(\"Add a new chain spec to the list\")\n .argument(\"<key>\", \"Key identifier for the chain spec\")\n .addOption(config)\n .option(\"-f, --file <filename>\", \"Source from metadata encoded file\")\n .option(\"-w, --wsUrl <URL>\", \"Source from websocket url\")\n .option(\"-c, --chainSpec <filename>\", \"Source from chain spec file\")\n .addOption(\n new Option(\"-n, --name <name>\", \"Source from a well-known chain\").choices(\n Object.keys(knownChains),\n ),\n )\n .option(\"--wasm <filename>\", \"Source from runtime wasm file\")\n .option(\"--no-persist\", \"Do not persist the metadata as a file\")\n .action(add)\n\n program\n .command(\"update\")\n .description(\"Update the metadata files and generate descriptor files\")\n .argument(\n \"[keys]\",\n \"Keys of the metadata files to update, separated by commas. Leave empty for all\",\n )\n .addOption(config)\n .action(update)\n\n program\n .command(\"remove\")\n .description(\"Remove a chain spec from the list\")\n .argument(\"<key>\", \"Key identifier for the chain spec\")\n .addOption(config)\n .action(remove)\n\n return program\n}\n","import { createClient } from \"@polkadot-api/substrate-client\"\nimport type { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport * as fs from \"node:fs/promises\"\nimport { V14, V15, metadata, v15 } from \"@polkadot-api/substrate-bindings\"\nimport { WebSocketProvider } from \"@polkadot-api/ws-provider/node\"\nimport { Worker } from \"node:worker_threads\"\nimport { getObservableClient } from \"@polkadot-api/observable-client\"\nimport { filter, firstValueFrom } from \"rxjs\"\nimport { EntryConfig } from \"./papiConfig\"\nimport { dirname } from \"path\"\nimport { fileURLToPath } from \"url\"\nimport * as knownChains from \"@polkadot-api/known-chains\"\nimport compatEnhancer from \"@polkadot-api/polkadot-sdk-compat\"\nimport type {\n MetadataWithRaw,\n WorkerRequestMessage,\n WorkerResponseMessage,\n} from \"./metadataWorker\"\n\nconst workerPath = fileURLToPath(import.meta.resolve(\"./metadataWorker.js\"))\n\nlet metadataWorker: Worker | null\nlet workerRefCount = 0\nasync function getMetadataWorker() {\n if (!metadataWorker) {\n metadataWorker = new Worker(workerPath, {\n stdout: true,\n stderr: true,\n })\n await new Promise((resolve) => {\n metadataWorker?.once(\"message\", resolve)\n metadataWorker?.postMessage(\"ready\")\n })\n }\n return metadataWorker\n}\n\nconst getMetadataCall = async (provider: JsonRpcProvider) => {\n const client = getObservableClient(createClient(provider))\n const { runtime$, unfollow } = client.chainHead$()\n const runtime = await firstValueFrom(runtime$.pipe(filter(Boolean)))\n\n unfollow()\n client.destroy()\n\n return { metadata: runtime.lookup.metadata, metadataRaw: runtime.metadataRaw }\n}\n\nconst getWorkerMessage = (chain: string): Omit<WorkerRequestMessage, \"id\"> => {\n if (!(chain in knownChains)) {\n const relayChainName = JSON.parse(chain).relay_chain\n return {\n potentialRelayChainSpecs:\n relayChainName in knownChains\n ? [knownChains[relayChainName as keyof typeof knownChains]]\n : [],\n chainSpec: chain,\n }\n }\n\n const relayChainName = Object.keys(knownChains).find(\n (c) => c !== chain && chain.startsWith(c),\n )\n const potentialRelayChainSpecs = relayChainName\n ? [knownChains[relayChainName as keyof typeof knownChains]]\n : []\n const chainSpec = knownChains[chain as keyof typeof knownChains]\n\n return {\n potentialRelayChainSpecs,\n chainSpec,\n }\n}\n\nlet id = 0\nconst getMetadataFromSmoldot = async (chain: string) => {\n workerRefCount++\n try {\n const reqId = id++\n const metadataWorker = await getMetadataWorker()\n const message: WorkerRequestMessage = {\n ...getWorkerMessage(chain),\n id: reqId,\n }\n const metadata = await new Promise<MetadataWithRaw>((resolve) => {\n const listener = (data: WorkerResponseMessage) => {\n if (data.id !== reqId) return\n metadataWorker.off(\"message\", listener)\n resolve(data.metadata)\n }\n metadataWorker.on(\"message\", listener)\n metadataWorker.postMessage(message)\n })\n return metadata\n } finally {\n workerRefCount--\n if (workerRefCount === 0) {\n metadataWorker?.terminate()\n metadataWorker = null\n }\n }\n}\n\nconst getMetadataFromWsURL = async (wsURL: string) =>\n getMetadataCall(compatEnhancer(WebSocketProvider(wsURL)))\n\nexport async function getMetadata(\n entry: EntryConfig,\n): Promise<{ metadata: V15 | V14; metadataRaw: Uint8Array } | null> {\n // metadata file always prevails over other entries.\n // cli's update will update the metadata file when the user requests it.\n if (entry.metadata) {\n const data = await fs.readFile(entry.metadata)\n const metadataRaw = new Uint8Array(data)\n\n let meta: V14 | V15\n try {\n meta = metadata.dec(metadataRaw).metadata.value as V14 | V15\n } catch (_) {\n meta = v15.dec(metadataRaw)\n }\n\n return {\n metadata: meta,\n metadataRaw,\n }\n }\n\n if (\"chain\" in entry) {\n return getMetadataFromSmoldot(entry.chain)\n }\n\n if (\"chainSpec\" in entry) {\n const chainSpec = await fs.readFile(entry.chainSpec, \"utf8\")\n return getMetadataFromSmoldot(chainSpec)\n }\n\n if (\"wsUrl\" in entry) {\n return getMetadataFromWsURL(entry.wsUrl)\n }\n\n return null\n}\n\nexport async function writeMetadataToDisk(\n metadataRaw: Uint8Array,\n outFile: string,\n) {\n await fs.mkdir(dirname(outFile), { recursive: true })\n await fs.writeFile(outFile, metadataRaw)\n}\n","import fsExists from \"fs.promises.exists\"\nimport { readPackage } from \"read-pkg\"\nimport { updatePackage } from \"write-package\"\nimport { readFile, writeFile } from \"node:fs/promises\"\n\nexport type EntryConfig =\n | {\n metadata: string\n }\n | {\n chainSpec: string\n metadata?: string\n }\n | {\n wsUrl: string\n metadata?: string\n }\n | {\n chain: string\n metadata?: string\n }\nexport type PapiConfig = Record<string, EntryConfig>\n\nconst papiCfgDefaultFile = \"polkadot-api.json\"\nconst packageJsonKey = \"polkadot-api\"\n\nexport async function readPapiConfig(\n configFile: string | undefined,\n): Promise<PapiConfig | null> {\n if (configFile) return readFromFile(configFile)\n\n const configFromDefaultFile = await readFromFile(papiCfgDefaultFile)\n if (configFromDefaultFile) return configFromDefaultFile\n\n return readFromFile(\"package.json\")\n}\n\n/**\n * Writes config to configFile. If configFile is not specified, it writes to the\n * default path, by this priority order:\n *\n * 1. Default config file (polkadot-api.json)\n * 2. Package.json If no pre-existing config exists, then it creates a\n * polkadot-api.json file.\n */\nexport async function writePapiConfig(\n configFile: string | undefined,\n config: PapiConfig,\n) {\n if (configFile) return writeToFile(configFile, config)\n\n const defaultCfgExists = await fsExists(papiCfgDefaultFile)\n if (defaultCfgExists) return writeToFile(papiCfgDefaultFile, config)\n\n const packageCfg = await readFromFile(\"package.json\")\n if (packageCfg) {\n return writeToFile(\"package.json\", config)\n }\n\n return writeToFile(papiCfgDefaultFile, config)\n}\n\nasync function readFromFile(file: string) {\n const fileExists = await fsExists(file)\n if (!fileExists) return null\n\n if (file === \"package.json\") {\n const packageJson = await readPackage()\n return packageJson[packageJsonKey] ?? null\n }\n return JSON.parse(await readFile(file, \"utf8\"))\n}\n\nasync function writeToFile(file: string, config: PapiConfig) {\n if (file === \"package.json\") {\n // updatePackage preserves existing values, we have to clear them to make removes work.\n await updatePackage({\n [packageJsonKey]: null,\n })\n return updatePackage({\n [packageJsonKey]: config,\n })\n }\n return writeFile(file, JSON.stringify(config, null, 2))\n}\n","import { getMetadata, writeMetadataToDisk } from \"@/metadata\"\nimport { EntryConfig, readPapiConfig, writePapiConfig } from \"@/papiConfig\"\nimport { compactNumber } from \"@polkadot-api/substrate-bindings\"\nimport { fromHex } from \"@polkadot-api/utils\"\nimport { getMetadataFromRuntime } from \"@polkadot-api/wasm-executor\"\nimport * as fs from \"node:fs/promises\"\nimport ora from \"ora\"\nimport { CommonOptions } from \"./commonOptions\"\n\nexport interface AddOptions extends CommonOptions {\n file?: string\n wsUrl?: string\n chainSpec?: string\n // well-known chains\n name?: string\n wasm?: string\n noPersist?: boolean\n}\n\nexport async function add(key: string, options: AddOptions) {\n const entries = (await readPapiConfig(options.config)) ?? {}\n if (key in entries) {\n console.warn(`Replacing existing ${key} config`)\n }\n\n if (options.file) {\n entries[key] = {\n metadata: options.file,\n }\n } else if (options.wasm) {\n const spinner = ora(`Loading metadata from runtime`).start()\n const metadataHex = (await fs.readFile(options.wasm)).toString(\"hex\")\n const opaqueMeta = fromHex(getMetadataFromRuntime(`0x${metadataHex}`))\n\n // metadata comes with compact length prepended\n const metadataLen = compactNumber.dec(opaqueMeta)\n const compactLen = compactNumber.enc(metadataLen).length\n // verify we got all data\n if (opaqueMeta.length - compactLen !== metadataLen)\n throw new Error(\"Not able to retrieve runtime metadata\")\n\n spinner.text = \"Writing metadata\"\n const metadataRaw = opaqueMeta.slice(compactLen)\n const filename = `${key}.scale`\n await writeMetadataToDisk(metadataRaw, filename)\n spinner.succeed(`Metadata saved as ${filename}`)\n\n entries[key] = {\n metadata: filename,\n }\n } else {\n const entry = entryFromOptions(options)\n entries[key] = entry\n\n if (!options.noPersist) {\n const spinner = ora(`Loading metadata`).start()\n const { metadataRaw } = (await getMetadata(entry))!\n\n spinner.text = \"Writing metadata\"\n const filename = `${key}.scale`\n await writeMetadataToDisk(metadataRaw, filename)\n\n spinner.succeed(`Metadata saved as ${filename}`)\n entry.metadata = filename\n }\n }\n\n await writePapiConfig(options.config, entries)\n return console.log(`Saved new spec \"${key}\"`)\n}\n\nconst entryFromOptions = (options: AddOptions): EntryConfig => {\n if (options.wsUrl) {\n return {\n wsUrl: options.wsUrl,\n }\n }\n if (options.chainSpec) {\n return {\n chainSpec: options.chainSpec,\n }\n }\n if (options.name) {\n return {\n chain: options.name,\n }\n }\n\n throw new Error(\n \"add command needs one source, specified by options -f -w -c or -n\",\n )\n}\n","import { getMetadata } from \"@/metadata\"\nimport { EntryConfig, readPapiConfig } from \"@/papiConfig\"\nimport { generateMultipleDescriptors } from \"@polkadot-api/codegen\"\nimport { Tuple, V14, V15, Vector } from \"@polkadot-api/substrate-bindings\"\nimport fs, { mkdtemp, rm } from \"fs/promises\"\nimport path, { join } from \"path\"\nimport process from \"process\"\nimport tsc from \"tsc-prog\"\nimport tsup, { build } from \"tsup\"\nimport { CommonOptions } from \"./commonOptions\"\nimport fsExists from \"fs.promises.exists\"\nimport { existsSync } from \"fs\"\nimport { tmpdir } from \"os\"\nimport { EntryPointCodec } from \"@polkadot-api/metadata-compatibility\"\nimport { TypedefCodec } from \"@polkadot-api/metadata-compatibility\"\n\nexport interface GenerateOptions extends CommonOptions {\n key?: string\n clientLibrary?: string\n whitelist?: string\n}\n\nexport async function generate(opts: GenerateOptions) {\n const sources = await getSources(opts)\n\n if (Object.keys(sources).length == 0) {\n console.log(\"No chains defined in config file\")\n }\n\n console.log(`Reading metadata`)\n const chains = await Promise.all(\n Object.entries(sources).map(async ([key, source]) => ({\n key,\n metadata: (await getMetadata(source))!.metadata,\n knownTypes: {},\n })),\n )\n\n const descriptorsDir = join(\n process.cwd(),\n \"node_modules\",\n \"@polkadot-api\",\n \"descriptors\",\n )\n\n const clientPath = opts.clientLibrary ?? \"polkadot-api\"\n\n if (existsSync(descriptorsDir))\n await fs.rm(descriptorsDir, { recursive: true })\n\n await fs.mkdir(descriptorsDir, { recursive: true })\n await generatePackageJson(join(descriptorsDir, \"package.json\"))\n\n const whitelist = opts.whitelist ? await readWhitelist(opts.whitelist) : null\n await outputCodegen(\n chains,\n join(descriptorsDir, \"src\"),\n clientPath,\n whitelist,\n )\n await compileCodegen(descriptorsDir)\n await fs.rm(join(descriptorsDir, \"src\"), { recursive: true })\n}\n\nasync function getSources(\n opts: GenerateOptions,\n): Promise<Record<string, EntryConfig>> {\n const config = await readPapiConfig(opts.config)\n if (!config) {\n throw new Error(\"Can't find the Polkadot-API configuration\")\n }\n\n if (opts.key) {\n if (!config[opts.key]) {\n throw new Error(`Key ${opts.key} not set in polkadot-api config`)\n }\n return {\n [opts.key]: config[opts.key],\n }\n }\n\n return config\n}\n\nasync function outputCodegen(\n chains: Array<{\n key: string\n metadata: V14 | V15\n knownTypes: Record<string, string>\n }>,\n outputFolder: string,\n clientPath: string,\n whitelist: string[] | null,\n) {\n const {\n descriptorsFileContent,\n descriptorTypesFileContent,\n metadataTypes,\n typesFileContent,\n publicTypes,\n } = generateMultipleDescriptors(\n chains,\n {\n client: clientPath,\n metadataTypes: \"./metadataTypes.scale\",\n types: \"./common-types\",\n descriptorValues: \"./descriptors\",\n },\n {\n whitelist: whitelist ?? undefined,\n },\n )\n const EntryPointsCodec = Vector(EntryPointCodec)\n const TypedefsCodec = Vector(TypedefCodec)\n const TypesCodec = Tuple(EntryPointsCodec, TypedefsCodec)\n\n await fs.mkdir(outputFolder, { recursive: true })\n await fs.writeFile(\n path.join(outputFolder, \"metadataTypes.scale\"),\n TypesCodec.enc([metadataTypes.entryPoints, metadataTypes.typedefs]),\n )\n await fs.writeFile(\n path.join(outputFolder, \"scale-import.d.ts\"),\n `declare module \"*.scale\" {\n const content: string;\n export default content;\n }\n `,\n )\n await fs.writeFile(\n path.join(outputFolder, \"descriptors.ts\"),\n `///<reference path=\"./scale-import.d.ts\"/>\n${descriptorsFileContent}`,\n )\n await fs.writeFile(\n path.join(outputFolder, \"common-types.ts\"),\n typesFileContent,\n )\n await Promise.all(\n chains.map((chain, i) =>\n fs.writeFile(\n join(outputFolder, `${chain.key}.ts`),\n descriptorTypesFileContent[i],\n ),\n ),\n )\n await generateIndex(\n outputFolder,\n chains.map((chain) => chain.key),\n publicTypes,\n )\n}\n\nasync function compileCodegen(packageDir: string) {\n const srcDir = join(packageDir, \"src\")\n const outDir = join(packageDir, \"dist\")\n\n if (await fsExists(outDir)) {\n await fs.rm(outDir, { recursive: true })\n }\n\n await tsup.build({\n format: [\"cjs\", \"esm\"],\n entry: [path.join(srcDir, \"index.ts\")],\n loader: {\n \".scale\": \"binary\",\n },\n platform: \"neutral\",\n outDir,\n outExtension: (ctx) => ({\n js: ctx.format === \"esm\" ? \".mjs\" : \".js\",\n }),\n })\n\n tsc.build({\n basePath: srcDir,\n compilerOptions: {\n skipLibCheck: true,\n declaration: true,\n emitDeclarationOnly: true,\n target: \"esnext\",\n module: \"esnext\",\n moduleResolution: \"node\",\n resolveJsonModule: true,\n allowSyntheticDefaultImports: true,\n outDir,\n },\n })\n}\n\nconst generateIndex = async (\n path: string,\n keys: string[],\n publicTypes: string[],\n) => {\n const indexTs = [\n ...keys.flatMap((key) => [\n `export { default as ${key} } from \"./${key}\";`,\n `export type * from \"./${key}\";`,\n ]),\n `export {`,\n publicTypes.join(\", \"),\n `} from './common-types';`,\n ].join(\"\\n\")\n await fs.writeFile(join(path, \"index.ts\"), indexTs)\n}\n\nconst generatePackageJson = async (path: string) => {\n await fs.writeFile(\n path,\n `{\n \"name\": \"@polkadot-api/descriptors\",\n \"exports\": {\n \".\": {\n \"module\": \"./dist/index.mjs\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.js\",\n \"default\": \"./dist/index.js\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.mjs\",\n \"browser\": \"./dist/index.mjs\",\n \"types\": \"./dist/index.d.ts\",\n \"sideEffects\": false,\n \"peerDependencies\": {\n \"polkadot-api\": \"*\"\n }\n }`,\n )\n}\n\nasync function readWhitelist(filename: string): Promise<string[] | null> {\n if (!(await fsExists(filename))) {\n throw new Error(\"Whitelist file not found: \" + filename)\n }\n\n const tmpDir = await mkdtemp(join(tmpdir(), \"papi-\"))\n try {\n await build({\n format: \"esm\",\n entry: {\n index: filename,\n },\n outDir: tmpDir,\n outExtension() {\n return { js: \".mjs\" }\n },\n silent: true,\n })\n const { whitelist } = await import(join(tmpDir, \"index.mjs\"))\n return whitelist\n } finally {\n await rm(tmpDir, { recursive: true }).catch(console.error)\n }\n}\n","import { readPapiConfig, writePapiConfig } from \"@/papiConfig\"\nimport { CommonOptions } from \"./commonOptions\"\n\nexport async function remove(key: string, options: CommonOptions) {\n const entries = (await readPapiConfig(options.config)) ?? {}\n\n if (!(key in entries)) {\n throw new Error(`Key ${key} not set in polkadot-api config`)\n }\n\n const entry = entries[key]\n delete entries[key]\n\n await writePapiConfig(options.config, entries)\n console.log(`Removed chain \"${key}\" from config`)\n}\n","import { getMetadata, writeMetadataToDisk } from \"@/metadata\"\nimport { EntryConfig, readPapiConfig } from \"@/papiConfig\"\nimport ora from \"ora\"\nimport { CommonOptions } from \"./commonOptions\"\nimport { generate } from \"./generate\"\n\nexport async function update(\n keysInput: string | undefined,\n options: CommonOptions,\n) {\n const entries = (await readPapiConfig(options.config)) ?? {}\n const keys =\n keysInput === undefined ? Object.keys(entries) : keysInput.split(\",\")\n\n const updateByKey = async (key: string) => {\n if (!(key in entries)) {\n throw new Error(`Key ${key} not set in polkadot-api config`)\n }\n\n // Exclude metadata file from the entry, otherwise getMetadata would load from the file\n const { metadata: filename, ...entry } = entries[key]\n if (!filename) {\n if (keysInput !== undefined) {\n console.warn(`Key ${key} doesn't have a metadata file to update`)\n }\n\n return\n }\n\n const metadata = await getMetadata(entry as EntryConfig)\n // For those without other sources than metadata file, we get a null.\n if (!metadata) {\n if (keysInput !== undefined) {\n console.warn(\n `Key ${key} doesn't have any external source to update from`,\n )\n }\n return\n }\n\n spinner.text = `Writing ${key} metadata`\n await writeMetadataToDisk(metadata.metadataRaw, filename)\n spinner.succeed(`${key} metadata updated`)\n }\n\n const spinner = ora(`Updating`).start()\n await Promise.all(keys.map(updateByKey))\n\n console.log(`Updating descriptors`)\n await generate({ config: options.config })\n\n spinner.stop()\n}\n"],"mappings":"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","names":["add","generate","remove","update","knownChains","relayChainName","metadataWorker","metadata","readFile","writeFile","fs","fs","fsExists","path","ora","metadata","ora"]}
|