@polkadot-api/compare-runtimes 0.0.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.
- package/LICENSE +21 -0
- package/README.md +94 -0
- package/dist/esm/compare-runtimes.mjs +136 -0
- package/dist/esm/compare-runtimes.mjs.map +1 -0
- package/dist/esm/index.mjs +3 -0
- package/dist/esm/index.mjs.map +1 -0
- package/dist/esm/mapped-metadata.mjs +57 -0
- package/dist/esm/mapped-metadata.mjs.map +1 -0
- package/dist/esm/shallow-diff.mjs +40 -0
- package/dist/esm/shallow-diff.mjs.map +1 -0
- package/dist/index.d.ts +44 -0
- package/dist/index.js +232 -0
- package/dist/index.js.map +1 -0
- package/package.json +50 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2023 Josep M Sobrepere
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
# 🧬 @polkadot-api/compare-runtimes
|
|
2
|
+
|
|
3
|
+
A lightweight yet powerful TypeScript library to **compare runtime metadata between upgrades** of PolkadotSDK-based blockchains. Easily detect **breaking changes, additions, and compatibility levels** across all runtime components.
|
|
4
|
+
|
|
5
|
+
## ✨ Features
|
|
6
|
+
|
|
7
|
+
- Detect added, removed, or changed runtime elements:
|
|
8
|
+
|
|
9
|
+
- Constants, Storage items, Calls, Events, Errors, View Functions, APIs
|
|
10
|
+
|
|
11
|
+
- Classify compatibility as:
|
|
12
|
+
|
|
13
|
+
- [`Identical`, `BackwardsCompatible`, `Partial`, or `Incompatible`](https://papi.how/typed#getcompatibilitylevel)
|
|
14
|
+
|
|
15
|
+
- Simple, typed API for easy integration into CLI tools, CI pipelines, or dashboards
|
|
16
|
+
|
|
17
|
+
## 🧩 API Reference
|
|
18
|
+
|
|
19
|
+
### `compareRuntimes(prevMetadata: Uint8Array, nextMetadata: Uint8Array): Output`
|
|
20
|
+
|
|
21
|
+
Compares two versions of runtime metadata and returns a detailed diff.
|
|
22
|
+
|
|
23
|
+
#### Output Structure
|
|
24
|
+
|
|
25
|
+
```ts
|
|
26
|
+
type Output = {
|
|
27
|
+
added: Change[]
|
|
28
|
+
removed: Change[]
|
|
29
|
+
kept: ComparedChange[]
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### `Change`
|
|
34
|
+
|
|
35
|
+
Represents a new or removed runtime item.
|
|
36
|
+
|
|
37
|
+
```ts
|
|
38
|
+
type Change =
|
|
39
|
+
| {
|
|
40
|
+
kind: "const" | "storage" | "call" | "event" | "error" | "view"
|
|
41
|
+
pallet: string
|
|
42
|
+
name: string
|
|
43
|
+
}
|
|
44
|
+
| { kind: "api"; group: string; name: string }
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### `ComparedChange`
|
|
48
|
+
|
|
49
|
+
Represents a kept runtime item with compatibility information.
|
|
50
|
+
|
|
51
|
+
```ts
|
|
52
|
+
type ComparedChange =
|
|
53
|
+
| {
|
|
54
|
+
kind: "call" | "event" | "error" | "const"
|
|
55
|
+
pallet: string
|
|
56
|
+
name: string
|
|
57
|
+
compat: CompatibilityLevel
|
|
58
|
+
}
|
|
59
|
+
| {
|
|
60
|
+
kind: "storage" | "view"
|
|
61
|
+
pallet: string
|
|
62
|
+
name: string
|
|
63
|
+
compat: { args: CompatibilityLevel; values: CompatibilityLevel }
|
|
64
|
+
}
|
|
65
|
+
| {
|
|
66
|
+
kind: "api"
|
|
67
|
+
group: string
|
|
68
|
+
name: string
|
|
69
|
+
compat: { args: CompatibilityLevel; values: CompatibilityLevel }
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### `CompatibilityLevel`
|
|
74
|
+
|
|
75
|
+
Indicates how compatible a change is:
|
|
76
|
+
|
|
77
|
+
```ts
|
|
78
|
+
enum CompatibilityLevel {
|
|
79
|
+
Incompatible = 0,
|
|
80
|
+
Partial = 1,
|
|
81
|
+
BackwardsCompatible = 2,
|
|
82
|
+
Identical = 3,
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## 📦 Example Use Case
|
|
87
|
+
|
|
88
|
+
- Automatically detect **breaking changes** before pushing an upgrade
|
|
89
|
+
- Generate upgrade reports for **audit or governance proposals**
|
|
90
|
+
- Integrate into **CI/CD** to fail builds with breaking changes
|
|
91
|
+
|
|
92
|
+
## 📄 License
|
|
93
|
+
|
|
94
|
+
MIT
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { mapLookupToTypedef, entryPointsAreCompatible, runtimeCallEntryPoint, storageEntryPoint, singleValueEntryPoint, enumValueEntryPointNode, voidEntryPointNode } from '@polkadot-api/metadata-compatibility';
|
|
2
|
+
import { getMappedMetadata } from './mapped-metadata.mjs';
|
|
3
|
+
import { unifyMetadata, decAnyMetadata } from '@polkadot-api/substrate-bindings';
|
|
4
|
+
import { getLookupFn } from '@polkadot-api/metadata-builders';
|
|
5
|
+
import { shallowDiff } from './shallow-diff.mjs';
|
|
6
|
+
|
|
7
|
+
const getEnumEntry = (entry, side) => {
|
|
8
|
+
const node = enumValueEntryPointNode(entry);
|
|
9
|
+
return {
|
|
10
|
+
args: side === "args" ? node : voidEntryPointNode,
|
|
11
|
+
values: side === "args" ? voidEntryPointNode : node
|
|
12
|
+
};
|
|
13
|
+
};
|
|
14
|
+
const getMetadataHelpers = (rawMetadata) => {
|
|
15
|
+
const metadata = unifyMetadata(decAnyMetadata(rawMetadata));
|
|
16
|
+
const lookupFn = getLookupFn(metadata);
|
|
17
|
+
const typeNodesCache = [];
|
|
18
|
+
const getTypeDefNode = (id) => typeNodesCache[id] || (typeNodesCache[id] = mapLookupToTypedef(lookupFn(id)));
|
|
19
|
+
const metadataMaps = getMappedMetadata(metadata, lookupFn);
|
|
20
|
+
return { lookupFn, getTypeDefNode, metadataMaps };
|
|
21
|
+
};
|
|
22
|
+
const minCompatLevel = (levels) => Math.min(levels.args, levels.values);
|
|
23
|
+
const compareRuntimes = (prevMetadata, nextMetadata) => {
|
|
24
|
+
const [prev, next] = [prevMetadata, nextMetadata].map(getMetadataHelpers);
|
|
25
|
+
const cache = /* @__PURE__ */ new Map();
|
|
26
|
+
const compareEnumEntries = ({
|
|
27
|
+
kind,
|
|
28
|
+
pallet,
|
|
29
|
+
name
|
|
30
|
+
}) => {
|
|
31
|
+
const a = prev.metadataMaps.pallets[pallet][kind].get(name);
|
|
32
|
+
const b = next.metadataMaps.pallets[pallet][kind].get(name);
|
|
33
|
+
const argsOrValues = kind === "call" ? "args" : "values";
|
|
34
|
+
return {
|
|
35
|
+
kind,
|
|
36
|
+
pallet,
|
|
37
|
+
name,
|
|
38
|
+
compat: minCompatLevel(
|
|
39
|
+
entryPointsAreCompatible(
|
|
40
|
+
getEnumEntry(a, argsOrValues),
|
|
41
|
+
prev.getTypeDefNode,
|
|
42
|
+
getEnumEntry(b, argsOrValues),
|
|
43
|
+
next.getTypeDefNode,
|
|
44
|
+
cache
|
|
45
|
+
)
|
|
46
|
+
)
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
const compareConst = (pallet, name) => {
|
|
50
|
+
const a = prev.metadataMaps.pallets[pallet].const.get(name);
|
|
51
|
+
const b = next.metadataMaps.pallets[pallet].const.get(name);
|
|
52
|
+
return {
|
|
53
|
+
kind: "const",
|
|
54
|
+
pallet,
|
|
55
|
+
name,
|
|
56
|
+
compat: minCompatLevel(
|
|
57
|
+
entryPointsAreCompatible(
|
|
58
|
+
singleValueEntryPoint(a.type),
|
|
59
|
+
prev.getTypeDefNode,
|
|
60
|
+
singleValueEntryPoint(b.type),
|
|
61
|
+
next.getTypeDefNode,
|
|
62
|
+
cache
|
|
63
|
+
)
|
|
64
|
+
)
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
const compareStorage = (pallet, name) => {
|
|
68
|
+
const a = prev.metadataMaps.pallets[pallet].storage.get(name);
|
|
69
|
+
const b = next.metadataMaps.pallets[pallet].storage.get(name);
|
|
70
|
+
return {
|
|
71
|
+
kind: "storage",
|
|
72
|
+
pallet,
|
|
73
|
+
name,
|
|
74
|
+
compat: entryPointsAreCompatible(
|
|
75
|
+
storageEntryPoint(a),
|
|
76
|
+
prev.getTypeDefNode,
|
|
77
|
+
storageEntryPoint(b),
|
|
78
|
+
next.getTypeDefNode,
|
|
79
|
+
cache
|
|
80
|
+
)
|
|
81
|
+
};
|
|
82
|
+
};
|
|
83
|
+
const compareViewFn = (pallet, name) => {
|
|
84
|
+
const a = prev.metadataMaps.pallets[pallet].view.get(name);
|
|
85
|
+
const b = next.metadataMaps.pallets[pallet].view.get(name);
|
|
86
|
+
return {
|
|
87
|
+
kind: "view",
|
|
88
|
+
pallet,
|
|
89
|
+
name,
|
|
90
|
+
compat: entryPointsAreCompatible(
|
|
91
|
+
runtimeCallEntryPoint(a),
|
|
92
|
+
prev.getTypeDefNode,
|
|
93
|
+
runtimeCallEntryPoint(b),
|
|
94
|
+
next.getTypeDefNode,
|
|
95
|
+
cache
|
|
96
|
+
)
|
|
97
|
+
};
|
|
98
|
+
};
|
|
99
|
+
const compareRuntimeApi = (group, name) => {
|
|
100
|
+
const a = prev.metadataMaps.api[group].get(name);
|
|
101
|
+
const b = next.metadataMaps.api[group].get(name);
|
|
102
|
+
return {
|
|
103
|
+
kind: "api",
|
|
104
|
+
group,
|
|
105
|
+
name,
|
|
106
|
+
compat: entryPointsAreCompatible(
|
|
107
|
+
runtimeCallEntryPoint(a),
|
|
108
|
+
prev.getTypeDefNode,
|
|
109
|
+
runtimeCallEntryPoint(b),
|
|
110
|
+
next.getTypeDefNode,
|
|
111
|
+
cache
|
|
112
|
+
)
|
|
113
|
+
};
|
|
114
|
+
};
|
|
115
|
+
const added = shallowDiff(prev.metadataMaps, next.metadataMaps, "added");
|
|
116
|
+
const removed = shallowDiff(next.metadataMaps, prev.metadataMaps, "added");
|
|
117
|
+
const commonApis = shallowDiff(prev.metadataMaps, next.metadataMaps, "kept");
|
|
118
|
+
const kept = commonApis.map((x) => {
|
|
119
|
+
switch (x.kind) {
|
|
120
|
+
case "const":
|
|
121
|
+
return compareConst(x.pallet, x.name);
|
|
122
|
+
case "storage":
|
|
123
|
+
return compareStorage(x.pallet, x.name);
|
|
124
|
+
case "view":
|
|
125
|
+
return compareViewFn(x.pallet, x.name);
|
|
126
|
+
case "api":
|
|
127
|
+
return compareRuntimeApi(x.group, x.name);
|
|
128
|
+
default:
|
|
129
|
+
return compareEnumEntries(x);
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
return { added, removed, kept };
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
export { compareRuntimes };
|
|
136
|
+
//# sourceMappingURL=compare-runtimes.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compare-runtimes.mjs","sources":["../../src/compare-runtimes.ts"],"sourcesContent":["import {\n CompatibilityLevel,\n entryPointsAreCompatible,\n enumValueEntryPointNode,\n mapLookupToTypedef,\n runtimeCallEntryPoint,\n singleValueEntryPoint,\n storageEntryPoint,\n TypedefNode,\n voidEntryPointNode,\n} from \"@polkadot-api/metadata-compatibility\"\nimport { EnumEntry, getMappedMetadata } from \"./mapped-metadata\"\nimport { decAnyMetadata, unifyMetadata } from \"@polkadot-api/substrate-bindings\"\nimport { getLookupFn } from \"@polkadot-api/metadata-builders\"\nimport { ComparedChange, Output } from \"./public-types\"\nimport { shallowDiff } from \"./shallow-diff\"\n\nconst getEnumEntry = (entry: EnumEntry, side: \"args\" | \"values\") => {\n const node = enumValueEntryPointNode(entry)\n return {\n args: side === \"args\" ? node : voidEntryPointNode,\n values: side === \"args\" ? voidEntryPointNode : node,\n }\n}\n\nconst getMetadataHelpers = (rawMetadata: Uint8Array) => {\n const metadata = unifyMetadata(decAnyMetadata(rawMetadata))\n const lookupFn = getLookupFn(metadata)\n const typeNodesCache: (TypedefNode | null)[] = []\n const getTypeDefNode = (id: number) =>\n (typeNodesCache[id] ||= mapLookupToTypedef(lookupFn(id)))\n const metadataMaps = getMappedMetadata(metadata, lookupFn)\n\n return { lookupFn, getTypeDefNode, metadataMaps }\n}\n\nconst minCompatLevel = (levels: {\n args: CompatibilityLevel\n values: CompatibilityLevel\n}) => Math.min(levels.args, levels.values)\n\nexport const compareRuntimes = (\n prevMetadata: Uint8Array,\n nextMetadata: Uint8Array,\n): Output => {\n const [prev, next] = [prevMetadata, nextMetadata].map(getMetadataHelpers)\n\n const cache = new Map()\n const compareEnumEntries = ({\n kind,\n pallet,\n name,\n }: {\n kind: \"call\" | \"event\" | \"error\"\n pallet: string\n name: string\n }): ComparedChange => {\n const a = prev.metadataMaps.pallets[pallet]![kind].get(name)!\n const b = next.metadataMaps.pallets[pallet]![kind].get(name)!\n const argsOrValues = kind === \"call\" ? \"args\" : \"values\"\n\n return {\n kind,\n pallet,\n name,\n compat: minCompatLevel(\n entryPointsAreCompatible(\n getEnumEntry(a, argsOrValues),\n prev.getTypeDefNode,\n getEnumEntry(b, argsOrValues),\n next.getTypeDefNode,\n cache,\n ),\n ),\n }\n }\n\n const compareConst = (pallet: string, name: string): ComparedChange => {\n const a = prev.metadataMaps.pallets[pallet]!.const.get(name)!\n const b = next.metadataMaps.pallets[pallet]!.const.get(name)!\n\n return {\n kind: \"const\",\n pallet,\n name,\n compat: minCompatLevel(\n entryPointsAreCompatible(\n singleValueEntryPoint(a.type),\n prev.getTypeDefNode,\n singleValueEntryPoint(b.type),\n next.getTypeDefNode,\n cache,\n ),\n ),\n }\n }\n\n const compareStorage = (pallet: string, name: string): ComparedChange => {\n const a = prev.metadataMaps.pallets[pallet]!.storage.get(name)!\n const b = next.metadataMaps.pallets[pallet]!.storage.get(name)!\n\n return {\n kind: \"storage\",\n pallet,\n name,\n compat: entryPointsAreCompatible(\n storageEntryPoint(a),\n prev.getTypeDefNode,\n storageEntryPoint(b),\n next.getTypeDefNode,\n cache,\n ),\n }\n }\n\n const compareViewFn = (pallet: string, name: string): ComparedChange => {\n const a = prev.metadataMaps.pallets[pallet]!.view.get(name)!\n const b = next.metadataMaps.pallets[pallet]!.view.get(name)!\n\n return {\n kind: \"view\",\n pallet,\n name,\n compat: entryPointsAreCompatible(\n runtimeCallEntryPoint(a),\n prev.getTypeDefNode,\n runtimeCallEntryPoint(b),\n next.getTypeDefNode,\n cache,\n ),\n }\n }\n\n const compareRuntimeApi = (group: string, name: string): ComparedChange => {\n const a = prev.metadataMaps.api[group]!.get(name)!\n const b = next.metadataMaps.api[group]!.get(name)!\n\n return {\n kind: \"api\",\n group,\n name,\n compat: entryPointsAreCompatible(\n runtimeCallEntryPoint(a),\n prev.getTypeDefNode,\n runtimeCallEntryPoint(b),\n next.getTypeDefNode,\n cache,\n ),\n }\n }\n\n const added = shallowDiff(prev.metadataMaps, next.metadataMaps, \"added\")\n const removed = shallowDiff(next.metadataMaps, prev.metadataMaps, \"added\")\n const commonApis = shallowDiff(prev.metadataMaps, next.metadataMaps, \"kept\")\n\n const kept = commonApis.map((x) => {\n switch (x.kind) {\n case \"const\":\n return compareConst(x.pallet, x.name)\n case \"storage\":\n return compareStorage(x.pallet, x.name)\n case \"view\":\n return compareViewFn(x.pallet, x.name)\n case \"api\":\n return compareRuntimeApi(x.group, x.name)\n default:\n return compareEnumEntries(x as any)\n }\n })\n\n return { added, removed, kept }\n}\n"],"names":[],"mappings":";;;;;;AAiBA,MAAM,YAAA,GAAe,CAAC,KAAA,EAAkB,IAA4B,KAAA;AAClE,EAAM,MAAA,IAAA,GAAO,wBAAwB,KAAK,CAAA;AAC1C,EAAO,OAAA;AAAA,IACL,IAAA,EAAM,IAAS,KAAA,MAAA,GAAS,IAAO,GAAA,kBAAA;AAAA,IAC/B,MAAA,EAAQ,IAAS,KAAA,MAAA,GAAS,kBAAqB,GAAA;AAAA,GACjD;AACF,CAAA;AAEA,MAAM,kBAAA,GAAqB,CAAC,WAA4B,KAAA;AACtD,EAAA,MAAM,QAAW,GAAA,aAAA,CAAc,cAAe,CAAA,WAAW,CAAC,CAAA;AAC1D,EAAM,MAAA,QAAA,GAAW,YAAY,QAAQ,CAAA;AACrC,EAAA,MAAM,iBAAyC,EAAC;AAChD,EAAA,MAAM,iBAAiB,CAAC,EAAA,KACrB,4CAAuB,kBAAmB,CAAA,QAAA,CAAS,EAAE,CAAC,CAAA,CAAA;AACzD,EAAM,MAAA,YAAA,GAAe,iBAAkB,CAAA,QAAA,EAAU,QAAQ,CAAA;AAEzD,EAAO,OAAA,EAAE,QAAU,EAAA,cAAA,EAAgB,YAAa,EAAA;AAClD,CAAA;AAEA,MAAM,cAAA,GAAiB,CAAC,MAGlB,KAAA,IAAA,CAAK,IAAI,MAAO,CAAA,IAAA,EAAM,OAAO,MAAM,CAAA;AAE5B,MAAA,eAAA,GAAkB,CAC7B,YAAA,EACA,YACW,KAAA;AACX,EAAM,MAAA,CAAC,MAAM,IAAI,CAAA,GAAI,CAAC,YAAc,EAAA,YAAY,CAAE,CAAA,GAAA,CAAI,kBAAkB,CAAA;AAExE,EAAM,MAAA,KAAA,uBAAY,GAAI,EAAA;AACtB,EAAA,MAAM,qBAAqB,CAAC;AAAA,IAC1B,IAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GAKoB,KAAA;AACpB,IAAM,MAAA,CAAA,GAAI,KAAK,YAAa,CAAA,OAAA,CAAQ,MAAM,CAAG,CAAA,IAAI,CAAE,CAAA,GAAA,CAAI,IAAI,CAAA;AAC3D,IAAM,MAAA,CAAA,GAAI,KAAK,YAAa,CAAA,OAAA,CAAQ,MAAM,CAAG,CAAA,IAAI,CAAE,CAAA,GAAA,CAAI,IAAI,CAAA;AAC3D,IAAM,MAAA,YAAA,GAAe,IAAS,KAAA,MAAA,GAAS,MAAS,GAAA,QAAA;AAEhD,IAAO,OAAA;AAAA,MACL,IAAA;AAAA,MACA,MAAA;AAAA,MACA,IAAA;AAAA,MACA,MAAQ,EAAA,cAAA;AAAA,QACN,wBAAA;AAAA,UACE,YAAA,CAAa,GAAG,YAAY,CAAA;AAAA,UAC5B,IAAK,CAAA,cAAA;AAAA,UACL,YAAA,CAAa,GAAG,YAAY,CAAA;AAAA,UAC5B,IAAK,CAAA,cAAA;AAAA,UACL;AAAA;AACF;AACF,KACF;AAAA,GACF;AAEA,EAAM,MAAA,YAAA,GAAe,CAAC,MAAA,EAAgB,IAAiC,KAAA;AACrE,IAAM,MAAA,CAAA,GAAI,KAAK,YAAa,CAAA,OAAA,CAAQ,MAAM,CAAG,CAAA,KAAA,CAAM,IAAI,IAAI,CAAA;AAC3D,IAAM,MAAA,CAAA,GAAI,KAAK,YAAa,CAAA,OAAA,CAAQ,MAAM,CAAG,CAAA,KAAA,CAAM,IAAI,IAAI,CAAA;AAE3D,IAAO,OAAA;AAAA,MACL,IAAM,EAAA,OAAA;AAAA,MACN,MAAA;AAAA,MACA,IAAA;AAAA,MACA,MAAQ,EAAA,cAAA;AAAA,QACN,wBAAA;AAAA,UACE,qBAAA,CAAsB,EAAE,IAAI,CAAA;AAAA,UAC5B,IAAK,CAAA,cAAA;AAAA,UACL,qBAAA,CAAsB,EAAE,IAAI,CAAA;AAAA,UAC5B,IAAK,CAAA,cAAA;AAAA,UACL;AAAA;AACF;AACF,KACF;AAAA,GACF;AAEA,EAAM,MAAA,cAAA,GAAiB,CAAC,MAAA,EAAgB,IAAiC,KAAA;AACvE,IAAM,MAAA,CAAA,GAAI,KAAK,YAAa,CAAA,OAAA,CAAQ,MAAM,CAAG,CAAA,OAAA,CAAQ,IAAI,IAAI,CAAA;AAC7D,IAAM,MAAA,CAAA,GAAI,KAAK,YAAa,CAAA,OAAA,CAAQ,MAAM,CAAG,CAAA,OAAA,CAAQ,IAAI,IAAI,CAAA;AAE7D,IAAO,OAAA;AAAA,MACL,IAAM,EAAA,SAAA;AAAA,MACN,MAAA;AAAA,MACA,IAAA;AAAA,MACA,MAAQ,EAAA,wBAAA;AAAA,QACN,kBAAkB,CAAC,CAAA;AAAA,QACnB,IAAK,CAAA,cAAA;AAAA,QACL,kBAAkB,CAAC,CAAA;AAAA,QACnB,IAAK,CAAA,cAAA;AAAA,QACL;AAAA;AACF,KACF;AAAA,GACF;AAEA,EAAM,MAAA,aAAA,GAAgB,CAAC,MAAA,EAAgB,IAAiC,KAAA;AACtE,IAAM,MAAA,CAAA,GAAI,KAAK,YAAa,CAAA,OAAA,CAAQ,MAAM,CAAG,CAAA,IAAA,CAAK,IAAI,IAAI,CAAA;AAC1D,IAAM,MAAA,CAAA,GAAI,KAAK,YAAa,CAAA,OAAA,CAAQ,MAAM,CAAG,CAAA,IAAA,CAAK,IAAI,IAAI,CAAA;AAE1D,IAAO,OAAA;AAAA,MACL,IAAM,EAAA,MAAA;AAAA,MACN,MAAA;AAAA,MACA,IAAA;AAAA,MACA,MAAQ,EAAA,wBAAA;AAAA,QACN,sBAAsB,CAAC,CAAA;AAAA,QACvB,IAAK,CAAA,cAAA;AAAA,QACL,sBAAsB,CAAC,CAAA;AAAA,QACvB,IAAK,CAAA,cAAA;AAAA,QACL;AAAA;AACF,KACF;AAAA,GACF;AAEA,EAAM,MAAA,iBAAA,GAAoB,CAAC,KAAA,EAAe,IAAiC,KAAA;AACzE,IAAA,MAAM,IAAI,IAAK,CAAA,YAAA,CAAa,IAAI,KAAK,CAAA,CAAG,IAAI,IAAI,CAAA;AAChD,IAAA,MAAM,IAAI,IAAK,CAAA,YAAA,CAAa,IAAI,KAAK,CAAA,CAAG,IAAI,IAAI,CAAA;AAEhD,IAAO,OAAA;AAAA,MACL,IAAM,EAAA,KAAA;AAAA,MACN,KAAA;AAAA,MACA,IAAA;AAAA,MACA,MAAQ,EAAA,wBAAA;AAAA,QACN,sBAAsB,CAAC,CAAA;AAAA,QACvB,IAAK,CAAA,cAAA;AAAA,QACL,sBAAsB,CAAC,CAAA;AAAA,QACvB,IAAK,CAAA,cAAA;AAAA,QACL;AAAA;AACF,KACF;AAAA,GACF;AAEA,EAAA,MAAM,QAAQ,WAAY,CAAA,IAAA,CAAK,YAAc,EAAA,IAAA,CAAK,cAAc,OAAO,CAAA;AACvE,EAAA,MAAM,UAAU,WAAY,CAAA,IAAA,CAAK,YAAc,EAAA,IAAA,CAAK,cAAc,OAAO,CAAA;AACzE,EAAA,MAAM,aAAa,WAAY,CAAA,IAAA,CAAK,YAAc,EAAA,IAAA,CAAK,cAAc,MAAM,CAAA;AAE3E,EAAA,MAAM,IAAO,GAAA,UAAA,CAAW,GAAI,CAAA,CAAC,CAAM,KAAA;AACjC,IAAA,QAAQ,EAAE,IAAM;AAAA,MACd,KAAK,OAAA;AACH,QAAA,OAAO,YAAa,CAAA,CAAA,CAAE,MAAQ,EAAA,CAAA,CAAE,IAAI,CAAA;AAAA,MACtC,KAAK,SAAA;AACH,QAAA,OAAO,cAAe,CAAA,CAAA,CAAE,MAAQ,EAAA,CAAA,CAAE,IAAI,CAAA;AAAA,MACxC,KAAK,MAAA;AACH,QAAA,OAAO,aAAc,CAAA,CAAA,CAAE,MAAQ,EAAA,CAAA,CAAE,IAAI,CAAA;AAAA,MACvC,KAAK,KAAA;AACH,QAAA,OAAO,iBAAkB,CAAA,CAAA,CAAE,KAAO,EAAA,CAAA,CAAE,IAAI,CAAA;AAAA,MAC1C;AACE,QAAA,OAAO,mBAAmB,CAAQ,CAAA;AAAA;AACtC,GACD,CAAA;AAED,EAAO,OAAA,EAAE,KAAO,EAAA,OAAA,EAAS,IAAK,EAAA;AAChC;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { mapObject } from '@polkadot-api/utils';
|
|
2
|
+
|
|
3
|
+
const buildVariants = (metadata, lookupFn) => Object.fromEntries(
|
|
4
|
+
metadata.pallets.map((palletEntry) => {
|
|
5
|
+
const [error, event, call] = [
|
|
6
|
+
"errors",
|
|
7
|
+
"events",
|
|
8
|
+
"calls"
|
|
9
|
+
].map((variantType) => {
|
|
10
|
+
try {
|
|
11
|
+
const lookup = lookupFn(palletEntry[variantType].type);
|
|
12
|
+
if (lookup.type !== "enum") throw null;
|
|
13
|
+
return new Map(Object.entries(lookup.value));
|
|
14
|
+
} catch {
|
|
15
|
+
return /* @__PURE__ */ new Map();
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
return [palletEntry.name, { error, event, call }];
|
|
19
|
+
})
|
|
20
|
+
);
|
|
21
|
+
const getMappedMetadata = (metadata, lookupFn) => {
|
|
22
|
+
const palletVariants = buildVariants(metadata, lookupFn);
|
|
23
|
+
const rest = Object.fromEntries(
|
|
24
|
+
metadata.pallets.map((palletEntry) => {
|
|
25
|
+
const [constants, view] = ["constants", "viewFns"].map(
|
|
26
|
+
(entryType) => new Map(palletEntry[entryType].map((x) => [x.name, x]))
|
|
27
|
+
);
|
|
28
|
+
return [palletEntry.name, { const: constants, view }];
|
|
29
|
+
})
|
|
30
|
+
);
|
|
31
|
+
const storage = Object.fromEntries(
|
|
32
|
+
metadata.pallets.map((palletEntry) => [
|
|
33
|
+
palletEntry.name,
|
|
34
|
+
new Map((palletEntry.storage?.items || []).map((x) => [x.name, x]))
|
|
35
|
+
])
|
|
36
|
+
);
|
|
37
|
+
const pallets = mapObject(
|
|
38
|
+
palletVariants,
|
|
39
|
+
({ error, event, call }, key) => ({
|
|
40
|
+
error,
|
|
41
|
+
event,
|
|
42
|
+
call,
|
|
43
|
+
storage: storage[key],
|
|
44
|
+
...rest[key]
|
|
45
|
+
})
|
|
46
|
+
);
|
|
47
|
+
const api = Object.fromEntries(
|
|
48
|
+
metadata.apis.map((x) => [
|
|
49
|
+
x.name,
|
|
50
|
+
new Map(x.methods.map((m) => [m.name, m]))
|
|
51
|
+
])
|
|
52
|
+
);
|
|
53
|
+
return { pallets, api };
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
export { getMappedMetadata };
|
|
57
|
+
//# sourceMappingURL=mapped-metadata.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mapped-metadata.mjs","sources":["../../src/mapped-metadata.ts"],"sourcesContent":["import { LookupEntry } from \"@polkadot-api/metadata-builders\"\nimport { UnifiedMetadata } from \"@polkadot-api/substrate-bindings\"\nimport type {\n StructVar,\n ArrayVar,\n TupleVar,\n VoidVar,\n} from \"@polkadot-api/metadata-builders\"\nimport { mapObject } from \"@polkadot-api/utils\"\n\nexport type EnumEntry = (\n | VoidVar\n | TupleVar\n | StructVar\n | ArrayVar\n | {\n type: \"lookupEntry\"\n value: LookupEntry\n }\n) & {\n idx: number\n}\n\nexport type MetadataMaps = {\n pallets: Record<\n string,\n {\n storage: Map<\n string,\n NonNullable<\n UnifiedMetadata[\"pallets\"][number][\"storage\"]\n >[\"items\"][number]\n >\n event: Map<string, EnumEntry>\n error: Map<string, EnumEntry>\n call: Map<string, EnumEntry>\n const: Map<\n string,\n NonNullable<UnifiedMetadata[\"pallets\"][number][\"constants\"]>[number]\n >\n view: Map<\n string,\n NonNullable<UnifiedMetadata[\"pallets\"][number][\"viewFns\"]>[number]\n >\n }\n >\n api: Record<\n string,\n Map<string, NonNullable<UnifiedMetadata[\"apis\"][number][\"methods\"][number]>>\n >\n}\n\nconst buildVariants = (\n metadata: UnifiedMetadata,\n lookupFn: (id: number) => LookupEntry,\n) =>\n Object.fromEntries(\n metadata.pallets.map((palletEntry) => {\n const [error, event, call] = [\n \"errors\" as const,\n \"events\" as const,\n \"calls\" as const,\n ].map((variantType) => {\n try {\n const lookup = lookupFn(palletEntry[variantType]!.type)\n if (lookup.type !== \"enum\") throw null\n return new Map(Object.entries(lookup.value))\n } catch {\n return new Map()\n }\n })\n return [palletEntry.name, { error, event, call }]\n }),\n )\n\nexport const getMappedMetadata = (\n metadata: UnifiedMetadata,\n lookupFn: (id: number) => LookupEntry,\n): MetadataMaps => {\n const palletVariants = buildVariants(metadata, lookupFn)\n const rest = Object.fromEntries(\n metadata.pallets.map((palletEntry) => {\n const [constants, view] = [\"constants\" as const, \"viewFns\" as const].map(\n (entryType) => new Map(palletEntry[entryType].map((x) => [x.name, x])),\n )\n return [palletEntry.name, { const: constants, view }]\n }),\n ) as Record<string, Pick<MetadataMaps[\"pallets\"][string], \"const\" | \"view\">>\n const storage = Object.fromEntries(\n metadata.pallets.map((palletEntry) => [\n palletEntry.name,\n new Map((palletEntry.storage?.items || []).map((x) => [x.name, x])),\n ]),\n ) as Record<string, MetadataMaps[\"pallets\"][string][\"storage\"]>\n\n const pallets: MetadataMaps[\"pallets\"] = mapObject(\n palletVariants,\n ({ error, event, call }, key) => ({\n error,\n event,\n call,\n storage: storage[key],\n ...rest[key],\n }),\n )\n\n const api: MetadataMaps[\"api\"] = Object.fromEntries(\n metadata.apis.map((x) => [\n x.name,\n new Map(x.methods.map((m) => [m.name, m])),\n ]),\n )\n\n return { pallets, api }\n}\n"],"names":[],"mappings":";;AAoDA,MAAM,aAAgB,GAAA,CACpB,QACA,EAAA,QAAA,KAEA,MAAO,CAAA,WAAA;AAAA,EACL,QAAS,CAAA,OAAA,CAAQ,GAAI,CAAA,CAAC,WAAgB,KAAA;AACpC,IAAA,MAAM,CAAC,KAAA,EAAO,KAAO,EAAA,IAAI,CAAI,GAAA;AAAA,MAC3B,QAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF,CAAE,GAAI,CAAA,CAAC,WAAgB,KAAA;AACrB,MAAI,IAAA;AACF,QAAA,MAAM,MAAS,GAAA,QAAA,CAAS,WAAY,CAAA,WAAW,EAAG,IAAI,CAAA;AACtD,QAAI,IAAA,MAAA,CAAO,IAAS,KAAA,MAAA,EAAc,MAAA,IAAA;AAClC,QAAA,OAAO,IAAI,GAAI,CAAA,MAAA,CAAO,OAAQ,CAAA,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,OACrC,CAAA,MAAA;AACN,QAAA,2BAAW,GAAI,EAAA;AAAA;AACjB,KACD,CAAA;AACD,IAAA,OAAO,CAAC,WAAY,CAAA,IAAA,EAAM,EAAE,KAAO,EAAA,KAAA,EAAO,MAAM,CAAA;AAAA,GACjD;AACH,CAAA;AAEW,MAAA,iBAAA,GAAoB,CAC/B,QAAA,EACA,QACiB,KAAA;AACjB,EAAM,MAAA,cAAA,GAAiB,aAAc,CAAA,QAAA,EAAU,QAAQ,CAAA;AACvD,EAAA,MAAM,OAAO,MAAO,CAAA,WAAA;AAAA,IAClB,QAAS,CAAA,OAAA,CAAQ,GAAI,CAAA,CAAC,WAAgB,KAAA;AACpC,MAAA,MAAM,CAAC,SAAW,EAAA,IAAI,IAAI,CAAC,WAAA,EAAsB,SAAkB,CAAE,CAAA,GAAA;AAAA,QACnE,CAAC,SAAA,KAAc,IAAI,GAAA,CAAI,YAAY,SAAS,CAAA,CAAE,GAAI,CAAA,CAAC,MAAM,CAAC,CAAA,CAAE,IAAM,EAAA,CAAC,CAAC,CAAC;AAAA,OACvE;AACA,MAAA,OAAO,CAAC,WAAY,CAAA,IAAA,EAAM,EAAE,KAAO,EAAA,SAAA,EAAW,MAAM,CAAA;AAAA,KACrD;AAAA,GACH;AACA,EAAA,MAAM,UAAU,MAAO,CAAA,WAAA;AAAA,IACrB,QAAS,CAAA,OAAA,CAAQ,GAAI,CAAA,CAAC,WAAgB,KAAA;AAAA,MACpC,WAAY,CAAA,IAAA;AAAA,MACZ,IAAI,GAAA,CAAA,CAAK,WAAY,CAAA,OAAA,EAAS,SAAS,EAAC,EAAG,GAAI,CAAA,CAAC,MAAM,CAAC,CAAA,CAAE,IAAM,EAAA,CAAC,CAAC,CAAC;AAAA,KACnE;AAAA,GACH;AAEA,EAAA,MAAM,OAAmC,GAAA,SAAA;AAAA,IACvC,cAAA;AAAA,IACA,CAAC,EAAE,KAAA,EAAO,KAAO,EAAA,IAAA,IAAQ,GAAS,MAAA;AAAA,MAChC,KAAA;AAAA,MACA,KAAA;AAAA,MACA,IAAA;AAAA,MACA,OAAA,EAAS,QAAQ,GAAG,CAAA;AAAA,MACpB,GAAG,KAAK,GAAG;AAAA,KACb;AAAA,GACF;AAEA,EAAA,MAAM,MAA2B,MAAO,CAAA,WAAA;AAAA,IACtC,QAAS,CAAA,IAAA,CAAK,GAAI,CAAA,CAAC,CAAM,KAAA;AAAA,MACvB,CAAE,CAAA,IAAA;AAAA,MACF,IAAI,GAAA,CAAI,CAAE,CAAA,OAAA,CAAQ,GAAI,CAAA,CAAC,CAAM,KAAA,CAAC,CAAE,CAAA,IAAA,EAAM,CAAC,CAAC,CAAC;AAAA,KAC1C;AAAA,GACH;AAEA,EAAO,OAAA,EAAE,SAAS,GAAI,EAAA;AACxB;;;;"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
const shallowDiff = (prev, next, type) => {
|
|
2
|
+
const result = [];
|
|
3
|
+
Object.entries(next.pallets).forEach(([palletName, data]) => {
|
|
4
|
+
[
|
|
5
|
+
"const",
|
|
6
|
+
"storage",
|
|
7
|
+
"call",
|
|
8
|
+
"event",
|
|
9
|
+
"error",
|
|
10
|
+
"view"
|
|
11
|
+
].forEach((x) => {
|
|
12
|
+
[...data[x].keys()].forEach((key) => {
|
|
13
|
+
const isInPrev = prev.pallets[palletName]?.[x].has(key);
|
|
14
|
+
if (type === "added" ? !isInPrev : isInPrev) {
|
|
15
|
+
result.push({
|
|
16
|
+
kind: x,
|
|
17
|
+
pallet: palletName,
|
|
18
|
+
name: key
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
Object.entries(next.api).forEach(([apiGroup, val]) => {
|
|
25
|
+
[...val.keys()].forEach((x) => {
|
|
26
|
+
const isInPrev = prev.api[apiGroup]?.has(x);
|
|
27
|
+
if (type === "added" ? !isInPrev : isInPrev) {
|
|
28
|
+
result.push({
|
|
29
|
+
kind: "api",
|
|
30
|
+
group: apiGroup,
|
|
31
|
+
name: x
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export { shallowDiff };
|
|
40
|
+
//# sourceMappingURL=shallow-diff.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shallow-diff.mjs","sources":["../../src/shallow-diff.ts"],"sourcesContent":["import { MetadataMaps } from \"./mapped-metadata\"\nimport { Change } from \"./public-types\"\n\nexport const shallowDiff = (\n prev: MetadataMaps,\n next: MetadataMaps,\n type: \"added\" | \"kept\",\n): Array<Change> => {\n const result: Array<Change> = []\n Object.entries(next.pallets).forEach(([palletName, data]) => {\n ;[\n \"const\" as const,\n \"storage\" as const,\n \"call\" as const,\n \"event\" as const,\n \"error\" as const,\n \"view\" as const,\n ].forEach((x) => {\n ;[...data[x as \"storage\"].keys()].forEach((key) => {\n const isInPrev = prev.pallets[palletName]?.[x as \"storage\"].has(key)\n if (type === \"added\" ? !isInPrev : isInPrev) {\n result.push({\n kind: x,\n pallet: palletName,\n name: key,\n })\n }\n })\n })\n })\n\n Object.entries(next.api).forEach(([apiGroup, val]) => {\n ;[...val.keys()].forEach((x) => {\n const isInPrev = prev.api[apiGroup]?.has(x)\n if (type === \"added\" ? !isInPrev : isInPrev) {\n result.push({\n kind: \"api\",\n group: apiGroup,\n name: x,\n })\n }\n })\n })\n\n return result\n}\n"],"names":[],"mappings":"AAGO,MAAM,WAAc,GAAA,CACzB,IACA,EAAA,IAAA,EACA,IACkB,KAAA;AAClB,EAAA,MAAM,SAAwB,EAAC;AAC/B,EAAO,MAAA,CAAA,OAAA,CAAQ,KAAK,OAAO,CAAA,CAAE,QAAQ,CAAC,CAAC,UAAY,EAAA,IAAI,CAAM,KAAA;AAC1D,IAAA;AAAA,MACC,OAAA;AAAA,MACA,SAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACF,CAAE,OAAQ,CAAA,CAAC,CAAM,KAAA;AACd,MAAC,CAAA,GAAG,KAAK,CAAc,CAAA,CAAE,MAAM,CAAA,CAAE,OAAQ,CAAA,CAAC,GAAQ,KAAA;AACjD,QAAM,MAAA,QAAA,GAAW,KAAK,OAAQ,CAAA,UAAU,IAAI,CAAc,CAAA,CAAE,IAAI,GAAG,CAAA;AACnE,QAAA,IAAI,IAAS,KAAA,OAAA,GAAU,CAAC,QAAA,GAAW,QAAU,EAAA;AAC3C,UAAA,MAAA,CAAO,IAAK,CAAA;AAAA,YACV,IAAM,EAAA,CAAA;AAAA,YACN,MAAQ,EAAA,UAAA;AAAA,YACR,IAAM,EAAA;AAAA,WACP,CAAA;AAAA;AACH,OACD,CAAA;AAAA,KACF,CAAA;AAAA,GACF,CAAA;AAED,EAAO,MAAA,CAAA,OAAA,CAAQ,KAAK,GAAG,CAAA,CAAE,QAAQ,CAAC,CAAC,QAAU,EAAA,GAAG,CAAM,KAAA;AACnD,IAAA,CAAC,GAAG,GAAI,CAAA,IAAA,EAAM,CAAE,CAAA,OAAA,CAAQ,CAAC,CAAM,KAAA;AAC9B,MAAA,MAAM,WAAW,IAAK,CAAA,GAAA,CAAI,QAAQ,CAAA,EAAG,IAAI,CAAC,CAAA;AAC1C,MAAA,IAAI,IAAS,KAAA,OAAA,GAAU,CAAC,QAAA,GAAW,QAAU,EAAA;AAC3C,QAAA,MAAA,CAAO,IAAK,CAAA;AAAA,UACV,IAAM,EAAA,KAAA;AAAA,UACN,KAAO,EAAA,QAAA;AAAA,UACP,IAAM,EAAA;AAAA,SACP,CAAA;AAAA;AACH,KACD,CAAA;AAAA,GACF,CAAA;AAED,EAAO,OAAA,MAAA;AACT;;;;"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { CompatibilityLevel } from '@polkadot-api/metadata-compatibility';
|
|
2
|
+
export { CompatibilityLevel } from '@polkadot-api/metadata-compatibility';
|
|
3
|
+
|
|
4
|
+
type Change = {
|
|
5
|
+
kind: "const" | "storage" | "call" | "event" | "error" | "view";
|
|
6
|
+
pallet: string;
|
|
7
|
+
name: string;
|
|
8
|
+
} | {
|
|
9
|
+
kind: "api";
|
|
10
|
+
group: string;
|
|
11
|
+
name: string;
|
|
12
|
+
};
|
|
13
|
+
type ComparedChange = {
|
|
14
|
+
kind: "call" | "event" | "error" | "const";
|
|
15
|
+
pallet: string;
|
|
16
|
+
name: string;
|
|
17
|
+
compat: CompatibilityLevel;
|
|
18
|
+
} | {
|
|
19
|
+
kind: "storage" | "view";
|
|
20
|
+
pallet: string;
|
|
21
|
+
name: string;
|
|
22
|
+
compat: {
|
|
23
|
+
args: CompatibilityLevel;
|
|
24
|
+
values: CompatibilityLevel;
|
|
25
|
+
};
|
|
26
|
+
} | {
|
|
27
|
+
kind: "api";
|
|
28
|
+
group: string;
|
|
29
|
+
name: string;
|
|
30
|
+
compat: {
|
|
31
|
+
args: CompatibilityLevel;
|
|
32
|
+
values: CompatibilityLevel;
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
type Output = {
|
|
36
|
+
added: Array<Change>;
|
|
37
|
+
removed: Array<Change>;
|
|
38
|
+
kept: Array<ComparedChange>;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
declare const compareRuntimes: (prevMetadata: Uint8Array, nextMetadata: Uint8Array) => Output;
|
|
42
|
+
|
|
43
|
+
export { compareRuntimes };
|
|
44
|
+
export type { Change, ComparedChange, Output };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var metadataCompatibility = require('@polkadot-api/metadata-compatibility');
|
|
4
|
+
var utils = require('@polkadot-api/utils');
|
|
5
|
+
var substrateBindings = require('@polkadot-api/substrate-bindings');
|
|
6
|
+
var metadataBuilders = require('@polkadot-api/metadata-builders');
|
|
7
|
+
|
|
8
|
+
const buildVariants = (metadata, lookupFn) => Object.fromEntries(
|
|
9
|
+
metadata.pallets.map((palletEntry) => {
|
|
10
|
+
const [error, event, call] = [
|
|
11
|
+
"errors",
|
|
12
|
+
"events",
|
|
13
|
+
"calls"
|
|
14
|
+
].map((variantType) => {
|
|
15
|
+
try {
|
|
16
|
+
const lookup = lookupFn(palletEntry[variantType].type);
|
|
17
|
+
if (lookup.type !== "enum") throw null;
|
|
18
|
+
return new Map(Object.entries(lookup.value));
|
|
19
|
+
} catch {
|
|
20
|
+
return /* @__PURE__ */ new Map();
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
return [palletEntry.name, { error, event, call }];
|
|
24
|
+
})
|
|
25
|
+
);
|
|
26
|
+
const getMappedMetadata = (metadata, lookupFn) => {
|
|
27
|
+
const palletVariants = buildVariants(metadata, lookupFn);
|
|
28
|
+
const rest = Object.fromEntries(
|
|
29
|
+
metadata.pallets.map((palletEntry) => {
|
|
30
|
+
const [constants, view] = ["constants", "viewFns"].map(
|
|
31
|
+
(entryType) => new Map(palletEntry[entryType].map((x) => [x.name, x]))
|
|
32
|
+
);
|
|
33
|
+
return [palletEntry.name, { const: constants, view }];
|
|
34
|
+
})
|
|
35
|
+
);
|
|
36
|
+
const storage = Object.fromEntries(
|
|
37
|
+
metadata.pallets.map((palletEntry) => [
|
|
38
|
+
palletEntry.name,
|
|
39
|
+
new Map((palletEntry.storage?.items || []).map((x) => [x.name, x]))
|
|
40
|
+
])
|
|
41
|
+
);
|
|
42
|
+
const pallets = utils.mapObject(
|
|
43
|
+
palletVariants,
|
|
44
|
+
({ error, event, call }, key) => ({
|
|
45
|
+
error,
|
|
46
|
+
event,
|
|
47
|
+
call,
|
|
48
|
+
storage: storage[key],
|
|
49
|
+
...rest[key]
|
|
50
|
+
})
|
|
51
|
+
);
|
|
52
|
+
const api = Object.fromEntries(
|
|
53
|
+
metadata.apis.map((x) => [
|
|
54
|
+
x.name,
|
|
55
|
+
new Map(x.methods.map((m) => [m.name, m]))
|
|
56
|
+
])
|
|
57
|
+
);
|
|
58
|
+
return { pallets, api };
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
const shallowDiff = (prev, next, type) => {
|
|
62
|
+
const result = [];
|
|
63
|
+
Object.entries(next.pallets).forEach(([palletName, data]) => {
|
|
64
|
+
[
|
|
65
|
+
"const",
|
|
66
|
+
"storage",
|
|
67
|
+
"call",
|
|
68
|
+
"event",
|
|
69
|
+
"error",
|
|
70
|
+
"view"
|
|
71
|
+
].forEach((x) => {
|
|
72
|
+
[...data[x].keys()].forEach((key) => {
|
|
73
|
+
const isInPrev = prev.pallets[palletName]?.[x].has(key);
|
|
74
|
+
if (type === "added" ? !isInPrev : isInPrev) {
|
|
75
|
+
result.push({
|
|
76
|
+
kind: x,
|
|
77
|
+
pallet: palletName,
|
|
78
|
+
name: key
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
Object.entries(next.api).forEach(([apiGroup, val]) => {
|
|
85
|
+
[...val.keys()].forEach((x) => {
|
|
86
|
+
const isInPrev = prev.api[apiGroup]?.has(x);
|
|
87
|
+
if (type === "added" ? !isInPrev : isInPrev) {
|
|
88
|
+
result.push({
|
|
89
|
+
kind: "api",
|
|
90
|
+
group: apiGroup,
|
|
91
|
+
name: x
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
return result;
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
const getEnumEntry = (entry, side) => {
|
|
100
|
+
const node = metadataCompatibility.enumValueEntryPointNode(entry);
|
|
101
|
+
return {
|
|
102
|
+
args: side === "args" ? node : metadataCompatibility.voidEntryPointNode,
|
|
103
|
+
values: side === "args" ? metadataCompatibility.voidEntryPointNode : node
|
|
104
|
+
};
|
|
105
|
+
};
|
|
106
|
+
const getMetadataHelpers = (rawMetadata) => {
|
|
107
|
+
const metadata = substrateBindings.unifyMetadata(substrateBindings.decAnyMetadata(rawMetadata));
|
|
108
|
+
const lookupFn = metadataBuilders.getLookupFn(metadata);
|
|
109
|
+
const typeNodesCache = [];
|
|
110
|
+
const getTypeDefNode = (id) => typeNodesCache[id] || (typeNodesCache[id] = metadataCompatibility.mapLookupToTypedef(lookupFn(id)));
|
|
111
|
+
const metadataMaps = getMappedMetadata(metadata, lookupFn);
|
|
112
|
+
return { lookupFn, getTypeDefNode, metadataMaps };
|
|
113
|
+
};
|
|
114
|
+
const minCompatLevel = (levels) => Math.min(levels.args, levels.values);
|
|
115
|
+
const compareRuntimes = (prevMetadata, nextMetadata) => {
|
|
116
|
+
const [prev, next] = [prevMetadata, nextMetadata].map(getMetadataHelpers);
|
|
117
|
+
const cache = /* @__PURE__ */ new Map();
|
|
118
|
+
const compareEnumEntries = ({
|
|
119
|
+
kind,
|
|
120
|
+
pallet,
|
|
121
|
+
name
|
|
122
|
+
}) => {
|
|
123
|
+
const a = prev.metadataMaps.pallets[pallet][kind].get(name);
|
|
124
|
+
const b = next.metadataMaps.pallets[pallet][kind].get(name);
|
|
125
|
+
const argsOrValues = kind === "call" ? "args" : "values";
|
|
126
|
+
return {
|
|
127
|
+
kind,
|
|
128
|
+
pallet,
|
|
129
|
+
name,
|
|
130
|
+
compat: minCompatLevel(
|
|
131
|
+
metadataCompatibility.entryPointsAreCompatible(
|
|
132
|
+
getEnumEntry(a, argsOrValues),
|
|
133
|
+
prev.getTypeDefNode,
|
|
134
|
+
getEnumEntry(b, argsOrValues),
|
|
135
|
+
next.getTypeDefNode,
|
|
136
|
+
cache
|
|
137
|
+
)
|
|
138
|
+
)
|
|
139
|
+
};
|
|
140
|
+
};
|
|
141
|
+
const compareConst = (pallet, name) => {
|
|
142
|
+
const a = prev.metadataMaps.pallets[pallet].const.get(name);
|
|
143
|
+
const b = next.metadataMaps.pallets[pallet].const.get(name);
|
|
144
|
+
return {
|
|
145
|
+
kind: "const",
|
|
146
|
+
pallet,
|
|
147
|
+
name,
|
|
148
|
+
compat: minCompatLevel(
|
|
149
|
+
metadataCompatibility.entryPointsAreCompatible(
|
|
150
|
+
metadataCompatibility.singleValueEntryPoint(a.type),
|
|
151
|
+
prev.getTypeDefNode,
|
|
152
|
+
metadataCompatibility.singleValueEntryPoint(b.type),
|
|
153
|
+
next.getTypeDefNode,
|
|
154
|
+
cache
|
|
155
|
+
)
|
|
156
|
+
)
|
|
157
|
+
};
|
|
158
|
+
};
|
|
159
|
+
const compareStorage = (pallet, name) => {
|
|
160
|
+
const a = prev.metadataMaps.pallets[pallet].storage.get(name);
|
|
161
|
+
const b = next.metadataMaps.pallets[pallet].storage.get(name);
|
|
162
|
+
return {
|
|
163
|
+
kind: "storage",
|
|
164
|
+
pallet,
|
|
165
|
+
name,
|
|
166
|
+
compat: metadataCompatibility.entryPointsAreCompatible(
|
|
167
|
+
metadataCompatibility.storageEntryPoint(a),
|
|
168
|
+
prev.getTypeDefNode,
|
|
169
|
+
metadataCompatibility.storageEntryPoint(b),
|
|
170
|
+
next.getTypeDefNode,
|
|
171
|
+
cache
|
|
172
|
+
)
|
|
173
|
+
};
|
|
174
|
+
};
|
|
175
|
+
const compareViewFn = (pallet, name) => {
|
|
176
|
+
const a = prev.metadataMaps.pallets[pallet].view.get(name);
|
|
177
|
+
const b = next.metadataMaps.pallets[pallet].view.get(name);
|
|
178
|
+
return {
|
|
179
|
+
kind: "view",
|
|
180
|
+
pallet,
|
|
181
|
+
name,
|
|
182
|
+
compat: metadataCompatibility.entryPointsAreCompatible(
|
|
183
|
+
metadataCompatibility.runtimeCallEntryPoint(a),
|
|
184
|
+
prev.getTypeDefNode,
|
|
185
|
+
metadataCompatibility.runtimeCallEntryPoint(b),
|
|
186
|
+
next.getTypeDefNode,
|
|
187
|
+
cache
|
|
188
|
+
)
|
|
189
|
+
};
|
|
190
|
+
};
|
|
191
|
+
const compareRuntimeApi = (group, name) => {
|
|
192
|
+
const a = prev.metadataMaps.api[group].get(name);
|
|
193
|
+
const b = next.metadataMaps.api[group].get(name);
|
|
194
|
+
return {
|
|
195
|
+
kind: "api",
|
|
196
|
+
group,
|
|
197
|
+
name,
|
|
198
|
+
compat: metadataCompatibility.entryPointsAreCompatible(
|
|
199
|
+
metadataCompatibility.runtimeCallEntryPoint(a),
|
|
200
|
+
prev.getTypeDefNode,
|
|
201
|
+
metadataCompatibility.runtimeCallEntryPoint(b),
|
|
202
|
+
next.getTypeDefNode,
|
|
203
|
+
cache
|
|
204
|
+
)
|
|
205
|
+
};
|
|
206
|
+
};
|
|
207
|
+
const added = shallowDiff(prev.metadataMaps, next.metadataMaps, "added");
|
|
208
|
+
const removed = shallowDiff(next.metadataMaps, prev.metadataMaps, "added");
|
|
209
|
+
const commonApis = shallowDiff(prev.metadataMaps, next.metadataMaps, "kept");
|
|
210
|
+
const kept = commonApis.map((x) => {
|
|
211
|
+
switch (x.kind) {
|
|
212
|
+
case "const":
|
|
213
|
+
return compareConst(x.pallet, x.name);
|
|
214
|
+
case "storage":
|
|
215
|
+
return compareStorage(x.pallet, x.name);
|
|
216
|
+
case "view":
|
|
217
|
+
return compareViewFn(x.pallet, x.name);
|
|
218
|
+
case "api":
|
|
219
|
+
return compareRuntimeApi(x.group, x.name);
|
|
220
|
+
default:
|
|
221
|
+
return compareEnumEntries(x);
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
return { added, removed, kept };
|
|
225
|
+
};
|
|
226
|
+
|
|
227
|
+
Object.defineProperty(exports, "CompatibilityLevel", {
|
|
228
|
+
enumerable: true,
|
|
229
|
+
get: function () { return metadataCompatibility.CompatibilityLevel; }
|
|
230
|
+
});
|
|
231
|
+
exports.compareRuntimes = compareRuntimes;
|
|
232
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/mapped-metadata.ts","../src/shallow-diff.ts","../src/compare-runtimes.ts"],"sourcesContent":["import { LookupEntry } from \"@polkadot-api/metadata-builders\"\nimport { UnifiedMetadata } from \"@polkadot-api/substrate-bindings\"\nimport type {\n StructVar,\n ArrayVar,\n TupleVar,\n VoidVar,\n} from \"@polkadot-api/metadata-builders\"\nimport { mapObject } from \"@polkadot-api/utils\"\n\nexport type EnumEntry = (\n | VoidVar\n | TupleVar\n | StructVar\n | ArrayVar\n | {\n type: \"lookupEntry\"\n value: LookupEntry\n }\n) & {\n idx: number\n}\n\nexport type MetadataMaps = {\n pallets: Record<\n string,\n {\n storage: Map<\n string,\n NonNullable<\n UnifiedMetadata[\"pallets\"][number][\"storage\"]\n >[\"items\"][number]\n >\n event: Map<string, EnumEntry>\n error: Map<string, EnumEntry>\n call: Map<string, EnumEntry>\n const: Map<\n string,\n NonNullable<UnifiedMetadata[\"pallets\"][number][\"constants\"]>[number]\n >\n view: Map<\n string,\n NonNullable<UnifiedMetadata[\"pallets\"][number][\"viewFns\"]>[number]\n >\n }\n >\n api: Record<\n string,\n Map<string, NonNullable<UnifiedMetadata[\"apis\"][number][\"methods\"][number]>>\n >\n}\n\nconst buildVariants = (\n metadata: UnifiedMetadata,\n lookupFn: (id: number) => LookupEntry,\n) =>\n Object.fromEntries(\n metadata.pallets.map((palletEntry) => {\n const [error, event, call] = [\n \"errors\" as const,\n \"events\" as const,\n \"calls\" as const,\n ].map((variantType) => {\n try {\n const lookup = lookupFn(palletEntry[variantType]!.type)\n if (lookup.type !== \"enum\") throw null\n return new Map(Object.entries(lookup.value))\n } catch {\n return new Map()\n }\n })\n return [palletEntry.name, { error, event, call }]\n }),\n )\n\nexport const getMappedMetadata = (\n metadata: UnifiedMetadata,\n lookupFn: (id: number) => LookupEntry,\n): MetadataMaps => {\n const palletVariants = buildVariants(metadata, lookupFn)\n const rest = Object.fromEntries(\n metadata.pallets.map((palletEntry) => {\n const [constants, view] = [\"constants\" as const, \"viewFns\" as const].map(\n (entryType) => new Map(palletEntry[entryType].map((x) => [x.name, x])),\n )\n return [palletEntry.name, { const: constants, view }]\n }),\n ) as Record<string, Pick<MetadataMaps[\"pallets\"][string], \"const\" | \"view\">>\n const storage = Object.fromEntries(\n metadata.pallets.map((palletEntry) => [\n palletEntry.name,\n new Map((palletEntry.storage?.items || []).map((x) => [x.name, x])),\n ]),\n ) as Record<string, MetadataMaps[\"pallets\"][string][\"storage\"]>\n\n const pallets: MetadataMaps[\"pallets\"] = mapObject(\n palletVariants,\n ({ error, event, call }, key) => ({\n error,\n event,\n call,\n storage: storage[key],\n ...rest[key],\n }),\n )\n\n const api: MetadataMaps[\"api\"] = Object.fromEntries(\n metadata.apis.map((x) => [\n x.name,\n new Map(x.methods.map((m) => [m.name, m])),\n ]),\n )\n\n return { pallets, api }\n}\n","import { MetadataMaps } from \"./mapped-metadata\"\nimport { Change } from \"./public-types\"\n\nexport const shallowDiff = (\n prev: MetadataMaps,\n next: MetadataMaps,\n type: \"added\" | \"kept\",\n): Array<Change> => {\n const result: Array<Change> = []\n Object.entries(next.pallets).forEach(([palletName, data]) => {\n ;[\n \"const\" as const,\n \"storage\" as const,\n \"call\" as const,\n \"event\" as const,\n \"error\" as const,\n \"view\" as const,\n ].forEach((x) => {\n ;[...data[x as \"storage\"].keys()].forEach((key) => {\n const isInPrev = prev.pallets[palletName]?.[x as \"storage\"].has(key)\n if (type === \"added\" ? !isInPrev : isInPrev) {\n result.push({\n kind: x,\n pallet: palletName,\n name: key,\n })\n }\n })\n })\n })\n\n Object.entries(next.api).forEach(([apiGroup, val]) => {\n ;[...val.keys()].forEach((x) => {\n const isInPrev = prev.api[apiGroup]?.has(x)\n if (type === \"added\" ? !isInPrev : isInPrev) {\n result.push({\n kind: \"api\",\n group: apiGroup,\n name: x,\n })\n }\n })\n })\n\n return result\n}\n","import {\n CompatibilityLevel,\n entryPointsAreCompatible,\n enumValueEntryPointNode,\n mapLookupToTypedef,\n runtimeCallEntryPoint,\n singleValueEntryPoint,\n storageEntryPoint,\n TypedefNode,\n voidEntryPointNode,\n} from \"@polkadot-api/metadata-compatibility\"\nimport { EnumEntry, getMappedMetadata } from \"./mapped-metadata\"\nimport { decAnyMetadata, unifyMetadata } from \"@polkadot-api/substrate-bindings\"\nimport { getLookupFn } from \"@polkadot-api/metadata-builders\"\nimport { ComparedChange, Output } from \"./public-types\"\nimport { shallowDiff } from \"./shallow-diff\"\n\nconst getEnumEntry = (entry: EnumEntry, side: \"args\" | \"values\") => {\n const node = enumValueEntryPointNode(entry)\n return {\n args: side === \"args\" ? node : voidEntryPointNode,\n values: side === \"args\" ? voidEntryPointNode : node,\n }\n}\n\nconst getMetadataHelpers = (rawMetadata: Uint8Array) => {\n const metadata = unifyMetadata(decAnyMetadata(rawMetadata))\n const lookupFn = getLookupFn(metadata)\n const typeNodesCache: (TypedefNode | null)[] = []\n const getTypeDefNode = (id: number) =>\n (typeNodesCache[id] ||= mapLookupToTypedef(lookupFn(id)))\n const metadataMaps = getMappedMetadata(metadata, lookupFn)\n\n return { lookupFn, getTypeDefNode, metadataMaps }\n}\n\nconst minCompatLevel = (levels: {\n args: CompatibilityLevel\n values: CompatibilityLevel\n}) => Math.min(levels.args, levels.values)\n\nexport const compareRuntimes = (\n prevMetadata: Uint8Array,\n nextMetadata: Uint8Array,\n): Output => {\n const [prev, next] = [prevMetadata, nextMetadata].map(getMetadataHelpers)\n\n const cache = new Map()\n const compareEnumEntries = ({\n kind,\n pallet,\n name,\n }: {\n kind: \"call\" | \"event\" | \"error\"\n pallet: string\n name: string\n }): ComparedChange => {\n const a = prev.metadataMaps.pallets[pallet]![kind].get(name)!\n const b = next.metadataMaps.pallets[pallet]![kind].get(name)!\n const argsOrValues = kind === \"call\" ? \"args\" : \"values\"\n\n return {\n kind,\n pallet,\n name,\n compat: minCompatLevel(\n entryPointsAreCompatible(\n getEnumEntry(a, argsOrValues),\n prev.getTypeDefNode,\n getEnumEntry(b, argsOrValues),\n next.getTypeDefNode,\n cache,\n ),\n ),\n }\n }\n\n const compareConst = (pallet: string, name: string): ComparedChange => {\n const a = prev.metadataMaps.pallets[pallet]!.const.get(name)!\n const b = next.metadataMaps.pallets[pallet]!.const.get(name)!\n\n return {\n kind: \"const\",\n pallet,\n name,\n compat: minCompatLevel(\n entryPointsAreCompatible(\n singleValueEntryPoint(a.type),\n prev.getTypeDefNode,\n singleValueEntryPoint(b.type),\n next.getTypeDefNode,\n cache,\n ),\n ),\n }\n }\n\n const compareStorage = (pallet: string, name: string): ComparedChange => {\n const a = prev.metadataMaps.pallets[pallet]!.storage.get(name)!\n const b = next.metadataMaps.pallets[pallet]!.storage.get(name)!\n\n return {\n kind: \"storage\",\n pallet,\n name,\n compat: entryPointsAreCompatible(\n storageEntryPoint(a),\n prev.getTypeDefNode,\n storageEntryPoint(b),\n next.getTypeDefNode,\n cache,\n ),\n }\n }\n\n const compareViewFn = (pallet: string, name: string): ComparedChange => {\n const a = prev.metadataMaps.pallets[pallet]!.view.get(name)!\n const b = next.metadataMaps.pallets[pallet]!.view.get(name)!\n\n return {\n kind: \"view\",\n pallet,\n name,\n compat: entryPointsAreCompatible(\n runtimeCallEntryPoint(a),\n prev.getTypeDefNode,\n runtimeCallEntryPoint(b),\n next.getTypeDefNode,\n cache,\n ),\n }\n }\n\n const compareRuntimeApi = (group: string, name: string): ComparedChange => {\n const a = prev.metadataMaps.api[group]!.get(name)!\n const b = next.metadataMaps.api[group]!.get(name)!\n\n return {\n kind: \"api\",\n group,\n name,\n compat: entryPointsAreCompatible(\n runtimeCallEntryPoint(a),\n prev.getTypeDefNode,\n runtimeCallEntryPoint(b),\n next.getTypeDefNode,\n cache,\n ),\n }\n }\n\n const added = shallowDiff(prev.metadataMaps, next.metadataMaps, \"added\")\n const removed = shallowDiff(next.metadataMaps, prev.metadataMaps, \"added\")\n const commonApis = shallowDiff(prev.metadataMaps, next.metadataMaps, \"kept\")\n\n const kept = commonApis.map((x) => {\n switch (x.kind) {\n case \"const\":\n return compareConst(x.pallet, x.name)\n case \"storage\":\n return compareStorage(x.pallet, x.name)\n case \"view\":\n return compareViewFn(x.pallet, x.name)\n case \"api\":\n return compareRuntimeApi(x.group, x.name)\n default:\n return compareEnumEntries(x as any)\n }\n })\n\n return { added, removed, kept }\n}\n"],"names":["mapObject","enumValueEntryPointNode","voidEntryPointNode","unifyMetadata","decAnyMetadata","getLookupFn","mapLookupToTypedef","entryPointsAreCompatible","singleValueEntryPoint","storageEntryPoint","runtimeCallEntryPoint"],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@polkadot-api/compare-runtimes",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"author": "Josep M Sobrepere (https://github.com/josepot)",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "git+https://github.com/polkadot-api/polkadot-api.git"
|
|
8
|
+
},
|
|
9
|
+
"license": "MIT",
|
|
10
|
+
"sideEffects": false,
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"node": {
|
|
14
|
+
"production": {
|
|
15
|
+
"import": "./dist/esm/index.mjs",
|
|
16
|
+
"require": "./dist/min/index.js",
|
|
17
|
+
"default": "./dist/index.js"
|
|
18
|
+
},
|
|
19
|
+
"import": "./dist/esm/index.mjs",
|
|
20
|
+
"require": "./dist/index.js",
|
|
21
|
+
"default": "./dist/index.js"
|
|
22
|
+
},
|
|
23
|
+
"module": "./dist/esm/index.mjs",
|
|
24
|
+
"import": "./dist/esm/index.mjs",
|
|
25
|
+
"require": "./dist/index.js",
|
|
26
|
+
"default": "./dist/index.js"
|
|
27
|
+
},
|
|
28
|
+
"./package.json": "./package.json"
|
|
29
|
+
},
|
|
30
|
+
"main": "./dist/index.js",
|
|
31
|
+
"module": "./dist/esm/index.mjs",
|
|
32
|
+
"browser": "./dist/esm/index.mjs",
|
|
33
|
+
"types": "./dist/index.d.ts",
|
|
34
|
+
"files": [
|
|
35
|
+
"dist"
|
|
36
|
+
],
|
|
37
|
+
"dependencies": {
|
|
38
|
+
"@polkadot-api/metadata-builders": "0.12.2",
|
|
39
|
+
"@polkadot-api/substrate-bindings": "0.14.0",
|
|
40
|
+
"@polkadot-api/metadata-compatibility": "0.2.4",
|
|
41
|
+
"@polkadot-api/utils": "0.2.0"
|
|
42
|
+
},
|
|
43
|
+
"scripts": {
|
|
44
|
+
"build-core": "tsc --noEmit && rollup -c ../../rollup.config.js",
|
|
45
|
+
"build": "pnpm build-core",
|
|
46
|
+
"test": "echo 'no tests'",
|
|
47
|
+
"lint": "prettier --check README.md \"src/**/*.{js,jsx,ts,tsx,json,md}\"",
|
|
48
|
+
"format": "prettier --write README.md \"src/**/*.{js,jsx,ts,tsx,json,md}\""
|
|
49
|
+
}
|
|
50
|
+
}
|