mirror of
https://github.com/pezkuwichain/pezkuwi-api.git
synced 2026-11-06 15:31:12 +00:00
* 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.
150 lines
3.7 KiB
TypeScript
150 lines
3.7 KiB
TypeScript
import {
|
|
Codec,
|
|
CodecType,
|
|
Decoder,
|
|
DecoderType,
|
|
Encoder,
|
|
EncoderType,
|
|
Enum as OEnum,
|
|
StringRecord,
|
|
createCodec,
|
|
} from "scale-ts"
|
|
import { mapObject } from "@pezkuwi/papi-utils"
|
|
import { Enum } from "@/types/enum"
|
|
import { withInner } from "./with-inner"
|
|
|
|
type Tuple<T, N extends number> = readonly [T, ...T[]] & { length: N }
|
|
|
|
type Push<T extends any[], V> = [...T, V]
|
|
|
|
type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (
|
|
k: infer I,
|
|
) => void
|
|
? I
|
|
: never
|
|
|
|
type LastOf<T> =
|
|
UnionToIntersection<T extends any ? () => T : never> extends () => infer R
|
|
? R
|
|
: never
|
|
|
|
type TuplifyUnion<
|
|
T,
|
|
L = LastOf<T>,
|
|
N = [T] extends [never] ? true : false,
|
|
> = true extends N ? [] : Push<TuplifyUnion<Exclude<T, L>>, L>
|
|
|
|
type RestrictedLenTuple<T, O extends StringRecord<any>> = Tuple<
|
|
T,
|
|
TuplifyUnion<keyof O> extends Tuple<any, infer V> ? V : 0
|
|
>
|
|
|
|
const VariantEnc: <O extends StringRecord<Encoder<any>>>(
|
|
inner: O,
|
|
x?: RestrictedLenTuple<number, O> | undefined,
|
|
) => Encoder<
|
|
Enum<{
|
|
[K in keyof O]: EncoderType<O[K]>
|
|
}>
|
|
> & { inner: O } = (...args) => {
|
|
const enc = OEnum.enc(...(args as [any, any]))
|
|
return withInner((v: any) => enc({ tag: v.type, value: v.value }), args[0])
|
|
}
|
|
|
|
const VariantDec: <O extends StringRecord<Decoder<any>>>(
|
|
inner: O,
|
|
x?: RestrictedLenTuple<number, O> | undefined,
|
|
) => Decoder<
|
|
Enum<{
|
|
[K in keyof O]: DecoderType<O[K]>
|
|
}>
|
|
> & { inner: O } = (...args) => {
|
|
const dec = OEnum.dec(...(args as [any]))
|
|
return withInner((v: any) => {
|
|
const { tag, value } = dec(v)
|
|
return Enum(tag as any, value as any) as any
|
|
}, args[0])
|
|
}
|
|
|
|
export const Variant: {
|
|
<O extends StringRecord<Codec<any>>>(
|
|
inner: O,
|
|
indexes?: RestrictedLenTuple<number, O> | undefined,
|
|
): Codec<
|
|
Enum<{
|
|
[K in keyof O]: CodecType<O[K]>
|
|
}>
|
|
> & { inner: O }
|
|
enc: <O_1 extends StringRecord<Encoder<any>>>(
|
|
inner: O_1,
|
|
x?: RestrictedLenTuple<number, O_1> | undefined,
|
|
) => Encoder<
|
|
Enum<{
|
|
[K in keyof O_1]: EncoderType<O_1[K]>
|
|
}>
|
|
> & { inner: O_1 }
|
|
dec: <O_2 extends StringRecord<Decoder<any>>>(
|
|
inner: O_2,
|
|
x?: RestrictedLenTuple<number, O_2> | undefined,
|
|
) => Decoder<
|
|
Enum<{
|
|
[K in keyof O_2]: DecoderType<O_2[K]>
|
|
}>
|
|
> & { inner: O_2 }
|
|
} = (inner, ...args) =>
|
|
withInner(
|
|
createCodec(
|
|
VariantEnc(
|
|
mapObject(inner, ([encoder]) => encoder) as any,
|
|
...(args as any[]),
|
|
),
|
|
VariantDec(
|
|
mapObject(inner, ([, decoder]) => decoder) as any,
|
|
...(args as any[]),
|
|
) as any,
|
|
),
|
|
inner,
|
|
) as any
|
|
Variant.enc = VariantEnc
|
|
Variant.dec = VariantDec
|
|
|
|
export const ScaleEnum: {
|
|
<O extends StringRecord<Codec<any>>>(
|
|
inner: O,
|
|
indexes?: RestrictedLenTuple<number, O> | undefined,
|
|
): Codec<
|
|
{
|
|
[K in keyof O]: {
|
|
tag: K
|
|
value: CodecType<O[K]>
|
|
}
|
|
}[keyof O]
|
|
> & { inner: O }
|
|
enc: <O_1 extends StringRecord<Encoder<any>>>(
|
|
inner: O_1,
|
|
x?: RestrictedLenTuple<number, O_1> | undefined,
|
|
) => Encoder<
|
|
{
|
|
[K_1 in keyof O_1]: {
|
|
tag: K_1
|
|
value: EncoderType<O_1[K_1]>
|
|
}
|
|
}[keyof O_1]
|
|
> & { inner: O_1 }
|
|
dec: <O_2 extends StringRecord<Decoder<any>>>(
|
|
inner: O_2,
|
|
x?: RestrictedLenTuple<number, O_2> | undefined,
|
|
) => Decoder<
|
|
{
|
|
[K_2 in keyof O_2]: {
|
|
tag: K_2
|
|
value: DecoderType<O_2[K_2]>
|
|
}
|
|
}[keyof O_2]
|
|
> & { inner: O_2 }
|
|
} = (inner, ...args) => withInner(OEnum(inner, ...(args as any[])), inner)
|
|
ScaleEnum.enc = (inner, ...rest) =>
|
|
withInner(OEnum.enc(inner, ...(rest as any[])), inner)
|
|
ScaleEnum.dec = (inner, ...rest) =>
|
|
withInner(OEnum.dec(inner, ...(rest as any[])), inner)
|