diff --git a/src/cbor/decoder.ts b/src/cbor/decoder.ts index ba571a20..96d5b0b4 100644 --- a/src/cbor/decoder.ts +++ b/src/cbor/decoder.ts @@ -4,7 +4,7 @@ import { Reader } from "./reader"; import { Tagged } from "./tagged"; import { infiniteBytes } from "./util"; -interface DecodeOptions { +export interface DecodeOptions { map?: "object" | "map"; replacer?: Replacer; } diff --git a/src/cbor/encoder.ts b/src/cbor/encoder.ts index 32e8b8c9..0694dc8c 100644 --- a/src/cbor/encoder.ts +++ b/src/cbor/encoder.ts @@ -6,7 +6,7 @@ import { PartiallyEncoded } from "./partial"; import { Tagged } from "./tagged"; import { Writer } from "./writer"; -interface EncoderOptions { +export interface EncoderOptions { replacer?: Replacer; writer?: Writer; partial?: Partial; diff --git a/src/cbor/partial.ts b/src/cbor/partial.ts index 38274a6c..35d182a1 100644 --- a/src/cbor/partial.ts +++ b/src/cbor/partial.ts @@ -1,5 +1,5 @@ import type { Replacer } from "./constants"; -import { encode } from "./encoder"; +import { type EncoderOptions, encode } from "./encoder"; import { CborFillMissing } from "./error"; import type { Fill, Gap } from "./gap"; import { Writer } from "./writer"; @@ -41,12 +41,12 @@ export class PartiallyEncoded { export function partiallyEncodeObject( object: Record, - fills?: Fill[], + options?: EncoderOptions, ): Record { return Object.fromEntries( Object.entries(object).map(([k, v]) => [ k, - encode(v, { fills, partial: true }), + encode(v, { ...options, partial: true }), ]), ); } diff --git a/src/surreal.ts b/src/surreal.ts index bb91ece8..b23ea540 100644 --- a/src/surreal.ts +++ b/src/surreal.ts @@ -34,6 +34,7 @@ import { } from "./types.ts"; import { type Fill, partiallyEncodeObject } from "./cbor"; +import { replacer } from "./data/cbor.ts"; import { HttpEngine } from "./engines/http.ts"; import { WebsocketEngine } from "./engines/ws.ts"; import { @@ -432,7 +433,13 @@ export class Surreal { ): Promise>> { const params = q instanceof PreparedQuery - ? [q.query, partiallyEncodeObject(q.bindings, b as Fill[])] + ? [ + q.query, + partiallyEncodeObject(q.bindings, { + fills: b as Fill[], + replacer: replacer.encode, + }), + ] : [q, b]; await this.ready; diff --git a/src/util/PreparedQuery.ts b/src/util/PreparedQuery.ts index a388fca5..d5adbccc 100644 --- a/src/util/PreparedQuery.ts +++ b/src/util/PreparedQuery.ts @@ -5,6 +5,7 @@ import { encode, partiallyEncodeObject, } from "../cbor"; +import { replacer } from "../data/cbor"; export type ConvertMethod = (result: unknown[]) => T; export class PreparedQuery< @@ -15,7 +16,9 @@ export class PreparedQuery< constructor(query: string, bindings?: Record, convert?: C) { this.query = new Encoded(encode(query)); - this.bindings = partiallyEncodeObject(bindings ?? {}); + this.bindings = partiallyEncodeObject(bindings ?? {}, { + replacer: replacer.encode, + }); } build(gaps?: Fill[]): ArrayBuffer { diff --git a/tests/integration/tests/querying.test.ts b/tests/integration/tests/querying.test.ts index bbbecf68..0a1504ab 100644 --- a/tests/integration/tests/querying.test.ts +++ b/tests/integration/tests/querying.test.ts @@ -381,6 +381,13 @@ describe("template literal", async () => { const res = await surreal.query(query, [gap.fill(789)]); expect(res).toStrictEqual([[123, 456, 789]]); }); + + test("has replacer context", async () => { + const id = new RecordId("test", 123); + const query = surql`RETURN ${id}`; + const res = await surreal.query(query); + expect(res).toStrictEqual([id]); + }); }); test("query", async () => {