@polkadot-api/cli 1.0.0-canary.ba592c2 → 1.0.0-canary.baa4c8e
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-S77F6UKA.js → chunk-U4K5MGZJ.js} +164 -37
- package/dist/chunk-U4K5MGZJ.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/main.js +3 -5
- package/dist/main.js.map +1 -1
- package/package.json +18 -18
- package/dist/chunk-S77F6UKA.js.map +0 -1
|
@@ -188,13 +188,11 @@ async function writeMetadataToDisk(metadataRaw, outFile) {
|
|
|
188
188
|
|
|
189
189
|
// src/papiConfig.ts
|
|
190
190
|
import fsExists from "fs.promises.exists";
|
|
191
|
-
import {
|
|
192
|
-
import { mkdir as mkdir2, readFile as readFile2, writeFile as writeFile2 } from "fs/promises";
|
|
191
|
+
import { mkdir as mkdir2, readFile as readFile2, writeFile as writeFile2, rename } from "fs/promises";
|
|
193
192
|
import { join } from "path";
|
|
194
193
|
import { existsSync } from "fs";
|
|
195
194
|
var papiFolder = ".papi";
|
|
196
195
|
var papiCfgDefaultFile = "polkadot-api.json";
|
|
197
|
-
var packageJsonKey = "polkadot-api";
|
|
198
196
|
var defaultConfig = {
|
|
199
197
|
version: 0,
|
|
200
198
|
descriptorPath: join(papiFolder, "descriptors"),
|
|
@@ -204,7 +202,7 @@ async function readPapiConfig(configFile) {
|
|
|
204
202
|
if (configFile) return readFromFile(configFile);
|
|
205
203
|
const currentVersionLocation = join(papiFolder, papiCfgDefaultFile);
|
|
206
204
|
const currentVersionLocationExists = await fsExists(currentVersionLocation);
|
|
207
|
-
const readConfig = await (currentVersionLocationExists ? readFromFile(currentVersionLocation) : readFromFile(papiCfgDefaultFile))
|
|
205
|
+
const readConfig = await (currentVersionLocationExists ? readFromFile(currentVersionLocation) : readFromFile(papiCfgDefaultFile));
|
|
208
206
|
if (readConfig && !currentVersionLocationExists) {
|
|
209
207
|
await writePapiConfig(void 0, readConfig);
|
|
210
208
|
}
|
|
@@ -220,15 +218,28 @@ async function writePapiConfig(configFile, config) {
|
|
|
220
218
|
async function readFromFile(file) {
|
|
221
219
|
const fileExists = await fsExists(file);
|
|
222
220
|
if (!fileExists) return null;
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
221
|
+
const content = JSON.parse(await readFile2(file, "utf8"));
|
|
222
|
+
const config = migrateOldConfig(content);
|
|
223
|
+
const migrations = [migrateOldChains, migrateWhitelistPath];
|
|
224
|
+
let migrationMsgs = [];
|
|
225
|
+
for (const migration of migrations) {
|
|
226
|
+
migrationMsgs = [...migrationMsgs, ...await migration(config)];
|
|
227
|
+
}
|
|
228
|
+
if (migrationMsgs.length) {
|
|
229
|
+
try {
|
|
230
|
+
await writeToFile(file, config);
|
|
231
|
+
migrationMsgs.forEach((msg) => console.warn(msg));
|
|
232
|
+
} catch {
|
|
233
|
+
console.warn("Unable to migrate polkadot-api.json");
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
return config;
|
|
230
237
|
}
|
|
231
|
-
|
|
238
|
+
var MIGRATION_CHAINS = {
|
|
239
|
+
ksmcc3: "kusama",
|
|
240
|
+
westend2: "westend"
|
|
241
|
+
};
|
|
242
|
+
function migrateOldConfig(content) {
|
|
232
243
|
if (typeof content.version === "number") {
|
|
233
244
|
return content;
|
|
234
245
|
}
|
|
@@ -237,13 +248,51 @@ function migrate(content) {
|
|
|
237
248
|
entries: content
|
|
238
249
|
};
|
|
239
250
|
}
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
251
|
+
function migrateOldChains(config) {
|
|
252
|
+
const migrationMsgs = [];
|
|
253
|
+
config.entries = Object.fromEntries(
|
|
254
|
+
Object.entries(config.entries).flatMap(([k, entry]) => {
|
|
255
|
+
if ("chain" in entry) {
|
|
256
|
+
if (entry.chain.startsWith("rococo_v2_2")) {
|
|
257
|
+
migrationMsgs.push(
|
|
258
|
+
`Rococo has been sunset. Removing ${entry.chain} descriptors.`
|
|
259
|
+
);
|
|
260
|
+
return [];
|
|
261
|
+
}
|
|
262
|
+
const oldKey = Object.keys(MIGRATION_CHAINS).find(
|
|
263
|
+
(k2) => entry.chain.startsWith(k2)
|
|
264
|
+
);
|
|
265
|
+
if (oldKey) {
|
|
266
|
+
const newChain = entry.chain.replace(oldKey, MIGRATION_CHAINS[oldKey]);
|
|
267
|
+
migrationMsgs.push(`Migrating ${entry.chain} to ${newChain}`);
|
|
268
|
+
entry.chain = newChain;
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
return [[k, entry]];
|
|
272
|
+
})
|
|
273
|
+
);
|
|
274
|
+
return migrationMsgs;
|
|
275
|
+
}
|
|
276
|
+
async function migrateWhitelistPath(config) {
|
|
277
|
+
const whitelist = config.options?.whitelist;
|
|
278
|
+
if (!whitelist) return [];
|
|
279
|
+
delete config.options.whitelist;
|
|
280
|
+
if (whitelist === ".papi/whitelist.ts") {
|
|
281
|
+
return ["Removed redundant `whitelist` option from config file"];
|
|
243
282
|
}
|
|
283
|
+
await rename(whitelist, ".papi/whitelist.ts");
|
|
284
|
+
return [`Moved whitelist file from ${whitelist} to .papi/whitelist.ts`];
|
|
285
|
+
}
|
|
286
|
+
async function writeToFile(file, config) {
|
|
244
287
|
return writeFile2(file, JSON.stringify(config, null, 2) + "\n");
|
|
245
288
|
}
|
|
246
289
|
|
|
290
|
+
// package.json
|
|
291
|
+
var version = "1.0.0-canary.baa4c8e";
|
|
292
|
+
|
|
293
|
+
// src/version.ts
|
|
294
|
+
var cliVersion = version;
|
|
295
|
+
|
|
247
296
|
// src/commands/generate.ts
|
|
248
297
|
import {
|
|
249
298
|
capitalize,
|
|
@@ -258,10 +307,12 @@ import {
|
|
|
258
307
|
} from "@polkadot-api/metadata-compatibility";
|
|
259
308
|
import {
|
|
260
309
|
Binary,
|
|
310
|
+
Blake2128,
|
|
261
311
|
h64,
|
|
262
312
|
Tuple,
|
|
263
313
|
Vector
|
|
264
314
|
} from "@polkadot-api/substrate-bindings";
|
|
315
|
+
import { toHex } from "@polkadot-api/utils";
|
|
265
316
|
import { spawn } from "child_process";
|
|
266
317
|
import { existsSync as existsSync2 } from "fs";
|
|
267
318
|
import fsExists2 from "fs.promises.exists";
|
|
@@ -269,7 +320,7 @@ import fs2, { mkdtemp, rm } from "fs/promises";
|
|
|
269
320
|
import { tmpdir } from "os";
|
|
270
321
|
import path, { join as join3, posix, win32 } from "path";
|
|
271
322
|
import process2 from "process";
|
|
272
|
-
import { readPackage
|
|
323
|
+
import { readPackage } from "read-pkg";
|
|
273
324
|
import tsc from "tsc-prog";
|
|
274
325
|
import tsup from "tsup";
|
|
275
326
|
import { updatePackage } from "write-package";
|
|
@@ -282,11 +333,11 @@ var detected = null;
|
|
|
282
333
|
async function detectPackageManager() {
|
|
283
334
|
if (detected) return detected;
|
|
284
335
|
const { packageManager, executable } = await detectByLockFile() ?? detectByEnvironment() ?? getFallback();
|
|
285
|
-
const
|
|
336
|
+
const version2 = await getVersion(executable);
|
|
286
337
|
return detected = {
|
|
287
338
|
packageManager,
|
|
288
339
|
executable,
|
|
289
|
-
version
|
|
340
|
+
version: version2
|
|
290
341
|
};
|
|
291
342
|
}
|
|
292
343
|
async function detectByLockFile() {
|
|
@@ -347,6 +398,12 @@ async function generate(opts) {
|
|
|
347
398
|
if (process2.env.PAPI_SKIP_GENERATE) {
|
|
348
399
|
return;
|
|
349
400
|
}
|
|
401
|
+
if (opts.whitelist) {
|
|
402
|
+
console.error(
|
|
403
|
+
"The --whitelist option has been removed. The whitelist should be placed at `.papi/whitelist.ts`"
|
|
404
|
+
);
|
|
405
|
+
process2.exit(1);
|
|
406
|
+
}
|
|
350
407
|
const config = await readPapiConfig(opts.config);
|
|
351
408
|
if (!config) {
|
|
352
409
|
throw new Error("Can't find the Polkadot-API configuration");
|
|
@@ -363,19 +420,37 @@ async function generate(opts) {
|
|
|
363
420
|
knownTypes: {}
|
|
364
421
|
}))
|
|
365
422
|
);
|
|
423
|
+
const contracts = Object.fromEntries(
|
|
424
|
+
await Promise.all(
|
|
425
|
+
["ink", "sol"].map(async (kind) => [
|
|
426
|
+
kind,
|
|
427
|
+
Object.fromEntries(
|
|
428
|
+
await Promise.all(
|
|
429
|
+
Object.entries(config[kind] ?? {}).map(async ([key, v]) => [
|
|
430
|
+
key,
|
|
431
|
+
toHex(Blake2128(Binary.fromText(await fs2.readFile(v, "utf-8"))))
|
|
432
|
+
])
|
|
433
|
+
)
|
|
434
|
+
)
|
|
435
|
+
])
|
|
436
|
+
)
|
|
437
|
+
);
|
|
366
438
|
if (chains.length === 0) {
|
|
367
439
|
console.log("No entries in polkadot-api.json. Nothing to generate.");
|
|
368
440
|
return;
|
|
369
441
|
}
|
|
442
|
+
const whitelist = await readWhitelist(".papi/whitelist.ts");
|
|
443
|
+
const descriptorsDir = join3(process2.cwd(), config.descriptorPath);
|
|
444
|
+
if (await alreadyGenerated(descriptorsDir, chains, contracts, whitelist)) {
|
|
445
|
+
console.log("Detected previous descriptors with no changes needed.");
|
|
446
|
+
return;
|
|
447
|
+
}
|
|
370
448
|
console.log(`Generating descriptors`);
|
|
371
449
|
await cleanDescriptorsPackage(config.descriptorPath);
|
|
372
450
|
if (!config.options?.noDescriptorsPackage) {
|
|
373
451
|
await addDescriptorsToPackageJson(config.descriptorPath);
|
|
374
452
|
}
|
|
375
|
-
const descriptorsDir = join3(process2.cwd(), config.descriptorPath);
|
|
376
453
|
const clientPath = opts.clientLibrary ?? "polkadot-api";
|
|
377
|
-
const whitelistPath = opts.whitelist ?? config.options?.whitelist;
|
|
378
|
-
const whitelist = whitelistPath ? await readWhitelist(whitelistPath) : null;
|
|
379
454
|
const descriptorSrcDir = join3(descriptorsDir, "src");
|
|
380
455
|
const hash = await outputCodegen(
|
|
381
456
|
chains,
|
|
@@ -387,13 +462,56 @@ async function generate(opts) {
|
|
|
387
462
|
outputContractCodegen(config, descriptorSrcDir);
|
|
388
463
|
}
|
|
389
464
|
await replacePackageJson(descriptorsDir, hash);
|
|
390
|
-
await compileCodegen(descriptorsDir);
|
|
465
|
+
const cleanCodegen = await compileCodegen(descriptorsDir);
|
|
466
|
+
if (cleanCodegen) {
|
|
467
|
+
await tagGenerated(descriptorsDir, chains, contracts, whitelist);
|
|
468
|
+
}
|
|
391
469
|
await fs2.rm(descriptorSrcDir, { recursive: true });
|
|
392
470
|
if (!config.options?.noDescriptorsPackage) {
|
|
393
471
|
await runInstall();
|
|
394
472
|
await flushBundlerCache();
|
|
395
473
|
}
|
|
396
474
|
}
|
|
475
|
+
async function tagGenerated(descriptorsDir, chains, contracts, whitelist) {
|
|
476
|
+
const filePath = join3(descriptorsDir, "generated.json");
|
|
477
|
+
await fs2.writeFile(
|
|
478
|
+
filePath,
|
|
479
|
+
JSON.stringify({
|
|
480
|
+
cliVersion,
|
|
481
|
+
whitelist,
|
|
482
|
+
chains: Object.fromEntries(
|
|
483
|
+
chains.map(({ key, metadataRaw }) => [
|
|
484
|
+
key,
|
|
485
|
+
toHex(Blake2128(metadataRaw))
|
|
486
|
+
])
|
|
487
|
+
),
|
|
488
|
+
contracts
|
|
489
|
+
})
|
|
490
|
+
);
|
|
491
|
+
}
|
|
492
|
+
async function alreadyGenerated(descriptorsDir, chains, contracts, whitelist) {
|
|
493
|
+
const generatedJs\u00F4n = join3(descriptorsDir, "generated.json");
|
|
494
|
+
if (!existsSync2(generatedJs\u00F4n)) return false;
|
|
495
|
+
try {
|
|
496
|
+
const generated = JSON.parse(
|
|
497
|
+
await fs2.readFile(generatedJs\u00F4n, {
|
|
498
|
+
encoding: "utf-8"
|
|
499
|
+
})
|
|
500
|
+
);
|
|
501
|
+
if ((generated.whitelist ?? ["*"]).join(",") != (whitelist ?? ["*"]).join(",") || generated.cliVersion !== cliVersion)
|
|
502
|
+
return false;
|
|
503
|
+
return chains.length === Object.entries(generated.chains).length && chains.every(({ key, metadataRaw }) => {
|
|
504
|
+
const hash = toHex(Blake2128(metadataRaw));
|
|
505
|
+
return hash === generated.chains[key];
|
|
506
|
+
}) && ["ink", "sol"].every(
|
|
507
|
+
(kind) => Object.entries(contracts[kind]).length === Object.entries(generated.contracts[kind]).length && Object.entries(contracts[kind]).every(
|
|
508
|
+
([k, hash]) => hash === generated.contracts[kind][k]
|
|
509
|
+
)
|
|
510
|
+
);
|
|
511
|
+
} catch {
|
|
512
|
+
return false;
|
|
513
|
+
}
|
|
514
|
+
}
|
|
397
515
|
async function cleanDescriptorsPackage(path2) {
|
|
398
516
|
const descriptorsDir = join3(process2.cwd(), path2);
|
|
399
517
|
if (!existsSync2(descriptorsDir)) {
|
|
@@ -410,7 +528,7 @@ async function cleanDescriptorsPackage(path2) {
|
|
|
410
528
|
}
|
|
411
529
|
async function addDescriptorsToPackageJson(path2) {
|
|
412
530
|
const [packageJson, protocol] = await Promise.all([
|
|
413
|
-
|
|
531
|
+
readPackage(),
|
|
414
532
|
getPackageProtocol()
|
|
415
533
|
]);
|
|
416
534
|
const packageSource = `${protocol}:${path2}`;
|
|
@@ -424,10 +542,10 @@ async function addDescriptorsToPackageJson(path2) {
|
|
|
424
542
|
}
|
|
425
543
|
}
|
|
426
544
|
async function getPackageProtocol() {
|
|
427
|
-
const { packageManager, version } = await detectPackageManager();
|
|
545
|
+
const { packageManager, version: version2 } = await detectPackageManager();
|
|
428
546
|
switch (packageManager) {
|
|
429
547
|
case "yarn":
|
|
430
|
-
const yarnMajorVersion = Number(
|
|
548
|
+
const yarnMajorVersion = Number(version2.split(".").at(0));
|
|
431
549
|
return yarnMajorVersion >= 2 ? "portal" : "file";
|
|
432
550
|
default:
|
|
433
551
|
return "file";
|
|
@@ -469,9 +587,7 @@ async function outputCodegen(chains, outputFolder, clientPath, whitelist) {
|
|
|
469
587
|
}
|
|
470
588
|
);
|
|
471
589
|
const hash = h64(
|
|
472
|
-
Binary.fromText(
|
|
473
|
-
Array.from(metadataTypes.checksumToIdx.keys()).join("")
|
|
474
|
-
).asBytes()
|
|
590
|
+
Binary.fromText(Array.from(metadataTypes.checksumToIdx.keys()).join(""))
|
|
475
591
|
);
|
|
476
592
|
const EntryPointsCodec = Vector(EntryPointCodec);
|
|
477
593
|
const TypedefsCodec = Vector(TypedefCodec);
|
|
@@ -578,7 +694,7 @@ async function compileCodegen(packageDir) {
|
|
|
578
694
|
js: ctx.format === "esm" ? ".mjs" : ".js"
|
|
579
695
|
})
|
|
580
696
|
});
|
|
581
|
-
tsc.
|
|
697
|
+
const program2 = tsc.createProgramFromConfig({
|
|
582
698
|
basePath: srcDir,
|
|
583
699
|
compilerOptions: {
|
|
584
700
|
skipLibCheck: true,
|
|
@@ -592,6 +708,16 @@ async function compileCodegen(packageDir) {
|
|
|
592
708
|
outDir
|
|
593
709
|
}
|
|
594
710
|
});
|
|
711
|
+
tsc.emit(program2);
|
|
712
|
+
const errors = [
|
|
713
|
+
program2.getGlobalDiagnostics(),
|
|
714
|
+
program2.getOptionsDiagnostics(),
|
|
715
|
+
program2.getSemanticDiagnostics(),
|
|
716
|
+
program2.getSyntacticDiagnostics(),
|
|
717
|
+
program2.getDeclarationDiagnostics(),
|
|
718
|
+
program2.getConfigFileParsingDiagnostics()
|
|
719
|
+
].flat();
|
|
720
|
+
return errors.length === 0;
|
|
595
721
|
}
|
|
596
722
|
var cacheMetadataStr = `
|
|
597
723
|
export const getMetadata: (codeHash: string) => Promise<Uint8Array | null> = async (
|
|
@@ -619,11 +745,11 @@ var generateIndex = async (path2, keys, publicTypes, metadatas) => {
|
|
|
619
745
|
].join("\n");
|
|
620
746
|
await fs2.writeFile(join3(path2, "index.ts"), indexTs);
|
|
621
747
|
};
|
|
622
|
-
async function replacePackageJson(descriptorsDir,
|
|
748
|
+
async function replacePackageJson(descriptorsDir, version2) {
|
|
623
749
|
await fs2.writeFile(
|
|
624
750
|
join3(descriptorsDir, "package.json"),
|
|
625
751
|
`{
|
|
626
|
-
"version": "0.1.0-autogenerated.${
|
|
752
|
+
"version": "0.1.0-autogenerated.${version2}",
|
|
627
753
|
"name": "@polkadot-api/descriptors",
|
|
628
754
|
"files": [
|
|
629
755
|
"dist"
|
|
@@ -651,7 +777,7 @@ async function replacePackageJson(descriptorsDir, version) {
|
|
|
651
777
|
}
|
|
652
778
|
async function readWhitelist(filename) {
|
|
653
779
|
if (!await fsExists2(filename)) {
|
|
654
|
-
|
|
780
|
+
return null;
|
|
655
781
|
}
|
|
656
782
|
const tmpDir = await mkdtemp(join3(tmpdir(), "papi-"));
|
|
657
783
|
try {
|
|
@@ -950,9 +1076,9 @@ function getCli({
|
|
|
950
1076
|
remove: remove2,
|
|
951
1077
|
update: update2,
|
|
952
1078
|
ink: ink2,
|
|
953
|
-
version
|
|
1079
|
+
version: version2
|
|
954
1080
|
}) {
|
|
955
|
-
program.name("polkadot-api").description("Polkadot API CLI").version(
|
|
1081
|
+
program.name("polkadot-api").description("Polkadot API CLI").version(version2);
|
|
956
1082
|
const config = new Option("--config <filename>", "Source for the config file");
|
|
957
1083
|
const skipCodegen = new Option(
|
|
958
1084
|
"--skip-codegen",
|
|
@@ -960,8 +1086,8 @@ function getCli({
|
|
|
960
1086
|
);
|
|
961
1087
|
const whitelist = new Option(
|
|
962
1088
|
"--whitelist <filename>",
|
|
963
|
-
"
|
|
964
|
-
);
|
|
1089
|
+
"Removed. The whitelist path is now .papi/whitelist.ts"
|
|
1090
|
+
).hideHelp();
|
|
965
1091
|
program.command("generate", {
|
|
966
1092
|
isDefault: true
|
|
967
1093
|
}).description("Generate descriptor files").addOption(config).addOption(whitelist).action(generate2);
|
|
@@ -990,6 +1116,7 @@ function getCli({
|
|
|
990
1116
|
export {
|
|
991
1117
|
getMetadata,
|
|
992
1118
|
readPapiConfig,
|
|
1119
|
+
version,
|
|
993
1120
|
generate,
|
|
994
1121
|
add,
|
|
995
1122
|
ink,
|
|
@@ -997,4 +1124,4 @@ export {
|
|
|
997
1124
|
update,
|
|
998
1125
|
getCli
|
|
999
1126
|
};
|
|
1000
|
-
//# sourceMappingURL=chunk-
|
|
1127
|
+
//# sourceMappingURL=chunk-U4K5MGZJ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/metadata.ts","../src/papiConfig.ts","../package.json","../src/version.ts","../src/commands/generate.ts","../src/packageManager.ts","../src/commands/add.ts","../src/commands/ink.ts","../src/commands/remove.ts","../src/commands/update.ts","../src/cli.ts","../src/commands/sol.ts"],"sourcesContent":["import { createClient } from \"@polkadot-api/substrate-client\"\nimport type { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport * as fs from \"node:fs/promises\"\nimport {\n HexString,\n metadata,\n UnifiedMetadata,\n unifyMetadata,\n v15,\n} from \"@polkadot-api/substrate-bindings\"\nimport { getWsProvider } from \"@polkadot-api/ws-provider\"\nimport { Worker } from \"node:worker_threads\"\nimport { getObservableClient } from \"@polkadot-api/observable-client\"\nimport {\n catchError,\n combineLatest,\n filter,\n firstValueFrom,\n from,\n map,\n Observable,\n of,\n switchMap,\n take,\n} from \"rxjs\"\nimport { EntryConfig } from \"./papiConfig\"\nimport { dirname } from \"path\"\nimport { fileURLToPath } from \"url\"\nimport * as knownChains from \"@polkadot-api/known-chains\"\nimport { startFromWorker } from \"@polkadot-api/smoldot/from-node-worker\"\nimport { Client as SmoldotClient } from \"@polkadot-api/smoldot\"\nimport { getSmProvider } from \"@polkadot-api/sm-provider\"\nimport { middleware } from \"@polkadot-api/ws-middleware\"\n\nconst workerPath = fileURLToPath(\n import.meta.resolve(\"@polkadot-api/smoldot/node-worker\"),\n)\n\nlet smoldotWorker: [SmoldotClient, Worker] | null\nlet workerRefCount = 0\nasync function getSmoldotWorker() {\n if (!smoldotWorker) {\n const worker = new Worker(workerPath, {\n stdout: true,\n stderr: true,\n })\n const client = startFromWorker(worker)\n smoldotWorker = [client, worker]\n }\n return smoldotWorker\n}\n\ntype GetMetadataPayload = {\n metadata: UnifiedMetadata\n metadataRaw: Uint8Array\n codeHash: string\n genesis: string\n}\nconst getMetadataCall = (provider: JsonRpcProvider, at?: string) =>\n new Observable<GetMetadataPayload>((observer) => {\n const substrateClient = createClient(provider)\n const client = getObservableClient(substrateClient)\n const { runtime$, unfollow, genesis$, getRuntime$ } = client.chainHead$()\n const archive = client.archive(getRuntime$)\n\n const getRuntimeCtx$ = () => {\n if (!at) return runtime$.pipe(filter(Boolean))\n // if it's a number\n const hash$ =\n at.length < 32 && /^\\d+$/.test(at)\n ? from(substrateClient.archive.hashByHeight(Number(at))).pipe(\n map(([hash]) => {\n if (!hash) {\n throw new Error(`Can't find block number \"${at}\"`)\n }\n return hash\n }),\n )\n : of(at)\n return hash$.pipe(switchMap(archive.getRuntimeContext$))\n }\n\n const subscription = combineLatest({\n runtime: getRuntimeCtx$(),\n genesis: genesis$,\n })\n .pipe(\n take(1),\n map(\n ({\n runtime: {\n lookup: { metadata },\n metadataRaw,\n codeHash,\n },\n genesis,\n }) => ({\n metadata,\n metadataRaw,\n codeHash,\n genesis,\n }),\n ),\n )\n .subscribe(observer)\n\n subscription.add(() => {\n try {\n unfollow()\n client.destroy()\n } catch {}\n })\n\n return subscription\n })\n\nconst getChainSpecs = (\n chain: string,\n): { potentialRelayChainSpecs: string[]; chainSpec: string } => {\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\nconst getMetadataFromSmoldot = async (chain: string) => {\n workerRefCount++\n try {\n const [smoldot] = await getSmoldotWorker()\n const chainSpecs = getChainSpecs(chain)\n const potentialRelayChains = await Promise.all(\n chainSpecs.potentialRelayChainSpecs.map((chainSpec) =>\n smoldot.addChain({ chainSpec }),\n ),\n )\n const provider = getSmProvider(() =>\n smoldot.addChain({\n chainSpec: chainSpecs.chainSpec,\n potentialRelayChains,\n }),\n )\n return await firstValueFrom(getMetadataCall(provider))\n } finally {\n workerRefCount--\n if (workerRefCount === 0) {\n const [smoldot, worker] = smoldotWorker!\n smoldotWorker = null\n await smoldot.terminate()\n await worker.terminate()\n }\n }\n}\n\nconst getMetadataCallWithError = (\n ...input: Parameters<typeof getMetadataCall>\n) =>\n getMetadataCall(...input).pipe(\n map((value) => ({ success: true as const, value })),\n catchError((error) => of({ success: false as const, error })),\n )\n\nconst getMetadataFromWsURL = (wsURL: string, at?: string) =>\n firstValueFrom(\n getMetadataCallWithError(getWsProvider(wsURL, { middleware }), at).pipe(\n map((x) => {\n if (x.success) return x.value\n throw x.error\n }),\n ),\n )\n\nexport async function getMetadata({\n metadata: metadataFile,\n codeHash,\n genesis,\n ...entry\n}: EntryConfig): Promise<{\n metadata: UnifiedMetadata\n metadataRaw: Uint8Array\n codeHash?: HexString\n genesis?: HexString\n} | 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 (metadataFile) {\n const data = await fs.readFile(metadataFile)\n const metadataRaw = new Uint8Array(data)\n\n let meta: UnifiedMetadata\n try {\n meta = unifyMetadata(metadata.dec(metadataRaw))\n } catch (_) {\n meta = unifyMetadata(v15.dec(metadataRaw))\n }\n\n return {\n metadata: meta,\n metadataRaw,\n codeHash,\n genesis,\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, entry.at)\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 { mkdir, readFile, writeFile, rename } from \"node:fs/promises\"\nimport { join } from \"node:path\"\nimport { existsSync } from \"node:fs\"\n\nexport type EntryConfig =\n | {\n metadata: string\n genesis?: string\n codeHash?: string\n }\n | {\n chainSpec: string\n metadata?: string\n genesis?: string\n codeHash?: string\n }\n | {\n wsUrl: string\n at?: string\n metadata?: string\n genesis?: string\n codeHash?: string\n }\n | {\n chain: string\n metadata?: string\n genesis?: string\n codeHash?: string\n }\ntype Entries = Record<string, EntryConfig>\nexport interface PapiConfigOptions {\n noDescriptorsPackage?: boolean\n whitelist?: string // Deprecated\n}\nexport type PapiConfig = {\n version: 0\n descriptorPath: string\n entries: Record<string, EntryConfig>\n ink?: Record<string, string>\n sol?: Record<string, string>\n options?: Partial<PapiConfigOptions>\n}\n\nexport const papiFolder = \".papi\"\nconst papiCfgDefaultFile = \"polkadot-api.json\"\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 = await (currentVersionLocationExists\n ? readFromFile(currentVersionLocation)\n : readFromFile(papiCfgDefaultFile))\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 (.papi/polkadot-api.json).\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 const content = JSON.parse(await readFile(file, \"utf8\"))\n const config = migrateOldConfig(content)\n\n const migrations = [migrateOldChains, migrateWhitelistPath]\n let migrationMsgs: string[] = []\n for (const migration of migrations) {\n migrationMsgs = [...migrationMsgs, ...(await migration(config))]\n }\n\n if (migrationMsgs.length) {\n try {\n await writeToFile(file, config as PapiConfig)\n migrationMsgs.forEach((msg) => console.warn(msg))\n } catch {\n console.warn(\"Unable to migrate polkadot-api.json\")\n }\n }\n return config\n}\n\nconst MIGRATION_CHAINS: Record<string, string> = {\n ksmcc3: \"kusama\",\n westend2: \"westend\",\n}\n\nfunction migrateOldConfig(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}\nfunction migrateOldChains(config: PapiConfig) {\n const migrationMsgs: string[] = []\n config.entries = Object.fromEntries(\n Object.entries(config.entries).flatMap(([k, entry]) => {\n if (\"chain\" in entry) {\n if (entry.chain.startsWith(\"rococo_v2_2\")) {\n migrationMsgs.push(\n `Rococo has been sunset. Removing ${entry.chain} descriptors.`,\n )\n return []\n }\n const oldKey = Object.keys(MIGRATION_CHAINS).find((k) =>\n entry.chain.startsWith(k),\n )\n if (oldKey) {\n const newChain = entry.chain.replace(oldKey, MIGRATION_CHAINS[oldKey])\n migrationMsgs.push(`Migrating ${entry.chain} to ${newChain}`)\n entry.chain = newChain\n }\n }\n return [[k, entry]]\n }),\n )\n return migrationMsgs\n}\nasync function migrateWhitelistPath(config: PapiConfig) {\n const whitelist = config.options?.whitelist\n if (!whitelist) return []\n\n delete config.options!.whitelist\n if (whitelist === \".papi/whitelist.ts\") {\n return [\"Removed redundant `whitelist` option from config file\"]\n }\n await rename(whitelist, \".papi/whitelist.ts\")\n return [`Moved whitelist file from ${whitelist} to .papi/whitelist.ts`]\n}\n\nasync function writeToFile(file: string, config: PapiConfig) {\n return writeFile(file, JSON.stringify(config, null, 2) + \"\\n\")\n}\n","{\n \"name\": \"@polkadot-api/cli\",\n \"version\": \"1.0.0-canary.baa4c8e\",\n \"author\": \"Victor Oliva (https://github.com/voliva)\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/polkadot-api/polkadot-api.git\"\n },\n \"license\": \"MIT\",\n \"sideEffects\": true,\n \"type\": \"module\",\n \"bin\": {\n \"papi\": \"./dist/main.js\",\n \"polkadot-api\": \"./dist/main.js\"\n },\n \"files\": [\n \"/dist\"\n ],\n \"exports\": {\n \".\": {\n \"node\": {\n \"import\": \"./dist/index.js\"\n },\n \"types\": \"./dist/index.d.ts\",\n \"module\": \"./dist/index.js\",\n \"import\": \"./dist/index.js\"\n }\n },\n \"scripts\": {\n \"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\",\n \"build\": \"pnpm build-core\",\n \"start\": \"pnpm build && node --enable-source-maps dist/main.js\",\n \"test\": \"echo 'no tests'\",\n \"lint\": \"prettier --check README.md \\\"src/**/*.{js,jsx,ts,tsx,json,md}\\\"\",\n \"format\": \"prettier --write README.md \\\"src/**/*.{js,jsx,ts,tsx,json,md}\\\"\",\n \"prepack\": \"pnpm run build\"\n },\n \"dependencies\": {\n \"@commander-js/extra-typings\": \"^14.0.0\",\n \"@polkadot-api/codegen\": \"workspace:*\",\n \"@polkadot-api/ink-contracts\": \"workspace:*\",\n \"@polkadot-api/json-rpc-provider\": \"workspace:*\",\n \"@polkadot-api/known-chains\": \"workspace:*\",\n \"@polkadot-api/metadata-compatibility\": \"workspace:*\",\n \"@polkadot-api/observable-client\": \"workspace:*\",\n \"@polkadot-api/sm-provider\": \"workspace:*\",\n \"@polkadot-api/smoldot\": \"workspace:*\",\n \"@polkadot-api/substrate-bindings\": \"workspace:*\",\n \"@polkadot-api/substrate-client\": \"workspace:*\",\n \"@polkadot-api/utils\": \"workspace:*\",\n \"@polkadot-api/wasm-executor\": \"^0.2.3\",\n \"@polkadot-api/ws-provider\": \"workspace:*\",\n \"@polkadot-api/ws-middleware\": \"workspace:*\",\n \"@types/node\": \"^25.0.10\",\n \"commander\": \"^14.0.2\",\n \"execa\": \"^9.6.1\",\n \"fs.promises.exists\": \"^1.1.4\",\n \"ora\": \"^9.1.0\",\n \"read-pkg\": \"^10.0.0\",\n \"rxjs\": \"^7.8.2\",\n \"tsc-prog\": \"^2.3.0\",\n \"tsup\": \"8.5.0\",\n \"typescript\": \"^5.9.3\",\n \"write-package\": \"^7.2.0\"\n },\n \"devDependencies\": {\n \"@polkadot-api/json-rpc-provider\": \"workspace:*\",\n \"@swc/core\": \"^1.15.10\"\n }\n}\n","import { version } from \"../package.json\"\nexport const cliVersion = version\n","import { getMetadata } from \"@/metadata\"\nimport { readPapiConfig } from \"@/papiConfig\"\nimport { cliVersion } from \"@/version\"\nimport {\n capitalize,\n generateInkTypes,\n generateMultipleDescriptors,\n generateSolTypes,\n type KnownTypes,\n} from \"@polkadot-api/codegen\"\nimport { getInkLookup } from \"@polkadot-api/ink-contracts\"\nimport {\n EntryPointCodec,\n TypedefCodec,\n} from \"@polkadot-api/metadata-compatibility\"\nimport {\n Binary,\n Blake2128,\n h64,\n HexString,\n Tuple,\n UnifiedMetadata,\n Vector,\n} from \"@polkadot-api/substrate-bindings\"\nimport { toHex } from \"@polkadot-api/utils\"\nimport { spawn } from \"child_process\"\nimport { existsSync } from \"fs\"\nimport fsExists from \"fs.promises.exists\"\nimport fs, { mkdtemp, rm } from \"fs/promises\"\nimport { tmpdir } from \"os\"\nimport path, { join, posix, win32 } from \"path\"\nimport process from \"process\"\nimport { readPackage } from \"read-pkg\"\nimport tsc from \"tsc-prog\"\nimport tsup from \"tsup\"\nimport { updatePackage } from \"write-package\"\nimport { detectPackageManager } from \"../packageManager\"\nimport { CommonOptions } from \"./commonOptions\"\n\nexport interface GenerateOptions extends CommonOptions {\n clientLibrary?: string\n}\n\nexport async function generate(opts: GenerateOptions) {\n if (process.env.PAPI_SKIP_GENERATE) {\n return\n }\n if (opts.whitelist) {\n console.error(\n \"The --whitelist option has been removed. The whitelist should be placed at `.papi/whitelist.ts`\",\n )\n process.exit(1)\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 ...(await getMetadata(source))!,\n knownTypes: {},\n })),\n )\n\n const contracts = Object.fromEntries(\n await Promise.all(\n ([\"ink\", \"sol\"] as const).map(async (kind) => [\n kind,\n Object.fromEntries(\n await Promise.all(\n Object.entries(config[kind] ?? {}).map(async ([key, v]) => [\n key,\n toHex(Blake2128(Binary.fromText(await fs.readFile(v, \"utf-8\")))),\n ]),\n ),\n ),\n ]),\n ),\n )\n\n if (chains.length === 0) {\n console.log(\"No entries in polkadot-api.json. Nothing to generate.\")\n return\n }\n\n const whitelist = await readWhitelist(\".papi/whitelist.ts\")\n\n const descriptorsDir = join(process.cwd(), config.descriptorPath)\n if (await alreadyGenerated(descriptorsDir, chains, contracts, whitelist)) {\n console.log(\"Detected previous descriptors with no changes needed.\")\n return\n }\n\n console.log(`Generating descriptors`)\n await cleanDescriptorsPackage(config.descriptorPath)\n if (!config.options?.noDescriptorsPackage) {\n await addDescriptorsToPackageJson(config.descriptorPath)\n }\n\n const clientPath = opts.clientLibrary ?? \"polkadot-api\"\n\n const descriptorSrcDir = join(descriptorsDir, \"src\")\n const hash = await outputCodegen(\n chains,\n descriptorSrcDir,\n clientPath,\n whitelist,\n )\n\n if (config.ink || config.sol) {\n outputContractCodegen(config, descriptorSrcDir)\n }\n\n await replacePackageJson(descriptorsDir, hash)\n const cleanCodegen = await compileCodegen(descriptorsDir)\n if (cleanCodegen) {\n await tagGenerated(descriptorsDir, chains, contracts, whitelist)\n }\n await fs.rm(descriptorSrcDir, { recursive: true })\n if (!config.options?.noDescriptorsPackage) {\n await runInstall()\n await flushBundlerCache()\n }\n}\n\nasync function tagGenerated(\n descriptorsDir: string,\n chains: {\n key: string\n metadataRaw: Uint8Array\n }[],\n contracts: Record<\"ink\" | \"sol\", Record<string, HexString>>,\n whitelist: string[] | null,\n) {\n const filePath = join(descriptorsDir, \"generated.json\")\n\n await fs.writeFile(\n filePath,\n JSON.stringify({\n cliVersion,\n whitelist,\n chains: Object.fromEntries(\n chains.map(({ key, metadataRaw }) => [\n key,\n toHex(Blake2128(metadataRaw)),\n ]),\n ),\n contracts,\n }),\n )\n}\nasync function alreadyGenerated(\n descriptorsDir: string,\n chains: {\n key: string\n metadataRaw: Uint8Array\n }[],\n contracts: Record<\"ink\" | \"sol\", Record<string, HexString>>,\n whitelist: string[] | null,\n) {\n const generatedJsôn = join(descriptorsDir, \"generated.json\")\n if (!existsSync(generatedJsôn)) return false\n\n try {\n const generated = JSON.parse(\n await fs.readFile(generatedJsôn, {\n encoding: \"utf-8\",\n }),\n )\n if (\n (generated.whitelist ?? [\"*\"]).join(\",\") !=\n (whitelist ?? [\"*\"]).join(\",\") ||\n generated.cliVersion !== cliVersion\n )\n return false\n\n return (\n chains.length === Object.entries(generated.chains).length &&\n chains.every(({ key, metadataRaw }) => {\n const hash = toHex(Blake2128(metadataRaw))\n return hash === generated.chains[key]\n }) &&\n ([\"ink\", \"sol\"] as const).every(\n (kind) =>\n Object.entries(contracts[kind]).length ===\n Object.entries(generated.contracts[kind]).length &&\n Object.entries(contracts[kind]).every(\n ([k, hash]) => hash === generated.contracts[kind][k],\n ),\n )\n )\n } catch {\n return false\n }\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\n const distDir = join(descriptorsDir, \"dist\")\n if (existsSync(distDir)) {\n await fs.rm(distDir, { recursive: true })\n }\n}\n\nasync function addDescriptorsToPackageJson(path: string) {\n const [packageJson, protocol] = await Promise.all([\n readPackage(),\n getPackageProtocol(),\n ])\n\n const packageSource = `${protocol}:${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\nasync function getPackageProtocol() {\n const { packageManager, version } = await detectPackageManager()\n\n switch (packageManager) {\n case \"yarn\":\n const yarnMajorVersion = Number(version.split(\".\").at(0))\n\n return yarnMajorVersion >= 2 ? \"portal\" : \"file\"\n default:\n return \"file\"\n }\n}\n\nasync function runInstall() {\n const { executable } = await detectPackageManager()\n console.log(`${executable} install`)\n const child = spawn(executable, [\"install\"], {\n stdio: \"inherit\",\n shell: true,\n env: {\n ...process.env,\n PAPI_SKIP_GENERATE: \"true\",\n },\n })\n await new Promise((resolve) => child.on(\"close\", resolve))\n}\n\nconst generateMetadataExportFile = (input: Uint8Array): string =>\n `const binMeta: string = \"${Buffer.from(input).toString(\"base64\")}\"; export default binMeta;`\n\nasync function outputCodegen(\n chains: Array<{\n key: string\n metadata: UnifiedMetadata\n metadataRaw: Uint8Array\n knownTypes: KnownTypes\n codeHash?: HexString\n genesis?: HexString\n }>,\n outputFolder: string,\n clientPath: string,\n whitelist: string[] | Record<string, string[]> | null,\n) {\n const {\n commonFileContent,\n descriptorsFileContent,\n descriptorTypesFiles,\n metadataTypes,\n typesFileContent,\n publicTypes,\n } = generateMultipleDescriptors(\n chains,\n {\n client: clientPath,\n metadataTypes: \"./metadataTypes\",\n types: \"./common-types\",\n descriptorValues: \"./descriptors\",\n common: \"./common\",\n },\n {\n whitelist: whitelist ?? undefined,\n },\n )\n\n const hash = h64(\n Binary.fromText(Array.from(metadataTypes.checksumToIdx.keys()).join(\"\")),\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\n await fs.writeFile(path.join(outputFolder, \"common.ts\"), commonFileContent)\n // Going through base64 conversion instead of using binary loader because of esbuild issue\n // https://github.com/evanw/esbuild/issues/3894\n const metadataTypesBase64 = Buffer.from(\n TypesCodec.enc([metadataTypes.entryPoints, metadataTypes.typedefs]),\n ).toString(\"base64\")\n\n await fs.writeFile(\n path.join(outputFolder, \"metadataTypes.ts\"),\n `\nconst content = \"${metadataTypesBase64}\"\nexport default content\n `,\n )\n await fs.writeFile(\n path.join(outputFolder, \"descriptors.ts\"),\n descriptorsFileContent,\n )\n await fs.writeFile(\n path.join(outputFolder, \"common-types.ts\"),\n typesFileContent,\n )\n await Promise.all(\n chains\n .map((chain, i) => [\n fs.writeFile(\n join(outputFolder, `${chain.key}.ts`),\n descriptorTypesFiles[i].content,\n ),\n fs.writeFile(\n join(outputFolder, `${chain.key}_metadata.ts`),\n generateMetadataExportFile(chain.metadataRaw),\n ),\n ])\n .flat(),\n )\n\n await generateIndex(\n outputFolder,\n chains.map((chain) => chain.key),\n publicTypes,\n Object.fromEntries(\n chains.filter((x) => x.codeHash!!).map((x) => [x.codeHash, x.key]),\n ),\n )\n\n return hash\n}\n\nasync function outputContractCodegen(\n contracts: {\n ink?: Record<string, string>\n sol?: Record<string, string>\n },\n outputFolder: string,\n) {\n console.log(\"Generating smart contract types\")\n\n const contractsFolder = join(outputFolder, \"contracts\")\n if (!existsSync(contractsFolder))\n await fs.mkdir(contractsFolder, { recursive: true })\n\n const imports: string[] = []\n for (const [key, metadata] of Object.entries(contracts.ink ?? {})) {\n try {\n const types = generateInkTypes(\n getInkLookup(JSON.parse(await fs.readFile(metadata, \"utf-8\"))),\n )\n await fs.writeFile(join(contractsFolder, `${key}.ts`), types)\n imports.push(`export { descriptor as ${key} } from './${key}'`)\n } catch (ex) {\n console.error(\"Exception when generating descriptors for contract \" + key)\n console.error(ex)\n }\n }\n\n for (const [key, metadata] of Object.entries(contracts.sol ?? {})) {\n try {\n const types = generateSolTypes(\n JSON.parse(await fs.readFile(metadata, \"utf-8\")),\n )\n await fs.writeFile(join(contractsFolder, `${key}.ts`), types)\n imports.push(`export { descriptor as ${key} } from './${key}'`)\n } catch (ex) {\n console.error(\"Exception when generating descriptors for contract \" + key)\n console.error(ex)\n }\n }\n\n await fs.writeFile(\n join(contractsFolder, `index.ts`),\n imports.join(\"\\n\") + \"\\n\",\n )\n\n fs.appendFile(\n join(outputFolder, \"index.ts\"),\n `\n export * as contracts from './contracts';\n `,\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 // tsup only builds cjs+esm outputs, skipping all typechecks.\n await tsup.build({\n target: \"es2022\",\n format: [\"cjs\", \"esm\"],\n entry: [path.join(srcDir, \"index.ts\").replaceAll(win32.sep, posix.sep)],\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 // We need tsc to actually build the definitions file, and also perform the typecheck\n const program = tsc.createProgramFromConfig({\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 tsc.emit(program)\n\n const errors = [\n program.getGlobalDiagnostics(),\n program.getOptionsDiagnostics(),\n program.getSemanticDiagnostics(),\n program.getSyntacticDiagnostics(),\n program.getDeclarationDiagnostics(),\n program.getConfigFileParsingDiagnostics(),\n ].flat()\n\n return errors.length === 0\n}\n\nconst cacheMetadataStr = `\nexport const getMetadata: (codeHash: string) => Promise<Uint8Array | null> = async (\n codeHash: string\n)=> {\n try {\n return await metadatas[codeHash].getMetadata()\n } catch {}\n return null\n}`\n\nconst generateIndex = async (\n path: string,\n keys: string[],\n publicTypes: string[],\n metadatas: Record<string, string>,\n) => {\n const indexTs = [\n ...keys.flatMap((key) => [\n `import { default as ${key}, type ${capitalize(key)}WhitelistEntry } from \"./${key}\";`,\n `export { ${key} }`,\n `export type * from \"./${key}\";`,\n ]),\n `export {`,\n publicTypes.join(\", \"),\n `} from './common-types';`,\n `const metadatas = {${Object.entries(metadatas)\n .map(([codeHash, key]) => `[\"${codeHash}\"]: ${key}`)\n .join(\",\\n\")}}`,\n cacheMetadataStr,\n `export type WhitelistEntry = ${keys.map((key) => `${capitalize(key)}WhitelistEntry`).join(\" | \")};`,\n `export type WhitelistEntriesByChain = Partial<{\"*\": WhitelistEntry[], ${keys.map((key) => `${key}: WhitelistEntry[]`).join(\",\\n\")}}>`,\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 \"types\": \"./dist/index.d.ts\",\n \"module\": \"./dist/index.mjs\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./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\": \">=1.21.0\"\n }\n}\n`,\n )\n}\n\nasync function readWhitelist(filename: string): Promise<string[] | null> {\n if (!(await fsExists(filename))) {\n return null\n }\n\n const tmpDir = await mkdtemp(join(tmpdir(), \"papi-\"))\n try {\n await tsup.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\nasync function flushBundlerCache() {\n try {\n const viteMetadata = join(\n process.cwd(),\n \"node_modules\",\n \".vite\",\n \"deps\",\n \"_metadata.json\",\n )\n if (await fsExists(viteMetadata)) {\n await rm(viteMetadata)\n }\n } catch (ex) {\n console.error(ex)\n }\n}\n","import { readdir } from \"node:fs/promises\"\nimport { join } from \"node:path\"\nimport { execa } from \"execa\"\n\nexport type PackageManager = \"npm\" | \"pnpm\" | \"yarn\" | \"bun\"\nexport interface PackageManagerDetection {\n packageManager: PackageManager\n executable: string\n version: string\n}\nlet detected: PackageManagerDetection | null = null\n\nexport async function detectPackageManager() {\n if (detected) return detected\n\n const { packageManager, executable } =\n (await detectByLockFile()) ?? detectByEnvironment() ?? getFallback()\n const version = await getVersion(executable)\n\n return (detected = {\n packageManager,\n executable,\n version,\n })\n}\n\nasync function detectByLockFile(): Promise<Omit<\n PackageManagerDetection,\n \"version\"\n> | null> {\n try {\n for (let i = 0, dir = \".\"; i < 5; i++, dir = join(dir, \"..\")) {\n const packageManager = await getByLockFile(dir)\n if (packageManager) {\n return {\n packageManager,\n executable: packageManager,\n }\n }\n }\n } catch (ex) {\n // fs access can fail for permission errors\n // We just assume that we have\n }\n return null\n}\n\nconst lockFileToPackageManager: Record<string, PackageManager> = {\n \"pnpm-lock.yaml\": \"pnpm\",\n \"yarn.lock\": \"yarn\",\n \"bun.lock\": \"bun\",\n \"bun.lockb\": \"bun\",\n \"package-lock.json\": \"npm\",\n}\n\nconst lockFiles = new Set(Object.keys(lockFileToPackageManager))\nasync function getByLockFile(dir: string) {\n const files = await readdir(dir)\n const lockFile = files.find((v) => lockFiles.has(v))\n return lockFile ? lockFileToPackageManager[lockFile] : null\n}\n\nfunction detectByEnvironment(): Omit<\n PackageManagerDetection,\n \"version\"\n> | null {\n const npm_execpath = process.env.npm_execpath\n if (npm_execpath) {\n const packageManager = Object.values(lockFileToPackageManager).find(\n (manager) => npm_execpath.includes(manager),\n )\n return packageManager ? { packageManager, executable: npm_execpath } : null\n }\n if (process.env.PNPM_PACKAGE_NAME) {\n return { packageManager: \"pnpm\", executable: \"pnpm\" }\n }\n return null\n}\n\nfunction getFallback(): Omit<PackageManagerDetection, \"version\"> {\n console.warn(\"Package manager couldn't be detected, fallback to npm\")\n return {\n executable: \"npm\",\n packageManager: \"npm\",\n }\n}\n\nasync function getVersion(executable: string) {\n const res = await execa(executable, [\"--version\"])\n return res.stdout\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/node\"\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 // only for wsUrl\n at?: string\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 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, genesis, codeHash } = (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 entry.genesis = genesis\n entry.codeHash = codeHash\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 at: options.at,\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 {\n defaultConfig,\n papiFolder,\n readPapiConfig,\n writePapiConfig,\n} from \"@/papiConfig\"\nimport { existsSync } from \"node:fs\"\nimport * as fs from \"node:fs/promises\"\nimport { join } from \"node:path\"\nimport { CommonOptions } from \"./commonOptions\"\nimport { generate } from \"./generate\"\n\nexport interface InkAddOptions extends CommonOptions {\n key?: string\n}\n\nexport const ink = {\n async add(file: string, options: InkAddOptions) {\n const metadata = JSON.parse(await fs.readFile(file, \"utf-8\"))\n // Remove wasm blob if it's there\n delete metadata.source?.wasm\n\n const key = options.key || metadata.contract.name\n const config = (await readPapiConfig(options.config)) ?? defaultConfig\n const inkConfig = (config.ink ||= {})\n if (key in inkConfig) {\n console.warn(`Replacing existing ${key} config`)\n }\n\n const contractsFolder = join(papiFolder, \"contracts\")\n if (!existsSync(contractsFolder)) {\n await fs.mkdir(contractsFolder, { recursive: true })\n }\n const fileName = join(contractsFolder, key + \".json\")\n await fs.writeFile(fileName, JSON.stringify(metadata, null, 2))\n\n inkConfig[key] = fileName\n await writePapiConfig(options.config, config)\n\n if (!options.skipCodegen) {\n generate({\n config: options.config,\n })\n }\n },\n async remove(key: string, options: CommonOptions) {\n const config = (await readPapiConfig(options.config)) ?? defaultConfig\n const inkConfig = (config.ink ||= {})\n if (!(key in inkConfig)) {\n console.log(`${key} contract not found in config`)\n return\n }\n\n const fileName = inkConfig[key]\n delete inkConfig[key]\n\n if (existsSync(fileName)) {\n await fs.rm(fileName)\n }\n\n await writePapiConfig(options.config, config)\n\n if (!options.skipCodegen) {\n generate({\n config: options.config,\n })\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 {\n defaultConfig,\n EntryConfig,\n readPapiConfig,\n writePapiConfig,\n} 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 config = (await readPapiConfig(options.config)) ?? defaultConfig\n const { entries } = config\n\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 if (\"at\" in entry) {\n console.warn(\n `Key ${key} is based on a specific block ${entry.at}, skipping update`,\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 entries[key].genesis = metadata.genesis\n entries[key].codeHash = metadata.codeHash\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 await writePapiConfig(options.config, config)\n\n if (!options.skipCodegen) {\n console.log(`Updating descriptors`)\n await generate({\n config: options.config,\n })\n }\n\n spinner.stop()\n console.log(`Updated chain(s) \"${keys.join(\", \")}\"`)\n}\n","import { Option, program } from \"@commander-js/extra-typings\"\nimport type { add, generate, ink, remove, update } from \"./commands\"\nimport * as knownChains from \"@polkadot-api/known-chains\"\nimport { sol } from \"./commands/sol\"\n\nexport type Commands = {\n add: typeof add\n generate: typeof generate\n remove: typeof remove\n update: typeof update\n ink: typeof ink\n version: string\n}\n\nexport function getCli({\n add,\n generate,\n remove,\n update,\n ink,\n version,\n}: Commands) {\n program.name(\"polkadot-api\").description(\"Polkadot API CLI\").version(version)\n\n const config = new Option(\"--config <filename>\", \"Source for the config file\")\n const skipCodegen = new Option(\n \"--skip-codegen\",\n \"Skip running codegen after adding\",\n )\n const whitelist = new Option(\n \"--whitelist <filename>\",\n \"Removed. The whitelist path is now .papi/whitelist.ts\",\n ).hideHelp()\n\n program\n .command(\"generate\", {\n isDefault: true,\n })\n .description(\"Generate descriptor files\")\n .addOption(config)\n .addOption(whitelist)\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(\n \"--at <block hash or number>\",\n \"Only for -w/--wsUrl. Fetch the metadata for a specific block or hash\",\n )\n .option(\"--no-persist\", \"Do not persist the metadata as a file\")\n .addOption(skipCodegen)\n .addOption(whitelist)\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 .addOption(skipCodegen)\n .addOption(whitelist)\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 .addOption(skipCodegen)\n .addOption(whitelist)\n .action(remove)\n\n const inkCommand = program\n .command(\"ink\")\n .description(\"Add, update or remove ink contracts\")\n inkCommand\n .command(\"add\")\n .description(\"Add or update an ink contract\")\n .argument(\"<file>\", \".contract or .json metadata file for the contract\")\n .option(\"-k, --key <key>\", \"Key identifier for the contract\")\n .addOption(config)\n .addOption(skipCodegen)\n .addOption(whitelist)\n .action(ink.add)\n inkCommand\n .command(\"remove\")\n .description(\"Remove an ink contract\")\n .argument(\"<key>\", \"Key identifier for the contract to remove\")\n .addOption(config)\n .addOption(skipCodegen)\n .addOption(whitelist)\n .action(ink.remove)\n\n const solCommand = program\n .command(\"sol\")\n .description(\"Add, update or remove solidity contracts\")\n solCommand\n .command(\"add\")\n .description(\"Add or update a solidity contract\")\n .argument(\"<file>\", \".abi file for the contract\")\n .argument(\"<key>\", \"Key identifier for the contract\")\n .addOption(config)\n .addOption(skipCodegen)\n .addOption(whitelist)\n .action(sol.add)\n solCommand\n .command(\"remove\")\n .description(\"Remove a solidity contract\")\n .argument(\"<key>\", \"Key identifier for the contract to remove\")\n .addOption(config)\n .addOption(skipCodegen)\n .addOption(whitelist)\n .action(sol.remove)\n\n return program\n}\n","import {\n defaultConfig,\n papiFolder,\n readPapiConfig,\n writePapiConfig,\n} from \"@/papiConfig\"\nimport { existsSync } from \"node:fs\"\nimport * as fs from \"node:fs/promises\"\nimport { join } from \"node:path\"\nimport { CommonOptions } from \"./commonOptions\"\nimport { generate } from \"./generate\"\n\nexport const sol = {\n async add(file: string, key: string, options: CommonOptions) {\n const abi = JSON.parse(await fs.readFile(file, \"utf-8\"))\n\n const config = (await readPapiConfig(options.config)) ?? defaultConfig\n const solConfig = (config.sol ||= {})\n if (key in solConfig) {\n console.warn(`Replacing existing ${key} config`)\n }\n\n const contractsFolder = join(papiFolder, \"contracts\")\n if (!existsSync(contractsFolder)) {\n await fs.mkdir(contractsFolder, { recursive: true })\n }\n const fileName = join(contractsFolder, key + \".json\")\n await fs.writeFile(fileName, JSON.stringify(abi, null, 2))\n\n solConfig[key] = fileName\n await writePapiConfig(options.config, config)\n\n if (!options.skipCodegen) {\n generate({\n config: options.config,\n })\n }\n },\n async remove(key: string, options: CommonOptions) {\n const config = (await readPapiConfig(options.config)) ?? defaultConfig\n const solConfig = (config.sol ||= {})\n if (!(key in solConfig)) {\n console.log(`${key} contract not found in config`)\n return\n }\n\n const fileName = solConfig[key]\n delete solConfig[key]\n\n if (existsSync(fileName)) {\n await fs.rm(fileName)\n }\n\n await writePapiConfig(options.config, config)\n\n if (!options.skipCodegen) {\n generate({\n config: options.config,\n })\n }\n },\n}\n"],"mappings":"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","names":["metadata","relayChainName","mkdir","readFile","writeFile","k","existsSync","fsExists","fs","join","process","join","version","process","fs","join","existsSync","path","version","metadata","fsExists","program","fs","join","existsSync","metadata","existsSync","fs","join","metadata","join","existsSync","ora","metadata","ora","knownChains","existsSync","fs","join","join","existsSync","add","generate","remove","update","ink","version","knownChains"]}
|
package/dist/index.js
CHANGED
package/dist/main.js
CHANGED
|
@@ -5,11 +5,9 @@ import {
|
|
|
5
5
|
getCli,
|
|
6
6
|
ink,
|
|
7
7
|
remove,
|
|
8
|
-
update
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
// package.json
|
|
12
|
-
var version = "1.0.0-canary.ba592c2";
|
|
8
|
+
update,
|
|
9
|
+
version
|
|
10
|
+
} from "./chunk-U4K5MGZJ.js";
|
|
13
11
|
|
|
14
12
|
// src/main.ts
|
|
15
13
|
var program = getCli({ add, generate, remove, update, ink, version });
|
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../
|
|
1
|
+
{"version":3,"sources":["../src/main.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { getCli } from \"./cli\"\nimport { add, generate, ink, remove, update } from \"./commands\"\nimport { version } from \"../package.json\"\n\nconst program = getCli({ add, generate, remove, update, ink, version })\nprogram.parse()\n"],"mappings":";;;;;;;;;;;;AAMA,IAAM,UAAU,OAAO,EAAE,KAAK,UAAU,QAAQ,QAAQ,KAAK,QAAQ,CAAC;AACtE,QAAQ,MAAM;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@polkadot-api/cli",
|
|
3
|
-
"version": "1.0.0-canary.
|
|
3
|
+
"version": "1.0.0-canary.baa4c8e",
|
|
4
4
|
"author": "Victor Oliva (https://github.com/voliva)",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -29,34 +29,34 @@
|
|
|
29
29
|
"dependencies": {
|
|
30
30
|
"@commander-js/extra-typings": "^14.0.0",
|
|
31
31
|
"@polkadot-api/wasm-executor": "^0.2.3",
|
|
32
|
-
"@types/node": "^
|
|
32
|
+
"@types/node": "^25.0.10",
|
|
33
33
|
"commander": "^14.0.2",
|
|
34
34
|
"execa": "^9.6.1",
|
|
35
35
|
"fs.promises.exists": "^1.1.4",
|
|
36
|
-
"ora": "^9.
|
|
36
|
+
"ora": "^9.1.0",
|
|
37
37
|
"read-pkg": "^10.0.0",
|
|
38
38
|
"rxjs": "^7.8.2",
|
|
39
39
|
"tsc-prog": "^2.3.0",
|
|
40
40
|
"tsup": "8.5.0",
|
|
41
41
|
"typescript": "^5.9.3",
|
|
42
42
|
"write-package": "^7.2.0",
|
|
43
|
-
"@polkadot-api/
|
|
44
|
-
"@polkadot-api/
|
|
45
|
-
"@polkadot-api/json-rpc-provider": "1.0.0-canary.
|
|
46
|
-
"@polkadot-api/known-chains": "1.0.0-canary.
|
|
47
|
-
"@polkadot-api/metadata-compatibility": "1.0.0-canary.
|
|
48
|
-
"@polkadot-api/
|
|
49
|
-
"@polkadot-api/
|
|
50
|
-
"@polkadot-api/substrate-bindings": "1.0.0-canary.
|
|
51
|
-
"@polkadot-api/
|
|
52
|
-
"@polkadot-api/
|
|
53
|
-
"@polkadot-api/
|
|
54
|
-
"@polkadot-api/
|
|
55
|
-
"@polkadot-api/ws-
|
|
43
|
+
"@polkadot-api/codegen": "1.0.0-canary.baa4c8e",
|
|
44
|
+
"@polkadot-api/ink-contracts": "1.0.0-canary.baa4c8e",
|
|
45
|
+
"@polkadot-api/json-rpc-provider": "1.0.0-canary.baa4c8e",
|
|
46
|
+
"@polkadot-api/known-chains": "1.0.0-canary.baa4c8e",
|
|
47
|
+
"@polkadot-api/metadata-compatibility": "1.0.0-canary.baa4c8e",
|
|
48
|
+
"@polkadot-api/observable-client": "1.0.0-canary.baa4c8e",
|
|
49
|
+
"@polkadot-api/sm-provider": "1.0.0-canary.baa4c8e",
|
|
50
|
+
"@polkadot-api/substrate-bindings": "1.0.0-canary.baa4c8e",
|
|
51
|
+
"@polkadot-api/utils": "1.0.0-canary.baa4c8e",
|
|
52
|
+
"@polkadot-api/smoldot": "1.0.0-canary.baa4c8e",
|
|
53
|
+
"@polkadot-api/substrate-client": "1.0.0-canary.baa4c8e",
|
|
54
|
+
"@polkadot-api/ws-provider": "1.0.0-canary.baa4c8e",
|
|
55
|
+
"@polkadot-api/ws-middleware": "1.0.0-canary.baa4c8e"
|
|
56
56
|
},
|
|
57
57
|
"devDependencies": {
|
|
58
|
-
"@swc/core": "^1.15.
|
|
59
|
-
"@polkadot-api/json-rpc-provider": "1.0.0-canary.
|
|
58
|
+
"@swc/core": "^1.15.10",
|
|
59
|
+
"@polkadot-api/json-rpc-provider": "1.0.0-canary.baa4c8e"
|
|
60
60
|
},
|
|
61
61
|
"scripts": {
|
|
62
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",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/metadata.ts","../src/papiConfig.ts","../src/commands/generate.ts","../src/packageManager.ts","../src/commands/add.ts","../src/commands/ink.ts","../src/commands/remove.ts","../src/commands/update.ts","../src/cli.ts","../src/commands/sol.ts"],"sourcesContent":["import { createClient } from \"@polkadot-api/substrate-client\"\nimport type { JsonRpcProvider } from \"@polkadot-api/json-rpc-provider\"\nimport * as fs from \"node:fs/promises\"\nimport {\n HexString,\n metadata,\n UnifiedMetadata,\n unifyMetadata,\n v15,\n} from \"@polkadot-api/substrate-bindings\"\nimport { getWsProvider } from \"@polkadot-api/ws-provider\"\nimport { Worker } from \"node:worker_threads\"\nimport { getObservableClient } from \"@polkadot-api/observable-client\"\nimport {\n catchError,\n combineLatest,\n filter,\n firstValueFrom,\n from,\n map,\n Observable,\n of,\n switchMap,\n take,\n} from \"rxjs\"\nimport { EntryConfig } from \"./papiConfig\"\nimport { dirname } from \"path\"\nimport { fileURLToPath } from \"url\"\nimport * as knownChains from \"@polkadot-api/known-chains\"\nimport { startFromWorker } from \"@polkadot-api/smoldot/from-node-worker\"\nimport { Client as SmoldotClient } from \"@polkadot-api/smoldot\"\nimport { getSmProvider } from \"@polkadot-api/sm-provider\"\nimport { middleware } from \"@polkadot-api/ws-middleware\"\n\nconst workerPath = fileURLToPath(\n import.meta.resolve(\"@polkadot-api/smoldot/node-worker\"),\n)\n\nlet smoldotWorker: [SmoldotClient, Worker] | null\nlet workerRefCount = 0\nasync function getSmoldotWorker() {\n if (!smoldotWorker) {\n const worker = new Worker(workerPath, {\n stdout: true,\n stderr: true,\n })\n const client = startFromWorker(worker)\n smoldotWorker = [client, worker]\n }\n return smoldotWorker\n}\n\ntype GetMetadataPayload = {\n metadata: UnifiedMetadata\n metadataRaw: Uint8Array\n codeHash: string\n genesis: string\n}\nconst getMetadataCall = (provider: JsonRpcProvider, at?: string) =>\n new Observable<GetMetadataPayload>((observer) => {\n const substrateClient = createClient(provider)\n const client = getObservableClient(substrateClient)\n const { runtime$, unfollow, genesis$, getRuntime$ } = client.chainHead$()\n const archive = client.archive(getRuntime$)\n\n const getRuntimeCtx$ = () => {\n if (!at) return runtime$.pipe(filter(Boolean))\n // if it's a number\n const hash$ =\n at.length < 32 && /^\\d+$/.test(at)\n ? from(substrateClient.archive.hashByHeight(Number(at))).pipe(\n map(([hash]) => {\n if (!hash) {\n throw new Error(`Can't find block number \"${at}\"`)\n }\n return hash\n }),\n )\n : of(at)\n return hash$.pipe(switchMap(archive.getRuntimeContext$))\n }\n\n const subscription = combineLatest({\n runtime: getRuntimeCtx$(),\n genesis: genesis$,\n })\n .pipe(\n take(1),\n map(\n ({\n runtime: {\n lookup: { metadata },\n metadataRaw,\n codeHash,\n },\n genesis,\n }) => ({\n metadata,\n metadataRaw,\n codeHash,\n genesis,\n }),\n ),\n )\n .subscribe(observer)\n\n subscription.add(() => {\n try {\n unfollow()\n client.destroy()\n } catch {}\n })\n\n return subscription\n })\n\nconst getChainSpecs = (\n chain: string,\n): { potentialRelayChainSpecs: string[]; chainSpec: string } => {\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\nconst getMetadataFromSmoldot = async (chain: string) => {\n workerRefCount++\n try {\n const [smoldot] = await getSmoldotWorker()\n const chainSpecs = getChainSpecs(chain)\n const potentialRelayChains = await Promise.all(\n chainSpecs.potentialRelayChainSpecs.map((chainSpec) =>\n smoldot.addChain({ chainSpec }),\n ),\n )\n const provider = getSmProvider(() =>\n smoldot.addChain({\n chainSpec: chainSpecs.chainSpec,\n potentialRelayChains,\n }),\n )\n return await firstValueFrom(getMetadataCall(provider))\n } finally {\n workerRefCount--\n if (workerRefCount === 0) {\n const [smoldot, worker] = smoldotWorker!\n smoldotWorker = null\n await smoldot.terminate()\n await worker.terminate()\n }\n }\n}\n\nconst getMetadataCallWithError = (\n ...input: Parameters<typeof getMetadataCall>\n) =>\n getMetadataCall(...input).pipe(\n map((value) => ({ success: true as const, value })),\n catchError((error) => of({ success: false as const, error })),\n )\n\nconst getMetadataFromWsURL = (wsURL: string, at?: string) =>\n firstValueFrom(\n getMetadataCallWithError(getWsProvider(wsURL, { middleware }), at).pipe(\n map((x) => {\n if (x.success) return x.value\n throw x.error\n }),\n ),\n )\n\nexport async function getMetadata({\n metadata: metadataFile,\n codeHash,\n genesis,\n ...entry\n}: EntryConfig): Promise<{\n metadata: UnifiedMetadata\n metadataRaw: Uint8Array\n codeHash?: HexString\n genesis?: HexString\n} | 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 (metadataFile) {\n const data = await fs.readFile(metadataFile)\n const metadataRaw = new Uint8Array(data)\n\n let meta: UnifiedMetadata\n try {\n meta = unifyMetadata(metadata.dec(metadataRaw))\n } catch (_) {\n meta = unifyMetadata(v15.dec(metadataRaw))\n }\n\n return {\n metadata: meta,\n metadataRaw,\n codeHash,\n genesis,\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, entry.at)\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 genesis?: string\n codeHash?: string\n }\n | {\n chainSpec: string\n metadata?: string\n genesis?: string\n codeHash?: string\n }\n | {\n wsUrl: string\n at?: string\n metadata?: string\n genesis?: string\n codeHash?: string\n }\n | {\n chain: string\n metadata?: string\n genesis?: string\n codeHash?: string\n }\ntype Entries = Record<string, EntryConfig>\nexport interface PapiConfigOptions {\n noDescriptorsPackage?: boolean\n whitelist?: string\n}\nexport type PapiConfig = {\n version: 0\n descriptorPath: string\n entries: Record<string, EntryConfig>\n ink?: Record<string, string>\n sol?: Record<string, string>\n options?: Partial<PapiConfigOptions>\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}\n","import { getMetadata } from \"@/metadata\"\nimport { readPapiConfig } from \"@/papiConfig\"\nimport {\n capitalize,\n generateInkTypes,\n generateMultipleDescriptors,\n generateSolTypes,\n type KnownTypes,\n} from \"@polkadot-api/codegen\"\nimport { getInkLookup } from \"@polkadot-api/ink-contracts\"\nimport {\n EntryPointCodec,\n TypedefCodec,\n} from \"@polkadot-api/metadata-compatibility\"\nimport {\n Binary,\n h64,\n HexString,\n UnifiedMetadata,\n Tuple,\n Vector,\n} from \"@polkadot-api/substrate-bindings\"\nimport { spawn } from \"child_process\"\nimport { existsSync } from \"fs\"\nimport fsExists from \"fs.promises.exists\"\nimport fs, { mkdtemp, rm } from \"fs/promises\"\nimport { tmpdir } from \"os\"\nimport path, { join, posix, win32 } from \"path\"\nimport process from \"process\"\nimport { readPackage } from \"read-pkg\"\nimport tsc from \"tsc-prog\"\nimport tsup from \"tsup\"\nimport { updatePackage } from \"write-package\"\nimport { detectPackageManager } from \"../packageManager\"\nimport { CommonOptions } from \"./commonOptions\"\n\nexport interface GenerateOptions extends CommonOptions {\n clientLibrary?: 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 ...(await getMetadata(source))!,\n knownTypes: {},\n })),\n )\n\n if (chains.length === 0) {\n console.log(\"No entries in polkadot-api.json. Nothing to generate.\")\n return\n }\n\n console.log(`Generating descriptors`)\n await cleanDescriptorsPackage(config.descriptorPath)\n if (!config.options?.noDescriptorsPackage) {\n await addDescriptorsToPackageJson(config.descriptorPath)\n }\n const descriptorsDir = join(process.cwd(), config.descriptorPath)\n\n const clientPath = opts.clientLibrary ?? \"polkadot-api\"\n\n const whitelistPath = opts.whitelist ?? config.options?.whitelist\n const whitelist = whitelistPath ? await readWhitelist(whitelistPath) : null\n const descriptorSrcDir = join(descriptorsDir, \"src\")\n const hash = await outputCodegen(\n chains,\n descriptorSrcDir,\n clientPath,\n whitelist,\n )\n\n if (config.ink || config.sol) {\n outputContractCodegen(config, descriptorSrcDir)\n }\n\n await replacePackageJson(descriptorsDir, hash)\n await compileCodegen(descriptorsDir)\n await fs.rm(descriptorSrcDir, { recursive: true })\n if (!config.options?.noDescriptorsPackage) {\n await runInstall()\n await flushBundlerCache()\n }\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\n const distDir = join(descriptorsDir, \"dist\")\n if (existsSync(distDir)) {\n await fs.rm(distDir, { recursive: true })\n }\n}\n\nasync function addDescriptorsToPackageJson(path: string) {\n const [packageJson, protocol] = await Promise.all([\n readPackage(),\n getPackageProtocol(),\n ])\n\n const packageSource = `${protocol}:${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\nasync function getPackageProtocol() {\n const { packageManager, version } = await detectPackageManager()\n\n switch (packageManager) {\n case \"yarn\":\n const yarnMajorVersion = Number(version.split(\".\").at(0))\n\n return yarnMajorVersion >= 2 ? \"portal\" : \"file\"\n default:\n return \"file\"\n }\n}\n\nasync function runInstall() {\n const { executable } = await detectPackageManager()\n console.log(`${executable} install`)\n const child = spawn(executable, [\"install\"], {\n stdio: \"inherit\",\n shell: true,\n env: {\n ...process.env,\n PAPI_SKIP_GENERATE: \"true\",\n },\n })\n await new Promise((resolve) => child.on(\"close\", resolve))\n}\n\nconst generateMetadataExportFile = (input: Uint8Array): string =>\n `const binMeta: string = \"${Buffer.from(input).toString(\"base64\")}\"; export default binMeta;`\n\nasync function outputCodegen(\n chains: Array<{\n key: string\n metadata: UnifiedMetadata\n metadataRaw: Uint8Array\n knownTypes: KnownTypes\n codeHash?: HexString\n genesis?: HexString\n }>,\n outputFolder: string,\n clientPath: string,\n whitelist: string[] | Record<string, string[]> | null,\n) {\n const {\n commonFileContent,\n descriptorsFileContent,\n descriptorTypesFiles,\n metadataTypes,\n typesFileContent,\n publicTypes,\n } = generateMultipleDescriptors(\n chains,\n {\n client: clientPath,\n metadataTypes: \"./metadataTypes\",\n types: \"./common-types\",\n descriptorValues: \"./descriptors\",\n common: \"./common\",\n },\n {\n whitelist: whitelist ?? undefined,\n },\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\n await fs.writeFile(path.join(outputFolder, \"common.ts\"), commonFileContent)\n // Going through base64 conversion instead of using binary loader because of esbuild issue\n // https://github.com/evanw/esbuild/issues/3894\n const metadataTypesBase64 = Buffer.from(\n TypesCodec.enc([metadataTypes.entryPoints, metadataTypes.typedefs]),\n ).toString(\"base64\")\n\n await fs.writeFile(\n path.join(outputFolder, \"metadataTypes.ts\"),\n `\nconst content = \"${metadataTypesBase64}\"\nexport default content\n `,\n )\n await fs.writeFile(\n path.join(outputFolder, \"descriptors.ts\"),\n descriptorsFileContent,\n )\n await fs.writeFile(\n path.join(outputFolder, \"common-types.ts\"),\n typesFileContent,\n )\n await Promise.all(\n chains\n .map((chain, i) => [\n fs.writeFile(\n join(outputFolder, `${chain.key}.ts`),\n descriptorTypesFiles[i].content,\n ),\n fs.writeFile(\n join(outputFolder, `${chain.key}_metadata.ts`),\n generateMetadataExportFile(chain.metadataRaw),\n ),\n ])\n .flat(),\n )\n\n await generateIndex(\n outputFolder,\n chains.map((chain) => chain.key),\n publicTypes,\n Object.fromEntries(\n chains.filter((x) => x.codeHash!!).map((x) => [x.codeHash, x.key]),\n ),\n )\n\n return hash\n}\n\nasync function outputContractCodegen(\n contracts: {\n ink?: Record<string, string>\n sol?: Record<string, string>\n },\n outputFolder: string,\n) {\n console.log(\"Generating smart contract types\")\n\n const contractsFolder = join(outputFolder, \"contracts\")\n if (!existsSync(contractsFolder))\n await fs.mkdir(contractsFolder, { recursive: true })\n\n const imports: string[] = []\n for (const [key, metadata] of Object.entries(contracts.ink ?? {})) {\n try {\n const types = generateInkTypes(\n getInkLookup(JSON.parse(await fs.readFile(metadata, \"utf-8\"))),\n )\n await fs.writeFile(join(contractsFolder, `${key}.ts`), types)\n imports.push(`export { descriptor as ${key} } from './${key}'`)\n } catch (ex) {\n console.error(\"Exception when generating descriptors for contract \" + key)\n console.error(ex)\n }\n }\n\n for (const [key, metadata] of Object.entries(contracts.sol ?? {})) {\n try {\n const types = generateSolTypes(\n JSON.parse(await fs.readFile(metadata, \"utf-8\")),\n )\n await fs.writeFile(join(contractsFolder, `${key}.ts`), types)\n imports.push(`export { descriptor as ${key} } from './${key}'`)\n } catch (ex) {\n console.error(\"Exception when generating descriptors for contract \" + key)\n console.error(ex)\n }\n }\n\n await fs.writeFile(\n join(contractsFolder, `index.ts`),\n imports.join(\"\\n\") + \"\\n\",\n )\n\n fs.appendFile(\n join(outputFolder, \"index.ts\"),\n `\n export * as contracts from './contracts';\n `,\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 target: \"es2022\",\n format: [\"cjs\", \"esm\"],\n entry: [path.join(srcDir, \"index.ts\").replaceAll(win32.sep, posix.sep)],\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 cacheMetadataStr = `\nexport const getMetadata: (codeHash: string) => Promise<Uint8Array | null> = async (\n codeHash: string\n)=> {\n try {\n return await metadatas[codeHash].getMetadata()\n } catch {}\n return null\n}`\n\nconst generateIndex = async (\n path: string,\n keys: string[],\n publicTypes: string[],\n metadatas: Record<string, string>,\n) => {\n const indexTs = [\n ...keys.flatMap((key) => [\n `import { default as ${key}, type ${capitalize(key)}WhitelistEntry } from \"./${key}\";`,\n `export { ${key} }`,\n `export type * from \"./${key}\";`,\n ]),\n `export {`,\n publicTypes.join(\", \"),\n `} from './common-types';`,\n `const metadatas = {${Object.entries(metadatas)\n .map(([codeHash, key]) => `[\"${codeHash}\"]: ${key}`)\n .join(\",\\n\")}}`,\n cacheMetadataStr,\n `export type WhitelistEntry = ${keys.map((key) => `${capitalize(key)}WhitelistEntry`).join(\" | \")};`,\n `export type WhitelistEntriesByChain = Partial<{\"*\": WhitelistEntry[], ${keys.map((key) => `${key}: WhitelistEntry[]`).join(\",\\n\")}}>`,\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 \"types\": \"./dist/index.d.ts\",\n \"module\": \"./dist/index.mjs\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./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\": \">=1.21.0\"\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 tsup.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\nasync function flushBundlerCache() {\n try {\n const viteMetadata = join(\n process.cwd(),\n \"node_modules\",\n \".vite\",\n \"deps\",\n \"_metadata.json\",\n )\n if (await fsExists(viteMetadata)) {\n await rm(viteMetadata)\n }\n } catch (ex) {\n console.error(ex)\n }\n}\n","import { readdir } from \"node:fs/promises\"\nimport { join } from \"node:path\"\nimport { execa } from \"execa\"\n\nexport type PackageManager = \"npm\" | \"pnpm\" | \"yarn\" | \"bun\"\nexport interface PackageManagerDetection {\n packageManager: PackageManager\n executable: string\n version: string\n}\nlet detected: PackageManagerDetection | null = null\n\nexport async function detectPackageManager() {\n if (detected) return detected\n\n const { packageManager, executable } =\n (await detectByLockFile()) ?? detectByEnvironment() ?? getFallback()\n const version = await getVersion(executable)\n\n return (detected = {\n packageManager,\n executable,\n version,\n })\n}\n\nasync function detectByLockFile(): Promise<Omit<\n PackageManagerDetection,\n \"version\"\n> | null> {\n try {\n for (let i = 0, dir = \".\"; i < 5; i++, dir = join(dir, \"..\")) {\n const packageManager = await getByLockFile(dir)\n if (packageManager) {\n return {\n packageManager,\n executable: packageManager,\n }\n }\n }\n } catch (ex) {\n // fs access can fail for permission errors\n // We just assume that we have\n }\n return null\n}\n\nconst lockFileToPackageManager: Record<string, PackageManager> = {\n \"pnpm-lock.yaml\": \"pnpm\",\n \"yarn.lock\": \"yarn\",\n \"bun.lock\": \"bun\",\n \"bun.lockb\": \"bun\",\n \"package-lock.json\": \"npm\",\n}\n\nconst lockFiles = new Set(Object.keys(lockFileToPackageManager))\nasync function getByLockFile(dir: string) {\n const files = await readdir(dir)\n const lockFile = files.find((v) => lockFiles.has(v))\n return lockFile ? lockFileToPackageManager[lockFile] : null\n}\n\nfunction detectByEnvironment(): Omit<\n PackageManagerDetection,\n \"version\"\n> | null {\n const npm_execpath = process.env.npm_execpath\n if (npm_execpath) {\n const packageManager = Object.values(lockFileToPackageManager).find(\n (manager) => npm_execpath.includes(manager),\n )\n return packageManager ? { packageManager, executable: npm_execpath } : null\n }\n if (process.env.PNPM_PACKAGE_NAME) {\n return { packageManager: \"pnpm\", executable: \"pnpm\" }\n }\n return null\n}\n\nfunction getFallback(): Omit<PackageManagerDetection, \"version\"> {\n console.warn(\"Package manager couldn't be detected, fallback to npm\")\n return {\n executable: \"npm\",\n packageManager: \"npm\",\n }\n}\n\nasync function getVersion(executable: string) {\n const res = await execa(executable, [\"--version\"])\n return res.stdout\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/node\"\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 // only for wsUrl\n at?: string\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 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, genesis, codeHash } = (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 entry.genesis = genesis\n entry.codeHash = codeHash\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 at: options.at,\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 {\n defaultConfig,\n papiFolder,\n readPapiConfig,\n writePapiConfig,\n} from \"@/papiConfig\"\nimport { existsSync } from \"node:fs\"\nimport * as fs from \"node:fs/promises\"\nimport { join } from \"node:path\"\nimport { CommonOptions } from \"./commonOptions\"\nimport { generate } from \"./generate\"\n\nexport interface InkAddOptions extends CommonOptions {\n key?: string\n}\n\nexport const ink = {\n async add(file: string, options: InkAddOptions) {\n const metadata = JSON.parse(await fs.readFile(file, \"utf-8\"))\n // Remove wasm blob if it's there\n delete metadata.source?.wasm\n\n const key = options.key || metadata.contract.name\n const config = (await readPapiConfig(options.config)) ?? defaultConfig\n const inkConfig = (config.ink ||= {})\n if (key in inkConfig) {\n console.warn(`Replacing existing ${key} config`)\n }\n\n const contractsFolder = join(papiFolder, \"contracts\")\n if (!existsSync(contractsFolder)) {\n await fs.mkdir(contractsFolder, { recursive: true })\n }\n const fileName = join(contractsFolder, key + \".json\")\n await fs.writeFile(fileName, JSON.stringify(metadata, null, 2))\n\n inkConfig[key] = fileName\n await writePapiConfig(options.config, config)\n\n if (!options.skipCodegen) {\n generate({\n config: options.config,\n })\n }\n },\n async remove(key: string, options: CommonOptions) {\n const config = (await readPapiConfig(options.config)) ?? defaultConfig\n const inkConfig = (config.ink ||= {})\n if (!(key in inkConfig)) {\n console.log(`${key} contract not found in config`)\n return\n }\n\n const fileName = inkConfig[key]\n delete inkConfig[key]\n\n if (existsSync(fileName)) {\n await fs.rm(fileName)\n }\n\n await writePapiConfig(options.config, config)\n\n if (!options.skipCodegen) {\n generate({\n config: options.config,\n })\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 {\n defaultConfig,\n EntryConfig,\n readPapiConfig,\n writePapiConfig,\n} 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 config = (await readPapiConfig(options.config)) ?? defaultConfig\n const { entries } = config\n\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 if (\"at\" in entry) {\n console.warn(\n `Key ${key} is based on a specific block ${entry.at}, skipping update`,\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 entries[key].genesis = metadata.genesis\n entries[key].codeHash = metadata.codeHash\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 await writePapiConfig(options.config, config)\n\n if (!options.skipCodegen) {\n console.log(`Updating descriptors`)\n await generate({\n config: options.config,\n })\n }\n\n spinner.stop()\n console.log(`Updated chain(s) \"${keys.join(\", \")}\"`)\n}\n","import { Option, program } from \"@commander-js/extra-typings\"\nimport type { add, generate, ink, remove, update } from \"./commands\"\nimport * as knownChains from \"@polkadot-api/known-chains\"\nimport { sol } from \"./commands/sol\"\n\nexport type Commands = {\n add: typeof add\n generate: typeof generate\n remove: typeof remove\n update: typeof update\n ink: typeof ink\n version: string\n}\n\nexport function getCli({\n add,\n generate,\n remove,\n update,\n ink,\n version,\n}: Commands) {\n program.name(\"polkadot-api\").description(\"Polkadot API CLI\").version(version)\n\n const config = new Option(\"--config <filename>\", \"Source for the config file\")\n const skipCodegen = new Option(\n \"--skip-codegen\",\n \"Skip running codegen after adding\",\n )\n const whitelist = new Option(\n \"--whitelist <filename>\",\n \"Use whitelist file to reduce descriptor size\",\n )\n\n program\n .command(\"generate\", {\n isDefault: true,\n })\n .description(\"Generate descriptor files\")\n .addOption(config)\n .addOption(whitelist)\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(\n \"--at <block hash or number>\",\n \"Only for -w/--wsUrl. Fetch the metadata for a specific block or hash\",\n )\n .option(\"--no-persist\", \"Do not persist the metadata as a file\")\n .addOption(skipCodegen)\n .addOption(whitelist)\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 .addOption(skipCodegen)\n .addOption(whitelist)\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 .addOption(skipCodegen)\n .addOption(whitelist)\n .action(remove)\n\n const inkCommand = program\n .command(\"ink\")\n .description(\"Add, update or remove ink contracts\")\n inkCommand\n .command(\"add\")\n .description(\"Add or update an ink contract\")\n .argument(\"<file>\", \".contract or .json metadata file for the contract\")\n .option(\"-k, --key <key>\", \"Key identifier for the contract\")\n .addOption(config)\n .addOption(skipCodegen)\n .addOption(whitelist)\n .action(ink.add)\n inkCommand\n .command(\"remove\")\n .description(\"Remove an ink contract\")\n .argument(\"<key>\", \"Key identifier for the contract to remove\")\n .addOption(config)\n .addOption(skipCodegen)\n .addOption(whitelist)\n .action(ink.remove)\n\n const solCommand = program\n .command(\"sol\")\n .description(\"Add, update or remove solidity contracts\")\n solCommand\n .command(\"add\")\n .description(\"Add or update a solidity contract\")\n .argument(\"<file>\", \".abi file for the contract\")\n .argument(\"<key>\", \"Key identifier for the contract\")\n .addOption(config)\n .addOption(skipCodegen)\n .addOption(whitelist)\n .action(sol.add)\n solCommand\n .command(\"remove\")\n .description(\"Remove a solidity contract\")\n .argument(\"<key>\", \"Key identifier for the contract to remove\")\n .addOption(config)\n .addOption(skipCodegen)\n .addOption(whitelist)\n .action(sol.remove)\n\n return program\n}\n","import {\n defaultConfig,\n papiFolder,\n readPapiConfig,\n writePapiConfig,\n} from \"@/papiConfig\"\nimport { existsSync } from \"node:fs\"\nimport * as fs from \"node:fs/promises\"\nimport { join } from \"node:path\"\nimport { CommonOptions } from \"./commonOptions\"\nimport { generate } from \"./generate\"\n\nexport const sol = {\n async add(file: string, key: string, options: CommonOptions) {\n const abi = JSON.parse(await fs.readFile(file, \"utf-8\"))\n\n const config = (await readPapiConfig(options.config)) ?? defaultConfig\n const solConfig = (config.sol ||= {})\n if (key in solConfig) {\n console.warn(`Replacing existing ${key} config`)\n }\n\n const contractsFolder = join(papiFolder, \"contracts\")\n if (!existsSync(contractsFolder)) {\n await fs.mkdir(contractsFolder, { recursive: true })\n }\n const fileName = join(contractsFolder, key + \".json\")\n await fs.writeFile(fileName, JSON.stringify(abi, null, 2))\n\n solConfig[key] = fileName\n await writePapiConfig(options.config, config)\n\n if (!options.skipCodegen) {\n generate({\n config: options.config,\n })\n }\n },\n async remove(key: string, options: CommonOptions) {\n const config = (await readPapiConfig(options.config)) ?? defaultConfig\n const solConfig = (config.sol ||= {})\n if (!(key in solConfig)) {\n console.log(`${key} contract not found in config`)\n return\n }\n\n const fileName = solConfig[key]\n delete solConfig[key]\n\n if (existsSync(fileName)) {\n await fs.rm(fileName)\n }\n\n await writePapiConfig(options.config, config)\n\n if (!options.skipCodegen) {\n generate({\n config: options.config,\n })\n }\n },\n}\n"],"mappings":"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","names":["metadata","relayChainName","mkdir","readFile","writeFile","existsSync","fsExists","fs","join","process","readPackage","join","process","join","fs","path","existsSync","readPackage","metadata","fsExists","fs","join","existsSync","metadata","existsSync","fs","join","metadata","join","existsSync","ora","metadata","ora","knownChains","existsSync","fs","join","join","existsSync","add","generate","remove","update","ink","knownChains"]}
|