@polkadot-api/cli 0.2.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -30,14 +30,14 @@ Usage: polkadot-api [options] [command]
30
30
  Polkadot API CLI
31
31
 
32
32
  Options:
33
- -h, --help display help for command
33
+ -h, --help display help for command
34
34
 
35
35
  Commands:
36
- generate [options] Generate file descriptors
37
- add [options] <key> [dest] Add a new chain spec to the list
38
- update [options] [keys] Update the metadata files
39
- remove [options] <key> Remove a chain spec to the list
40
- help [command] display help for command
36
+ generate [options] Generate descriptor files
37
+ add [options] <key> Add a new chain spec to the list
38
+ update [options] [keys] Update the metadata files
39
+ remove [options] <key> Remove a chain spec from the list
40
+ help [command] display help for command
41
41
  ```
42
42
 
43
43
  ## Configuration file
@@ -58,9 +58,9 @@ Usage: polkadot-api generate [options]
58
58
  Generate descriptor files
59
59
 
60
60
  Options:
61
- --config <filename> Source for the config file
62
- -k, --key <key> Key of the descriptor to generate
63
- -h, --help display help for command
61
+ --config <filename> Source for the config file
62
+ -k, --key <key> Key of the descriptor to generate
63
+ -h, --help display help for command
64
64
  ```
65
65
 
66
66
  By default, it generates the descriptor files for all of the chains defined in the config file. To generate only the ones for a specific chain, use the `-k, --key` parameter.
@@ -68,7 +68,7 @@ By default, it generates the descriptor files for all of the chains defined in t
68
68
  ### Add
69
69
 
