@ckb-cobuild/molecule
v1.1.0
Published
An opinionated [molecule](https://github.com/nervosnetwork/molecule) library which defines schema in code.
Downloads
17
Readme
@ckb-cobuild/molecule
An opinionated molecule library which defines schema in code.
Browser Compatibility
TypedArray
: Can I Use?DataView
: Can I Use?BigInt
: Can I Use?
Compare With @ckb-lumos/codec
The differences between @ckb-cobuild/molecule
and @ckb-lumos/codec
:
- Lumos is flexible on the parameter type of the
pack
function, this library is strict and providesparse
,safeParse
,around
to do conversions. - Lumos table codec fields are nullable, this library only allows null for option field.
- This library supports schema validation via
parse
andsafeParse
. - This library supports exporting molecule schema to
.mol
file.
About the Interface
This library prefers better type inferring and checking to sipmle schema definition. There will be many type names repetitions because of the limitation of TypeScript.
Example
Coerce
import { mol } from "@ckb-cobuild/molecule";
const ByteCoerce = mol.byte.beforeParse((input: any) => Number(input));
Use Different JavaScript Value
import { mol } from "@ckb-cobuild/molecule";
const ByteOpt = mol.option("ByteOpt", mol.byte);
const BooleanOpt = ByteOpt.around({
safeParse: (input: boolean | null) => mol.parseSuccess(input),
willPack: (input: boolean | null) =>
input !== null ? (input ? 1 : 0) : null,
didUnpack: (value: number | null) => (value !== null ? value !== 0 : null),
});
Validation
const result = codec.safeParse({/*...*/});
expect(result.success).toBeFalsy();
if (!result.success) {
const messages = result.error.collectMessages();
expect(messages).toEqual([
"//: Struct member parse failed",
"//a: Expected integer from 0 to 255, found undefined",
"//b: Array member parse failed",
"//b/0: Expected object, found null",
"//b/2: Struct member parse failed",
"//b/2/b2: Array member parse failed",
"//b/2/b2/1: Expected integer from 0 to 255, found -1",
]);
}
Export Schema
import { mol } from "@ckb-cobuild/molecule";
const ByteOpt = mol.option("ByteOpt", mol.byte);
const ByteOptOpt = mol.option("ByteOptOpt", ByteOpt);
export(Array.from(ByteOptOpt.exportSchema().values())).toEqual([
"option ByteOpt (byte);",
"option ByteOptOpt (ByteOpt);",
]);