UNPKG

envio

Version:

A latency and sync speed optimized, developer friendly blockchain data indexer.

134 lines (126 loc) 4.2 kB
export type { logger as Logger, effect as Effect, effectContext as EffectContext, effectArgs as EffectArgs, effectOptions as EffectOptions, blockEvent as BlockEvent, onBlockArgs as OnBlockArgs, onBlockOptions as OnBlockOptions, } from "./src/Envio.gen.ts"; export type { EffectCaller } from "./src/Types.ts"; import type { effect as Effect, effectArgs as EffectArgs, } from "./src/Envio.gen.ts"; import { schema as bigDecimalSchema } from "./src/bindings/BigDecimal.gen.ts"; import { schema as bigintSchema } from "./src/bindings/BigInt.gen.ts"; import * as Sury from "rescript-schema"; type UnknownToOutput<T> = T extends Sury.Schema<unknown> ? Sury.Output<T> : T extends (...args: any[]) => any ? T : T extends unknown[] ? { [K in keyof T]: UnknownToOutput<T[K]> } : T extends { [k in keyof T]: unknown } ? Flatten< { [k in keyof T as HasUndefined<UnknownToOutput<T[k]>> extends true ? k : never]?: UnknownToOutput<T[k]>; } & { [k in keyof T as HasUndefined<UnknownToOutput<T[k]>> extends true ? never : k]: UnknownToOutput<T[k]>; } > : T; type HasUndefined<T> = [T] extends [undefined] ? true : undefined extends T ? true : false; // Utility to flatten the type into a single object type Flatten<T> = T extends object ? { [K in keyof T as T[K] extends never ? never : K]: T[K] } : T; // All the type gymnastics with generics to be able to // define schema without an additional `S.schema` call in TS: // createEffect({ // input: undefined, // }) // Instead of: // createEffect({ // input: S.schema(undefined), // }) // Or for objects: // createEffect({ // input: { // foo: S.string, // }, // }) // Instead of: // createEffect({ // input: S.schema({ // foo: S.string, // }), // }) // The behaviour is inspired by Sury code: // https://github.com/DZakh/sury/blob/551f8ee32c1af95320936d00c086e5fb337f59fa/packages/sury/src/S.d.ts#L344C1-L355C50 export function experimental_createEffect< IS, OS, I = UnknownToOutput<IS>, O = UnknownToOutput<OS>, // A hack to enforce that the inferred return type // matches the output schema type R extends O = O >( options: { /** The name of the effect. Used for logging and debugging. */ readonly name: string; /** The input schema of the effect. */ readonly input: IS; /** The output schema of the effect. */ readonly output: OS; /** Whether the effect should be cached. */ readonly cache?: boolean; }, handler: (args: EffectArgs<I>) => Promise<R> ): Effect<I, O>; // Important! Should match the index.js file export declare namespace S { export type Output<T> = Sury.Output<T>; export type Infer<T> = Sury.Output<T>; export type Input<T> = Sury.Input<T>; export type Schema<Output, Input = unknown> = Sury.Schema<Output, Input>; export const string: typeof Sury.string; export const jsonString: typeof Sury.jsonString; export const boolean: typeof Sury.boolean; export const int32: typeof Sury.int32; export const number: typeof Sury.number; export const bigint: typeof bigintSchema; export const never: typeof Sury.never; export const union: typeof Sury.union; export const object: typeof Sury.object; // Might change in a near future // export const custom: typeof Sury.custom; // Don't expose recursive for now, since it's too advanced // export const recursive: typeof Sury.recursive; export const transform: typeof Sury.transform; export const shape: typeof Sury.shape; export const refine: typeof Sury.refine; export const schema: typeof Sury.schema; export const record: typeof Sury.record; export const array: typeof Sury.array; export const tuple: typeof Sury.tuple; export const merge: typeof Sury.merge; export const optional: typeof Sury.optional; export const nullable: typeof Sury.nullable; export const bigDecimal: typeof bigDecimalSchema; export const unknown: typeof Sury.unknown; // Nullish type will change in "sury@10" // export const nullish: typeof Sury.nullish; export const assertOrThrow: typeof Sury.assertOrThrow; export const parseOrThrow: typeof Sury.parseOrThrow; }