70
70
  ```sh
71
- Usage: polkadot-api add [options] <key> [dest]
71
+ Usage: polkadot-api add [options] <key>
72
72
 
73
73
  Add a new chain spec to the list
74
74
 
@@ -102,7 +102,8 @@ Usage: polkadot-api update [options] [keys]
102
102
  Update the metadata files
103
103
 
104
104
  Arguments:
105
- keys Keys of the metadata files to update, separated by commas. Leave empty for all
105
+ keys Keys of the metadata files to update, separated by commas. Leave
106
+ empty for all
106
107
 
107
108
  Options:
108
109
  --config <filename> Source for the config file
@@ -16,7 +16,10 @@ function getCli({ add: add2, generate: generate2, remove: remove2, update: updat
16
16
  const config = new Option("--config <filename>", "Source for the config file");
17
17
  program.command("generate", {
18
18
  isDefault: true
19
- }).description("Generate descriptor files").addOption(config).option("-k, --key <key>", "Key of the descriptor to generate").action(generate2);
19
+ }).description("Generate descriptor files").addOption(config).option("-k, --key <key>", "Key of the descriptor to generate").option(
20
+ "--whitelist <filename>",
21
+ "Use whitelist file to reduce descriptor size"
22
+ ).action(generate2);
20
23
  program.command("add").description("Add a new chain spec to the list").argument("<key>", "Key identifier for the chain spec").addOption(config).option("-f, --file <filename>", "Source from metadata encoded file").option("-w, --wsUrl <URL>", "Source from websocket url").option("-c, --chainSpec <filename>", "Source from chain spec file").addOption(
21
24
  new Option("-n, --name <name>", "Source from a well-known chain").choices(
22
25
  Object.keys(WellKnownChain)
@@ -33,7 +36,7 @@ function getCli({ add: add2, generate: generate2, remove: remove2, update: updat
33
36
  // src/metadata.ts
34
37
  import { createClient } from "@polkadot-api/substrate-client";
35
38
  import * as fs from "node:fs/promises";
36
- import { v15 } from "@polkadot-api/substrate-bindings";
39
+ import { metadata, v15 } from "@polkadot-api/substrate-bindings";
37
40
  import { WebSocketProvider } from "@polkadot-api/ws-provider/node";
38
41
 
39
42
  // src/smolldot-worker.ts
@@ -106,11 +109,11 @@ import { filter, firstValueFrom } from "rxjs";
106
109
  import { dirname } from "path";
107
110
  var getMetadataCall = async (provider) => {
108
111
  const client = getObservableClient(createClient(provider));
109
- const { metadata$, unfollow } = client.chainHead$();
110
- const metadata = await firstValueFrom(metadata$.pipe(filter(Boolean)));
112
+ const { runtime$, unfollow } = client.chainHead$();
113
+ const runtime = await firstValueFrom(runtime$.pipe(filter(Boolean)));
111
114
  unfollow();
112
115
  client.destroy();
113
- return metadata;
116
+ return { metadata: runtime.metadata, metadataRaw: runtime.metadataRaw };
114
117
  };
115
118
  var getMetadataFromProvider = async (chain) => {
116
119
  const provider = (onMsg) => {
@@ -139,7 +142,17 @@ var getMetadataFromWsURL = async (wsURL) => getMetadataCall(WebSocketProvider(ws
139
142
  async function getMetadata(entry) {
140
143
  if (entry.metadata) {
141
144
  const data = await fs.readFile(entry.metadata);
142
- return v15.dec(data);
145
+ const metadataRaw = new Uint8Array(data);
146
+ let meta;
147
+ try {
148
+ meta = metadata.dec(metadataRaw).metadata.value;
149
+ } catch (_) {
150
+ meta = v15.dec(metadataRaw);
151
+ }
152
+ return {
153
+ metadata: meta,
154
+ metadataRaw
155
+ };
143
156
  }
144
157
  if ("chain" in entry) {
145
158
  return getMetadataFromProvider(entry.chain);
@@ -153,10 +166,9 @@ async function getMetadata(entry) {
153
166
  }
154
167
  return null;
155
168
  }
156
- async function writeMetadataToDisk(metadata, outFile) {
157
- const encoded = v15.enc(metadata);
169
+ async function writeMetadataToDisk(metadataRaw, outFile) {
158
170
  await fs.mkdir(dirname(outFile), { recursive: true });
159
- await fs.writeFile(outFile, encoded);
171
+ await fs.writeFile(outFile, metadataRaw);
160
172
  }
161
173
 
162
174
  // src/papiConfig.ts
@@ -224,10 +236,10 @@ async function add(key, options) {
224
236
  entries[key] = entry;
225
237
  if (!options.noPersist) {
226
238
  const spinner = ora(`Loading metadata`).start();
227
- const metadata = await getMetadata(entry);
239
+ const { metadataRaw } = await getMetadata(entry);
228
240
  spinner.text = "Writing metadata";
229
241
  const filename = `${key}.scale`;
230
- await writeMetadataToDisk(metadata, filename);
242
+ await writeMetadataToDisk(metadataRaw, filename);
231
243
  spinner.succeed(`Metadata saved as ${filename}`);
232
244
  entry.metadata = filename;
233
245
  }
@@ -258,13 +270,14 @@ var entryFromOptions = (options) => {
258
270
 
259
271
  // src/commands/generate.ts
260
272
  import { generateMultipleDescriptors } from "@polkadot-api/codegen";
261
- import fs2 from "fs/promises";
273
+ import fs2, { mkdtemp, rm } from "fs/promises";
262
274
  import path, { join } from "path";
263
275
  import process from "process";
264
276
  import tsc from "tsc-prog";
265
- import tsup from "tsup";
277
+ import tsup, { build } from "tsup";
266
278
  import fsExists2 from "fs.promises.exists";
267
279
  import { existsSync } from "fs";
280
+ import { tmpdir } from "os";
268
281
  async function generate(opts) {
269
282
  const sources = await getSources(opts);
270
283
  if (Object.keys(sources).length == 0) {
@@ -274,7 +287,7 @@ async function generate(opts) {
274
287
  const chains = await Promise.all(
275
288
  Object.entries(sources).map(async ([key, source]) => ({
276
289
  key,
277
- metadata: await getMetadata(source),
290
+ metadata: (await getMetadata(source)).metadata,
278
291
  knownTypes: {}
279
292
  }))
280
293
  );
@@ -289,7 +302,13 @@ async function generate(opts) {
289
302
  await fs2.rm(descriptorsDir, { recursive: true });
290
303
  await fs2.mkdir(descriptorsDir, { recursive: true });
291
304
  await generatePackageJson(join(descriptorsDir, "package.json"));
292
- await outputCodegen(chains, join(descriptorsDir, "src"), clientPath);
305
+ const whitelist = opts.whitelist ? await readWhitelist(opts.whitelist) : null;
306
+ await outputCodegen(
307
+ chains,
308
+ join(descriptorsDir, "src"),
309
+ clientPath,
310
+ whitelist
311
+ );
293
312
  await compileCodegen(descriptorsDir);
294
313
  await fs2.rm(join(descriptorsDir, "src"), { recursive: true });
295
314
  }
@@ -308,12 +327,18 @@ async function getSources(opts) {
308
327
  }
309
328
  return config;
310
329
  }
311
- async function outputCodegen(chains, outputFolder, clientPath) {
312
- const { descriptorsFileContent, checksums, typesFileContent, publicTypes } = generateMultipleDescriptors(chains, {
313
- client: clientPath,
314
- checksums: "./checksums.json",
315
- types: "./common-types"
316
- });
330
+ async function outputCodegen(chains, outputFolder, clientPath, whitelist) {
331
+ const { descriptorsFileContent, checksums, typesFileContent, publicTypes } = generateMultipleDescriptors(
332
+ chains,
333
+ {
334
+ client: clientPath,
335
+ checksums: "./checksums.json",
336
+ types: "./common-types"
337
+ },
338
+ {
339
+ whitelist: whitelist ?? void 0
340
+ }
341
+ );
317
342
  await fs2.mkdir(outputFolder, { recursive: true });
318
343
  await fs2.writeFile(
319
344
  path.join(outputFolder, "checksums.json"),
@@ -403,6 +428,29 @@ var generatePackageJson = async (path2) => {
403
428
  }`
