@polkadot-api/cli 0.6.1 → 0.7.1

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