envio
Version:
A latency and sync speed optimized, developer friendly blockchain data indexer.
134 lines (126 loc) • 4.2 kB
TypeScript
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;
}