404
429
  );
405
430
  };
431
+ async function readWhitelist(filename) {
432
+ if (!await fsExists2(filename)) {
433
+ throw new Error("Whitelist file not found: " + filename);
434
+ }
435
+ const tmpDir = await mkdtemp(join(tmpdir(), "papi-"));
436
+ try {
437
+ await build({
438
+ format: "esm",
439
+ entry: {
440
+ index: filename
441
+ },
442
+ outDir: tmpDir,
443
+ outExtension() {
444
+ return { js: ".mjs" };
445
+ },
446
+ silent: true
447
+ });
448
+ const { whitelist } = await import(join(tmpDir, "index.mjs"));
449
+ return whitelist;
450
+ } finally {
451
+ await rm(tmpDir, { recursive: true }).catch(console.error);
452
+ }
453
+ }
406
454
 
407
455
  // src/commands/remove.ts
408
456
  async function remove(key, options) {
@@ -434,8 +482,8 @@ async function update(keysInput, options) {
434
482
  spinner.stop();
435
483
  continue;
436
484
  }
437
- const metadata = await getMetadata(entry);
438
- if (!metadata) {
485
+ const metadata2 = await getMetadata(entry);
486
+ if (!metadata2) {
439
487
  if (keysInput !== void 0) {
440
488
  console.warn(
441
489
  `Key ${key} doesn't have any external source to update from`
@@ -445,7 +493,7 @@ async function update(keysInput, options) {
445
493
  continue;
446
494
  }
447
495
  spinner.text = `Writing ${key} metadata`;
448
- await writeMetadataToDisk(metadata, filename);
496
+ await writeMetadataToDisk(metadata2.metadataRaw, filename);
449
497
  spinner.succeed(`${key} metadata updated`);
450
498
  }
451
499
  }
@@ -457,4 +505,4 @@ export {
457
505
  remove,
458
506
  update
459
507
  };
460
- //# sourceMappingURL=chunk-ILWYWJEB.js.map
508
+ //# sourceMappingURL=chunk-THFZ6HTG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli.ts","../src/well-known-chains.ts","../src/metadata.ts","../src/smolldot-worker.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 { WellKnownChain } from \"./well-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(WellKnownChain) as WellKnownChain[],\n ),\n )\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\")\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","export enum WellKnownChain {\n polkadot = \"polkadot\",\n ksmcc3 = \"ksmcc3\",\n rococo_v2_2 = \"rococo_v2_2\",\n westend2 = \"westend2\",\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 { PROVIDER_WORKER_CODE } from \"./smolldot-worker\"\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 { WellKnownChain } from \"./well-known-chains\"\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.metadata, metadataRaw: runtime.metadataRaw }\n}\n\nconst getMetadataFromProvider = async (chain: WellKnownChain | string) => {\n const provider: JsonRpcProvider = (onMsg) => {\n let worker: Worker | null = new Worker(PROVIDER_WORKER_CODE, {\n eval: true,\n workerData: chain,\n stderr: true,\n stdout: true,\n })\n worker.on(\"message\", onMsg)\n\n return {\n send: (msg) => worker?.postMessage({ type: \"send\", value: msg }),\n disconnect: () => {\n if (!worker) return\n\n worker.postMessage({ type: \"disconnect\" })\n worker.removeAllListeners()\n worker.terminate()\n worker = null\n },\n }\n }\n\n return getMetadataCall(provider)\n}\n\nconst getMetadataFromWsURL = async (wsURL: string) =>\n getMetadataCall(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 getMetadataFromProvider(entry.chain)\n }\n\n if (\"chainSpec\" in entry) {\n const chainSpec = await fs.readFile(entry.chainSpec, \"utf8\")\n return getMetadataFromProvider(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","export const PROVIDER_WORKER_CODE = `\nconst { start } = require(\"smoldot\")\nconst { parentPort, workerData } = require(\"node:worker_threads\")\nconst { getSmProvider } = require(\"@polkadot-api/sm-provider\")\n\nif (!parentPort) throw new Error(\"no parent port\")\n\nconst WELL_KNOWN_CHAINS_LIB = \"@polkadot-api/known-chains/\"\nconst wellKnownChains = new Set([\n \"polkadot\",\n \"ksmcc3\",\n \"rococo_v2_2\",\n \"westend2\",\n])\n\nconst smoldot = start()\n\nconst getProvider = (chainSpec) => {\n const { relay_chain } = JSON.parse(chainSpec)\n\n if (!relay_chain)\n return getSmProvider(\n smoldot.addChain({\n chainSpec,\n }),\n )\n\n if (!wellKnownChains.has(relay_chain))\n throw new Error(\"Relay chain \" + relay_chain + \" is not well-known\")\n\n const relayP = smoldot.addChain({\n chainSpec: require(WELL_KNOWN_CHAINS_LIB + relay_chain).chainSpec,\n disableJsonRpc: true,\n })\n\n return getSmProvider(\n relayP.then((relay) =>\n smoldot.addChain({\n potentialRelayChains: [relay],\n chainSpec,\n }),\n ),\n )\n}\n\nconst provider = getProvider(\n wellKnownChains.has(workerData)\n ? require(WELL_KNOWN_CHAINS_LIB + workerData).chainSpec\n : workerData,\n)((msg) => parentPort.postMessage(msg))\n\nparentPort.on(\"message\", (msg) => {\n switch (msg.type) {\n case \"send\":\n provider.send(msg.value)\n break\n case \"disconnect\":\n provider.disconnect()\n }\n})\n`\n","import fsExists from \"fs.promises.exists\"\nimport { readPackage } from \"read-pkg\"\nimport { updatePackage, writePackage } from \"write-pkg\"\nimport { readFile, writeFile } from \"node:fs/promises\"\nimport { WellKnownChain } from \"./well-known-chains\"\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: WellKnownChain\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.\n * If configFile is not specified, it writes to the default path, by this priority order:\n * 1. default config file (polkadot-api.json)\n * 2. package.json\n * If no pre-existing config exists, then it creates a 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 ora from \"ora\"\nimport { CommonOptions } from \"./commonOptions\"\nimport { WellKnownChain } from \"../well-known-chains\"\n\nexport interface AddOptions extends CommonOptions {\n file?: string\n wsUrl?: string\n chainSpec?: string\n name?: WellKnownChain\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 {\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 as WellKnownChain,\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 { V14, V15 } 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\"\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 { descriptorsFileContent, checksums, typesFileContent, publicTypes } =\n generateMultipleDescriptors(\n chains,\n {\n client: clientPath,\n checksums: \"./checksums.json\",\n types: \"./common-types\",\n },\n {\n whitelist: whitelist ?? undefined,\n },\n )\n\n await fs.mkdir(outputFolder, { recursive: true })\n await fs.writeFile(\n path.join(outputFolder, \"checksums.json\"),\n JSON.stringify(checksums),\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 descriptorsFileContent[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 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\"\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 for (let key of keys) {\n if (!(key in entries)) {\n throw new Error(`Key ${key} not set in polkadot-api config`)\n }\n\n const spinner = ora(`Updating ${key}`).start()\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 spinner.stop()\n continue\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 spinner.stop()\n continue\n }\n\n spinner.text = `Writing ${key} metadata`\n await writeMetadataToDisk(metadata.metadataRaw, filename)\n\n spinner.succeed(`${key} metadata updated`)\n }\n}\n"],"mappings":"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","names":["WellKnownChain","add","generate","remove","update","readFile","writeFile","fs","fsExists","path","ora","metadata"]}
package/dist/index.d.ts CHANGED
@@ -23,6 +23,7 @@ declare function add(key: string, options: AddOptions): Promise<void>;
23
23
  interface GenerateOptions extends CommonOptions {
24
24
  key?: string;
25
25
  clientLibrary?: string;
26
+ whitelist?: string;
26
27
  }
27
28
  declare function generate(opts: GenerateOptions): Promise<void>;
28
29
 
package/dist/index.js CHANGED
@@ -4,7 +4,7 @@ import {
4
4
  getCli,
5
5
  remove,
6
6
  update
7
- } from "./chunk-ILWYWJEB.js";
7
+ } from "./chunk-THFZ6HTG.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-ILWYWJEB.js";
8
+ } from "./chunk-THFZ6HTG.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.2.2",
3
+ "version": "0.3.0",
4
4
  "author": "Ryan Lee (https://github.com/ryanleecode)",
5
5
  "license": "MIT",
6
6
  "sideEffects": true,
@@ -42,17 +42,17 @@
42
42
  "typescript": "^5.3.2",
43
43
  "write-pkg": "^6.0.0",
44
44
  "ws": "^8.14.2",
45
- "@polkadot-api/codegen": "0.0.2",
45
+ "@polkadot-api/codegen": "0.2.0",
46
46
  "@polkadot-api/json-rpc-provider-proxy": "0.0.1",
47
47
  "@polkadot-api/json-rpc-provider": "0.0.1",
48
- "@polkadot-api/metadata-builders": "0.0.1",
49
- "@polkadot-api/observable-client": "0.1.0",
48
+ "@polkadot-api/metadata-builders": "0.2.0",
49
+ "@polkadot-api/observable-client": "0.2.0",
50
50
  "@polkadot-api/sm-provider": "0.0.1",
51
- "@polkadot-api/substrate-client": "0.0.1",
52
- "@polkadot-api/substrate-bindings": "0.0.1",
51
+ "@polkadot-api/substrate-bindings": "0.2.0",
52
+ "@polkadot-api/substrate-client": "0.0.2",
53
53
  "@polkadot-api/ws-provider": "0.0.1",
54
54
  "@polkadot-api/utils": "0.0.1",
55
- "@polkadot-api/known-chains": "0.1.0"
55
+ "@polkadot-api/known-chains": "0.1.2"
56
56
  },
