Files
pezkuwi-api/packages/bizinikiwi-bindings/upstream-src/codecs/metadata/unified.ts
T
SatoshiQaziMuhammed e3c72817fb chore(papi): commit the sources behind the four polkadot-api packages (#15)
* chore(papi): commit the sources behind the four polkadot-api packages

papi-utils, bizinikiwi-bindings, metadata-builders and merkleize-metadata
held only dist/ builds, and no repository held their source. Every
source map in dist/ embeds the TypeScript it was compiled from; that is
now committed as src/ (59 files), and it matches upstream polkadot-api
(MIT) exactly once @polkadot-api/* imports are renamed:

  papi-utils           @polkadot-api/utils 0.2.0
  bizinikiwi-bindings  @polkadot-api/substrate-bindings 0.16.6
  metadata-builders    @polkadot-api/metadata-builders 0.13.0-0.13.2
  merkleize-metadata   @polkadot-api/merkleize-metadata 1.1.21-1.1.23

scripts/check-papi-sources.mjs, run in the lint job, fails unless the
source embedded in dist/ is exactly the committed src/. tsconfig.json
excludes these src/ trees; ESLint already skipped the packages. Each
README now states the upstream package and version.

* chore(papi): keep the upstream sources in upstream-src/

The pezkuwi-dev build treats any package with a src/ directory as its
own: it requires our license header on every file and builds it. These
are upstream files that must stay byte-identical to the source embedded
in dist/, so they live in upstream-src/ instead, which neither the build
nor the root tsconfig picks up.
2026-10-19 22:50:59 +04:00

162 lines
4.2 KiB
TypeScript

import { CodecType } from "scale-ts"
import { V14Lookup } from "./lookup"
import { storageMap } from "./pallets"
import { HexString } from "../scale"
import { itemDeprecation, variantDeprecation } from "./deprecation"
import { viewFunction } from "./runtime-api"
import { V14 } from "./v14"
import { V16 } from "./v16"
import { V15 } from "./v15"
import { Metadata } from "./metadata"
type EnumRef<T> =
| ({
type: number
} & (T extends 16
? { deprecationInfo: CodecType<typeof variantDeprecation> }
: {}))
| undefined
type DeprecationInfo<T> = T extends 16
? { deprecationInfo: CodecType<typeof itemDeprecation> }
: {}
export type UnifiedMetadata<T extends 14 | 15 | 16 = 14 | 15 | 16> = {
version: T
lookup: V14Lookup
pallets: Array<
{
name: string
storage:
| {
prefix: string
items: Array<
{
name: string
modifier: number
type:
| { tag: "plain"; value: number }
| { tag: "map"; value: CodecType<typeof storageMap> }
fallback: HexString
docs: string[]
} & DeprecationInfo<T>
>
}
| undefined
calls: EnumRef<T>
events: EnumRef<T>
constants: Array<
{
name: string
type: number
value: HexString
docs: string[]
} & DeprecationInfo<T>
>
errors: EnumRef<T>
associatedTypes: Array<{
name: string
type: number
docs: string[]
}>
viewFns: Array<CodecType<typeof viewFunction>>
index: number
docs: string[]
} & DeprecationInfo<T>
>
extrinsic: {
version: number[]
signedExtensions: Array<{
identifier: string
type: number
additionalSigned: number
}>
} & (T extends 14
? {
type: number
}
: { address: number; call: number; signature: number }) &
(T extends 16
? { signedExtensionsByVersion: Array<[number, number[]]> }
: {})
apis: Array<
{
name: string
methods: Array<
{
name: string
inputs: Array<{ name: string; type: number }>
output: number
docs: string[]
} & DeprecationInfo<T>
>
docs: string[]
} & (T extends 16 ? { version: number } : {}) &
DeprecationInfo<T>
>
} & (T extends 14
? {}
: {
outerEnums: { call: number; event: number; error: number }
custom: Array<[string, { type: number; value: HexString }]>
})
export const unifyMetadata = (
metadata: Metadata | Metadata["metadata"] | V14 | V15 | V16,
): UnifiedMetadata => {
// complete metadata
if ("magicNumber" in metadata) metadata = metadata.metadata
if ("tag" in metadata) {
if (
metadata.tag !== "v14" &&
metadata.tag !== "v15" &&
metadata.tag !== "v16"
)
throw new Error("Only metadata 14, 15, and 16 are supported")
metadata = metadata.value
}
// v16
if ("signedExtensionsByVersion" in metadata.extrinsic) {
return { version: 16, ...(metadata as V16) }
}
// v15
if ("custom" in metadata) {
const { lookup, extrinsic, custom, apis, pallets, outerEnums } =
metadata as V15
return {
version: 15,
lookup,
pallets: pallets.map((p): UnifiedMetadata<15>["pallets"][number] => ({
...p,
calls: p.calls != null ? { type: p.calls } : undefined,
events: p.events != null ? { type: p.events } : undefined,
errors: p.errors != null ? { type: p.errors } : undefined,
viewFns: [],
associatedTypes: [],
})),
extrinsic: { ...extrinsic, version: [extrinsic.version] },
apis,
outerEnums,
custom,
}
}
// fallback, v14
const { lookup, extrinsic, pallets } = metadata as V14
return {
version: 14,
lookup,
pallets: pallets.map((p): UnifiedMetadata<14>["pallets"][number] => ({
...p,
calls: p.calls != null ? { type: p.calls } : undefined,
events: p.events != null ? { type: p.events } : undefined,
errors: p.errors != null ? { type: p.errors } : undefined,
viewFns: [],
associatedTypes: [],
})),
extrinsic: { ...extrinsic, version: [extrinsic.version] },
apis: [],
}
}