UNPKG

@tai-kun/surrealdb

Version:

The SurrealDB SDK for JavaScript

120 lines (102 loc) 3.15 kB
import type { EncodedCBOR, EncodedJSON } from "@tai-kun/surrealdb/formatter"; import type { PreparedQueryLike, SlotLike } from "@tai-kun/surrealdb/types"; declare const NONE: unique symbol; type None = typeof NONE; const passthrough = (v: unknown): any => v; export interface PreparedQueryOptions< TResults extends readonly unknown[] = any[], TTransformed = any, > { readonly parse?: ((results: unknown[]) => TResults) | undefined; readonly trans?: ((results: TResults) => TTransformed) | undefined; readonly encodedText?: | string | EncodedJSON<string> | EncodedCBOR<string> | undefined; } export default class PreparedQuery< TSlot extends SlotLike, TResults extends unknown[] = unknown[], TTransformed = None, > implements PreparedQueryLike { readonly text: string | EncodedJSON<string> | EncodedCBOR<string>; readonly originalText: string; // @ts-expect-error 型だけ readonly __type: TTransformed extends None ? TResults : TTransformed; readonly _parse: (results: unknown[]) => TResults; readonly _trans: (results: TResults) => TTransformed; constructor( text: string, readonly vars: { readonly [p: string]: unknown }, readonly slots: readonly TSlot[], options: PreparedQueryOptions<TResults, TTransformed> = {}, ) { this.text = options.encodedText || text; this.originalText = text; this._parse = options.parse || passthrough; this._trans = options.trans || passthrough; } /** * @alias {@link type} */ as<TResults extends unknown[] = unknown[]>(): PreparedQuery< TSlot, TResults, TTransformed >; /** * @alias {@link type} */ as<TResults extends unknown[] = unknown[]>( parser: (results: unknown[]) => TResults, ): PreparedQuery<TSlot, TResults, TTransformed>; as( parser: (results: unknown[]) => TResults = this._parse, ): PreparedQuery<TSlot, TResults, TTransformed> { const This = this.constructor as typeof PreparedQuery; return new This(this.originalText, this.vars, this.slots, { parse: parser, trans: this._trans, encodedText: this.text, }); } /** * @alias {@link as} */ type<TResults extends unknown[] = unknown[]>(): PreparedQuery< TSlot, TResults, TTransformed >; /** * @alias {@link as} */ type<TResults extends unknown[] = unknown[]>( parser: (results: unknown[]) => TResults, ): PreparedQuery<TSlot, TResults, TTransformed>; type(parser = this._parse): PreparedQuery<SlotLike, any, any> { return this.as(parser); } /** * @alias {@link transform} */ to<TTransformed>( transformer: (results: TResults) => TTransformed, ): PreparedQuery<TSlot, TResults, TTransformed> { const This = this.constructor as typeof PreparedQuery; return new This(this.originalText, this.vars, this.slots, { parse: this._parse, trans: transformer, encodedText: this.text, }); } /** * @alias {@link to} */ transform<TTransformed>( transformer: (results: TResults) => TTransformed, ): PreparedQuery<TSlot, TResults, TTransformed> { return this.to(transformer); } }