57
57
  "devDependencies": {
58
58
  "@types/ws": "^8.5.10",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/well-known-chains.ts","../src/metadata.ts","../src/smolldot-worker.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 { WellKnownChain } from \"./well-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 .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(WellKnownChain) as WellKnownChain[],\n ),\n )\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\")\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","export enum WellKnownChain {\n polkadot = \"polkadot\",\n ksmcc3 = \"ksmcc3\",\n rococo_v2_2 = \"rococo_v2_2\",\n westend2 = \"westend2\",\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 { V15, v15 } from \"@polkadot-api/substrate-bindings\"\nimport { WebSocketProvider } from \"@polkadot-api/ws-provider/node\"\nimport { PROVIDER_WORKER_CODE } from \"./smolldot-worker\"\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 { WellKnownChain } from \"./well-known-chains\"\n\nconst getMetadataCall = async (provider: JsonRpcProvider) => {\n const client = getObservableClient(createClient(provider))\n const { metadata$, unfollow } = client.chainHead$()\n const metadata = await firstValueFrom(metadata$.pipe(filter(Boolean)))\n\n unfollow()\n client.destroy()\n\n return metadata\n}\n\nconst getMetadataFromProvider = async (chain: WellKnownChain | string) => {\n const provider: JsonRpcProvider = (onMsg) => {\n let worker: Worker | null = new Worker(PROVIDER_WORKER_CODE, {\n eval: true,\n workerData: chain,\n stderr: true,\n stdout: true,\n })\n worker.on(\"message\", onMsg)\n\n return {\n send: (msg) => worker?.postMessage({ type: \"send\", value: msg }),\n disconnect: () => {\n if (!worker) return\n\n worker.postMessage({ type: \"disconnect\" })\n worker.removeAllListeners()\n worker.terminate()\n worker = null\n },\n }\n }\n\n return getMetadataCall(provider)\n}\n\nconst getMetadataFromWsURL = async (wsURL: string) =>\n getMetadataCall(WebSocketProvider(wsURL))\n\nexport async function getMetadata(entry: EntryConfig): Promise<V15 | 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 return v15.dec(data)\n }\n\n if (\"chain\" in entry) {\n return getMetadataFromProvider(entry.chain)\n }\n\n if (\"chainSpec\" in entry) {\n const chainSpec = await fs.readFile(entry.chainSpec, \"utf8\")\n return getMetadataFromProvider(chainSpec)\n }\n\n if (\"wsUrl\" in entry) {\n return getMetadataFromWsURL(entry.wsUrl)\n }\n\n return null\n}\n\nexport async function writeMetadataToDisk(metadata: V15, outFile: string) {\n const encoded = v15.enc(metadata)\n\n await fs.mkdir(dirname(outFile), { recursive: true })\n await fs.writeFile(outFile, encoded)\n}\n","export const PROVIDER_WORKER_CODE = `\nconst { start } = require(\"smoldot\")\nconst { parentPort, workerData } = require(\"node:worker_threads\")\nconst { getSmProvider } = require(\"@polkadot-api/sm-provider\")\n\nif (!parentPort) throw new Error(\"no parent port\")\n\nconst WELL_KNOWN_CHAINS_LIB = \"@polkadot-api/known-chains/\"\nconst wellKnownChains = new Set([\n \"polkadot\",\n \"ksmcc3\",\n \"rococo_v2_2\",\n \"westend2\",\n])\n\nconst smoldot = start()\n\nconst getProvider = (chainSpec) => {\n const { relay_chain } = JSON.parse(chainSpec)\n\n if (!relay_chain)\n return getSmProvider(\n smoldot.addChain({\n chainSpec,\n }),\n )\n\n if (!wellKnownChains.has(relay_chain))\n throw new Error(\"Relay chain \" + relay_chain + \" is not well-known\")\n\n const relayP = smoldot.addChain({\n chainSpec: require(WELL_KNOWN_CHAINS_LIB + relay_chain).chainSpec,\n disableJsonRpc: true,\n })\n\n return getSmProvider(\n relayP.then((relay) =>\n smoldot.addChain({\n potentialRelayChains: [relay],\n chainSpec,\n }),\n ),\n )\n}\n\nconst provider = getProvider(\n wellKnownChains.has(workerData)\n ? require(WELL_KNOWN_CHAINS_LIB + workerData).chainSpec\n : workerData,\n)((msg) => parentPort.postMessage(msg))\n\nparentPort.on(\"message\", (msg) => {\n switch (msg.type) {\n case \"send\":\n provider.send(msg.value)\n break\n case \"disconnect\":\n provider.disconnect()\n }\n})\n`\n","import fsExists from \"fs.promises.exists\"\nimport { readPackage } from \"read-pkg\"\nimport { updatePackage, writePackage } from \"write-pkg\"\nimport { readFile, writeFile } from \"node:fs/promises\"\nimport { WellKnownChain } from \"./well-known-chains\"\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: WellKnownChain\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.\n * If configFile is not specified, it writes to the default path, by this priority order:\n * 1. default config file (polkadot-api.json)\n * 2. package.json\n * If no pre-existing config exists, then it creates a 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 ora from \"ora\"\nimport { CommonOptions } from \"./commonOptions\"\nimport { WellKnownChain } from \"../well-known-chains\"\n\nexport interface AddOptions extends CommonOptions {\n file?: string\n wsUrl?: string\n chainSpec?: string\n name?: WellKnownChain\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 {\n const entry = entryFromOptions(options)\n entries[key] = entry\n\n if (!options.noPersist) {\n const spinner = ora(`Loading metadata`).start()\n const metadata = await getMetadata(entry)\n\n spinner.text = \"Writing metadata\"\n const filename = `${key}.scale`\n await writeMetadataToDisk(metadata!, 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 as WellKnownChain,\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 { V15 } from \"@polkadot-api/substrate-bindings\"\nimport fs from \"fs/promises\"\nimport path, { join } from \"path\"\nimport process from \"process\"\nimport tsc from \"tsc-prog\"\nimport tsup from \"tsup\"\nimport { CommonOptions } from \"./commonOptions\"\nimport fsExists from \"fs.promises.exists\"\nimport { existsSync } from \"fs\"\n\nexport interface GenerateOptions extends CommonOptions {\n key?: string\n clientLibrary?: 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))!,\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 await outputCodegen(chains, join(descriptorsDir, \"src\"), clientPath)\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: V15\n knownTypes: Record<string, string>\n }>,\n outputFolder: string,\n clientPath: string,\n) {\n const { descriptorsFileContent, checksums, typesFileContent, publicTypes } =\n generateMultipleDescriptors(chains, {\n client: clientPath,\n checksums: \"./checksums.json\",\n types: \"./common-types\",\n })\n\n await fs.mkdir(outputFolder, { recursive: true })\n await fs.writeFile(\n path.join(outputFolder, \"checksums.json\"),\n JSON.stringify(checksums),\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 descriptorsFileContent[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 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","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\"\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 for (let key of keys) {\n if (!(key in entries)) {\n throw new Error(`Key ${key} not set in polkadot-api config`)\n }\n\n const spinner = ora(`Updating ${key}`).start()\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 spinner.stop()\n continue\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 spinner.stop()\n continue\n }\n\n spinner.text = `Writing ${key} metadata`\n await writeMetadataToDisk(metadata, filename)\n\n spinner.succeed(`${key} metadata updated`)\n }\n}\n"],"mappings":"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","names":["WellKnownChain","add","generate","remove","update","readFile","writeFile","fs","fsExists","path","ora"]}