API reference › @evolu/common › local‑first/Query › evoluJsonObjectFrom
function evoluJsonObjectFrom<O>(
expr: SelectQueryBuilderExpression<O>,
): RawBuilder<Simplify<O> | null>;
Defined in: packages/common/src/local-first/Query.ts:224
An improved Evolu version of Kysely's SQLite jsonObjectFrom helper.
Kysely's ParseJSONResultsPlugin heuristically parses any result string that
looks like JSON. Evolu instead prefixes JSON produced by these helpers with a
per-runtime identifier and only parses values carrying that prefix, avoiding
accidental parsing of ordinary string columns that merely happen to start
with { or [.
The subquery must only return one row.
Example
import {
createQueryBuilder,
evoluJsonObjectFrom,
id,
NonEmptyTrimmedString100,
SqliteBoolean,
} from "@evolu/common";
const PersonId = id("Person");
const Schema = {
person: { id: PersonId },
pet: {
id: id("Pet"),
name: NonEmptyTrimmedString100,
personId: PersonId,
isFavorite: SqliteBoolean,
},
};
const createQuery = createQueryBuilder(Schema);
const people = createQuery((db) =>
db
.selectFrom("person")
.select(["person.id"])
.select((eb) => [
evoluJsonObjectFrom(
eb
.selectFrom("pet")
.select(["pet.id as petId", "pet.name"])
.whereRef("pet.personId", "=", "person.id")
.where("pet.isFavorite", "=", 1),
).as("favoritePet"),
]),
);
expectTypeOf<typeof people.Row.favoritePet>().toEqualTypeOf<{
petId: typeof Schema.pet.id.Output;
name: NonEmptyTrimmedString100 | null;
} | null>();