@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 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":"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"}
@@ -0,0 +1,3 @@
1
+ export { compareRuntimes } from './compare-runtimes.mjs';
2
+ export { CompatibilityLevel } from '@polkadot-api/metadata-compatibility';
3
+ //# sourceMappingURL=index.mjs.map
@@ -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;;;;"}
@@ -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
+ }