@polkadot-api/cli 0.0.1 → 0.1.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/package.json CHANGED
@@ -1,17 +1,27 @@
1
1
  {
2
2
  "name": "@polkadot-api/cli",
3
- "version": "0.0.1",
3
+ "version": "0.1.0",
4
4
  "author": "Ryan Lee (https://github.com/ryanleecode)",
5
5
  "license": "MIT",
6
6
  "sideEffects": true,
7
7
  "type": "module",
8
8
  "bin": {
9
- "papi": "./bin/main.js",
10
- "polkadot-api": "./bin/main.js"
9
+ "papi": "./dist/main.js",
10
+ "polkadot-api": "./dist/main.js"
11
11
  },
12
12
  "files": [
13
- "/bin"
13
+ "/dist"
14
14
  ],
15
+ "exports": {
16
+ ".": {
17
+ "node": {
18
+ "import": "./dist/index.js"
19
+ },
20
+ "types": "./dist/index.d.ts",
21
+ "module": "./dist/index.js",
22
+ "import": "./dist/index.js"
23
+ }
24
+ },
15
25
  "prettier": {
16
26
  "printWidth": 80,
17
27
  "semi": false,
@@ -19,9 +29,9 @@
19
29
  },
20
30
  "dependencies": {
21
31
  "@commander-js/extra-typings": "^12.0.1",
22
- "@substrate/connect": "^0.7.32",
32
+ "@substrate/connect": "^0.8.8",
23
33
  "@types/node": "^20.9.0",
24
- "commander": "^11.0.0",
34
+ "commander": "^12.0.0",
25
35
  "fs.promises.exists": "^1.1.4",
26
36
  "ora": "^7.0.1",
27
37
  "read-pkg": "^8.1.0",
@@ -32,15 +42,15 @@
32
42
  "typescript": "^5.3.2",
33
43
  "write-pkg": "^6.0.0",
34
44
  "ws": "^8.14.2",
35
- "@polkadot-api/client": "0.0.1",
36
45
  "@polkadot-api/codegen": "0.0.1",
37
46
  "@polkadot-api/json-rpc-provider-proxy": "0.0.1",
38
- "@polkadot-api/json-rpc-provider": "0.0.1",
39
- "@polkadot-api/sc-provider": "0.0.0",
40
- "@polkadot-api/substrate-client": "0.0.1",
47
+ "@polkadot-api/observable-client": "0.1.0",
41
48
  "@polkadot-api/metadata-builders": "0.0.1",
49
+ "@polkadot-api/sc-provider": "0.0.1",
50
+ "@polkadot-api/json-rpc-provider": "0.0.1",
42
51
  "@polkadot-api/substrate-bindings": "0.0.1",
43
- "@polkadot-api/ws-provider": "0.0.0",
52
+ "@polkadot-api/substrate-client": "0.0.1",
53
+ "@polkadot-api/ws-provider": "0.0.1",
44
54
  "@polkadot-api/utils": "0.0.1"
45
55
  },
46
56
  "devDependencies": {
@@ -49,8 +59,8 @@
49
59
  "@polkadot-api/json-rpc-provider": "0.0.1"
50
60
  },
51
61
  "scripts": {
52
- "build": "tsc --noEmit && tsup-node src/main.ts --clean --out-dir bin --sourcemap --platform node --format esm",
53
- "start": "pnpm build && node --enable-source-maps bin/main.js",
62
+ "build": "tsc --noEmit && tsup-node src/main.ts src/index.ts --clean --out-dir dist --dts --sourcemap --platform node --format esm",
63
+ "start": "pnpm build && node --enable-source-maps dist/main.js",
54
64
  "test": "echo 'no tests'",
55
65
  "lint": "prettier --check README.md \"src/**/*.{js,jsx,ts,tsx,json,md}\"",
56
66
  "format": "prettier --write README.md \"src/**/*.{js,jsx,ts,tsx,json,md}\""
package/bin/main.js DELETED
@@ -1,418 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- // src/main.ts
4
- import { Option, program } from "@commander-js/extra-typings";
5
- import { WellKnownChain } from "@substrate/connect";
6
-
7
- // src/metadata.ts
8
- import { createClient } from "@polkadot-api/substrate-client";
9
- import * as fs from "node:fs/promises";
10
- import { v15 } from "@polkadot-api/substrate-bindings";
11
- import { WebSocketProvider } from "@polkadot-api/ws-provider/node";
12
-
13
- // src/smolldot-worker.ts
14
- var PROVIDER_WORKER_CODE = `
15
- const { parentPort, workerData } = require("node:worker_threads")
16
- const { getScProvider } = require("@polkadot-api/sc-provider")
17
- const { WellKnownChain, createScClient } = require("@substrate/connect")
18
- const wellKnownChains = new Set(Object.values(WellKnownChain))
19
- const isWellKnownChain = (input) => wellKnownChains.has(input)
20
-
21
- if (!parentPort) {
22
- throw new Error("no parent port")
23
- }
24
-
25
- const chain = workerData
26
- const scProvider = getScProvider(createScClient())
27
- const getProvider = isWellKnownChain(chain)
28
- ? scProvider(chain).relayChain
29
- : (() => {
30
- const parsedSpec = JSON.parse(chain)
31
- if (parsedSpec.relay_chain) {
32
- if (!isWellKnownChain(parsedSpec.relay_chain)) {
33
- throw new Error(
34
- "Relay chain " + parsedSpec.relay_chain + " is not well-known",
35
- )
36
- }
37
- const provider = scProvider(parsedSpec.relay_chain)
38
- return provider.addParachain(chain)
39
- } else {
40
- return scProvider(chain).relayChain
41
- }
42
- })()
43
-
44
- const provider = getProvider((msg) => parentPort.postMessage(msg))
45
- parentPort.on("message", (msg) => {
46
- switch (msg.type) {
47
- case "send":
48
- provider.send(msg.value)
49
- break
50
- case "disconnect":
51
- provider.disconnect()
52
- }
53
- })
54
- `;
55
-
56
- // src/metadata.ts
57
- import { Worker } from "node:worker_threads";
58
- import { getObservableClient } from "@polkadot-api/client";
59
- import { filter, firstValueFrom } from "rxjs";
60
- import { dirname } from "path";
61
- var getMetadataCall = async (provider) => {
62
- const client = getObservableClient(createClient(provider));
63
- const { metadata$, unfollow } = client.chainHead$();
64
- const metadata = await firstValueFrom(metadata$.pipe(filter(Boolean)));
65
- unfollow();
66
- client.destroy();
67
- return metadata;
68
- };
69
- var getMetadataFromProvider = async (chain) => {
70
- const provider = (onMsg) => {
71
- let worker = new Worker(PROVIDER_WORKER_CODE, {
72
- eval: true,
73
- workerData: chain,
74
- stderr: true,
75
- stdout: true
76
- });
77
- worker.on("message", onMsg);
78
- return {
79
- send: (msg) => worker?.postMessage({ type: "send", value: msg }),
80
- disconnect: () => {
81
- if (!worker)
82
- return;
83
- worker.postMessage({ type: "disconnect" });
84
- worker.removeAllListeners();
85
- worker.terminate();
86
- worker = null;
87
- }
88
- };
89
- };
90
- return getMetadataCall(provider);
91
- };
92
- var getMetadataFromWsURL = async (wsURL) => getMetadataCall(WebSocketProvider(wsURL));
93
- async function getMetadata(entry) {
94
- if (entry.metadata) {
95
- const data = await fs.readFile(entry.metadata);
96
- return v15.dec(data);
97
- }
98
- if ("chain" in entry) {
99
- return getMetadataFromProvider(entry.chain);
100
- }
101
- if ("chainSpec" in entry) {
102
- const chainSpec = await fs.readFile(entry.chainSpec, "utf8");
103
- return getMetadataFromProvider(chainSpec);
104
- }
105
- if ("wsUrl" in entry) {
106
- return getMetadataFromWsURL(entry.wsUrl);
107
- }
108
- return null;
109
- }
110
- async function writeMetadataToDisk(metadata, outFile) {
111
- const encoded = v15.enc(metadata);
112
- await fs.mkdir(dirname(outFile), { recursive: true });
113
- await fs.writeFile(outFile, encoded);
114
- }
115
-
116
- // src/papiConfig.ts
117
- import fsExists from "fs.promises.exists";
118
- import { readPackage } from "read-pkg";
119
- import { updatePackage } from "write-pkg";
120
- import { readFile as readFile2, writeFile as writeFile2 } from "node:fs/promises";
121
- var papiCfgDefaultFile = "polkadot-api.json";
122
- var packageJsonKey = "polkadot-api";
123
- async function readPapiConfig(configFile) {
124
- if (configFile)
125
- return readFromFile(configFile);
126
- const configFromDefaultFile = await readFromFile(papiCfgDefaultFile);
127
- if (configFromDefaultFile)
128
- return configFromDefaultFile;
129
- return readFromFile("package.json");
130
- }
131
- async function writePapiConfig(configFile, config2) {
132
- if (configFile)
133
- return writeToFile(configFile, config2);
134
- const defaultCfgExists = await fsExists(papiCfgDefaultFile);
135
- if (defaultCfgExists)
136
- return writeToFile(papiCfgDefaultFile, config2);
137
- const packageCfg = await readFromFile("package.json");
138
- if (packageCfg) {
139
- return writeToFile("package.json", config2);
140
- }
141
- return writeToFile(papiCfgDefaultFile, config2);
142
- }
143
- async function readFromFile(file) {
144
- const fileExists = await fsExists(file);
145
- if (!fileExists)
146
- return null;
147
- if (file === "package.json") {
148
- const packageJson = await readPackage();
149
- return packageJson[packageJsonKey] ?? null;
150
- }
151
- return JSON.parse(await readFile2(file, "utf8"));
152
- }
153
- async function writeToFile(file, config2) {
154
- if (file === "package.json") {
155
- await updatePackage({
156
- [packageJsonKey]: null
157
- });
158
- return updatePackage({
159
- [packageJsonKey]: config2
160
- });
161
- }
162
- return writeFile2(file, JSON.stringify(config2, null, 2));
163
- }
164
-
165
- // src/commands/add.ts
166
- import ora from "ora";
167
- async function add(key, options) {
168
- const entries = await readPapiConfig(options.config) ?? {};
169
- if (key in entries) {
170
- console.warn(`Replacing existing ${key} config`);
171
- }
172
- if (options.file) {
173
- entries[key] = {
174
- metadata: options.file
175
- };
176
- } else {
177
- const entry = entryFromOptions(options);
178
- entries[key] = entry;
179
- if (!options.noPersist) {
180
- const spinner = ora(`Loading metadata`).start();
181
- const metadata = await getMetadata(entry);
182
- spinner.text = "Writing metadata";
183
- const filename = `${key}.scale`;
184
- await writeMetadataToDisk(metadata, filename);
185
- spinner.succeed(`Metadata saved as ${filename}`);
186
- entry.metadata = filename;
187
- }
188
- }
189
- await writePapiConfig(options.config, entries);
190
- return console.log(`Saved new spec "${key}"`);
191
- }
192
- var entryFromOptions = (options) => {
193
- if (options.wsUrl) {
194
- return {
195
- wsUrl: options.wsUrl
196
- };
197
- }
198
- if (options.chainSpec) {
199
- return {
200
- chainSpec: options.chainSpec
201
- };
202
- }
203
- if (options.name) {
204
- return {
205
- chain: options.name
206
- };
207
- }
208
- throw new Error(
209
- "add command needs one source, specified by options -f -w -c or -n"
210
- );
211
- };
212
-
213
- // src/commands/generate.ts
214
- import { generateMultipleDescriptors } from "@polkadot-api/codegen";
215
- import fs2 from "fs/promises";
216
- import path, { join } from "path";
217
- import process from "process";
218
- import tsc from "tsc-prog";
219
- import tsup from "tsup";
220
- async function generate(opts) {
221
- const sources = await getSources(opts);
222
- if (Object.keys(sources).length == 0) {
223
- console.log("No chains defined in config file");
224
- }
225
- console.log(`Reading metadata`);
226
- const chains = await Promise.all(
227
- Object.entries(sources).map(async ([key, source]) => ({
228
- key,
229
- metadata: await getMetadata(source),
230
- knownTypes: {}
231
- }))
232
- );
233
- const descriptorsDir = join(
234
- process.cwd(),
235
- "node_modules",
236
- "@polkadot-api",
237
- "descriptors"
238
- );
239
- await fs2.mkdir(descriptorsDir, { recursive: true });
240
- await generatePackageJson(join(descriptorsDir, "package.json"));
241
- await outputCodegen(chains, join(descriptorsDir, "src"));
242
- await compileCodegen(descriptorsDir);
243
- await fs2.rm(join(descriptorsDir, "src"), { recursive: true });
244
- }
245
- async function getSources(opts) {
246
- const config2 = await readPapiConfig(opts.config);
247
- if (!config2) {
248
- throw new Error("Can't find the Polkadot-API configuration");
249
- }
250
- if (opts.key) {
251
- if (!config2[opts.key]) {
252
- throw new Error(`Key ${opts.key} not set in polkadot-api config`);
253
- }
254
- return {
255
- [opts.key]: config2[opts.key]
256
- };
257
- }
258
- return config2;
259
- }
260
- async function outputCodegen(chains, outputFolder) {
261
- console.log(`Generating code`);
262
- const { descriptorsFileContent, checksums, typesFileContent, publicTypes } = generateMultipleDescriptors(chains, {
263
- client: "@polkadot-api/client",
264
- checksums: "./checksums.json",
265
- types: "./common-types"
266
- });
267
- console.log("Writing code");
268
- await fs2.mkdir(outputFolder);
269
- await fs2.writeFile(
270
- path.join(outputFolder, "checksums.json"),
271
- JSON.stringify(checksums)
272
- );
273
- await fs2.writeFile(
274
- path.join(outputFolder, "common-types.ts"),
275
- typesFileContent
276
- );
277
- await Promise.all(
278
- chains.map(
279
- (chain, i) => fs2.writeFile(
280
- join(outputFolder, `${chain.key}.ts`),
281
- descriptorsFileContent[i]
282
- )
283
- )
284
- );
285
- await generateIndex(
286
- outputFolder,
287
- chains.map((chain) => chain.key),
288
- publicTypes
289
- );
290
- }
291
- async function compileCodegen(packageDir) {
292
- const srcDir = join(packageDir, "src");
293
- const outDir = join(packageDir, "dist");
294
- await tsup.build({
295
- format: ["cjs", "esm"],
296
- entry: [path.join(srcDir, "index.ts")],
297
- outDir,
298
- outExtension: (ctx) => ({
299
- js: ctx.format === "esm" ? ".mjs" : ".js"
300
- })
301
- });
302
- tsc.build({
303
- basePath: srcDir,
304
- compilerOptions: {
305
- skipLibCheck: true,
306
- declaration: true,
307
- emitDeclarationOnly: true,
308
- target: "esnext",
309
- module: "esnext",
310
- moduleResolution: "node",
311
- resolveJsonModule: true,
312
- allowSyntheticDefaultImports: true,
313
- outDir
314
- }
315
- });
316
- }
317
- var generateIndex = async (path2, keys, publicTypes) => {
318
- const indexTs = [
319
- ...keys.flatMap((key) => [
320
- `export { default as ${key} } from "./${key}";`,
321
- `export type * from "./${key}";`
322
- ]),
323
- `export {`,
324
- publicTypes.join(", "),
325
- `} from './common-types';`
326
- ].join("\n");
327
- await fs2.writeFile(join(path2, "index.ts"), indexTs);
328
- };
329
- var generatePackageJson = async (path2) => {
330
- await fs2.writeFile(
331
- path2,
332
- `{
333
- "name": "@polkadot-api/descriptors",
334
- "exports": {
335
- ".": {
336
- "module": "./dist/index.mjs",
337
- "import": "./dist/index.mjs",
338
- "require": "./dist/index.js",
339
- "default": "./dist/index.js"
340
- },
341
- "./package.json": "./package.json"
342
- },
343
- "main": "./dist/index.js",
344
- "module": "./dist/index.mjs",
345
- "browser": "./dist/index.mjs",
346
- "types": "./dist/index.d.ts",
347
- "sideEffects": false,
348
- "peerDependencies": {
349
- "@polkadot-api/client": "*"
350
- }
351
- }`
352
- );
353
- };
354
-
355
- // src/commands/remove.ts
356
- async function remove(key, options) {
357
- const entries = await readPapiConfig(options.config) ?? {};
358
- if (!(key in entries)) {
359
- throw new Error(`Key ${key} not set in polkadot-api config`);
360
- }
361
- const entry = entries[key];
362
- delete entries[key];
363
- await writePapiConfig(options.config, entries);
364
- console.log(`Removed chain "${key}" from config`);
365
- }
366
-
367
- // src/commands/update.ts
368
- import ora2 from "ora";
369
- async function update(keysInput, options) {
370
- const entries = await readPapiConfig(options.config) ?? {};
371
- const keys = keysInput === void 0 ? Object.keys(entries) : keysInput.split(",");
372
- for (let key of keys) {
373
- if (!(key in entries)) {
374
- throw new Error(`Key ${key} not set in polkadot-api config`);
375
- }
376
- const spinner = ora2(`Updating ${key}`).start();
377
- const { metadata: filename, ...entry } = entries[key];
378
- if (!filename) {
379
- if (keysInput !== void 0) {
380
- console.warn(`Key ${key} doesn't have a metadata file to update`);
381
- }
382
- spinner.stop();
383
- continue;
384
- }
385
- const metadata = await getMetadata(entry);
386
- if (!metadata) {
387
- if (keysInput !== void 0) {
388
- console.warn(
389
- `Key ${key} doesn't have any external source to update from`
390
- );
391
- }
392
- spinner.stop();
393
- continue;
394
- }
395
- spinner.text = `Writing ${key} metadata`;
396
- await writeMetadataToDisk(metadata, filename);
397
- spinner.succeed(`${key} metadata updated`);
398
- }
399
- }
400
-
401
- // src/main.ts
402
- program.name("polkadot-api").description("Polkadot API CLI");
403
- var config = new Option("--config <filename>", "Source for the config file");
404
- program.command("generate", {
405
- isDefault: true
406
- }).description("Generate descriptor files").addOption(config).option("-k, --key <key>", "Key of the descriptor to generate").action(generate);
407
- 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(
408
- new Option("-n, --name <name>", "Source from a well-known chain").choices(
409
- Object.keys(WellKnownChain)
410
- )
411
- ).option("--no-persist", "Do not persist the metadata as a file").action(add);
412
- program.command("update").description("Update the metadata files").argument(
413
- "[keys]",
414
- "Keys of the metadata files to update, separated by commas. Leave empty for all"
415
- ).addOption(config).action(update);
416
- program.command("remove").description("Remove a chain spec from the list").argument("<key>", "Key identifier for the chain spec").addOption(config).action(remove);
417
- program.parse();
418
- //# sourceMappingURL=main.js.map
package/bin/main.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/main.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":["#!/usr/bin/env node\n\nimport { Option, program } from \"@commander-js/extra-typings\"\nimport { WellKnownChain } from \"@substrate/connect\"\nimport { add, generate, remove, update } from \"./commands\"\n\nprogram.name(\"polkadot-api\").description(\"Polkadot API CLI\")\n\nconst config = new Option(\"--config <filename>\", \"Source for the config file\")\n\nprogram\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\nprogram\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\nprogram\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\nprogram\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\nprogram.parse()\n","import { WellKnownChain } from \"@substrate/connect\"\nimport { 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/client\"\nimport { filter, firstValueFrom } from \"rxjs\"\nimport { EntryConfig } from \"./papiConfig\"\nimport { dirname } from \"path\"\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 { parentPort, workerData } = require(\"node:worker_threads\")\nconst { getScProvider } = require(\"@polkadot-api/sc-provider\")\nconst { WellKnownChain, createScClient } = require(\"@substrate/connect\")\nconst wellKnownChains = new Set(Object.values(WellKnownChain))\nconst isWellKnownChain = (input) => wellKnownChains.has(input)\n\nif (!parentPort) {\n throw new Error(\"no parent port\")\n}\n\nconst chain = workerData\nconst scProvider = getScProvider(createScClient())\nconst getProvider = isWellKnownChain(chain)\n ? scProvider(chain).relayChain\n : (() => {\n const parsedSpec = JSON.parse(chain)\n if (parsedSpec.relay_chain) {\n if (!isWellKnownChain(parsedSpec.relay_chain)) {\n throw new Error(\n \"Relay chain \" + parsedSpec.relay_chain + \" is not well-known\",\n )\n }\n const provider = scProvider(parsedSpec.relay_chain)\n return provider.addParachain(chain)\n } else {\n return scProvider(chain).relayChain\n }\n })()\n\nconst provider = getProvider((msg) => parentPort.postMessage(msg))\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 { WellKnownChain } from \"@substrate/connect\"\nimport fsExists from \"fs.promises.exists\"\nimport { readPackage } from \"read-pkg\"\nimport { updatePackage, writePackage } from \"write-pkg\"\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: 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 { WellKnownChain } from \"@substrate/connect\"\nimport ora from \"ora\"\nimport { CommonOptions } from \"./commonOptions\"\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\"\n\nexport interface GenerateOptions extends CommonOptions {\n key?: 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 await fs.mkdir(descriptorsDir, { recursive: true })\n await generatePackageJson(join(descriptorsDir, \"package.json\"))\n await outputCodegen(chains, join(descriptorsDir, \"src\"))\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) {\n console.log(`Generating code`)\n\n const { descriptorsFileContent, checksums, typesFileContent, publicTypes } =\n generateMultipleDescriptors(chains, {\n client: \"@polkadot-api/client\",\n checksums: \"./checksums.json\",\n types: \"./common-types\",\n })\n\n console.log(\"Writing code\")\n await fs.mkdir(outputFolder)\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 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/client\": \"*\"\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":["readFile","writeFile","config","fs","config","path","ora"]}