@spooky-sync/query-builder 0.0.1-canary.69 → 0.0.1-canary.70
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +29 -4
- package/dist/index.d.mts.map +1 -1
- package/dist/index.d.ts +29 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -9
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +16 -9
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/query-builder.test.ts +70 -0
- package/src/query-builder.ts +36 -15
- package/src/types.ts +34 -3
package/dist/index.d.mts
CHANGED
|
@@ -217,9 +217,34 @@ interface RelatedQuery {
|
|
|
217
217
|
/** The cardinality of the relationship */
|
|
218
218
|
cardinality: 'one' | 'many';
|
|
219
219
|
}
|
|
220
|
+
/**
|
|
221
|
+
* Comparison-operator descriptor for a single WHERE field, e.g.
|
|
222
|
+
* `{ _op: '<=', _val: 5 }` → `field <= $field`. A `$`-prefixed string `_val`
|
|
223
|
+
* references an existing query param verbatim; `_swap: true` flips the operands
|
|
224
|
+
* (`$val _op field`). Plain values still mean equality (`field = $field`).
|
|
225
|
+
*/
|
|
226
|
+
interface ComparisonOp {
|
|
227
|
+
_op: '=' | '!=' | '>' | '>=' | '<' | '<=' | (string & {});
|
|
228
|
+
_val: unknown;
|
|
229
|
+
_swap?: boolean;
|
|
230
|
+
}
|
|
231
|
+
/** A single WHERE field value: an equality value or a comparison descriptor. */
|
|
232
|
+
type WhereFieldValue<V> = V | ComparisonOp;
|
|
233
|
+
/** A flat conjunction of field conditions (equality or comparison). */
|
|
234
|
+
type WhereConditions<TModel extends GenericModel> = { [K in keyof TModel]?: WhereFieldValue<TModel[K]> };
|
|
235
|
+
/**
|
|
236
|
+
* WHERE input for `.where()`. Supports equality (`{ field: value }`), comparison
|
|
237
|
+
* operators (`{ field: { _op, _val } }`), and a single top-level `_or` group of
|
|
238
|
+
* condition fragments that compile to a parenthesised `(... OR ...)` conjunct —
|
|
239
|
+
* e.g. `{ _or: [{ white: x }, { black: x }] }` → `(white = $or0 OR black = $or1)`.
|
|
240
|
+
* Backward-compatible with plain `Partial<TModel>` equality objects.
|
|
241
|
+
*/
|
|
242
|
+
type WhereInput<TModel extends GenericModel> = WhereConditions<TModel> & {
|
|
243
|
+
_or?: WhereConditions<TModel>[];
|
|
244
|
+
};
|
|
220
245
|
interface QueryOptions<TModel extends GenericModel, IsOne extends boolean> {
|
|
221
246
|
select?: ((keyof TModel & string) | '*')[];
|
|
222
|
-
where?:
|
|
247
|
+
where?: WhereInput<TModel>;
|
|
223
248
|
limit?: number;
|
|
224
249
|
offset?: number;
|
|
225
250
|
orderBy?: Partial<Record<keyof TModel, 'asc' | 'desc'>>;
|
|
@@ -231,7 +256,7 @@ type LiveQueryOptions<TModel extends GenericModel> = Omit<QueryOptions<TModel, b
|
|
|
231
256
|
type QueryModifier<TModel extends GenericModel> = (builder: QueryModifierBuilder<TModel>) => QueryModifierBuilder<TModel>;
|
|
232
257
|
type SchemaAwareQueryModifier<S extends SchemaStructure, TableName extends TableNames<S>, RelatedFields extends Record<string, any> = {}> = (builder: SchemaAwareQueryModifierBuilder<S, TableName, {}>) => SchemaAwareQueryModifierBuilder<S, TableName, RelatedFields>;
|
|
233
258
|
interface QueryModifierBuilder<TModel extends GenericModel> {
|
|
234
|
-
where(conditions:
|
|
259
|
+
where(conditions: WhereInput<TModel>): this;
|
|
235
260
|
select(...fields: ((keyof TModel & string) | '*')[]): this;
|
|
236
261
|
limit(count: number): this;
|
|
237
262
|
offset(count: number): this;
|
|
@@ -240,7 +265,7 @@ interface QueryModifierBuilder<TModel extends GenericModel> {
|
|
|
240
265
|
_getOptions(): QueryOptions<TModel, boolean>;
|
|
241
266
|
}
|
|
242
267
|
interface SchemaAwareQueryModifierBuilder<S extends SchemaStructure, TableName extends TableNames<S>, RelatedFields extends Record<string, any> = {}> {
|
|
243
|
-
where(conditions:
|
|
268
|
+
where(conditions: WhereInput<TableModel<GetTable<S, TableName>>>): this;
|
|
244
269
|
select(...fields: ((keyof TableModel<GetTable<S, TableName>> & string) | '*')[]): this;
|
|
245
270
|
limit(count: number): this;
|
|
246
271
|
offset(count: number): this;
|
|
@@ -380,7 +405,7 @@ declare class QueryBuilder<const S extends SchemaStructure, const TableName exte
|
|
|
380
405
|
/**
|
|
381
406
|
* Add additional where conditions
|
|
382
407
|
*/
|
|
383
|
-
where(conditions:
|
|
408
|
+
where(conditions: WhereInput<TableModel<GetTable<S, TableName>>>): QueryBuilder<S, TableName, R, RelatedFields, IsOne>;
|
|
384
409
|
/**
|
|
385
410
|
* Specify fields to select
|
|
386
411
|
*/
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/table-schema.ts","../src/types.ts","../src/query-builder.ts"],"sourcesContent":[],"mappings":"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iBFpD2B,CAAA,sBEoDa,gBFpDb,CAAA,GAAA,MEoDuC,aFpDvC;AActB,KEwCL,oBAAA,GFxCoB;EAAA,EAAA,EAAA,MAAA;aAGK,EAAA,KAAA,GAAA,MAAA;eAAf,EEwCL,gBFxCK;;AASc,KEkCxB,gBAAA,GAAmB,MFlCK,CAAA,MAAA,EEkCU,oBFlCV,CAAA;;;;AAEN,KEqClB,kBFrCkB,CAAA,UEsClB,eFtCkB,EAAA,sBEuCN,gBFvCM,CAAA,GAAA,QAAsB,MEyCtC,aFzCsC,GEyCtB,WFzCsB,CE0ChD,CF1CgD,EE2ChD,aF3CgD,CE2ClC,CF3CkC,CAAA,CAAA,IAAA,CAAA,EE4ChD,aF5CgD,CE4ClC,CF5CkC,CAAA,CAAA,eAAA,CAAA,EE6ChD,aF7CgD,CE6ClC,CF7CkC,CAAA,CAAA,aAAA,CAAA,SAAA,KAAA,GAAA,IAAA,GAAA,KAAA,CAAA,EAGpD;AAA4C,KE8ChC,mBF9CgC,CAAA,UE+ChC,eF/CgC,EAAA,kBEgDxB,UFhDwB,CEgDb,CFhDa,CAAA,EAAA,sBEiDpB,gBFjDoB,CAAA,GEkDxC,IFlDwC,CEkDnC,UFlDmC,CEkDxB,QFlDwB,CEkDf,CFlDe,EEkDZ,SFlDY,CAAA,CAAA,EEkDC,iBFlDD,CEkDmB,aFlDnB,CAAA,CAAA,GEmD1C,kBFnD0C,CEmDvB,CFnDuB,EEmDpB,aFnDoB,CAAA;AAEV,KEmDtB,oBFnDsB,CAAA,UEoDtB,eFpDsB,EAAA,kBEqDd,UFrDc,CEqDH,CFrDG,CAAA,EAAA,sBEsDV,gBFtDU,CAAA,GAAA,CEuD7B,IFvD6B,CEuDxB,UFvDwB,CEuDb,QFvDa,CEuDJ,CFvDI,EEuDD,SFvDC,CAAA,CAAA,EEuDY,iBFvDZ,CEuD8B,aFvD9B,CAAA,CAAA,GEwDhC,kBFxDgC,CEwDb,CFxDa,EEwDV,aFxDU,CAAA,CAAA,EAAA;;;AAGlC;;AACgC,KE0DpB,WF1DoB,CAAA,UE2DpB,eF3DoB,EAAA,kBE4DZ,UF5DY,CE4DD,CF5DC,CAAA,EAAA,sBE6DR,gBF7DQ,EAAA,cAAA,OAAA,CAAA,GE+D5B,KF/D4B,SAAA,IAAA,GEgE5B,mBFhE4B,CEgER,CFhEQ,EEgEL,SFhEK,EEgEM,aFhEN,CAAA,GEiE5B,oBFjE4B,CEiEP,CFjEO,EEiEJ,SFjEI,EEiEO,aFjEP,CAAA;AAAf,cEmEJ,UFnEI,CAAA,UEoEL,eFpEK,EAAA,kBEqEG,UFrEH,CEqEc,CFrEd,CAAA,EAAA,UAAA;EAAM,OAAA,EEsEA,MFtEA,CAAA,MAAA,EEsEe,YFtEf,CAAA;AAGvB,CAAA,EAAA,sBEqEwB,gBFrEuB,EAAA,cAC9B,OAAS,EAAA,IAAA,IAAA,CAAA,CAAA;EASd,iBAAW,SAAA;EAAA,iBAAA,OAAA;mBAAW,MAAA;mBAChC,QAAA;UAA8B,WAAA;aAC1B,CAAA,SAAA,EEgE0B,SFhE1B,EAAA,OAAA,EEiEwB,YFjExB,CEiEqC,UFjErC,CEiEgD,CFjEhD,CAAA,EEiEoD,KFjEpD,CAAA,EAAA,MAAA,EEkEuB,CFlEvB,EAAA,QAAA,EEmEyB,QFnEzB,CEmEkC,CFnElC,EEmEqC,CFnErC,CAAA;EAAC,GAAA,CAAA,CAAA,EE6EE,CF7EF;EAIK,gBAAY,CAAA,OAAA,EAAA,GAAA,EAAA,CAAA,EE6EY,SF7EZ;EAAA,gBAAA,CAAA,CAAA,EEiFF,SFjFE;YAAW,CAAA,CAAA,EEqFnB,SFrFmB;MAAuC,UAAA,CAAA,CAAA,EEyFtD,UFzFsD,CEyF3C,CFzF2C,EEyFxC,KFzFwC,EEyFjC,CFzFiC,CAAA;MAAZ,KAAA,CAAA,CAAA,EAAA,OAAA;MAC5D,IAAA,CAAA,CAAA,EAAA,MAAA;;;;;;AAKU,cE+MC,YF/MW,CAAA,gBEgNN,eFhNM,EAAA,wBEiNE,UFjNF,CEiNa,CFjNb,CAAA,EAAA,UAAA,IAAA,EAAA,4BEmNM,gBFnNN,GAAA,CAAA,CAAA,EAAA,oBAAA,OAAA,GAAA,KAAA,CAAA,CAAA;EAAA,iBAAA,MAAA;mBAAW,SAAA;mBAAyB,QAAA;EAAC,QAAA,OAAA;EAGjD,WAAA,CAAA,MAAa,EEoNI,CFpNJ,EAAA,SAAA,EEqNO,SFrNP,EAAA,QAAA,CAAA,EEsNM,QFtNN,CEsNe,QFtNf,CEsNwB,CFtNxB,EEsN2B,SFtN3B,CAAA,EEsNuC,CFtNvC,CAAA,EAAA,OAAA,CAAA,EEuNJ,YFvNI,CEuNS,UFvNT,CEuNoB,QFvNpB,CEuN6B,CFvN7B,EEuNgC,SFvNhC,CAAA,CAAA,EEuN6C,KFvN7C,CAAA;EAAA;;;OAEb,CAAA,UAAA,EE4NI,OF5NJ,CE4NY,UF5NZ,CE4NuB,QF5NvB,CE4NgC,CF5NhC,EE4NmC,SF5NnC,CAAA,CAAA,CAAA,CAAA,EE6NP,YF7NO,CE6NM,CF7NN,EE6NS,SF7NT,EE6NoB,CF7NpB,EE6NuB,aF7NvB,EE6NsC,KF7NtC,CAAA;;;;EAIA,MAAA,CAAA,GAAA,MAAY,EAAA,CAAA,CAAA,MEkOD,UFlOC,CEkOU,QFlOV,CEkOmB,CFlOnB,EEkOsB,SFlOtB,CAAA,CAAA,GAAA,MAAA,CAAA,GAAA,GAAA,CAAA,EAAA,CAAA,EEmOnB,YFnOmB,CEmON,CFnOM,EEmOH,SFnOG,EEmOQ,CFnOR,EEmOW,aFnOX,EEmO0B,KFnO1B,CAAA;EAAA;;;SAEZ,CAAA,KAAA,EE6OD,eF7OC,CE6Oe,QF7Of,CE6OwB,CF7OxB,EE6O2B,SF7O3B,CAAA,CAAA,EAAA,SAAA,CAAA,EAAA,KAAA,GAAA,MAAA,CAAA,EE+OP,YF/OO,CE+OM,CF/ON,EE+OS,SF/OT,EE+OoB,CF/OpB,EE+OuB,aF/OvB,EE+OsC,KF/OtC,CAAA;;;;OAEY,CAAA,KAAA,EAAA,MAAA,CAAA,EEwPA,YFxPA,CEwPa,CFxPb,EEwPgB,SFxPhB,EEwP2B,CFxP3B,EEwP8B,aFxP9B,EEwP6C,KFxP7C,CAAA;;;;QACpB,CAAA,KAAA,EAAA,MAAA,CAAA,EE+PqB,YF/PrB,CE+PkC,CF/PlC,EE+PqC,SF/PrC,EE+PgD,CF/PhD,EE+PmD,aF/PnD,EE+PkE,KF/PlE,CAAA;KAE+B,CAAA,CAAA,EEkQ1B,YFlQ0B,CEkQb,CFlQa,EEkQV,SFlQU,EEkQC,CFlQD,EEkQI,aFlQJ,EAAA,IAAA,CAAA;;;;;;SAA6C,CAAA,cEiR9D,kBFjR8D,CEiR3C,CFjR2C,EEiRxC,SFjRwC,CAAA,CAAA,OAAA,CAAA,EAAA,YEkRhE,eFlRgE,CEkRhD,CFlRgD,EEkR7C,SFlR6C,EEkRlC,KFlRkC,CAAA,EAAA,uBEmRrD,gBFnRqD,GAAA,CAAA,CAAA,CAAA,CAAA,KAAA,EEqRrE,KFrRqE,EAAA,qBAAA,CAAA,EEuRxE,wBFvRwE,CEuR/C,CFvR+C,EEuR5C,GFvR4C,CAAA,IAAA,CAAA,EEuRjC,cFvRiC,CAAA,GEwRxE,GFxRwE,CAAA,aAAA,CAAA,EAAA,QAAA,CAAA,EEyRjE,wBFzRiE,CEyRxC,CFzRwC,EEyRrC,GFzRqC,CAAA,IAAA,CAAA,EEyR1B,cFzR0B,CAAA,CAAA,EE0R3E,YF1R2E,CE2R5E,CF3R4E,EE4R5E,SF5R4E,EE6R5E,CF7R4E,EE8R5E,aF9R4E,GAAA,QE+RpE,KF/RuE,GAAA;IAAnB,EAAA,EEgSpD,GFhSoD,CAAA,IAAA,CAAA;IAAsB,WAAA,EEiSjE,GFjSiE,CAAA,aAAA,CAAA;IAEnD,aAAA,EEgSZ,cFhSY;EAAG,CAAA,IEmSlC,KFnSqC,CAAA;;;;YAAwC,CAAA,CAAA,EEyXjE,YFzXiE,CEyXpD,UFzXoD,CEyXzC,QFzXyC,CEyXhC,CFzXgC,EEyX7B,SFzX6B,CAAA,CAAA,EEyXhB,KFzXgB,CAAA;;;;;EAHrE,KAAA,CAAA,CAAA,EEoYD,UFpYC,CEoYU,CFpYV,EEoYa,SFpYb,EEoYwB,QFpYxB,CEoYiC,CFpYjC,EEoYoC,SFpYpC,CAAA,EEoYgD,aFpYhD,EEoY+D,KFpY/D,EEoYsE,CFpYtE,CAAA;AAIN;AAEW,iBEwYD,MAAA,CFxYC,GAAA,EAAA,MAAA,EAAA,IAAA,CAAA,EAAA,MAAA,CAAA,EAAA,MAAA;;;;;;AAIe;;;AAIP,iBEseT,qBFteS,CAAA,eEse4B,YFte5B,EAAA,cAAA,OAAA,CAAA,CAAA,MAAA,EAAA,QAAA,GAAA,aAAA,GAAA,kBAAA,GAAA,QAAA,GAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EEyed,YFzec,CEyeD,MFzeC,EEyeO,KFzeP,CAAA,EAAA,MAAA,EE0ef,eF1ee,EAAA,OAAA,CAAA,EAAA,GAAA,EAAA,CAAA,EE4etB,SF5esB"}
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/table-schema.ts","../src/types.ts","../src/query-builder.ts"],"sourcesContent":[],"mappings":"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EmDmB,aFnDnB,CAAA,CAAA,GEoD1C,kBFpD0C,CEoDvB,CFpDuB,EEoDpB,aFpDoB,CAAA;AAEV,KEoDtB,oBFpDsB,CAAA,UEqDtB,eFrDsB,EAAA,kBEsDd,UFtDc,CEsDH,CFtDG,CAAA,EAAA,sBEuDV,gBFvDU,CAAA,GAAA,CEwD7B,IFxD6B,CEwDxB,UFxDwB,CEwDb,QFxDa,CEwDJ,CFxDI,EEwDD,SFxDC,CAAA,CAAA,EEwDY,iBFxDZ,CEwD8B,aFxD9B,CAAA,CAAA,GEyDhC,kBFzDgC,CEyDb,CFzDa,EEyDV,aFzDU,CAAA,CAAA,EAAA;;;AAGlC;;AACgC,KE2DpB,WF3DoB,CAAA,UE4DpB,eF5DoB,EAAA,kBE6DZ,UF7DY,CE6DD,CF7DC,CAAA,EAAA,sBE8DR,gBF9DQ,EAAA,cAAA,OAAA,CAAA,GEgE5B,KFhE4B,SAAA,IAAA,GEiE5B,mBFjE4B,CEiER,CFjEQ,EEiEL,SFjEK,EEiEM,aFjEN,CAAA,GEkE5B,oBFlE4B,CEkEP,CFlEO,EEkEJ,SFlEI,EEkEO,aFlEP,CAAA;AAAf,cEoEJ,UFpEI,CAAA,UEqEL,eFrEK,EAAA,kBEsEG,UFtEH,CEsEc,CFtEd,CAAA,EAAA,UAAA;EAAM,OAAA,EEuEA,MFvEA,CAAA,MAAA,EEuEe,YFvEf,CAAA;AAGvB,CAAA,EAAA,sBEsEwB,gBFtEuB,EAAA,cAC9B,OAAS,EAAA,IAAA,IAAA,CAAA,CAAA;EASd,iBAAW,SAAA;EAAA,iBAAA,OAAA;mBAAW,MAAA;mBAChC,QAAA;UAA8B,WAAA;aAC1B,CAAA,SAAA,EEiE0B,SFjE1B,EAAA,OAAA,EEkEwB,YFlExB,CEkEqC,UFlErC,CEkEgD,CFlEhD,CAAA,EEkEoD,KFlEpD,CAAA,EAAA,MAAA,EEmEuB,CFnEvB,EAAA,QAAA,EEoEyB,QFpEzB,CEoEkC,CFpElC,EEoEqC,CFpErC,CAAA;EAAC,GAAA,CAAA,CAAA,EE8EE,CF9EF;EAIK,gBAAY,CAAA,OAAA,EAAA,GAAA,EAAA,CAAA,EE8EY,SF9EZ;EAAA,gBAAA,CAAA,CAAA,EEkFF,SFlFE;YAAW,CAAA,CAAA,EEsFnB,SFtFmB;MAAuC,UAAA,CAAA,CAAA,EE0FtD,UF1FsD,CE0F3C,CF1F2C,EE0FxC,KF1FwC,EE0FjC,CF1FiC,CAAA;MAAZ,KAAA,CAAA,CAAA,EAAA,OAAA;MAC5D,IAAA,CAAA,CAAA,EAAA,MAAA;;;;;;AAKU,cEgNC,YFhNW,CAAA,gBEiNN,eFjNM,EAAA,wBEkNE,UFlNF,CEkNa,CFlNb,CAAA,EAAA,UAAA,IAAA,EAAA,4BEoNM,gBFpNN,GAAA,CAAA,CAAA,EAAA,oBAAA,OAAA,GAAA,KAAA,CAAA,CAAA;EAAA,iBAAA,MAAA;mBAAW,SAAA;mBAAyB,QAAA;EAAC,QAAA,OAAA;EAGjD,WAAA,CAAA,MAAa,EEqNI,CFrNJ,EAAA,SAAA,EEsNO,SFtNP,EAAA,QAAA,CAAA,EEuNM,QFvNN,CEuNe,QFvNf,CEuNwB,CFvNxB,EEuN2B,SFvN3B,CAAA,EEuNuC,CFvNvC,CAAA,EAAA,OAAA,CAAA,EEwNJ,YFxNI,CEwNS,UFxNT,CEwNoB,QFxNpB,CEwN6B,CFxN7B,EEwNgC,SFxNhC,CAAA,CAAA,EEwN6C,KFxN7C,CAAA;EAAA;;;OAEb,CAAA,UAAA,EE6NI,UF7NJ,CE6Ne,UF7Nf,CE6N0B,QF7N1B,CE6NmC,CF7NnC,EE6NsC,SF7NtC,CAAA,CAAA,CAAA,CAAA,EE8NP,YF9NO,CE8NM,CF9NN,EE8NS,SF9NT,EE8NoB,CF9NpB,EE8NuB,aF9NvB,EE8NsC,KF9NtC,CAAA;;;;EAIA,MAAA,CAAA,GAAA,MAAY,EAAA,CAAA,CAAA,MEmOD,UFnOC,CEmOU,QFnOV,CEmOmB,CFnOnB,EEmOsB,SFnOtB,CAAA,CAAA,GAAA,MAAA,CAAA,GAAA,GAAA,CAAA,EAAA,CAAA,EEoOnB,YFpOmB,CEoON,CFpOM,EEoOH,SFpOG,EEoOQ,CFpOR,EEoOW,aFpOX,EEoO0B,KFpO1B,CAAA;EAAA;;;SAEZ,CAAA,KAAA,EE8OD,eF9OC,CE8Oe,QF9Of,CE8OwB,CF9OxB,EE8O2B,SF9O3B,CAAA,CAAA,EAAA,SAAA,CAAA,EAAA,KAAA,GAAA,MAAA,CAAA,EEgPP,YFhPO,CEgPM,CFhPN,EEgPS,SFhPT,EEgPoB,CFhPpB,EEgPuB,aFhPvB,EEgPsC,KFhPtC,CAAA;;;;OAEY,CAAA,KAAA,EAAA,MAAA,CAAA,EEyPA,YFzPA,CEyPa,CFzPb,EEyPgB,SFzPhB,EEyP2B,CFzP3B,EEyP8B,aFzP9B,EEyP6C,KFzP7C,CAAA;;;;QACpB,CAAA,KAAA,EAAA,MAAA,CAAA,EEgQqB,YFhQrB,CEgQkC,CFhQlC,EEgQqC,SFhQrC,EEgQgD,CFhQhD,EEgQmD,aFhQnD,EEgQkE,KFhQlE,CAAA;KAE+B,CAAA,CAAA,EEmQ1B,YFnQ0B,CEmQb,CFnQa,EEmQV,SFnQU,EEmQC,CFnQD,EEmQI,aFnQJ,EAAA,IAAA,CAAA;;;;;;SAA6C,CAAA,cEkR9D,kBFlR8D,CEkR3C,CFlR2C,EEkRxC,SFlRwC,CAAA,CAAA,OAAA,CAAA,EAAA,YEmRhE,eFnRgE,CEmRhD,CFnRgD,EEmR7C,SFnR6C,EEmRlC,KFnRkC,CAAA,EAAA,uBEoRrD,gBFpRqD,GAAA,CAAA,CAAA,CAAA,CAAA,KAAA,EEsRrE,KFtRqE,EAAA,qBAAA,CAAA,EEwRxE,wBFxRwE,CEwR/C,CFxR+C,EEwR5C,GFxR4C,CAAA,IAAA,CAAA,EEwRjC,cFxRiC,CAAA,GEyRxE,GFzRwE,CAAA,aAAA,CAAA,EAAA,QAAA,CAAA,EE0RjE,wBF1RiE,CE0RxC,CF1RwC,EE0RrC,GF1RqC,CAAA,IAAA,CAAA,EE0R1B,cF1R0B,CAAA,CAAA,EE2R3E,YF3R2E,CE4R5E,CF5R4E,EE6R5E,SF7R4E,EE8R5E,CF9R4E,EE+R5E,aF/R4E,GAAA,QEgSpE,KFhSuE,GAAA;IAAnB,EAAA,EEiSpD,GFjSoD,CAAA,IAAA,CAAA;IAAsB,WAAA,EEkSjE,GFlSiE,CAAA,aAAA,CAAA;IAEnD,aAAA,EEiSZ,cFjSY;EAAG,CAAA,IEoSlC,KFpSqC,CAAA;;;;YAAwC,CAAA,CAAA,EE0XjE,YF1XiE,CE0XpD,UF1XoD,CE0XzC,QF1XyC,CE0XhC,CF1XgC,EE0X7B,SF1X6B,CAAA,CAAA,EE0XhB,KF1XgB,CAAA;;;;;EAHrE,KAAA,CAAA,CAAA,EEqYD,UFrYC,CEqYU,CFrYV,EEqYa,SFrYb,EEqYwB,QFrYxB,CEqYiC,CFrYjC,EEqYoC,SFrYpC,CAAA,EEqYgD,aFrYhD,EEqY+D,KFrY/D,EEqYsE,CFrYtE,CAAA;AAIN;AAEW,iBEyYD,MAAA,CFzYC,GAAA,EAAA,MAAA,EAAA,IAAA,CAAA,EAAA,MAAA,CAAA,EAAA,MAAA;;;;;;AAIe;;;AAIP,iBEueT,qBFveS,CAAA,eEue4B,YFve5B,EAAA,cAAA,OAAA,CAAA,CAAA,MAAA,EAAA,QAAA,GAAA,aAAA,GAAA,kBAAA,GAAA,QAAA,GAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EE0ed,YF1ec,CE0eD,MF1eC,EE0eO,KF1eP,CAAA,EAAA,MAAA,EE2ef,eF3ee,EAAA,OAAA,CAAA,EAAA,GAAA,EAAA,CAAA,EE6etB,SF7esB"}
|
package/dist/index.d.ts
CHANGED
|
@@ -217,9 +217,34 @@ interface RelatedQuery {
|
|
|
217
217
|
/** The cardinality of the relationship */
|
|
218
218
|
cardinality: 'one' | 'many';
|
|
219
219
|
}
|
|
220
|
+
/**
|
|
221
|
+
* Comparison-operator descriptor for a single WHERE field, e.g.
|
|
222
|
+
* `{ _op: '<=', _val: 5 }` → `field <= $field`. A `$`-prefixed string `_val`
|
|
223
|
+
* references an existing query param verbatim; `_swap: true` flips the operands
|
|
224
|
+
* (`$val _op field`). Plain values still mean equality (`field = $field`).
|
|
225
|
+
*/
|
|
226
|
+
interface ComparisonOp {
|
|
227
|
+
_op: '=' | '!=' | '>' | '>=' | '<' | '<=' | (string & {});
|
|
228
|
+
_val: unknown;
|
|
229
|
+
_swap?: boolean;
|
|
230
|
+
}
|
|
231
|
+
/** A single WHERE field value: an equality value or a comparison descriptor. */
|
|
232
|
+
type WhereFieldValue<V> = V | ComparisonOp;
|
|
233
|
+
/** A flat conjunction of field conditions (equality or comparison). */
|
|
234
|
+
type WhereConditions<TModel extends GenericModel> = { [K in keyof TModel]?: WhereFieldValue<TModel[K]> };
|
|
235
|
+
/**
|
|
236
|
+
* WHERE input for `.where()`. Supports equality (`{ field: value }`), comparison
|
|
237
|
+
* operators (`{ field: { _op, _val } }`), and a single top-level `_or` group of
|
|
238
|
+
* condition fragments that compile to a parenthesised `(... OR ...)` conjunct —
|
|
239
|
+
* e.g. `{ _or: [{ white: x }, { black: x }] }` → `(white = $or0 OR black = $or1)`.
|
|
240
|
+
* Backward-compatible with plain `Partial<TModel>` equality objects.
|
|
241
|
+
*/
|
|
242
|
+
type WhereInput<TModel extends GenericModel> = WhereConditions<TModel> & {
|
|
243
|
+
_or?: WhereConditions<TModel>[];
|
|
244
|
+
};
|
|
220
245
|
interface QueryOptions<TModel extends GenericModel, IsOne extends boolean> {
|
|
221
246
|
select?: ((keyof TModel & string) | '*')[];
|
|
222
|
-
where?:
|
|
247
|
+
where?: WhereInput<TModel>;
|
|
223
248
|
limit?: number;
|
|
224
249
|
offset?: number;
|
|
225
250
|
orderBy?: Partial<Record<keyof TModel, 'asc' | 'desc'>>;
|
|
@@ -231,7 +256,7 @@ type LiveQueryOptions<TModel extends GenericModel> = Omit<QueryOptions<TModel, b
|
|
|
231
256
|
type QueryModifier<TModel extends GenericModel> = (builder: QueryModifierBuilder<TModel>) => QueryModifierBuilder<TModel>;
|
|
232
257
|
type SchemaAwareQueryModifier<S extends SchemaStructure, TableName extends TableNames<S>, RelatedFields extends Record<string, any> = {}> = (builder: SchemaAwareQueryModifierBuilder<S, TableName, {}>) => SchemaAwareQueryModifierBuilder<S, TableName, RelatedFields>;
|
|
233
258
|
interface QueryModifierBuilder<TModel extends GenericModel> {
|
|
234
|
-
where(conditions:
|
|
259
|
+
where(conditions: WhereInput<TModel>): this;
|
|
235
260
|
select(...fields: ((keyof TModel & string) | '*')[]): this;
|
|
236
261
|
limit(count: number): this;
|
|
237
262
|
offset(count: number): this;
|
|
@@ -240,7 +265,7 @@ interface QueryModifierBuilder<TModel extends GenericModel> {
|
|
|
240
265
|
_getOptions(): QueryOptions<TModel, boolean>;
|
|
241
266
|
}
|
|
242
267
|
interface SchemaAwareQueryModifierBuilder<S extends SchemaStructure, TableName extends TableNames<S>, RelatedFields extends Record<string, any> = {}> {
|
|
243
|
-
where(conditions:
|
|
268
|
+
where(conditions: WhereInput<TableModel<GetTable<S, TableName>>>): this;
|
|
244
269
|
select(...fields: ((keyof TableModel<GetTable<S, TableName>> & string) | '*')[]): this;
|
|
245
270
|
limit(count: number): this;
|
|
246
271
|
offset(count: number): this;
|
|
@@ -380,7 +405,7 @@ declare class QueryBuilder<const S extends SchemaStructure, const TableName exte
|
|
|
380
405
|
/**
|
|
381
406
|
* Add additional where conditions
|
|
382
407
|
*/
|
|
383
|
-
where(conditions:
|
|
408
|
+
where(conditions: WhereInput<TableModel<GetTable<S, TableName>>>): QueryBuilder<S, TableName, R, RelatedFields, IsOne>;
|
|
384
409
|
/**
|
|
385
410
|
* Specify fields to select
|
|
386
411
|
*/
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/table-schema.ts","../src/types.ts","../src/query-builder.ts"],"sourcesContent":[],"mappings":"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iBFpD2B,CAAA,sBEoDa,gBFpDb,CAAA,GAAA,MEoDuC,aFpDvC;AActB,KEwCL,oBAAA,GFxCoB;EAAA,EAAA,EAAA,MAAA;aAGK,EAAA,KAAA,GAAA,MAAA;eAAf,EEwCL,gBFxCK;;AASc,KEkCxB,gBAAA,GAAmB,MFlCK,CAAA,MAAA,EEkCU,oBFlCV,CAAA;;;;AAEN,KEqClB,kBFrCkB,CAAA,UEsClB,eFtCkB,EAAA,sBEuCN,gBFvCM,CAAA,GAAA,QAAsB,MEyCtC,aFzCsC,GEyCtB,WFzCsB,CE0ChD,CF1CgD,EE2ChD,aF3CgD,CE2ClC,CF3CkC,CAAA,CAAA,IAAA,CAAA,EE4ChD,aF5CgD,CE4ClC,CF5CkC,CAAA,CAAA,eAAA,CAAA,EE6ChD,aF7CgD,CE6ClC,CF7CkC,CAAA,CAAA,aAAA,CAAA,SAAA,KAAA,GAAA,IAAA,GAAA,KAAA,CAAA,EAGpD;AAA4C,KE8ChC,mBF9CgC,CAAA,UE+ChC,eF/CgC,EAAA,kBEgDxB,UFhDwB,CEgDb,CFhDa,CAAA,EAAA,sBEiDpB,gBFjDoB,CAAA,GEkDxC,IFlDwC,CEkDnC,UFlDmC,CEkDxB,QFlDwB,CEkDf,CFlDe,EEkDZ,SFlDY,CAAA,CAAA,EEkDC,iBFlDD,CEkDmB,aFlDnB,CAAA,CAAA,GEmD1C,kBFnD0C,CEmDvB,CFnDuB,EEmDpB,aFnDoB,CAAA;AAEV,KEmDtB,oBFnDsB,CAAA,UEoDtB,eFpDsB,EAAA,kBEqDd,UFrDc,CEqDH,CFrDG,CAAA,EAAA,sBEsDV,gBFtDU,CAAA,GAAA,CEuD7B,IFvD6B,CEuDxB,UFvDwB,CEuDb,QFvDa,CEuDJ,CFvDI,EEuDD,SFvDC,CAAA,CAAA,EEuDY,iBFvDZ,CEuD8B,aFvD9B,CAAA,CAAA,GEwDhC,kBFxDgC,CEwDb,CFxDa,EEwDV,aFxDU,CAAA,CAAA,EAAA;;;AAGlC;;AACgC,KE0DpB,WF1DoB,CAAA,UE2DpB,eF3DoB,EAAA,kBE4DZ,UF5DY,CE4DD,CF5DC,CAAA,EAAA,sBE6DR,gBF7DQ,EAAA,cAAA,OAAA,CAAA,GE+D5B,KF/D4B,SAAA,IAAA,GEgE5B,mBFhE4B,CEgER,CFhEQ,EEgEL,SFhEK,EEgEM,aFhEN,CAAA,GEiE5B,oBFjE4B,CEiEP,CFjEO,EEiEJ,SFjEI,EEiEO,aFjEP,CAAA;AAAf,cEmEJ,UFnEI,CAAA,UEoEL,eFpEK,EAAA,kBEqEG,UFrEH,CEqEc,CFrEd,CAAA,EAAA,UAAA;EAAM,OAAA,EEsEA,MFtEA,CAAA,MAAA,EEsEe,YFtEf,CAAA;AAGvB,CAAA,EAAA,sBEqEwB,gBFrEuB,EAAA,cAC9B,OAAS,EAAA,IAAA,IAAA,CAAA,CAAA;EASd,iBAAW,SAAA;EAAA,iBAAA,OAAA;mBAAW,MAAA;mBAChC,QAAA;UAA8B,WAAA;aAC1B,CAAA,SAAA,EEgE0B,SFhE1B,EAAA,OAAA,EEiEwB,YFjExB,CEiEqC,UFjErC,CEiEgD,CFjEhD,CAAA,EEiEoD,KFjEpD,CAAA,EAAA,MAAA,EEkEuB,CFlEvB,EAAA,QAAA,EEmEyB,QFnEzB,CEmEkC,CFnElC,EEmEqC,CFnErC,CAAA;EAAC,GAAA,CAAA,CAAA,EE6EE,CF7EF;EAIK,gBAAY,CAAA,OAAA,EAAA,GAAA,EAAA,CAAA,EE6EY,SF7EZ;EAAA,gBAAA,CAAA,CAAA,EEiFF,SFjFE;YAAW,CAAA,CAAA,EEqFnB,SFrFmB;MAAuC,UAAA,CAAA,CAAA,EEyFtD,UFzFsD,CEyF3C,CFzF2C,EEyFxC,KFzFwC,EEyFjC,CFzFiC,CAAA;MAAZ,KAAA,CAAA,CAAA,EAAA,OAAA;MAC5D,IAAA,CAAA,CAAA,EAAA,MAAA;;;;;;AAKU,cE+MC,YF/MW,CAAA,gBEgNN,eFhNM,EAAA,wBEiNE,UFjNF,CEiNa,CFjNb,CAAA,EAAA,UAAA,IAAA,EAAA,4BEmNM,gBFnNN,GAAA,CAAA,CAAA,EAAA,oBAAA,OAAA,GAAA,KAAA,CAAA,CAAA;EAAA,iBAAA,MAAA;mBAAW,SAAA;mBAAyB,QAAA;EAAC,QAAA,OAAA;EAGjD,WAAA,CAAA,MAAa,EEoNI,CFpNJ,EAAA,SAAA,EEqNO,SFrNP,EAAA,QAAA,CAAA,EEsNM,QFtNN,CEsNe,QFtNf,CEsNwB,CFtNxB,EEsN2B,SFtN3B,CAAA,EEsNuC,CFtNvC,CAAA,EAAA,OAAA,CAAA,EEuNJ,YFvNI,CEuNS,UFvNT,CEuNoB,QFvNpB,CEuN6B,CFvN7B,EEuNgC,SFvNhC,CAAA,CAAA,EEuN6C,KFvN7C,CAAA;EAAA;;;OAEb,CAAA,UAAA,EE4NI,OF5NJ,CE4NY,UF5NZ,CE4NuB,QF5NvB,CE4NgC,CF5NhC,EE4NmC,SF5NnC,CAAA,CAAA,CAAA,CAAA,EE6NP,YF7NO,CE6NM,CF7NN,EE6NS,SF7NT,EE6NoB,CF7NpB,EE6NuB,aF7NvB,EE6NsC,KF7NtC,CAAA;;;;EAIA,MAAA,CAAA,GAAA,MAAY,EAAA,CAAA,CAAA,MEkOD,UFlOC,CEkOU,QFlOV,CEkOmB,CFlOnB,EEkOsB,SFlOtB,CAAA,CAAA,GAAA,MAAA,CAAA,GAAA,GAAA,CAAA,EAAA,CAAA,EEmOnB,YFnOmB,CEmON,CFnOM,EEmOH,SFnOG,EEmOQ,CFnOR,EEmOW,aFnOX,EEmO0B,KFnO1B,CAAA;EAAA;;;SAEZ,CAAA,KAAA,EE6OD,eF7OC,CE6Oe,QF7Of,CE6OwB,CF7OxB,EE6O2B,SF7O3B,CAAA,CAAA,EAAA,SAAA,CAAA,EAAA,KAAA,GAAA,MAAA,CAAA,EE+OP,YF/OO,CE+OM,CF/ON,EE+OS,SF/OT,EE+OoB,CF/OpB,EE+OuB,aF/OvB,EE+OsC,KF/OtC,CAAA;;;;OAEY,CAAA,KAAA,EAAA,MAAA,CAAA,EEwPA,YFxPA,CEwPa,CFxPb,EEwPgB,SFxPhB,EEwP2B,CFxP3B,EEwP8B,aFxP9B,EEwP6C,KFxP7C,CAAA;;;;QACpB,CAAA,KAAA,EAAA,MAAA,CAAA,EE+PqB,YF/PrB,CE+PkC,CF/PlC,EE+PqC,SF/PrC,EE+PgD,CF/PhD,EE+PmD,aF/PnD,EE+PkE,KF/PlE,CAAA;KAE+B,CAAA,CAAA,EEkQ1B,YFlQ0B,CEkQb,CFlQa,EEkQV,SFlQU,EEkQC,CFlQD,EEkQI,aFlQJ,EAAA,IAAA,CAAA;;;;;;SAA6C,CAAA,cEiR9D,kBFjR8D,CEiR3C,CFjR2C,EEiRxC,SFjRwC,CAAA,CAAA,OAAA,CAAA,EAAA,YEkRhE,eFlRgE,CEkRhD,CFlRgD,EEkR7C,SFlR6C,EEkRlC,KFlRkC,CAAA,EAAA,uBEmRrD,gBFnRqD,GAAA,CAAA,CAAA,CAAA,CAAA,KAAA,EEqRrE,KFrRqE,EAAA,qBAAA,CAAA,EEuRxE,wBFvRwE,CEuR/C,CFvR+C,EEuR5C,GFvR4C,CAAA,IAAA,CAAA,EEuRjC,cFvRiC,CAAA,GEwRxE,GFxRwE,CAAA,aAAA,CAAA,EAAA,QAAA,CAAA,EEyRjE,wBFzRiE,CEyRxC,CFzRwC,EEyRrC,GFzRqC,CAAA,IAAA,CAAA,EEyR1B,cFzR0B,CAAA,CAAA,EE0R3E,YF1R2E,CE2R5E,CF3R4E,EE4R5E,SF5R4E,EE6R5E,CF7R4E,EE8R5E,aF9R4E,GAAA,QE+RpE,KF/RuE,GAAA;IAAnB,EAAA,EEgSpD,GFhSoD,CAAA,IAAA,CAAA;IAAsB,WAAA,EEiSjE,GFjSiE,CAAA,aAAA,CAAA;IAEnD,aAAA,EEgSZ,cFhSY;EAAG,CAAA,IEmSlC,KFnSqC,CAAA;;;;YAAwC,CAAA,CAAA,EEyXjE,YFzXiE,CEyXpD,UFzXoD,CEyXzC,QFzXyC,CEyXhC,CFzXgC,EEyX7B,SFzX6B,CAAA,CAAA,EEyXhB,KFzXgB,CAAA;;;;;EAHrE,KAAA,CAAA,CAAA,EEoYD,UFpYC,CEoYU,CFpYV,EEoYa,SFpYb,EEoYwB,QFpYxB,CEoYiC,CFpYjC,EEoYoC,SFpYpC,CAAA,EEoYgD,aFpYhD,EEoY+D,KFpY/D,EEoYsE,CFpYtE,CAAA;AAIN;AAEW,iBEwYD,MAAA,CFxYC,GAAA,EAAA,MAAA,EAAA,IAAA,CAAA,EAAA,MAAA,CAAA,EAAA,MAAA;;;;;;AAIe;;;AAIP,iBEseT,qBFteS,CAAA,eEse4B,YFte5B,EAAA,cAAA,OAAA,CAAA,CAAA,MAAA,EAAA,QAAA,GAAA,aAAA,GAAA,kBAAA,GAAA,QAAA,GAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EEyed,YFzec,CEyeD,MFzeC,EEyeO,KFzeP,CAAA,EAAA,MAAA,EE0ef,eF1ee,EAAA,OAAA,CAAA,EAAA,GAAA,EAAA,CAAA,EE4etB,SF5esB"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/table-schema.ts","../src/types.ts","../src/query-builder.ts"],"sourcesContent":[],"mappings":"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EmDmB,aFnDnB,CAAA,CAAA,GEoD1C,kBFpD0C,CEoDvB,CFpDuB,EEoDpB,aFpDoB,CAAA;AAEV,KEoDtB,oBFpDsB,CAAA,UEqDtB,eFrDsB,EAAA,kBEsDd,UFtDc,CEsDH,CFtDG,CAAA,EAAA,sBEuDV,gBFvDU,CAAA,GAAA,CEwD7B,IFxD6B,CEwDxB,UFxDwB,CEwDb,QFxDa,CEwDJ,CFxDI,EEwDD,SFxDC,CAAA,CAAA,EEwDY,iBFxDZ,CEwD8B,aFxD9B,CAAA,CAAA,GEyDhC,kBFzDgC,CEyDb,CFzDa,EEyDV,aFzDU,CAAA,CAAA,EAAA;;;AAGlC;;AACgC,KE2DpB,WF3DoB,CAAA,UE4DpB,eF5DoB,EAAA,kBE6DZ,UF7DY,CE6DD,CF7DC,CAAA,EAAA,sBE8DR,gBF9DQ,EAAA,cAAA,OAAA,CAAA,GEgE5B,KFhE4B,SAAA,IAAA,GEiE5B,mBFjE4B,CEiER,CFjEQ,EEiEL,SFjEK,EEiEM,aFjEN,CAAA,GEkE5B,oBFlE4B,CEkEP,CFlEO,EEkEJ,SFlEI,EEkEO,aFlEP,CAAA;AAAf,cEoEJ,UFpEI,CAAA,UEqEL,eFrEK,EAAA,kBEsEG,UFtEH,CEsEc,CFtEd,CAAA,EAAA,UAAA;EAAM,OAAA,EEuEA,MFvEA,CAAA,MAAA,EEuEe,YFvEf,CAAA;AAGvB,CAAA,EAAA,sBEsEwB,gBFtEuB,EAAA,cAC9B,OAAS,EAAA,IAAA,IAAA,CAAA,CAAA;EASd,iBAAW,SAAA;EAAA,iBAAA,OAAA;mBAAW,MAAA;mBAChC,QAAA;UAA8B,WAAA;aAC1B,CAAA,SAAA,EEiE0B,SFjE1B,EAAA,OAAA,EEkEwB,YFlExB,CEkEqC,UFlErC,CEkEgD,CFlEhD,CAAA,EEkEoD,KFlEpD,CAAA,EAAA,MAAA,EEmEuB,CFnEvB,EAAA,QAAA,EEoEyB,QFpEzB,CEoEkC,CFpElC,EEoEqC,CFpErC,CAAA;EAAC,GAAA,CAAA,CAAA,EE8EE,CF9EF;EAIK,gBAAY,CAAA,OAAA,EAAA,GAAA,EAAA,CAAA,EE8EY,SF9EZ;EAAA,gBAAA,CAAA,CAAA,EEkFF,SFlFE;YAAW,CAAA,CAAA,EEsFnB,SFtFmB;MAAuC,UAAA,CAAA,CAAA,EE0FtD,UF1FsD,CE0F3C,CF1F2C,EE0FxC,KF1FwC,EE0FjC,CF1FiC,CAAA;MAAZ,KAAA,CAAA,CAAA,EAAA,OAAA;MAC5D,IAAA,CAAA,CAAA,EAAA,MAAA;;;;;;AAKU,cEgNC,YFhNW,CAAA,gBEiNN,eFjNM,EAAA,wBEkNE,UFlNF,CEkNa,CFlNb,CAAA,EAAA,UAAA,IAAA,EAAA,4BEoNM,gBFpNN,GAAA,CAAA,CAAA,EAAA,oBAAA,OAAA,GAAA,KAAA,CAAA,CAAA;EAAA,iBAAA,MAAA;mBAAW,SAAA;mBAAyB,QAAA;EAAC,QAAA,OAAA;EAGjD,WAAA,CAAA,MAAa,EEqNI,CFrNJ,EAAA,SAAA,EEsNO,SFtNP,EAAA,QAAA,CAAA,EEuNM,QFvNN,CEuNe,QFvNf,CEuNwB,CFvNxB,EEuN2B,SFvN3B,CAAA,EEuNuC,CFvNvC,CAAA,EAAA,OAAA,CAAA,EEwNJ,YFxNI,CEwNS,UFxNT,CEwNoB,QFxNpB,CEwN6B,CFxN7B,EEwNgC,SFxNhC,CAAA,CAAA,EEwN6C,KFxN7C,CAAA;EAAA;;;OAEb,CAAA,UAAA,EE6NI,UF7NJ,CE6Ne,UF7Nf,CE6N0B,QF7N1B,CE6NmC,CF7NnC,EE6NsC,SF7NtC,CAAA,CAAA,CAAA,CAAA,EE8NP,YF9NO,CE8NM,CF9NN,EE8NS,SF9NT,EE8NoB,CF9NpB,EE8NuB,aF9NvB,EE8NsC,KF9NtC,CAAA;;;;EAIA,MAAA,CAAA,GAAA,MAAY,EAAA,CAAA,CAAA,MEmOD,UFnOC,CEmOU,QFnOV,CEmOmB,CFnOnB,EEmOsB,SFnOtB,CAAA,CAAA,GAAA,MAAA,CAAA,GAAA,GAAA,CAAA,EAAA,CAAA,EEoOnB,YFpOmB,CEoON,CFpOM,EEoOH,SFpOG,EEoOQ,CFpOR,EEoOW,aFpOX,EEoO0B,KFpO1B,CAAA;EAAA;;;SAEZ,CAAA,KAAA,EE8OD,eF9OC,CE8Oe,QF9Of,CE8OwB,CF9OxB,EE8O2B,SF9O3B,CAAA,CAAA,EAAA,SAAA,CAAA,EAAA,KAAA,GAAA,MAAA,CAAA,EEgPP,YFhPO,CEgPM,CFhPN,EEgPS,SFhPT,EEgPoB,CFhPpB,EEgPuB,aFhPvB,EEgPsC,KFhPtC,CAAA;;;;OAEY,CAAA,KAAA,EAAA,MAAA,CAAA,EEyPA,YFzPA,CEyPa,CFzPb,EEyPgB,SFzPhB,EEyP2B,CFzP3B,EEyP8B,aFzP9B,EEyP6C,KFzP7C,CAAA;;;;QACpB,CAAA,KAAA,EAAA,MAAA,CAAA,EEgQqB,YFhQrB,CEgQkC,CFhQlC,EEgQqC,SFhQrC,EEgQgD,CFhQhD,EEgQmD,aFhQnD,EEgQkE,KFhQlE,CAAA;KAE+B,CAAA,CAAA,EEmQ1B,YFnQ0B,CEmQb,CFnQa,EEmQV,SFnQU,EEmQC,CFnQD,EEmQI,aFnQJ,EAAA,IAAA,CAAA;;;;;;SAA6C,CAAA,cEkR9D,kBFlR8D,CEkR3C,CFlR2C,EEkRxC,SFlRwC,CAAA,CAAA,OAAA,CAAA,EAAA,YEmRhE,eFnRgE,CEmRhD,CFnRgD,EEmR7C,SFnR6C,EEmRlC,KFnRkC,CAAA,EAAA,uBEoRrD,gBFpRqD,GAAA,CAAA,CAAA,CAAA,CAAA,KAAA,EEsRrE,KFtRqE,EAAA,qBAAA,CAAA,EEwRxE,wBFxRwE,CEwR/C,CFxR+C,EEwR5C,GFxR4C,CAAA,IAAA,CAAA,EEwRjC,cFxRiC,CAAA,GEyRxE,GFzRwE,CAAA,aAAA,CAAA,EAAA,QAAA,CAAA,EE0RjE,wBF1RiE,CE0RxC,CF1RwC,EE0RrC,GF1RqC,CAAA,IAAA,CAAA,EE0R1B,cF1R0B,CAAA,CAAA,EE2R3E,YF3R2E,CE4R5E,CF5R4E,EE6R5E,SF7R4E,EE8R5E,CF9R4E,EE+R5E,aF/R4E,GAAA,QEgSpE,KFhSuE,GAAA;IAAnB,EAAA,EEiSpD,GFjSoD,CAAA,IAAA,CAAA;IAAsB,WAAA,EEkSjE,GFlSiE,CAAA,aAAA,CAAA;IAEnD,aAAA,EEiSZ,cFjSY;EAAG,CAAA,IEoSlC,KFpSqC,CAAA;;;;YAAwC,CAAA,CAAA,EE0XjE,YF1XiE,CE0XpD,UF1XoD,CE0XzC,QF1XyC,CE0XhC,CF1XgC,EE0X7B,SF1X6B,CAAA,CAAA,EE0XhB,KF1XgB,CAAA;;;;;EAHrE,KAAA,CAAA,CAAA,EEqYD,UFrYC,CEqYU,CFrYV,EEqYa,SFrYb,EEqYwB,QFrYxB,CEqYiC,CFrYjC,EEqYoC,SFrYpC,CAAA,EEqYgD,aFrYhD,EEqY+D,KFrY/D,EEqYsE,CFrYtE,CAAA;AAIN;AAEW,iBEyYD,MAAA,CFzYC,GAAA,EAAA,MAAA,EAAA,IAAA,CAAA,EAAA,MAAA,CAAA,EAAA,MAAA;;;;;;AAIe;;;AAIP,iBEueT,qBFveS,CAAA,eEue4B,YFve5B,EAAA,cAAA,OAAA,CAAA,CAAA,MAAA,EAAA,QAAA,GAAA,aAAA,GAAA,kBAAA,GAAA,QAAA,GAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EE0ed,YF1ec,CE0eD,MF1eC,EE0eO,KF1eP,CAAA,EAAA,MAAA,EE2ef,eF3ee,EAAA,OAAA,CAAA,EAAA,GAAA,EAAA,CAAA,EE6etB,SF7esB"}
|
package/dist/index.js
CHANGED
|
@@ -355,24 +355,31 @@ function buildQueryFromOptions(method, tableName, options, schema, patches) {
|
|
|
355
355
|
const vars = {};
|
|
356
356
|
if (parsedWhere && Object.keys(parsedWhere).length > 0) {
|
|
357
357
|
const conditions = [];
|
|
358
|
-
|
|
359
|
-
const varName = key;
|
|
358
|
+
const buildCondition = (field, value, varName) => {
|
|
360
359
|
if (value && typeof value === "object" && "_op" in value && "_val" in value) {
|
|
361
360
|
const { _op, _val, _swap } = value;
|
|
362
|
-
let rightSide
|
|
361
|
+
let rightSide;
|
|
363
362
|
if (typeof _val === "string" && _val.startsWith("$")) rightSide = _val;
|
|
364
363
|
else {
|
|
365
364
|
vars[varName] = _val;
|
|
366
365
|
rightSide = `$${varName}`;
|
|
367
366
|
}
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
367
|
+
return _swap ? `${rightSide} ${_op} ${field}` : `${field} ${_op} ${rightSide}`;
|
|
368
|
+
}
|
|
369
|
+
vars[varName] = value;
|
|
370
|
+
return `${field} = $${varName}`;
|
|
371
|
+
};
|
|
372
|
+
for (const [key, value] of Object.entries(parsedWhere)) {
|
|
373
|
+
if (key === "_or" && Array.isArray(value)) {
|
|
374
|
+
const orParts = [];
|
|
375
|
+
let i = 0;
|
|
376
|
+
for (const branch of value) if (branch && typeof branch === "object") for (const [bField, bVal] of Object.entries(branch)) orParts.push(buildCondition(bField, bVal, `or${i++}`));
|
|
377
|
+
if (orParts.length > 0) conditions.push(`(${orParts.join(" OR ")})`);
|
|
378
|
+
continue;
|
|
373
379
|
}
|
|
380
|
+
conditions.push(buildCondition(key, value, key));
|
|
374
381
|
}
|
|
375
|
-
query += ` WHERE ${conditions.join(" AND ")}`;
|
|
382
|
+
if (conditions.length > 0) query += ` WHERE ${conditions.join(" AND ")}`;
|
|
376
383
|
}
|
|
377
384
|
if (method === "UPDATE" && patches) query += ` PATCH ${JSON.stringify(patches)}`;
|
|
378
385
|
if (!isLiveQuery) {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["RecordId"],"sources":["../src/query-builder.ts"],"sourcesContent":["import { RecordId } from 'surrealdb';\nimport type {\n GenericModel,\n QueryInfo,\n QueryOptions,\n QueryModifier,\n RelatedQuery,\n SchemaAwareQueryModifier,\n SchemaAwareQueryModifierBuilder,\n} from './types';\nimport type {\n TableNames,\n GetTable,\n TableModel,\n TableRelationships,\n GetRelationship,\n SchemaStructure,\n TableFieldNames,\n ColumnSchema,\n} from './table-schema';\n\n/**\n * Parse a string ID to RecordId\n * - If it's in the format \"table:id\", use it as-is\n * - If it's just an ID without \":\", prepend the table name\n * @param value - The value to parse (could be a string ID)\n * @param tableName - The table name to use if the ID doesn't contain \":\"\n * @param fieldName - The field name to determine if this is an ID field\n */\nfunction parseStringToRecordId(value: unknown, tableName?: string, fieldName?: string): unknown {\n if (typeof value !== 'string') return value;\n\n // If it already contains \":\", parse it as a full record ID\n if (value.includes(':')) {\n const [table, ...idParts] = value.split(':');\n const id = idParts.join(':'); // Handle IDs that contain colons\n return new RecordId(table, id);\n }\n\n // If this is an \"id\" field and we have a table name, prepend it\n if (fieldName === 'id' && tableName) {\n return new RecordId(tableName, value);\n }\n\n // Otherwise, return as-is (it might not be an ID at all)\n return value;\n}\n\n/**\n * Recursively parse string IDs to RecordId in an object\n * @param obj - The object to parse\n * @param tableName - The table name to use for ID fields without \":\"\n */\nfunction parseObjectIdsToRecordId(obj: unknown, tableName?: string): unknown {\n if (obj === null || obj === undefined) return obj;\n\n if (typeof obj === 'string') {\n return parseStringToRecordId(obj, tableName);\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => parseObjectIdsToRecordId(item, tableName));\n }\n\n if (typeof obj === 'object' && obj.constructor === Object) {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n // Parse recursively, passing the field name to identify ID fields\n result[key] =\n typeof value === 'string'\n ? parseStringToRecordId(value, tableName, key)\n : parseObjectIdsToRecordId(value, tableName);\n }\n return result;\n }\n\n return obj;\n}\n\nexport type Executor<T extends { columns: Record<string, ColumnSchema> }, R = void> = (\n query: InnerQuery<T, boolean>\n) => R;\n\nexport class InnerQuery<\n T extends { columns: Record<string, ColumnSchema> },\n IsOne extends boolean,\n R = void,\n> {\n private _hash: number;\n private _mainQuery: QueryInfo;\n private _selectQuery: QueryInfo;\n private _selectLiveQuery: QueryInfo;\n private _subqueries: InnerQuery<{ columns: Record<string, ColumnSchema> }, boolean>[];\n\n constructor(\n private readonly _tableName: string,\n private readonly options: QueryOptions<TableModel<T>, IsOne>,\n private readonly schema: SchemaStructure,\n private readonly executor: Executor<any, R>\n ) {\n this._selectQuery = buildQueryFromOptions('SELECT', this._tableName, this.options, this.schema);\n\n this._mainQuery = buildQueryFromOptions(\n 'SELECT',\n this._tableName,\n { ...this.options, related: [] },\n this.schema\n );\n\n this._hash = this._selectQuery.hash;\n\n this._selectLiveQuery = buildQueryFromOptions(\n 'LIVE SELECT',\n this._tableName,\n this.options,\n this.schema\n );\n\n this._subqueries = extractSubqueryQueryInfos(\n schema,\n this._tableName,\n this.options,\n this.executor\n );\n }\n\n get mainQuery(): QueryInfo {\n return this._mainQuery;\n }\n\n get subqueries(): InnerQuery<{ columns: Record<string, ColumnSchema> }, boolean>[] {\n return this._subqueries;\n }\n\n get selectQuery(): QueryInfo {\n return this._selectQuery;\n }\n\n get selectLiveQuery(): QueryInfo {\n return this._selectLiveQuery;\n }\n\n get tableName(): string {\n return this._tableName;\n }\n\n get hash(): number {\n return this._hash;\n }\n\n get isOne(): boolean {\n return this.options.isOne ?? false;\n }\n\n public run(): R {\n return this.executor(this);\n }\n\n public buildUpdateQuery(patches: any[]): QueryInfo {\n return buildQueryFromOptions('UPDATE', this._tableName, this.options, this.schema, patches);\n }\n\n public buildDeleteQuery(): QueryInfo {\n return buildQueryFromOptions('DELETE', this._tableName, this.options, this.schema);\n }\n\n public getOptions(): QueryOptions<TableModel<T>, IsOne> {\n return this.options;\n }\n}\n\n/**\n * Helper type to get the model type for a related table\n */\ntype _GetRelatedModel<S extends SchemaStructure, RelatedTableName extends string> =\n RelatedTableName extends TableNames<S> ? TableModel<GetTable<S, RelatedTableName>> : never;\n\n/**\n * Helper type to extract field names from RelatedFields\n */\nexport type ExtractFieldNames<RelatedFields extends RelatedFieldsMap> = keyof RelatedFields;\n\nexport type RelatedFieldMapEntry = {\n to: string;\n cardinality: 'one' | 'many';\n relatedFields: RelatedFieldsMap;\n};\n\nexport type RelatedFieldsMap = Record<string, RelatedFieldMapEntry>;\n\n/**\n * Helper type to build the related fields object based on accumulated relationships\n */\nexport type BuildRelatedFields<\n S extends SchemaStructure,\n RelatedFields extends RelatedFieldsMap,\n> = {\n [K in keyof RelatedFields]: QueryResult<\n S,\n RelatedFields[K]['to'],\n RelatedFields[K]['relatedFields'],\n RelatedFields[K]['cardinality'] extends 'one' ? true : false\n >;\n};\n\nexport type BuildResultModelOne<\n S extends SchemaStructure,\n TableName extends TableNames<S>,\n RelatedFields extends RelatedFieldsMap,\n> = Omit<TableModel<GetTable<S, TableName>>, ExtractFieldNames<RelatedFields>> &\n BuildRelatedFields<S, RelatedFields>;\n\nexport type BuildResultModelMany<\n S extends SchemaStructure,\n TableName extends TableNames<S>,\n RelatedFields extends RelatedFieldsMap,\n> = (Omit<TableModel<GetTable<S, TableName>>, ExtractFieldNames<RelatedFields>> &\n BuildRelatedFields<S, RelatedFields>)[];\n\n/**\n * The final result type combining base model with related fields\n * Excludes related field keys from the base model to avoid type conflicts\n */\nexport type QueryResult<\n S extends SchemaStructure,\n TableName extends TableNames<S>,\n RelatedFields extends RelatedFieldsMap,\n IsOne extends boolean,\n> = IsOne extends true\n ? BuildResultModelOne<S, TableName, RelatedFields>\n : BuildResultModelMany<S, TableName, RelatedFields>;\n\nexport class FinalQuery<\n S extends SchemaStructure,\n TableName extends TableNames<S>,\n T extends { columns: Record<string, ColumnSchema> },\n // oxlint-disable-next-line no-unused-vars -- RelatedFields is used externally for type inference\n RelatedFields extends RelatedFieldsMap,\n IsOne extends boolean,\n R = void,\n> {\n private _innerQuery: InnerQuery<T, IsOne, R>;\n\n constructor(\n private readonly tableName: TableName,\n private readonly options: QueryOptions<TableModel<T>, IsOne>,\n private readonly schema: S,\n private readonly executor: Executor<T, R>\n ) {\n this._innerQuery = new InnerQuery<T, IsOne, R>(\n this.tableName,\n this.options,\n this.schema,\n this.executor\n );\n }\n\n run(): R {\n return this.executor(this._innerQuery);\n }\n\n buildUpdateQuery(patches: any[]): QueryInfo {\n return this._innerQuery.buildUpdateQuery(patches);\n }\n\n buildDeleteQuery(): QueryInfo {\n return this._innerQuery.buildDeleteQuery();\n }\n\n selectLive(): QueryInfo {\n return this._innerQuery.selectLiveQuery;\n }\n\n get innerQuery(): InnerQuery<T, IsOne, R> {\n return this._innerQuery;\n }\n\n get isOne(): boolean {\n return this.options.isOne ?? false;\n }\n\n get hash(): number {\n return this._innerQuery.hash;\n }\n}\n\n/**\n * Schema-aware query modifier builder implementation\n * This version provides full type safety for nested relationships\n */\nclass SchemaAwareQueryModifierBuilderImpl<\n S extends SchemaStructure,\n TableName extends TableNames<S>,\n RelatedFields extends RelatedFieldsMap = {},\n> implements SchemaAwareQueryModifierBuilder<S, TableName, RelatedFields> {\n private options: QueryOptions<TableModel<GetTable<S, TableName>>, boolean> = {};\n\n constructor(\n private readonly tableName: TableName,\n private readonly schema: S\n ) {}\n\n where(conditions: Partial<TableModel<GetTable<S, TableName>>>): this {\n this.options.where = { ...this.options.where, ...conditions };\n return this;\n }\n\n select(...fields: ((keyof TableModel<GetTable<S, TableName>> & string) | '*')[]): this {\n if (this.options.select) {\n throw new Error('Select can only be called once per query');\n }\n this.options.select = fields;\n return this;\n }\n\n limit(count: number): this {\n this.options.limit = count;\n return this;\n }\n\n offset(count: number): this {\n this.options.offset = count;\n return this;\n }\n\n orderBy(\n field: keyof TableModel<GetTable<S, TableName>> & string,\n direction: 'asc' | 'desc' = 'asc'\n ): this {\n this.options.orderBy = {\n ...this.options.orderBy,\n [field]: direction,\n } as Partial<Record<keyof TableModel<GetTable<S, TableName>>, 'asc' | 'desc'>>;\n return this;\n }\n\n // Schema-aware implementation for nested relationships with full type inference\n related<\n Field extends TableRelationships<S, TableName>['field'],\n Rel extends GetRelationship<S, TableName, Field>,\n RelatedFields2 extends RelatedFieldsMap = {},\n >(\n relatedField: Field,\n modifier?: SchemaAwareQueryModifier<S, Rel['to'], RelatedFields2>\n ): SchemaAwareQueryModifierBuilderImpl<\n S,\n TableName,\n RelatedFields & {\n [K in Field]: {\n to: Rel['to'];\n cardinality: Rel['cardinality'];\n relatedFields: RelatedFields2;\n };\n }\n > {\n if (!this.options.related) {\n this.options.related = [];\n }\n\n const exists = this.options.related.some((r) => (r.alias || r.relatedTable) === relatedField);\n\n if (!exists) {\n // Look up the relationship from schema\n const relationship = this.schema.relationships.find(\n (r) => r.from === this.tableName && r.field === relatedField\n );\n\n if (!relationship) {\n throw new Error(\n `Relationship '${String(relatedField)}' not found for table '${this.tableName}'`\n );\n }\n\n const relatedTable = relationship.to;\n const cardinality = relationship.cardinality;\n const foreignKeyField = cardinality === 'many' ? this.tableName : relatedField;\n\n this.options.related.push({\n relatedTable,\n alias: relatedField as string,\n modifier: modifier as QueryModifier<GenericModel>,\n cardinality,\n foreignKeyField: foreignKeyField as string,\n } as RelatedQuery & { foreignKeyField: string });\n }\n return this as any;\n }\n\n _getOptions(): QueryOptions<TableModel<GetTable<S, TableName>>, boolean> {\n return this.options;\n }\n}\n\n/**\n * Fluent query builder for constructing queries with chainable methods\n * Now with full type inference from schema constant AND related field accumulation!\n */\nexport class QueryBuilder<\n const S extends SchemaStructure,\n const TableName extends TableNames<S>,\n const R = void,\n const RelatedFields extends RelatedFieldsMap = {},\n const IsOne extends boolean = false,\n> {\n constructor(\n private readonly schema: S,\n private readonly tableName: TableName,\n private readonly executer: Executor<GetTable<S, TableName>, R> = () => undefined as R,\n private options: QueryOptions<TableModel<GetTable<S, TableName>>, IsOne> = {}\n ) {}\n\n /**\n * Add additional where conditions\n */\n where(\n conditions: Partial<TableModel<GetTable<S, TableName>>>\n ): QueryBuilder<S, TableName, R, RelatedFields, IsOne> {\n this.options.where = { ...this.options.where, ...conditions };\n return this;\n }\n\n /**\n * Specify fields to select\n */\n select(\n ...fields: ((keyof TableModel<GetTable<S, TableName>> & string) | '*')[]\n ): QueryBuilder<S, TableName, R, RelatedFields, IsOne> {\n if (this.options.select) {\n throw new Error('Select can only be called once per query');\n }\n this.options.select = fields;\n return this;\n }\n\n /**\n * Add ordering to the query (only for non-live queries)\n */\n orderBy(\n field: TableFieldNames<GetTable<S, TableName>>,\n direction: 'asc' | 'desc' = 'asc'\n ): QueryBuilder<S, TableName, R, RelatedFields, IsOne> {\n this.options.orderBy = {\n ...this.options.orderBy,\n [field]: direction,\n } as Partial<Record<keyof TableModel<GetTable<S, TableName>>, 'asc' | 'desc'>>;\n return this;\n }\n\n /**\n * Add limit to the query (only for non-live queries)\n */\n limit(count: number): QueryBuilder<S, TableName, R, RelatedFields, IsOne> {\n this.options.limit = count;\n return this;\n }\n\n /**\n * Add offset to the query (only for non-live queries)\n */\n offset(count: number): QueryBuilder<S, TableName, R, RelatedFields, IsOne> {\n this.options.offset = count;\n return this;\n }\n\n one(): QueryBuilder<S, TableName, R, RelatedFields, true> {\n return new QueryBuilder<S, TableName, R, RelatedFields, true>(\n this.schema,\n this.tableName,\n this.executer,\n { ...this.options, isOne: true }\n );\n }\n\n /**\n * Include related data via subqueries\n * Field and cardinality are validated against schema relationships\n * Now accumulates the related field in the type!\n */\n related<\n Field extends TableRelationships<S, TableName>['field'],\n Rel extends GetRelationship<S, TableName, Field>,\n RelatedFields2 extends RelatedFieldsMap = {},\n >(\n field: Field,\n modifierOrCardinality?:\n | SchemaAwareQueryModifier<S, Rel['to'], RelatedFields2>\n | Rel['cardinality'],\n modifier?: SchemaAwareQueryModifier<S, Rel['to'], RelatedFields2>\n ): QueryBuilder<\n S,\n TableName,\n R,\n RelatedFields & {\n [K in Field]: {\n to: Rel['to'];\n cardinality: Rel['cardinality'];\n relatedFields: RelatedFields2;\n };\n },\n IsOne\n > {\n if (!this.options.related) {\n this.options.related = [];\n }\n\n // Check if field already exists\n const exists = this.options.related.some((r) => (r.alias || r.relatedTable) === field);\n\n if (exists) {\n return this as any;\n }\n\n // Look up relationship metadata from schema\n const relationship = this.schema.relationships.find(\n (r) => r.from === this.tableName && r.field === field\n );\n\n if (!relationship) {\n throw new Error(`Relationship '${String(field)}' not found for table '${this.tableName}'`);\n }\n\n // Determine cardinality and modifier based on arguments\n let actualCardinality: 'one' | 'many';\n let actualModifier: SchemaAwareQueryModifier<S, Rel['to']> | undefined;\n\n if (typeof modifierOrCardinality === 'function') {\n // Signature: related(field, modifier)\n actualCardinality = relationship.cardinality;\n actualModifier = modifierOrCardinality;\n } else if (modifierOrCardinality === 'one' || modifierOrCardinality === 'many') {\n // Signature: related(field, cardinality, modifier)\n actualCardinality = modifierOrCardinality;\n actualModifier = modifier;\n } else {\n // Signature: related(field)\n actualCardinality = relationship.cardinality;\n actualModifier = undefined;\n }\n\n // Determine foreign key field based on cardinality\n let foreignKeyField: string =\n actualCardinality === 'many' ? (this.tableName as string) : (field as string);\n\n if (actualCardinality === 'many') {\n // For one-to-many, we need to find the field on the child table that points back to the parent\n // We look for a relationship from Child -> Parent\n const reverseRelationships = this.schema.relationships.filter(\n (r) => r.from === relationship.to && r.to === this.tableName && r.cardinality === 'one'\n );\n\n if (reverseRelationships.length > 0) {\n // Prioritize field that matches parent table name\n const exactMatch = reverseRelationships.find((r) => r.field === this.tableName);\n if (exactMatch) {\n foreignKeyField = exactMatch.field;\n } else {\n foreignKeyField = reverseRelationships[0].field;\n }\n } else {\n // Fallback heuristics\n if (this.tableName.startsWith(`${relationship.to}_`)) {\n // If parent table is \"game_database\" and child is \"game\", try \"database\"\n foreignKeyField = this.tableName.slice(relationship.to.length + 1);\n }\n }\n }\n\n // Cast the schema-aware modifier to the runtime type\n // At runtime, QueryModifierBuilderImpl will work correctly with the schema\n const wrappedModifier = actualModifier as QueryModifier<GenericModel> | undefined;\n\n this.options.related.push({\n relatedTable: relationship.to,\n alias: field as string,\n modifier: wrappedModifier,\n cardinality: actualCardinality,\n foreignKeyField: foreignKeyField as any,\n } as RelatedQuery & { foreignKeyField: string });\n\n return this as any;\n }\n\n /**\n * Get the current query options\n */\n getOptions(): QueryOptions<TableModel<GetTable<S, TableName>>, IsOne> {\n return this.options;\n }\n\n /**\n * Build query methods for SELECT and LIVE SELECT (custom implementation)\n * @returns FinalQuery object with select() method for custom usage\n */\n build(): FinalQuery<S, TableName, GetTable<S, TableName>, RelatedFields, IsOne, R> {\n return new FinalQuery<S, TableName, GetTable<S, TableName>, RelatedFields, IsOne, R>(\n this.tableName,\n this.options,\n this.schema,\n this.executer\n );\n }\n}\n\nexport function cyrb53(str: string, seed: number = 0): number {\n let h1 = 0xdeadbeef ^ seed,\n h2 = 0x41c6ce57 ^ seed;\n for (let i = 0, ch; i < str.length; i++) {\n ch = str.charCodeAt(i);\n h1 = Math.imul(h1 ^ ch, 2654435761);\n h2 = Math.imul(h2 ^ ch, 1597334677);\n }\n h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507);\n h1 ^= Math.imul(h2 ^ (h2 >>> 13), 3266489909);\n h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507);\n h2 ^= Math.imul(h1 ^ (h1 >>> 13), 3266489909);\n\n return 4294967296 * (2097151 & h2) + (h1 >>> 0);\n}\n\nexport function extractSubqueryQueryInfos<S extends SchemaStructure>(\n schema: S,\n parentTableName: string,\n options: QueryOptions<GenericModel, boolean>,\n executer: Executor<{ columns: Record<string, ColumnSchema> }>\n): InnerQuery<{ columns: Record<string, ColumnSchema> }, boolean>[] {\n if (!options.related) {\n return [];\n }\n\n return options.related.map((rel) => {\n // Get base options from modifier\n const subOptions =\n rel\n .modifier?.(new SchemaAwareQueryModifierBuilderImpl(rel.relatedTable, schema))\n ._getOptions() ?? {};\n\n // Find relationship to determine how to filter\n const relationship = schema.relationships.find(\n (r) => r.from === parentTableName && r.field === rel.alias\n );\n\n if (relationship) {\n // Determine foreign key field\n // rel.alias is guaranteed to be defined if relationship is found (matched r.field)\n // oxlint-disable-next-line no-non-null-assertion -- alias is guaranteed defined when relationship is found\n let foreignKeyField = rel.alias!;\n\n if (relationship.cardinality === 'many') {\n // For one-to-many, we need to find the field on the child table that points back to the parent\n // We look for a relationship from Child -> Parent\n const reverseRelationships = schema.relationships.filter(\n (r) => r.from === rel.relatedTable && r.to === parentTableName && r.cardinality === 'one'\n );\n\n if (reverseRelationships.length > 0) {\n // Prioritize field that matches parent table name\n const exactMatch = reverseRelationships.find((r) => r.field === parentTableName);\n if (exactMatch) {\n foreignKeyField = exactMatch.field;\n } else {\n foreignKeyField = reverseRelationships[0].field;\n }\n } else {\n // Fallback heuristics\n if (parentTableName.startsWith(`${rel.relatedTable}_`)) {\n // If parent table is \"game_database\" and child is \"game\", try \"database\"\n foreignKeyField = parentTableName.slice(rel.relatedTable.length + 1);\n } else {\n // Default to parent table name\n foreignKeyField = parentTableName;\n }\n }\n }\n\n // Add parent filter to where clause\n subOptions.where = subOptions.where || {};\n\n if (relationship.cardinality === 'many') {\n // One-to-Many: Child has foreign key to parent\n // WHERE $parentIds ∋ child.parent_id\n (subOptions.where as any)[foreignKeyField] = { _op: '∋', _val: '$parentIds', _swap: true };\n } else {\n // One-to-One: Parent has foreign key to child\n // WHERE $parent_<foreignKeyField> ∋ child.id\n // We use a dynamic variable name derived from the foreign key field on the parent\n (subOptions.where as any).id = {\n _op: '∋',\n _val: `$parent_${foreignKeyField}`,\n _swap: true,\n };\n }\n }\n\n return new InnerQuery(rel.relatedTable, subOptions, schema, executer);\n });\n}\n\n/**\n * Build a query string from query options\n * @param method - The query method (SELECT or LIVE SELECT)\n * @param tableName - The table name to query\n * @param options - The query options (where, select, orderBy, etc.)\n * @param schema - Optional schema for resolving nested relationships\n * @returns QueryInfo with the generated SQL and variables\n */\nexport function buildQueryFromOptions<TModel extends GenericModel, IsOne extends boolean>(\n method: 'SELECT' | 'LIVE SELECT' | 'LIVE SELECT DIFF' | 'UPDATE' | 'DELETE',\n tableName: string,\n options: QueryOptions<TModel, IsOne>,\n schema: SchemaStructure,\n patches?: any[]\n): QueryInfo {\n if (options.isOne) {\n options.limit = 1;\n }\n const isLiveQuery = method === 'LIVE SELECT' || method === 'LIVE SELECT DIFF';\n\n // Parse where conditions to convert string IDs to RecordId\n const parsedWhere = options.where\n ? parseObjectIdsToRecordId(options.where, tableName)\n : undefined;\n\n // Build SELECT clause\n let selectClause = '*';\n\n if (method === 'LIVE SELECT DIFF') {\n selectClause = '';\n } else {\n if (options.select && options.select.length > 0) {\n selectClause = options.select.join(', ');\n }\n }\n\n // Build related subqueries (fetch clauses)\n let fetchClauses = '';\n if (!isLiveQuery && options.related && options.related.length > 0) {\n const subqueries = options.related.map((rel) => buildSubquery(rel, schema));\n fetchClauses = ', ' + subqueries.join(', ');\n }\n\n // Start building the query\n let query = '';\n\n if (method === 'UPDATE') {\n query = `UPDATE ${tableName}`;\n } else if (method === 'DELETE') {\n query = `DELETE FROM ${tableName}`;\n } else {\n query = `${method}${selectClause ? ` ${selectClause}` : ''}${fetchClauses} FROM ${tableName}`;\n }\n\n // Build WHERE clause\n const vars: Record<string, unknown> = {};\n if (parsedWhere && Object.keys(parsedWhere).length > 0) {\n const conditions: string[] = [];\n for (const [key, value] of Object.entries(parsedWhere)) {\n const varName = key;\n\n // Handle operator objects { _op, _val }\n if (value && typeof value === 'object' && '_op' in value && '_val' in value) {\n const { _op, _val, _swap } = value as { _op: string; _val: unknown; _swap?: boolean };\n\n let rightSide = '';\n if (typeof _val === 'string' && _val.startsWith('$')) {\n rightSide = _val;\n } else {\n vars[varName] = _val;\n rightSide = `$${varName}`;\n }\n\n if (_swap) {\n conditions.push(`${rightSide} ${_op} ${key}`);\n } else {\n conditions.push(`${key} ${_op} ${rightSide}`);\n }\n } else {\n vars[varName] = value;\n conditions.push(`${key} = $${varName}`);\n }\n }\n query += ` WHERE ${conditions.join(' AND ')}`;\n }\n\n // Add PATCH for UPDATE\n if (method === 'UPDATE' && patches) {\n query += ` PATCH ${JSON.stringify(patches)}`;\n }\n\n // Add ORDER BY, LIMIT, START only for non-live queries and non-update/delete queries (unless supported)\n // SurrealDB UPDATE/DELETE supports WHERE, but LIMIT/START/ORDER BY might be restricted or behave differently.\n // For now, let's allow them if they are set, as SurrealDB supports them for DELETE/UPDATE.\n if (!isLiveQuery) {\n if (options.orderBy && Object.keys(options.orderBy).length > 0) {\n const orderClauses = Object.entries(options.orderBy).map(\n ([field, direction]) => `${field} ${direction}`\n );\n query += ` ORDER BY ${orderClauses.join(', ')}`;\n }\n\n if (options.limit !== undefined) {\n query += ` LIMIT ${options.limit}`;\n }\n\n if (options.offset !== undefined) {\n query += ` START ${options.offset}`;\n }\n }\n\n query += ';';\n\n return {\n query,\n hash: cyrb53(\n `${query}::${Object.entries(vars)\n .map(([key, value]) => `${key}=${value}`)\n .join('&')}`,\n 0\n ),\n vars: Object.keys(vars).length > 0 ? vars : undefined,\n };\n}\n\n/**\n * Build a subquery for a related field\n */\nfunction buildSubquery(\n rel: RelatedQuery & { foreignKeyField?: string },\n schema: SchemaStructure\n): string {\n const { relatedTable, alias, modifier, cardinality } = rel;\n const foreignKeyField = rel.foreignKeyField || alias;\n\n let subquerySelect = '*';\n let subqueryWhere = '';\n let subqueryOrderBy = '';\n let subqueryLimit = '';\n\n // If there's a modifier, apply it to get the sub-options\n if (modifier) {\n const modifierBuilder = new SchemaAwareQueryModifierBuilderImpl(relatedTable, schema);\n modifier(modifierBuilder);\n const subOptions = modifierBuilder._getOptions();\n\n // Build sub-select\n if (subOptions.select && subOptions.select.length > 0) {\n subquerySelect = subOptions.select.join(', ');\n }\n\n // Build sub-where\n if (subOptions.where && Object.keys(subOptions.where).length > 0) {\n const parsedSubWhere = parseObjectIdsToRecordId(subOptions.where, relatedTable) as Record<\n string,\n unknown\n >;\n const conditions = Object.entries(parsedSubWhere).map(([key, value]) => {\n if (value instanceof RecordId) {\n return `${key} = ${value.toString()}`;\n }\n return `${key} = ${JSON.stringify(value)}`;\n });\n subqueryWhere = ` AND ${conditions.join(' AND ')}`;\n }\n\n // Build sub-orderBy\n if (subOptions.orderBy && Object.keys(subOptions.orderBy).length > 0) {\n const orderClauses = Object.entries(subOptions.orderBy).map(\n ([field, direction]) => `${field} ${direction}`\n );\n subqueryOrderBy = ` ORDER BY ${orderClauses.join(', ')}`;\n }\n\n // Build sub-limit\n if (subOptions.limit !== undefined) {\n subqueryLimit = ` LIMIT ${subOptions.limit}`;\n }\n\n // Handle nested relationships\n if (subOptions.related && subOptions.related.length > 0) {\n // Resolve nested relationship metadata if schema is available\n const resolvedNestedRels = subOptions.related.map((nestedRel) => {\n if (schema) {\n // Look up the actual relationship metadata from schema\n const relationship = schema.relationships.find(\n (r) => r.from === relatedTable && r.field === nestedRel.alias\n );\n\n if (relationship) {\n // Use the resolved table name and add foreign key field\n const nestedForeignKeyField =\n relationship.cardinality === 'many' ? relatedTable : nestedRel.alias;\n\n return {\n ...nestedRel,\n relatedTable: relationship.to,\n cardinality: relationship.cardinality,\n foreignKeyField: nestedForeignKeyField,\n } as RelatedQuery & { foreignKeyField: string };\n }\n }\n return nestedRel;\n });\n\n const nestedSubqueries = resolvedNestedRels.map((nestedRel) =>\n buildSubquery(nestedRel, schema)\n );\n subquerySelect += ', ' + nestedSubqueries.join(', ');\n }\n }\n\n // Determine the WHERE condition based on cardinality\n let whereCondition: string;\n if (cardinality === 'one') {\n // For one-to-one, the related table's id matches parent's foreign key field\n whereCondition = `WHERE id=$parent.${foreignKeyField}`;\n // Add LIMIT 1 for one-to-one relationships if not already set\n if (!subqueryLimit) {\n subqueryLimit = ' LIMIT 1';\n }\n } else {\n // For one-to-many, the related table has a foreign key field pointing to parent's id\n whereCondition = `WHERE ${foreignKeyField}=$parent.id`;\n }\n\n // Build the complete subquery\n let subquery = `(SELECT ${subquerySelect} FROM ${relatedTable} ${whereCondition}${subqueryWhere}${subqueryOrderBy}${subqueryLimit})`;\n\n // For one-to-one relationships, select the first element\n if (cardinality === 'one') {\n subquery += '[0]';\n }\n\n subquery += ` AS ${alias}`;\n\n return subquery;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["RecordId"],"sources":["../src/query-builder.ts"],"sourcesContent":["import { RecordId } from 'surrealdb';\nimport type {\n GenericModel,\n QueryInfo,\n QueryOptions,\n QueryModifier,\n RelatedQuery,\n SchemaAwareQueryModifier,\n SchemaAwareQueryModifierBuilder,\n WhereInput,\n} from './types';\nimport type {\n TableNames,\n GetTable,\n TableModel,\n TableRelationships,\n GetRelationship,\n SchemaStructure,\n TableFieldNames,\n ColumnSchema,\n} from './table-schema';\n\n/**\n * Parse a string ID to RecordId\n * - If it's in the format \"table:id\", use it as-is\n * - If it's just an ID without \":\", prepend the table name\n * @param value - The value to parse (could be a string ID)\n * @param tableName - The table name to use if the ID doesn't contain \":\"\n * @param fieldName - The field name to determine if this is an ID field\n */\nfunction parseStringToRecordId(value: unknown, tableName?: string, fieldName?: string): unknown {\n if (typeof value !== 'string') return value;\n\n // If it already contains \":\", parse it as a full record ID\n if (value.includes(':')) {\n const [table, ...idParts] = value.split(':');\n const id = idParts.join(':'); // Handle IDs that contain colons\n return new RecordId(table, id);\n }\n\n // If this is an \"id\" field and we have a table name, prepend it\n if (fieldName === 'id' && tableName) {\n return new RecordId(tableName, value);\n }\n\n // Otherwise, return as-is (it might not be an ID at all)\n return value;\n}\n\n/**\n * Recursively parse string IDs to RecordId in an object\n * @param obj - The object to parse\n * @param tableName - The table name to use for ID fields without \":\"\n */\nfunction parseObjectIdsToRecordId(obj: unknown, tableName?: string): unknown {\n if (obj === null || obj === undefined) return obj;\n\n if (typeof obj === 'string') {\n return parseStringToRecordId(obj, tableName);\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => parseObjectIdsToRecordId(item, tableName));\n }\n\n if (typeof obj === 'object' && obj.constructor === Object) {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n // Parse recursively, passing the field name to identify ID fields\n result[key] =\n typeof value === 'string'\n ? parseStringToRecordId(value, tableName, key)\n : parseObjectIdsToRecordId(value, tableName);\n }\n return result;\n }\n\n return obj;\n}\n\nexport type Executor<T extends { columns: Record<string, ColumnSchema> }, R = void> = (\n query: InnerQuery<T, boolean>\n) => R;\n\nexport class InnerQuery<\n T extends { columns: Record<string, ColumnSchema> },\n IsOne extends boolean,\n R = void,\n> {\n private _hash: number;\n private _mainQuery: QueryInfo;\n private _selectQuery: QueryInfo;\n private _selectLiveQuery: QueryInfo;\n private _subqueries: InnerQuery<{ columns: Record<string, ColumnSchema> }, boolean>[];\n\n constructor(\n private readonly _tableName: string,\n private readonly options: QueryOptions<TableModel<T>, IsOne>,\n private readonly schema: SchemaStructure,\n private readonly executor: Executor<any, R>\n ) {\n this._selectQuery = buildQueryFromOptions('SELECT', this._tableName, this.options, this.schema);\n\n this._mainQuery = buildQueryFromOptions(\n 'SELECT',\n this._tableName,\n { ...this.options, related: [] },\n this.schema\n );\n\n this._hash = this._selectQuery.hash;\n\n this._selectLiveQuery = buildQueryFromOptions(\n 'LIVE SELECT',\n this._tableName,\n this.options,\n this.schema\n );\n\n this._subqueries = extractSubqueryQueryInfos(\n schema,\n this._tableName,\n this.options,\n this.executor\n );\n }\n\n get mainQuery(): QueryInfo {\n return this._mainQuery;\n }\n\n get subqueries(): InnerQuery<{ columns: Record<string, ColumnSchema> }, boolean>[] {\n return this._subqueries;\n }\n\n get selectQuery(): QueryInfo {\n return this._selectQuery;\n }\n\n get selectLiveQuery(): QueryInfo {\n return this._selectLiveQuery;\n }\n\n get tableName(): string {\n return this._tableName;\n }\n\n get hash(): number {\n return this._hash;\n }\n\n get isOne(): boolean {\n return this.options.isOne ?? false;\n }\n\n public run(): R {\n return this.executor(this);\n }\n\n public buildUpdateQuery(patches: any[]): QueryInfo {\n return buildQueryFromOptions('UPDATE', this._tableName, this.options, this.schema, patches);\n }\n\n public buildDeleteQuery(): QueryInfo {\n return buildQueryFromOptions('DELETE', this._tableName, this.options, this.schema);\n }\n\n public getOptions(): QueryOptions<TableModel<T>, IsOne> {\n return this.options;\n }\n}\n\n/**\n * Helper type to get the model type for a related table\n */\ntype _GetRelatedModel<S extends SchemaStructure, RelatedTableName extends string> =\n RelatedTableName extends TableNames<S> ? TableModel<GetTable<S, RelatedTableName>> : never;\n\n/**\n * Helper type to extract field names from RelatedFields\n */\nexport type ExtractFieldNames<RelatedFields extends RelatedFieldsMap> = keyof RelatedFields;\n\nexport type RelatedFieldMapEntry = {\n to: string;\n cardinality: 'one' | 'many';\n relatedFields: RelatedFieldsMap;\n};\n\nexport type RelatedFieldsMap = Record<string, RelatedFieldMapEntry>;\n\n/**\n * Helper type to build the related fields object based on accumulated relationships\n */\nexport type BuildRelatedFields<\n S extends SchemaStructure,\n RelatedFields extends RelatedFieldsMap,\n> = {\n [K in keyof RelatedFields]: QueryResult<\n S,\n RelatedFields[K]['to'],\n RelatedFields[K]['relatedFields'],\n RelatedFields[K]['cardinality'] extends 'one' ? true : false\n >;\n};\n\nexport type BuildResultModelOne<\n S extends SchemaStructure,\n TableName extends TableNames<S>,\n RelatedFields extends RelatedFieldsMap,\n> = Omit<TableModel<GetTable<S, TableName>>, ExtractFieldNames<RelatedFields>> &\n BuildRelatedFields<S, RelatedFields>;\n\nexport type BuildResultModelMany<\n S extends SchemaStructure,\n TableName extends TableNames<S>,\n RelatedFields extends RelatedFieldsMap,\n> = (Omit<TableModel<GetTable<S, TableName>>, ExtractFieldNames<RelatedFields>> &\n BuildRelatedFields<S, RelatedFields>)[];\n\n/**\n * The final result type combining base model with related fields\n * Excludes related field keys from the base model to avoid type conflicts\n */\nexport type QueryResult<\n S extends SchemaStructure,\n TableName extends TableNames<S>,\n RelatedFields extends RelatedFieldsMap,\n IsOne extends boolean,\n> = IsOne extends true\n ? BuildResultModelOne<S, TableName, RelatedFields>\n : BuildResultModelMany<S, TableName, RelatedFields>;\n\nexport class FinalQuery<\n S extends SchemaStructure,\n TableName extends TableNames<S>,\n T extends { columns: Record<string, ColumnSchema> },\n // oxlint-disable-next-line no-unused-vars -- RelatedFields is used externally for type inference\n RelatedFields extends RelatedFieldsMap,\n IsOne extends boolean,\n R = void,\n> {\n private _innerQuery: InnerQuery<T, IsOne, R>;\n\n constructor(\n private readonly tableName: TableName,\n private readonly options: QueryOptions<TableModel<T>, IsOne>,\n private readonly schema: S,\n private readonly executor: Executor<T, R>\n ) {\n this._innerQuery = new InnerQuery<T, IsOne, R>(\n this.tableName,\n this.options,\n this.schema,\n this.executor\n );\n }\n\n run(): R {\n return this.executor(this._innerQuery);\n }\n\n buildUpdateQuery(patches: any[]): QueryInfo {\n return this._innerQuery.buildUpdateQuery(patches);\n }\n\n buildDeleteQuery(): QueryInfo {\n return this._innerQuery.buildDeleteQuery();\n }\n\n selectLive(): QueryInfo {\n return this._innerQuery.selectLiveQuery;\n }\n\n get innerQuery(): InnerQuery<T, IsOne, R> {\n return this._innerQuery;\n }\n\n get isOne(): boolean {\n return this.options.isOne ?? false;\n }\n\n get hash(): number {\n return this._innerQuery.hash;\n }\n}\n\n/**\n * Schema-aware query modifier builder implementation\n * This version provides full type safety for nested relationships\n */\nclass SchemaAwareQueryModifierBuilderImpl<\n S extends SchemaStructure,\n TableName extends TableNames<S>,\n RelatedFields extends RelatedFieldsMap = {},\n> implements SchemaAwareQueryModifierBuilder<S, TableName, RelatedFields> {\n private options: QueryOptions<TableModel<GetTable<S, TableName>>, boolean> = {};\n\n constructor(\n private readonly tableName: TableName,\n private readonly schema: S\n ) {}\n\n where(conditions: WhereInput<TableModel<GetTable<S, TableName>>>): this {\n this.options.where = { ...this.options.where, ...conditions };\n return this;\n }\n\n select(...fields: ((keyof TableModel<GetTable<S, TableName>> & string) | '*')[]): this {\n if (this.options.select) {\n throw new Error('Select can only be called once per query');\n }\n this.options.select = fields;\n return this;\n }\n\n limit(count: number): this {\n this.options.limit = count;\n return this;\n }\n\n offset(count: number): this {\n this.options.offset = count;\n return this;\n }\n\n orderBy(\n field: keyof TableModel<GetTable<S, TableName>> & string,\n direction: 'asc' | 'desc' = 'asc'\n ): this {\n this.options.orderBy = {\n ...this.options.orderBy,\n [field]: direction,\n } as Partial<Record<keyof TableModel<GetTable<S, TableName>>, 'asc' | 'desc'>>;\n return this;\n }\n\n // Schema-aware implementation for nested relationships with full type inference\n related<\n Field extends TableRelationships<S, TableName>['field'],\n Rel extends GetRelationship<S, TableName, Field>,\n RelatedFields2 extends RelatedFieldsMap = {},\n >(\n relatedField: Field,\n modifier?: SchemaAwareQueryModifier<S, Rel['to'], RelatedFields2>\n ): SchemaAwareQueryModifierBuilderImpl<\n S,\n TableName,\n RelatedFields & {\n [K in Field]: {\n to: Rel['to'];\n cardinality: Rel['cardinality'];\n relatedFields: RelatedFields2;\n };\n }\n > {\n if (!this.options.related) {\n this.options.related = [];\n }\n\n const exists = this.options.related.some((r) => (r.alias || r.relatedTable) === relatedField);\n\n if (!exists) {\n // Look up the relationship from schema\n const relationship = this.schema.relationships.find(\n (r) => r.from === this.tableName && r.field === relatedField\n );\n\n if (!relationship) {\n throw new Error(\n `Relationship '${String(relatedField)}' not found for table '${this.tableName}'`\n );\n }\n\n const relatedTable = relationship.to;\n const cardinality = relationship.cardinality;\n const foreignKeyField = cardinality === 'many' ? this.tableName : relatedField;\n\n this.options.related.push({\n relatedTable,\n alias: relatedField as string,\n modifier: modifier as QueryModifier<GenericModel>,\n cardinality,\n foreignKeyField: foreignKeyField as string,\n } as RelatedQuery & { foreignKeyField: string });\n }\n return this as any;\n }\n\n _getOptions(): QueryOptions<TableModel<GetTable<S, TableName>>, boolean> {\n return this.options;\n }\n}\n\n/**\n * Fluent query builder for constructing queries with chainable methods\n * Now with full type inference from schema constant AND related field accumulation!\n */\nexport class QueryBuilder<\n const S extends SchemaStructure,\n const TableName extends TableNames<S>,\n const R = void,\n const RelatedFields extends RelatedFieldsMap = {},\n const IsOne extends boolean = false,\n> {\n constructor(\n private readonly schema: S,\n private readonly tableName: TableName,\n private readonly executer: Executor<GetTable<S, TableName>, R> = () => undefined as R,\n private options: QueryOptions<TableModel<GetTable<S, TableName>>, IsOne> = {}\n ) {}\n\n /**\n * Add additional where conditions\n */\n where(\n conditions: WhereInput<TableModel<GetTable<S, TableName>>>\n ): QueryBuilder<S, TableName, R, RelatedFields, IsOne> {\n this.options.where = { ...this.options.where, ...conditions };\n return this;\n }\n\n /**\n * Specify fields to select\n */\n select(\n ...fields: ((keyof TableModel<GetTable<S, TableName>> & string) | '*')[]\n ): QueryBuilder<S, TableName, R, RelatedFields, IsOne> {\n if (this.options.select) {\n throw new Error('Select can only be called once per query');\n }\n this.options.select = fields;\n return this;\n }\n\n /**\n * Add ordering to the query (only for non-live queries)\n */\n orderBy(\n field: TableFieldNames<GetTable<S, TableName>>,\n direction: 'asc' | 'desc' = 'asc'\n ): QueryBuilder<S, TableName, R, RelatedFields, IsOne> {\n this.options.orderBy = {\n ...this.options.orderBy,\n [field]: direction,\n } as Partial<Record<keyof TableModel<GetTable<S, TableName>>, 'asc' | 'desc'>>;\n return this;\n }\n\n /**\n * Add limit to the query (only for non-live queries)\n */\n limit(count: number): QueryBuilder<S, TableName, R, RelatedFields, IsOne> {\n this.options.limit = count;\n return this;\n }\n\n /**\n * Add offset to the query (only for non-live queries)\n */\n offset(count: number): QueryBuilder<S, TableName, R, RelatedFields, IsOne> {\n this.options.offset = count;\n return this;\n }\n\n one(): QueryBuilder<S, TableName, R, RelatedFields, true> {\n return new QueryBuilder<S, TableName, R, RelatedFields, true>(\n this.schema,\n this.tableName,\n this.executer,\n { ...this.options, isOne: true }\n );\n }\n\n /**\n * Include related data via subqueries\n * Field and cardinality are validated against schema relationships\n * Now accumulates the related field in the type!\n */\n related<\n Field extends TableRelationships<S, TableName>['field'],\n Rel extends GetRelationship<S, TableName, Field>,\n RelatedFields2 extends RelatedFieldsMap = {},\n >(\n field: Field,\n modifierOrCardinality?:\n | SchemaAwareQueryModifier<S, Rel['to'], RelatedFields2>\n | Rel['cardinality'],\n modifier?: SchemaAwareQueryModifier<S, Rel['to'], RelatedFields2>\n ): QueryBuilder<\n S,\n TableName,\n R,\n RelatedFields & {\n [K in Field]: {\n to: Rel['to'];\n cardinality: Rel['cardinality'];\n relatedFields: RelatedFields2;\n };\n },\n IsOne\n > {\n if (!this.options.related) {\n this.options.related = [];\n }\n\n // Check if field already exists\n const exists = this.options.related.some((r) => (r.alias || r.relatedTable) === field);\n\n if (exists) {\n return this as any;\n }\n\n // Look up relationship metadata from schema\n const relationship = this.schema.relationships.find(\n (r) => r.from === this.tableName && r.field === field\n );\n\n if (!relationship) {\n throw new Error(`Relationship '${String(field)}' not found for table '${this.tableName}'`);\n }\n\n // Determine cardinality and modifier based on arguments\n let actualCardinality: 'one' | 'many';\n let actualModifier: SchemaAwareQueryModifier<S, Rel['to']> | undefined;\n\n if (typeof modifierOrCardinality === 'function') {\n // Signature: related(field, modifier)\n actualCardinality = relationship.cardinality;\n actualModifier = modifierOrCardinality;\n } else if (modifierOrCardinality === 'one' || modifierOrCardinality === 'many') {\n // Signature: related(field, cardinality, modifier)\n actualCardinality = modifierOrCardinality;\n actualModifier = modifier;\n } else {\n // Signature: related(field)\n actualCardinality = relationship.cardinality;\n actualModifier = undefined;\n }\n\n // Determine foreign key field based on cardinality\n let foreignKeyField: string =\n actualCardinality === 'many' ? (this.tableName as string) : (field as string);\n\n if (actualCardinality === 'many') {\n // For one-to-many, we need to find the field on the child table that points back to the parent\n // We look for a relationship from Child -> Parent\n const reverseRelationships = this.schema.relationships.filter(\n (r) => r.from === relationship.to && r.to === this.tableName && r.cardinality === 'one'\n );\n\n if (reverseRelationships.length > 0) {\n // Prioritize field that matches parent table name\n const exactMatch = reverseRelationships.find((r) => r.field === this.tableName);\n if (exactMatch) {\n foreignKeyField = exactMatch.field;\n } else {\n foreignKeyField = reverseRelationships[0].field;\n }\n } else {\n // Fallback heuristics\n if (this.tableName.startsWith(`${relationship.to}_`)) {\n // If parent table is \"game_database\" and child is \"game\", try \"database\"\n foreignKeyField = this.tableName.slice(relationship.to.length + 1);\n }\n }\n }\n\n // Cast the schema-aware modifier to the runtime type\n // At runtime, QueryModifierBuilderImpl will work correctly with the schema\n const wrappedModifier = actualModifier as QueryModifier<GenericModel> | undefined;\n\n this.options.related.push({\n relatedTable: relationship.to,\n alias: field as string,\n modifier: wrappedModifier,\n cardinality: actualCardinality,\n foreignKeyField: foreignKeyField as any,\n } as RelatedQuery & { foreignKeyField: string });\n\n return this as any;\n }\n\n /**\n * Get the current query options\n */\n getOptions(): QueryOptions<TableModel<GetTable<S, TableName>>, IsOne> {\n return this.options;\n }\n\n /**\n * Build query methods for SELECT and LIVE SELECT (custom implementation)\n * @returns FinalQuery object with select() method for custom usage\n */\n build(): FinalQuery<S, TableName, GetTable<S, TableName>, RelatedFields, IsOne, R> {\n return new FinalQuery<S, TableName, GetTable<S, TableName>, RelatedFields, IsOne, R>(\n this.tableName,\n this.options,\n this.schema,\n this.executer\n );\n }\n}\n\nexport function cyrb53(str: string, seed: number = 0): number {\n let h1 = 0xdeadbeef ^ seed,\n h2 = 0x41c6ce57 ^ seed;\n for (let i = 0, ch; i < str.length; i++) {\n ch = str.charCodeAt(i);\n h1 = Math.imul(h1 ^ ch, 2654435761);\n h2 = Math.imul(h2 ^ ch, 1597334677);\n }\n h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507);\n h1 ^= Math.imul(h2 ^ (h2 >>> 13), 3266489909);\n h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507);\n h2 ^= Math.imul(h1 ^ (h1 >>> 13), 3266489909);\n\n return 4294967296 * (2097151 & h2) + (h1 >>> 0);\n}\n\nexport function extractSubqueryQueryInfos<S extends SchemaStructure>(\n schema: S,\n parentTableName: string,\n options: QueryOptions<GenericModel, boolean>,\n executer: Executor<{ columns: Record<string, ColumnSchema> }>\n): InnerQuery<{ columns: Record<string, ColumnSchema> }, boolean>[] {\n if (!options.related) {\n return [];\n }\n\n return options.related.map((rel) => {\n // Get base options from modifier\n const subOptions =\n rel\n .modifier?.(new SchemaAwareQueryModifierBuilderImpl(rel.relatedTable, schema))\n ._getOptions() ?? {};\n\n // Find relationship to determine how to filter\n const relationship = schema.relationships.find(\n (r) => r.from === parentTableName && r.field === rel.alias\n );\n\n if (relationship) {\n // Determine foreign key field\n // rel.alias is guaranteed to be defined if relationship is found (matched r.field)\n // oxlint-disable-next-line no-non-null-assertion -- alias is guaranteed defined when relationship is found\n let foreignKeyField = rel.alias!;\n\n if (relationship.cardinality === 'many') {\n // For one-to-many, we need to find the field on the child table that points back to the parent\n // We look for a relationship from Child -> Parent\n const reverseRelationships = schema.relationships.filter(\n (r) => r.from === rel.relatedTable && r.to === parentTableName && r.cardinality === 'one'\n );\n\n if (reverseRelationships.length > 0) {\n // Prioritize field that matches parent table name\n const exactMatch = reverseRelationships.find((r) => r.field === parentTableName);\n if (exactMatch) {\n foreignKeyField = exactMatch.field;\n } else {\n foreignKeyField = reverseRelationships[0].field;\n }\n } else {\n // Fallback heuristics\n if (parentTableName.startsWith(`${rel.relatedTable}_`)) {\n // If parent table is \"game_database\" and child is \"game\", try \"database\"\n foreignKeyField = parentTableName.slice(rel.relatedTable.length + 1);\n } else {\n // Default to parent table name\n foreignKeyField = parentTableName;\n }\n }\n }\n\n // Add parent filter to where clause\n subOptions.where = subOptions.where || {};\n\n if (relationship.cardinality === 'many') {\n // One-to-Many: Child has foreign key to parent\n // WHERE $parentIds ∋ child.parent_id\n (subOptions.where as any)[foreignKeyField] = { _op: '∋', _val: '$parentIds', _swap: true };\n } else {\n // One-to-One: Parent has foreign key to child\n // WHERE $parent_<foreignKeyField> ∋ child.id\n // We use a dynamic variable name derived from the foreign key field on the parent\n (subOptions.where as any).id = {\n _op: '∋',\n _val: `$parent_${foreignKeyField}`,\n _swap: true,\n };\n }\n }\n\n return new InnerQuery(rel.relatedTable, subOptions, schema, executer);\n });\n}\n\n/**\n * Build a query string from query options\n * @param method - The query method (SELECT or LIVE SELECT)\n * @param tableName - The table name to query\n * @param options - The query options (where, select, orderBy, etc.)\n * @param schema - Optional schema for resolving nested relationships\n * @returns QueryInfo with the generated SQL and variables\n */\nexport function buildQueryFromOptions<TModel extends GenericModel, IsOne extends boolean>(\n method: 'SELECT' | 'LIVE SELECT' | 'LIVE SELECT DIFF' | 'UPDATE' | 'DELETE',\n tableName: string,\n options: QueryOptions<TModel, IsOne>,\n schema: SchemaStructure,\n patches?: any[]\n): QueryInfo {\n if (options.isOne) {\n options.limit = 1;\n }\n const isLiveQuery = method === 'LIVE SELECT' || method === 'LIVE SELECT DIFF';\n\n // Parse where conditions to convert string IDs to RecordId\n const parsedWhere = options.where\n ? parseObjectIdsToRecordId(options.where, tableName)\n : undefined;\n\n // Build SELECT clause\n let selectClause = '*';\n\n if (method === 'LIVE SELECT DIFF') {\n selectClause = '';\n } else {\n if (options.select && options.select.length > 0) {\n selectClause = options.select.join(', ');\n }\n }\n\n // Build related subqueries (fetch clauses)\n let fetchClauses = '';\n if (!isLiveQuery && options.related && options.related.length > 0) {\n const subqueries = options.related.map((rel) => buildSubquery(rel, schema));\n fetchClauses = ', ' + subqueries.join(', ');\n }\n\n // Start building the query\n let query = '';\n\n if (method === 'UPDATE') {\n query = `UPDATE ${tableName}`;\n } else if (method === 'DELETE') {\n query = `DELETE FROM ${tableName}`;\n } else {\n query = `${method}${selectClause ? ` ${selectClause}` : ''}${fetchClauses} FROM ${tableName}`;\n }\n\n // Build WHERE clause\n const vars: Record<string, unknown> = {};\n if (parsedWhere && Object.keys(parsedWhere).length > 0) {\n const conditions: string[] = [];\n\n // Build a single condition for `field`, binding its value under `varName`.\n // Supports operator objects `{ _op, _val, _swap }` (e.g. `{ _op: '<=', _val:\n // 5 }`); a `$`-prefixed string `_val` references an existing param verbatim.\n // Plain values mean equality (`field = $varName`).\n const buildCondition = (field: string, value: unknown, varName: string): string => {\n if (value && typeof value === 'object' && '_op' in value && '_val' in value) {\n const { _op, _val, _swap } = value as { _op: string; _val: unknown; _swap?: boolean };\n let rightSide: string;\n if (typeof _val === 'string' && _val.startsWith('$')) {\n rightSide = _val;\n } else {\n vars[varName] = _val;\n rightSide = `$${varName}`;\n }\n return _swap ? `${rightSide} ${_op} ${field}` : `${field} ${_op} ${rightSide}`;\n }\n vars[varName] = value;\n return `${field} = $${varName}`;\n };\n\n for (const [key, value] of Object.entries(parsedWhere)) {\n // OR-group: `{ _or: [ {field: val}, {field: {_op,_val}}, ... ] }` compiles\n // to one parenthesised `(c1 OR c2 ...)` conjunct. Each branch condition gets\n // a unique, position-indexed param name (`or0`, `or1`, …) so it never\n // collides with a top-level condition on the same field (e.g. a `white =\n // $white` filter alongside an opponent `_or` on white/black) — keeping the\n // surql + vars, and thus the query hash, stable and deterministic.\n if (key === '_or' && Array.isArray(value)) {\n const orParts: string[] = [];\n let i = 0;\n for (const branch of value) {\n if (branch && typeof branch === 'object') {\n for (const [bField, bVal] of Object.entries(branch as Record<string, unknown>)) {\n orParts.push(buildCondition(bField, bVal, `or${i++}`));\n }\n }\n }\n if (orParts.length > 0) conditions.push(`(${orParts.join(' OR ')})`);\n continue;\n }\n\n conditions.push(buildCondition(key, value, key));\n }\n\n if (conditions.length > 0) query += ` WHERE ${conditions.join(' AND ')}`;\n }\n\n // Add PATCH for UPDATE\n if (method === 'UPDATE' && patches) {\n query += ` PATCH ${JSON.stringify(patches)}`;\n }\n\n // Add ORDER BY, LIMIT, START only for non-live queries and non-update/delete queries (unless supported)\n // SurrealDB UPDATE/DELETE supports WHERE, but LIMIT/START/ORDER BY might be restricted or behave differently.\n // For now, let's allow them if they are set, as SurrealDB supports them for DELETE/UPDATE.\n if (!isLiveQuery) {\n if (options.orderBy && Object.keys(options.orderBy).length > 0) {\n const orderClauses = Object.entries(options.orderBy).map(\n ([field, direction]) => `${field} ${direction}`\n );\n query += ` ORDER BY ${orderClauses.join(', ')}`;\n }\n\n if (options.limit !== undefined) {\n query += ` LIMIT ${options.limit}`;\n }\n\n if (options.offset !== undefined) {\n query += ` START ${options.offset}`;\n }\n }\n\n query += ';';\n\n return {\n query,\n hash: cyrb53(\n `${query}::${Object.entries(vars)\n .map(([key, value]) => `${key}=${value}`)\n .join('&')}`,\n 0\n ),\n vars: Object.keys(vars).length > 0 ? vars : undefined,\n };\n}\n\n/**\n * Build a subquery for a related field\n */\nfunction buildSubquery(\n rel: RelatedQuery & { foreignKeyField?: string },\n schema: SchemaStructure\n): string {\n const { relatedTable, alias, modifier, cardinality } = rel;\n const foreignKeyField = rel.foreignKeyField || alias;\n\n let subquerySelect = '*';\n let subqueryWhere = '';\n let subqueryOrderBy = '';\n let subqueryLimit = '';\n\n // If there's a modifier, apply it to get the sub-options\n if (modifier) {\n const modifierBuilder = new SchemaAwareQueryModifierBuilderImpl(relatedTable, schema);\n modifier(modifierBuilder);\n const subOptions = modifierBuilder._getOptions();\n\n // Build sub-select\n if (subOptions.select && subOptions.select.length > 0) {\n subquerySelect = subOptions.select.join(', ');\n }\n\n // Build sub-where\n if (subOptions.where && Object.keys(subOptions.where).length > 0) {\n const parsedSubWhere = parseObjectIdsToRecordId(subOptions.where, relatedTable) as Record<\n string,\n unknown\n >;\n const conditions = Object.entries(parsedSubWhere).map(([key, value]) => {\n if (value instanceof RecordId) {\n return `${key} = ${value.toString()}`;\n }\n return `${key} = ${JSON.stringify(value)}`;\n });\n subqueryWhere = ` AND ${conditions.join(' AND ')}`;\n }\n\n // Build sub-orderBy\n if (subOptions.orderBy && Object.keys(subOptions.orderBy).length > 0) {\n const orderClauses = Object.entries(subOptions.orderBy).map(\n ([field, direction]) => `${field} ${direction}`\n );\n subqueryOrderBy = ` ORDER BY ${orderClauses.join(', ')}`;\n }\n\n // Build sub-limit\n if (subOptions.limit !== undefined) {\n subqueryLimit = ` LIMIT ${subOptions.limit}`;\n }\n\n // Handle nested relationships\n if (subOptions.related && subOptions.related.length > 0) {\n // Resolve nested relationship metadata if schema is available\n const resolvedNestedRels = subOptions.related.map((nestedRel) => {\n if (schema) {\n // Look up the actual relationship metadata from schema\n const relationship = schema.relationships.find(\n (r) => r.from === relatedTable && r.field === nestedRel.alias\n );\n\n if (relationship) {\n // Use the resolved table name and add foreign key field\n const nestedForeignKeyField =\n relationship.cardinality === 'many' ? relatedTable : nestedRel.alias;\n\n return {\n ...nestedRel,\n relatedTable: relationship.to,\n cardinality: relationship.cardinality,\n foreignKeyField: nestedForeignKeyField,\n } as RelatedQuery & { foreignKeyField: string };\n }\n }\n return nestedRel;\n });\n\n const nestedSubqueries = resolvedNestedRels.map((nestedRel) =>\n buildSubquery(nestedRel, schema)\n );\n subquerySelect += ', ' + nestedSubqueries.join(', ');\n }\n }\n\n // Determine the WHERE condition based on cardinality\n let whereCondition: string;\n if (cardinality === 'one') {\n // For one-to-one, the related table's id matches parent's foreign key field\n whereCondition = `WHERE id=$parent.${foreignKeyField}`;\n // Add LIMIT 1 for one-to-one relationships if not already set\n if (!subqueryLimit) {\n subqueryLimit = ' LIMIT 1';\n }\n } else {\n // For one-to-many, the related table has a foreign key field pointing to parent's id\n whereCondition = `WHERE ${foreignKeyField}=$parent.id`;\n }\n\n // Build the complete subquery\n let subquery = `(SELECT ${subquerySelect} FROM ${relatedTable} ${whereCondition}${subqueryWhere}${subqueryOrderBy}${subqueryLimit})`;\n\n // For one-to-one relationships, select the first element\n if (cardinality === 'one') {\n subquery += '[0]';\n }\n\n subquery += ` AS ${alias}`;\n\n return subquery;\n}\n"],"mappings":"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"}
|
package/dist/index.mjs
CHANGED
|
@@ -354,24 +354,31 @@ function buildQueryFromOptions(method, tableName, options, schema, patches) {
|
|
|
354
354
|
const vars = {};
|
|
355
355
|
if (parsedWhere && Object.keys(parsedWhere).length > 0) {
|
|
356
356
|
const conditions = [];
|
|
357
|
-
|
|
358
|
-
const varName = key;
|
|
357
|
+
const buildCondition = (field, value, varName) => {
|
|
359
358
|
if (value && typeof value === "object" && "_op" in value && "_val" in value) {
|
|
360
359
|
const { _op, _val, _swap } = value;
|
|
361
|
-
let rightSide
|
|
360
|
+
let rightSide;
|
|
362
361
|
if (typeof _val === "string" && _val.startsWith("$")) rightSide = _val;
|
|
363
362
|
else {
|
|
364
363
|
vars[varName] = _val;
|
|
365
364
|
rightSide = `$${varName}`;
|
|
366
365
|
}
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
366
|
+
return _swap ? `${rightSide} ${_op} ${field}` : `${field} ${_op} ${rightSide}`;
|
|
367
|
+
}
|
|
368
|
+
vars[varName] = value;
|
|
369
|
+
return `${field} = $${varName}`;
|
|
370
|
+
};
|
|
371
|
+
for (const [key, value] of Object.entries(parsedWhere)) {
|
|
372
|
+
if (key === "_or" && Array.isArray(value)) {
|
|
373
|
+
const orParts = [];
|
|
374
|
+
let i = 0;
|
|
375
|
+
for (const branch of value) if (branch && typeof branch === "object") for (const [bField, bVal] of Object.entries(branch)) orParts.push(buildCondition(bField, bVal, `or${i++}`));
|
|
376
|
+
if (orParts.length > 0) conditions.push(`(${orParts.join(" OR ")})`);
|
|
377
|
+
continue;
|
|
372
378
|
}
|
|
379
|
+
conditions.push(buildCondition(key, value, key));
|
|
373
380
|
}
|
|
374
|
-
query += ` WHERE ${conditions.join(" AND ")}`;
|
|
381
|
+
if (conditions.length > 0) query += ` WHERE ${conditions.join(" AND ")}`;
|
|
375
382
|
}
|
|
376
383
|
if (method === "UPDATE" && patches) query += ` PATCH ${JSON.stringify(patches)}`;
|
|
377
384
|
if (!isLiveQuery) {
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["RecordId"],"sources":["../src/query-builder.ts"],"sourcesContent":["import { RecordId } from 'surrealdb';\nimport type {\n GenericModel,\n QueryInfo,\n QueryOptions,\n QueryModifier,\n RelatedQuery,\n SchemaAwareQueryModifier,\n SchemaAwareQueryModifierBuilder,\n} from './types';\nimport type {\n TableNames,\n GetTable,\n TableModel,\n TableRelationships,\n GetRelationship,\n SchemaStructure,\n TableFieldNames,\n ColumnSchema,\n} from './table-schema';\n\n/**\n * Parse a string ID to RecordId\n * - If it's in the format \"table:id\", use it as-is\n * - If it's just an ID without \":\", prepend the table name\n * @param value - The value to parse (could be a string ID)\n * @param tableName - The table name to use if the ID doesn't contain \":\"\n * @param fieldName - The field name to determine if this is an ID field\n */\nfunction parseStringToRecordId(value: unknown, tableName?: string, fieldName?: string): unknown {\n if (typeof value !== 'string') return value;\n\n // If it already contains \":\", parse it as a full record ID\n if (value.includes(':')) {\n const [table, ...idParts] = value.split(':');\n const id = idParts.join(':'); // Handle IDs that contain colons\n return new RecordId(table, id);\n }\n\n // If this is an \"id\" field and we have a table name, prepend it\n if (fieldName === 'id' && tableName) {\n return new RecordId(tableName, value);\n }\n\n // Otherwise, return as-is (it might not be an ID at all)\n return value;\n}\n\n/**\n * Recursively parse string IDs to RecordId in an object\n * @param obj - The object to parse\n * @param tableName - The table name to use for ID fields without \":\"\n */\nfunction parseObjectIdsToRecordId(obj: unknown, tableName?: string): unknown {\n if (obj === null || obj === undefined) return obj;\n\n if (typeof obj === 'string') {\n return parseStringToRecordId(obj, tableName);\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => parseObjectIdsToRecordId(item, tableName));\n }\n\n if (typeof obj === 'object' && obj.constructor === Object) {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n // Parse recursively, passing the field name to identify ID fields\n result[key] =\n typeof value === 'string'\n ? parseStringToRecordId(value, tableName, key)\n : parseObjectIdsToRecordId(value, tableName);\n }\n return result;\n }\n\n return obj;\n}\n\nexport type Executor<T extends { columns: Record<string, ColumnSchema> }, R = void> = (\n query: InnerQuery<T, boolean>\n) => R;\n\nexport class InnerQuery<\n T extends { columns: Record<string, ColumnSchema> },\n IsOne extends boolean,\n R = void,\n> {\n private _hash: number;\n private _mainQuery: QueryInfo;\n private _selectQuery: QueryInfo;\n private _selectLiveQuery: QueryInfo;\n private _subqueries: InnerQuery<{ columns: Record<string, ColumnSchema> }, boolean>[];\n\n constructor(\n private readonly _tableName: string,\n private readonly options: QueryOptions<TableModel<T>, IsOne>,\n private readonly schema: SchemaStructure,\n private readonly executor: Executor<any, R>\n ) {\n this._selectQuery = buildQueryFromOptions('SELECT', this._tableName, this.options, this.schema);\n\n this._mainQuery = buildQueryFromOptions(\n 'SELECT',\n this._tableName,\n { ...this.options, related: [] },\n this.schema\n );\n\n this._hash = this._selectQuery.hash;\n\n this._selectLiveQuery = buildQueryFromOptions(\n 'LIVE SELECT',\n this._tableName,\n this.options,\n this.schema\n );\n\n this._subqueries = extractSubqueryQueryInfos(\n schema,\n this._tableName,\n this.options,\n this.executor\n );\n }\n\n get mainQuery(): QueryInfo {\n return this._mainQuery;\n }\n\n get subqueries(): InnerQuery<{ columns: Record<string, ColumnSchema> }, boolean>[] {\n return this._subqueries;\n }\n\n get selectQuery(): QueryInfo {\n return this._selectQuery;\n }\n\n get selectLiveQuery(): QueryInfo {\n return this._selectLiveQuery;\n }\n\n get tableName(): string {\n return this._tableName;\n }\n\n get hash(): number {\n return this._hash;\n }\n\n get isOne(): boolean {\n return this.options.isOne ?? false;\n }\n\n public run(): R {\n return this.executor(this);\n }\n\n public buildUpdateQuery(patches: any[]): QueryInfo {\n return buildQueryFromOptions('UPDATE', this._tableName, this.options, this.schema, patches);\n }\n\n public buildDeleteQuery(): QueryInfo {\n return buildQueryFromOptions('DELETE', this._tableName, this.options, this.schema);\n }\n\n public getOptions(): QueryOptions<TableModel<T>, IsOne> {\n return this.options;\n }\n}\n\n/**\n * Helper type to get the model type for a related table\n */\ntype _GetRelatedModel<S extends SchemaStructure, RelatedTableName extends string> =\n RelatedTableName extends TableNames<S> ? TableModel<GetTable<S, RelatedTableName>> : never;\n\n/**\n * Helper type to extract field names from RelatedFields\n */\nexport type ExtractFieldNames<RelatedFields extends RelatedFieldsMap> = keyof RelatedFields;\n\nexport type RelatedFieldMapEntry = {\n to: string;\n cardinality: 'one' | 'many';\n relatedFields: RelatedFieldsMap;\n};\n\nexport type RelatedFieldsMap = Record<string, RelatedFieldMapEntry>;\n\n/**\n * Helper type to build the related fields object based on accumulated relationships\n */\nexport type BuildRelatedFields<\n S extends SchemaStructure,\n RelatedFields extends RelatedFieldsMap,\n> = {\n [K in keyof RelatedFields]: QueryResult<\n S,\n RelatedFields[K]['to'],\n RelatedFields[K]['relatedFields'],\n RelatedFields[K]['cardinality'] extends 'one' ? true : false\n >;\n};\n\nexport type BuildResultModelOne<\n S extends SchemaStructure,\n TableName extends TableNames<S>,\n RelatedFields extends RelatedFieldsMap,\n> = Omit<TableModel<GetTable<S, TableName>>, ExtractFieldNames<RelatedFields>> &\n BuildRelatedFields<S, RelatedFields>;\n\nexport type BuildResultModelMany<\n S extends SchemaStructure,\n TableName extends TableNames<S>,\n RelatedFields extends RelatedFieldsMap,\n> = (Omit<TableModel<GetTable<S, TableName>>, ExtractFieldNames<RelatedFields>> &\n BuildRelatedFields<S, RelatedFields>)[];\n\n/**\n * The final result type combining base model with related fields\n * Excludes related field keys from the base model to avoid type conflicts\n */\nexport type QueryResult<\n S extends SchemaStructure,\n TableName extends TableNames<S>,\n RelatedFields extends RelatedFieldsMap,\n IsOne extends boolean,\n> = IsOne extends true\n ? BuildResultModelOne<S, TableName, RelatedFields>\n : BuildResultModelMany<S, TableName, RelatedFields>;\n\nexport class FinalQuery<\n S extends SchemaStructure,\n TableName extends TableNames<S>,\n T extends { columns: Record<string, ColumnSchema> },\n // oxlint-disable-next-line no-unused-vars -- RelatedFields is used externally for type inference\n RelatedFields extends RelatedFieldsMap,\n IsOne extends boolean,\n R = void,\n> {\n private _innerQuery: InnerQuery<T, IsOne, R>;\n\n constructor(\n private readonly tableName: TableName,\n private readonly options: QueryOptions<TableModel<T>, IsOne>,\n private readonly schema: S,\n private readonly executor: Executor<T, R>\n ) {\n this._innerQuery = new InnerQuery<T, IsOne, R>(\n this.tableName,\n this.options,\n this.schema,\n this.executor\n );\n }\n\n run(): R {\n return this.executor(this._innerQuery);\n }\n\n buildUpdateQuery(patches: any[]): QueryInfo {\n return this._innerQuery.buildUpdateQuery(patches);\n }\n\n buildDeleteQuery(): QueryInfo {\n return this._innerQuery.buildDeleteQuery();\n }\n\n selectLive(): QueryInfo {\n return this._innerQuery.selectLiveQuery;\n }\n\n get innerQuery(): InnerQuery<T, IsOne, R> {\n return this._innerQuery;\n }\n\n get isOne(): boolean {\n return this.options.isOne ?? false;\n }\n\n get hash(): number {\n return this._innerQuery.hash;\n }\n}\n\n/**\n * Schema-aware query modifier builder implementation\n * This version provides full type safety for nested relationships\n */\nclass SchemaAwareQueryModifierBuilderImpl<\n S extends SchemaStructure,\n TableName extends TableNames<S>,\n RelatedFields extends RelatedFieldsMap = {},\n> implements SchemaAwareQueryModifierBuilder<S, TableName, RelatedFields> {\n private options: QueryOptions<TableModel<GetTable<S, TableName>>, boolean> = {};\n\n constructor(\n private readonly tableName: TableName,\n private readonly schema: S\n ) {}\n\n where(conditions: Partial<TableModel<GetTable<S, TableName>>>): this {\n this.options.where = { ...this.options.where, ...conditions };\n return this;\n }\n\n select(...fields: ((keyof TableModel<GetTable<S, TableName>> & string) | '*')[]): this {\n if (this.options.select) {\n throw new Error('Select can only be called once per query');\n }\n this.options.select = fields;\n return this;\n }\n\n limit(count: number): this {\n this.options.limit = count;\n return this;\n }\n\n offset(count: number): this {\n this.options.offset = count;\n return this;\n }\n\n orderBy(\n field: keyof TableModel<GetTable<S, TableName>> & string,\n direction: 'asc' | 'desc' = 'asc'\n ): this {\n this.options.orderBy = {\n ...this.options.orderBy,\n [field]: direction,\n } as Partial<Record<keyof TableModel<GetTable<S, TableName>>, 'asc' | 'desc'>>;\n return this;\n }\n\n // Schema-aware implementation for nested relationships with full type inference\n related<\n Field extends TableRelationships<S, TableName>['field'],\n Rel extends GetRelationship<S, TableName, Field>,\n RelatedFields2 extends RelatedFieldsMap = {},\n >(\n relatedField: Field,\n modifier?: SchemaAwareQueryModifier<S, Rel['to'], RelatedFields2>\n ): SchemaAwareQueryModifierBuilderImpl<\n S,\n TableName,\n RelatedFields & {\n [K in Field]: {\n to: Rel['to'];\n cardinality: Rel['cardinality'];\n relatedFields: RelatedFields2;\n };\n }\n > {\n if (!this.options.related) {\n this.options.related = [];\n }\n\n const exists = this.options.related.some((r) => (r.alias || r.relatedTable) === relatedField);\n\n if (!exists) {\n // Look up the relationship from schema\n const relationship = this.schema.relationships.find(\n (r) => r.from === this.tableName && r.field === relatedField\n );\n\n if (!relationship) {\n throw new Error(\n `Relationship '${String(relatedField)}' not found for table '${this.tableName}'`\n );\n }\n\n const relatedTable = relationship.to;\n const cardinality = relationship.cardinality;\n const foreignKeyField = cardinality === 'many' ? this.tableName : relatedField;\n\n this.options.related.push({\n relatedTable,\n alias: relatedField as string,\n modifier: modifier as QueryModifier<GenericModel>,\n cardinality,\n foreignKeyField: foreignKeyField as string,\n } as RelatedQuery & { foreignKeyField: string });\n }\n return this as any;\n }\n\n _getOptions(): QueryOptions<TableModel<GetTable<S, TableName>>, boolean> {\n return this.options;\n }\n}\n\n/**\n * Fluent query builder for constructing queries with chainable methods\n * Now with full type inference from schema constant AND related field accumulation!\n */\nexport class QueryBuilder<\n const S extends SchemaStructure,\n const TableName extends TableNames<S>,\n const R = void,\n const RelatedFields extends RelatedFieldsMap = {},\n const IsOne extends boolean = false,\n> {\n constructor(\n private readonly schema: S,\n private readonly tableName: TableName,\n private readonly executer: Executor<GetTable<S, TableName>, R> = () => undefined as R,\n private options: QueryOptions<TableModel<GetTable<S, TableName>>, IsOne> = {}\n ) {}\n\n /**\n * Add additional where conditions\n */\n where(\n conditions: Partial<TableModel<GetTable<S, TableName>>>\n ): QueryBuilder<S, TableName, R, RelatedFields, IsOne> {\n this.options.where = { ...this.options.where, ...conditions };\n return this;\n }\n\n /**\n * Specify fields to select\n */\n select(\n ...fields: ((keyof TableModel<GetTable<S, TableName>> & string) | '*')[]\n ): QueryBuilder<S, TableName, R, RelatedFields, IsOne> {\n if (this.options.select) {\n throw new Error('Select can only be called once per query');\n }\n this.options.select = fields;\n return this;\n }\n\n /**\n * Add ordering to the query (only for non-live queries)\n */\n orderBy(\n field: TableFieldNames<GetTable<S, TableName>>,\n direction: 'asc' | 'desc' = 'asc'\n ): QueryBuilder<S, TableName, R, RelatedFields, IsOne> {\n this.options.orderBy = {\n ...this.options.orderBy,\n [field]: direction,\n } as Partial<Record<keyof TableModel<GetTable<S, TableName>>, 'asc' | 'desc'>>;\n return this;\n }\n\n /**\n * Add limit to the query (only for non-live queries)\n */\n limit(count: number): QueryBuilder<S, TableName, R, RelatedFields, IsOne> {\n this.options.limit = count;\n return this;\n }\n\n /**\n * Add offset to the query (only for non-live queries)\n */\n offset(count: number): QueryBuilder<S, TableName, R, RelatedFields, IsOne> {\n this.options.offset = count;\n return this;\n }\n\n one(): QueryBuilder<S, TableName, R, RelatedFields, true> {\n return new QueryBuilder<S, TableName, R, RelatedFields, true>(\n this.schema,\n this.tableName,\n this.executer,\n { ...this.options, isOne: true }\n );\n }\n\n /**\n * Include related data via subqueries\n * Field and cardinality are validated against schema relationships\n * Now accumulates the related field in the type!\n */\n related<\n Field extends TableRelationships<S, TableName>['field'],\n Rel extends GetRelationship<S, TableName, Field>,\n RelatedFields2 extends RelatedFieldsMap = {},\n >(\n field: Field,\n modifierOrCardinality?:\n | SchemaAwareQueryModifier<S, Rel['to'], RelatedFields2>\n | Rel['cardinality'],\n modifier?: SchemaAwareQueryModifier<S, Rel['to'], RelatedFields2>\n ): QueryBuilder<\n S,\n TableName,\n R,\n RelatedFields & {\n [K in Field]: {\n to: Rel['to'];\n cardinality: Rel['cardinality'];\n relatedFields: RelatedFields2;\n };\n },\n IsOne\n > {\n if (!this.options.related) {\n this.options.related = [];\n }\n\n // Check if field already exists\n const exists = this.options.related.some((r) => (r.alias || r.relatedTable) === field);\n\n if (exists) {\n return this as any;\n }\n\n // Look up relationship metadata from schema\n const relationship = this.schema.relationships.find(\n (r) => r.from === this.tableName && r.field === field\n );\n\n if (!relationship) {\n throw new Error(`Relationship '${String(field)}' not found for table '${this.tableName}'`);\n }\n\n // Determine cardinality and modifier based on arguments\n let actualCardinality: 'one' | 'many';\n let actualModifier: SchemaAwareQueryModifier<S, Rel['to']> | undefined;\n\n if (typeof modifierOrCardinality === 'function') {\n // Signature: related(field, modifier)\n actualCardinality = relationship.cardinality;\n actualModifier = modifierOrCardinality;\n } else if (modifierOrCardinality === 'one' || modifierOrCardinality === 'many') {\n // Signature: related(field, cardinality, modifier)\n actualCardinality = modifierOrCardinality;\n actualModifier = modifier;\n } else {\n // Signature: related(field)\n actualCardinality = relationship.cardinality;\n actualModifier = undefined;\n }\n\n // Determine foreign key field based on cardinality\n let foreignKeyField: string =\n actualCardinality === 'many' ? (this.tableName as string) : (field as string);\n\n if (actualCardinality === 'many') {\n // For one-to-many, we need to find the field on the child table that points back to the parent\n // We look for a relationship from Child -> Parent\n const reverseRelationships = this.schema.relationships.filter(\n (r) => r.from === relationship.to && r.to === this.tableName && r.cardinality === 'one'\n );\n\n if (reverseRelationships.length > 0) {\n // Prioritize field that matches parent table name\n const exactMatch = reverseRelationships.find((r) => r.field === this.tableName);\n if (exactMatch) {\n foreignKeyField = exactMatch.field;\n } else {\n foreignKeyField = reverseRelationships[0].field;\n }\n } else {\n // Fallback heuristics\n if (this.tableName.startsWith(`${relationship.to}_`)) {\n // If parent table is \"game_database\" and child is \"game\", try \"database\"\n foreignKeyField = this.tableName.slice(relationship.to.length + 1);\n }\n }\n }\n\n // Cast the schema-aware modifier to the runtime type\n // At runtime, QueryModifierBuilderImpl will work correctly with the schema\n const wrappedModifier = actualModifier as QueryModifier<GenericModel> | undefined;\n\n this.options.related.push({\n relatedTable: relationship.to,\n alias: field as string,\n modifier: wrappedModifier,\n cardinality: actualCardinality,\n foreignKeyField: foreignKeyField as any,\n } as RelatedQuery & { foreignKeyField: string });\n\n return this as any;\n }\n\n /**\n * Get the current query options\n */\n getOptions(): QueryOptions<TableModel<GetTable<S, TableName>>, IsOne> {\n return this.options;\n }\n\n /**\n * Build query methods for SELECT and LIVE SELECT (custom implementation)\n * @returns FinalQuery object with select() method for custom usage\n */\n build(): FinalQuery<S, TableName, GetTable<S, TableName>, RelatedFields, IsOne, R> {\n return new FinalQuery<S, TableName, GetTable<S, TableName>, RelatedFields, IsOne, R>(\n this.tableName,\n this.options,\n this.schema,\n this.executer\n );\n }\n}\n\nexport function cyrb53(str: string, seed: number = 0): number {\n let h1 = 0xdeadbeef ^ seed,\n h2 = 0x41c6ce57 ^ seed;\n for (let i = 0, ch; i < str.length; i++) {\n ch = str.charCodeAt(i);\n h1 = Math.imul(h1 ^ ch, 2654435761);\n h2 = Math.imul(h2 ^ ch, 1597334677);\n }\n h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507);\n h1 ^= Math.imul(h2 ^ (h2 >>> 13), 3266489909);\n h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507);\n h2 ^= Math.imul(h1 ^ (h1 >>> 13), 3266489909);\n\n return 4294967296 * (2097151 & h2) + (h1 >>> 0);\n}\n\nexport function extractSubqueryQueryInfos<S extends SchemaStructure>(\n schema: S,\n parentTableName: string,\n options: QueryOptions<GenericModel, boolean>,\n executer: Executor<{ columns: Record<string, ColumnSchema> }>\n): InnerQuery<{ columns: Record<string, ColumnSchema> }, boolean>[] {\n if (!options.related) {\n return [];\n }\n\n return options.related.map((rel) => {\n // Get base options from modifier\n const subOptions =\n rel\n .modifier?.(new SchemaAwareQueryModifierBuilderImpl(rel.relatedTable, schema))\n ._getOptions() ?? {};\n\n // Find relationship to determine how to filter\n const relationship = schema.relationships.find(\n (r) => r.from === parentTableName && r.field === rel.alias\n );\n\n if (relationship) {\n // Determine foreign key field\n // rel.alias is guaranteed to be defined if relationship is found (matched r.field)\n // oxlint-disable-next-line no-non-null-assertion -- alias is guaranteed defined when relationship is found\n let foreignKeyField = rel.alias!;\n\n if (relationship.cardinality === 'many') {\n // For one-to-many, we need to find the field on the child table that points back to the parent\n // We look for a relationship from Child -> Parent\n const reverseRelationships = schema.relationships.filter(\n (r) => r.from === rel.relatedTable && r.to === parentTableName && r.cardinality === 'one'\n );\n\n if (reverseRelationships.length > 0) {\n // Prioritize field that matches parent table name\n const exactMatch = reverseRelationships.find((r) => r.field === parentTableName);\n if (exactMatch) {\n foreignKeyField = exactMatch.field;\n } else {\n foreignKeyField = reverseRelationships[0].field;\n }\n } else {\n // Fallback heuristics\n if (parentTableName.startsWith(`${rel.relatedTable}_`)) {\n // If parent table is \"game_database\" and child is \"game\", try \"database\"\n foreignKeyField = parentTableName.slice(rel.relatedTable.length + 1);\n } else {\n // Default to parent table name\n foreignKeyField = parentTableName;\n }\n }\n }\n\n // Add parent filter to where clause\n subOptions.where = subOptions.where || {};\n\n if (relationship.cardinality === 'many') {\n // One-to-Many: Child has foreign key to parent\n // WHERE $parentIds ∋ child.parent_id\n (subOptions.where as any)[foreignKeyField] = { _op: '∋', _val: '$parentIds', _swap: true };\n } else {\n // One-to-One: Parent has foreign key to child\n // WHERE $parent_<foreignKeyField> ∋ child.id\n // We use a dynamic variable name derived from the foreign key field on the parent\n (subOptions.where as any).id = {\n _op: '∋',\n _val: `$parent_${foreignKeyField}`,\n _swap: true,\n };\n }\n }\n\n return new InnerQuery(rel.relatedTable, subOptions, schema, executer);\n });\n}\n\n/**\n * Build a query string from query options\n * @param method - The query method (SELECT or LIVE SELECT)\n * @param tableName - The table name to query\n * @param options - The query options (where, select, orderBy, etc.)\n * @param schema - Optional schema for resolving nested relationships\n * @returns QueryInfo with the generated SQL and variables\n */\nexport function buildQueryFromOptions<TModel extends GenericModel, IsOne extends boolean>(\n method: 'SELECT' | 'LIVE SELECT' | 'LIVE SELECT DIFF' | 'UPDATE' | 'DELETE',\n tableName: string,\n options: QueryOptions<TModel, IsOne>,\n schema: SchemaStructure,\n patches?: any[]\n): QueryInfo {\n if (options.isOne) {\n options.limit = 1;\n }\n const isLiveQuery = method === 'LIVE SELECT' || method === 'LIVE SELECT DIFF';\n\n // Parse where conditions to convert string IDs to RecordId\n const parsedWhere = options.where\n ? parseObjectIdsToRecordId(options.where, tableName)\n : undefined;\n\n // Build SELECT clause\n let selectClause = '*';\n\n if (method === 'LIVE SELECT DIFF') {\n selectClause = '';\n } else {\n if (options.select && options.select.length > 0) {\n selectClause = options.select.join(', ');\n }\n }\n\n // Build related subqueries (fetch clauses)\n let fetchClauses = '';\n if (!isLiveQuery && options.related && options.related.length > 0) {\n const subqueries = options.related.map((rel) => buildSubquery(rel, schema));\n fetchClauses = ', ' + subqueries.join(', ');\n }\n\n // Start building the query\n let query = '';\n\n if (method === 'UPDATE') {\n query = `UPDATE ${tableName}`;\n } else if (method === 'DELETE') {\n query = `DELETE FROM ${tableName}`;\n } else {\n query = `${method}${selectClause ? ` ${selectClause}` : ''}${fetchClauses} FROM ${tableName}`;\n }\n\n // Build WHERE clause\n const vars: Record<string, unknown> = {};\n if (parsedWhere && Object.keys(parsedWhere).length > 0) {\n const conditions: string[] = [];\n for (const [key, value] of Object.entries(parsedWhere)) {\n const varName = key;\n\n // Handle operator objects { _op, _val }\n if (value && typeof value === 'object' && '_op' in value && '_val' in value) {\n const { _op, _val, _swap } = value as { _op: string; _val: unknown; _swap?: boolean };\n\n let rightSide = '';\n if (typeof _val === 'string' && _val.startsWith('$')) {\n rightSide = _val;\n } else {\n vars[varName] = _val;\n rightSide = `$${varName}`;\n }\n\n if (_swap) {\n conditions.push(`${rightSide} ${_op} ${key}`);\n } else {\n conditions.push(`${key} ${_op} ${rightSide}`);\n }\n } else {\n vars[varName] = value;\n conditions.push(`${key} = $${varName}`);\n }\n }\n query += ` WHERE ${conditions.join(' AND ')}`;\n }\n\n // Add PATCH for UPDATE\n if (method === 'UPDATE' && patches) {\n query += ` PATCH ${JSON.stringify(patches)}`;\n }\n\n // Add ORDER BY, LIMIT, START only for non-live queries and non-update/delete queries (unless supported)\n // SurrealDB UPDATE/DELETE supports WHERE, but LIMIT/START/ORDER BY might be restricted or behave differently.\n // For now, let's allow them if they are set, as SurrealDB supports them for DELETE/UPDATE.\n if (!isLiveQuery) {\n if (options.orderBy && Object.keys(options.orderBy).length > 0) {\n const orderClauses = Object.entries(options.orderBy).map(\n ([field, direction]) => `${field} ${direction}`\n );\n query += ` ORDER BY ${orderClauses.join(', ')}`;\n }\n\n if (options.limit !== undefined) {\n query += ` LIMIT ${options.limit}`;\n }\n\n if (options.offset !== undefined) {\n query += ` START ${options.offset}`;\n }\n }\n\n query += ';';\n\n return {\n query,\n hash: cyrb53(\n `${query}::${Object.entries(vars)\n .map(([key, value]) => `${key}=${value}`)\n .join('&')}`,\n 0\n ),\n vars: Object.keys(vars).length > 0 ? vars : undefined,\n };\n}\n\n/**\n * Build a subquery for a related field\n */\nfunction buildSubquery(\n rel: RelatedQuery & { foreignKeyField?: string },\n schema: SchemaStructure\n): string {\n const { relatedTable, alias, modifier, cardinality } = rel;\n const foreignKeyField = rel.foreignKeyField || alias;\n\n let subquerySelect = '*';\n let subqueryWhere = '';\n let subqueryOrderBy = '';\n let subqueryLimit = '';\n\n // If there's a modifier, apply it to get the sub-options\n if (modifier) {\n const modifierBuilder = new SchemaAwareQueryModifierBuilderImpl(relatedTable, schema);\n modifier(modifierBuilder);\n const subOptions = modifierBuilder._getOptions();\n\n // Build sub-select\n if (subOptions.select && subOptions.select.length > 0) {\n subquerySelect = subOptions.select.join(', ');\n }\n\n // Build sub-where\n if (subOptions.where && Object.keys(subOptions.where).length > 0) {\n const parsedSubWhere = parseObjectIdsToRecordId(subOptions.where, relatedTable) as Record<\n string,\n unknown\n >;\n const conditions = Object.entries(parsedSubWhere).map(([key, value]) => {\n if (value instanceof RecordId) {\n return `${key} = ${value.toString()}`;\n }\n return `${key} = ${JSON.stringify(value)}`;\n });\n subqueryWhere = ` AND ${conditions.join(' AND ')}`;\n }\n\n // Build sub-orderBy\n if (subOptions.orderBy && Object.keys(subOptions.orderBy).length > 0) {\n const orderClauses = Object.entries(subOptions.orderBy).map(\n ([field, direction]) => `${field} ${direction}`\n );\n subqueryOrderBy = ` ORDER BY ${orderClauses.join(', ')}`;\n }\n\n // Build sub-limit\n if (subOptions.limit !== undefined) {\n subqueryLimit = ` LIMIT ${subOptions.limit}`;\n }\n\n // Handle nested relationships\n if (subOptions.related && subOptions.related.length > 0) {\n // Resolve nested relationship metadata if schema is available\n const resolvedNestedRels = subOptions.related.map((nestedRel) => {\n if (schema) {\n // Look up the actual relationship metadata from schema\n const relationship = schema.relationships.find(\n (r) => r.from === relatedTable && r.field === nestedRel.alias\n );\n\n if (relationship) {\n // Use the resolved table name and add foreign key field\n const nestedForeignKeyField =\n relationship.cardinality === 'many' ? relatedTable : nestedRel.alias;\n\n return {\n ...nestedRel,\n relatedTable: relationship.to,\n cardinality: relationship.cardinality,\n foreignKeyField: nestedForeignKeyField,\n } as RelatedQuery & { foreignKeyField: string };\n }\n }\n return nestedRel;\n });\n\n const nestedSubqueries = resolvedNestedRels.map((nestedRel) =>\n buildSubquery(nestedRel, schema)\n );\n subquerySelect += ', ' + nestedSubqueries.join(', ');\n }\n }\n\n // Determine the WHERE condition based on cardinality\n let whereCondition: string;\n if (cardinality === 'one') {\n // For one-to-one, the related table's id matches parent's foreign key field\n whereCondition = `WHERE id=$parent.${foreignKeyField}`;\n // Add LIMIT 1 for one-to-one relationships if not already set\n if (!subqueryLimit) {\n subqueryLimit = ' LIMIT 1';\n }\n } else {\n // For one-to-many, the related table has a foreign key field pointing to parent's id\n whereCondition = `WHERE ${foreignKeyField}=$parent.id`;\n }\n\n // Build the complete subquery\n let subquery = `(SELECT ${subquerySelect} FROM ${relatedTable} ${whereCondition}${subqueryWhere}${subqueryOrderBy}${subqueryLimit})`;\n\n // For one-to-one relationships, select the first element\n if (cardinality === 'one') {\n subquery += '[0]';\n }\n\n subquery += ` AS ${alias}`;\n\n return subquery;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["RecordId"],"sources":["../src/query-builder.ts"],"sourcesContent":["import { RecordId } from 'surrealdb';\nimport type {\n GenericModel,\n QueryInfo,\n QueryOptions,\n QueryModifier,\n RelatedQuery,\n SchemaAwareQueryModifier,\n SchemaAwareQueryModifierBuilder,\n WhereInput,\n} from './types';\nimport type {\n TableNames,\n GetTable,\n TableModel,\n TableRelationships,\n GetRelationship,\n SchemaStructure,\n TableFieldNames,\n ColumnSchema,\n} from './table-schema';\n\n/**\n * Parse a string ID to RecordId\n * - If it's in the format \"table:id\", use it as-is\n * - If it's just an ID without \":\", prepend the table name\n * @param value - The value to parse (could be a string ID)\n * @param tableName - The table name to use if the ID doesn't contain \":\"\n * @param fieldName - The field name to determine if this is an ID field\n */\nfunction parseStringToRecordId(value: unknown, tableName?: string, fieldName?: string): unknown {\n if (typeof value !== 'string') return value;\n\n // If it already contains \":\", parse it as a full record ID\n if (value.includes(':')) {\n const [table, ...idParts] = value.split(':');\n const id = idParts.join(':'); // Handle IDs that contain colons\n return new RecordId(table, id);\n }\n\n // If this is an \"id\" field and we have a table name, prepend it\n if (fieldName === 'id' && tableName) {\n return new RecordId(tableName, value);\n }\n\n // Otherwise, return as-is (it might not be an ID at all)\n return value;\n}\n\n/**\n * Recursively parse string IDs to RecordId in an object\n * @param obj - The object to parse\n * @param tableName - The table name to use for ID fields without \":\"\n */\nfunction parseObjectIdsToRecordId(obj: unknown, tableName?: string): unknown {\n if (obj === null || obj === undefined) return obj;\n\n if (typeof obj === 'string') {\n return parseStringToRecordId(obj, tableName);\n }\n\n if (Array.isArray(obj)) {\n return obj.map((item) => parseObjectIdsToRecordId(item, tableName));\n }\n\n if (typeof obj === 'object' && obj.constructor === Object) {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n // Parse recursively, passing the field name to identify ID fields\n result[key] =\n typeof value === 'string'\n ? parseStringToRecordId(value, tableName, key)\n : parseObjectIdsToRecordId(value, tableName);\n }\n return result;\n }\n\n return obj;\n}\n\nexport type Executor<T extends { columns: Record<string, ColumnSchema> }, R = void> = (\n query: InnerQuery<T, boolean>\n) => R;\n\nexport class InnerQuery<\n T extends { columns: Record<string, ColumnSchema> },\n IsOne extends boolean,\n R = void,\n> {\n private _hash: number;\n private _mainQuery: QueryInfo;\n private _selectQuery: QueryInfo;\n private _selectLiveQuery: QueryInfo;\n private _subqueries: InnerQuery<{ columns: Record<string, ColumnSchema> }, boolean>[];\n\n constructor(\n private readonly _tableName: string,\n private readonly options: QueryOptions<TableModel<T>, IsOne>,\n private readonly schema: SchemaStructure,\n private readonly executor: Executor<any, R>\n ) {\n this._selectQuery = buildQueryFromOptions('SELECT', this._tableName, this.options, this.schema);\n\n this._mainQuery = buildQueryFromOptions(\n 'SELECT',\n this._tableName,\n { ...this.options, related: [] },\n this.schema\n );\n\n this._hash = this._selectQuery.hash;\n\n this._selectLiveQuery = buildQueryFromOptions(\n 'LIVE SELECT',\n this._tableName,\n this.options,\n this.schema\n );\n\n this._subqueries = extractSubqueryQueryInfos(\n schema,\n this._tableName,\n this.options,\n this.executor\n );\n }\n\n get mainQuery(): QueryInfo {\n return this._mainQuery;\n }\n\n get subqueries(): InnerQuery<{ columns: Record<string, ColumnSchema> }, boolean>[] {\n return this._subqueries;\n }\n\n get selectQuery(): QueryInfo {\n return this._selectQuery;\n }\n\n get selectLiveQuery(): QueryInfo {\n return this._selectLiveQuery;\n }\n\n get tableName(): string {\n return this._tableName;\n }\n\n get hash(): number {\n return this._hash;\n }\n\n get isOne(): boolean {\n return this.options.isOne ?? false;\n }\n\n public run(): R {\n return this.executor(this);\n }\n\n public buildUpdateQuery(patches: any[]): QueryInfo {\n return buildQueryFromOptions('UPDATE', this._tableName, this.options, this.schema, patches);\n }\n\n public buildDeleteQuery(): QueryInfo {\n return buildQueryFromOptions('DELETE', this._tableName, this.options, this.schema);\n }\n\n public getOptions(): QueryOptions<TableModel<T>, IsOne> {\n return this.options;\n }\n}\n\n/**\n * Helper type to get the model type for a related table\n */\ntype _GetRelatedModel<S extends SchemaStructure, RelatedTableName extends string> =\n RelatedTableName extends TableNames<S> ? TableModel<GetTable<S, RelatedTableName>> : never;\n\n/**\n * Helper type to extract field names from RelatedFields\n */\nexport type ExtractFieldNames<RelatedFields extends RelatedFieldsMap> = keyof RelatedFields;\n\nexport type RelatedFieldMapEntry = {\n to: string;\n cardinality: 'one' | 'many';\n relatedFields: RelatedFieldsMap;\n};\n\nexport type RelatedFieldsMap = Record<string, RelatedFieldMapEntry>;\n\n/**\n * Helper type to build the related fields object based on accumulated relationships\n */\nexport type BuildRelatedFields<\n S extends SchemaStructure,\n RelatedFields extends RelatedFieldsMap,\n> = {\n [K in keyof RelatedFields]: QueryResult<\n S,\n RelatedFields[K]['to'],\n RelatedFields[K]['relatedFields'],\n RelatedFields[K]['cardinality'] extends 'one' ? true : false\n >;\n};\n\nexport type BuildResultModelOne<\n S extends SchemaStructure,\n TableName extends TableNames<S>,\n RelatedFields extends RelatedFieldsMap,\n> = Omit<TableModel<GetTable<S, TableName>>, ExtractFieldNames<RelatedFields>> &\n BuildRelatedFields<S, RelatedFields>;\n\nexport type BuildResultModelMany<\n S extends SchemaStructure,\n TableName extends TableNames<S>,\n RelatedFields extends RelatedFieldsMap,\n> = (Omit<TableModel<GetTable<S, TableName>>, ExtractFieldNames<RelatedFields>> &\n BuildRelatedFields<S, RelatedFields>)[];\n\n/**\n * The final result type combining base model with related fields\n * Excludes related field keys from the base model to avoid type conflicts\n */\nexport type QueryResult<\n S extends SchemaStructure,\n TableName extends TableNames<S>,\n RelatedFields extends RelatedFieldsMap,\n IsOne extends boolean,\n> = IsOne extends true\n ? BuildResultModelOne<S, TableName, RelatedFields>\n : BuildResultModelMany<S, TableName, RelatedFields>;\n\nexport class FinalQuery<\n S extends SchemaStructure,\n TableName extends TableNames<S>,\n T extends { columns: Record<string, ColumnSchema> },\n // oxlint-disable-next-line no-unused-vars -- RelatedFields is used externally for type inference\n RelatedFields extends RelatedFieldsMap,\n IsOne extends boolean,\n R = void,\n> {\n private _innerQuery: InnerQuery<T, IsOne, R>;\n\n constructor(\n private readonly tableName: TableName,\n private readonly options: QueryOptions<TableModel<T>, IsOne>,\n private readonly schema: S,\n private readonly executor: Executor<T, R>\n ) {\n this._innerQuery = new InnerQuery<T, IsOne, R>(\n this.tableName,\n this.options,\n this.schema,\n this.executor\n );\n }\n\n run(): R {\n return this.executor(this._innerQuery);\n }\n\n buildUpdateQuery(patches: any[]): QueryInfo {\n return this._innerQuery.buildUpdateQuery(patches);\n }\n\n buildDeleteQuery(): QueryInfo {\n return this._innerQuery.buildDeleteQuery();\n }\n\n selectLive(): QueryInfo {\n return this._innerQuery.selectLiveQuery;\n }\n\n get innerQuery(): InnerQuery<T, IsOne, R> {\n return this._innerQuery;\n }\n\n get isOne(): boolean {\n return this.options.isOne ?? false;\n }\n\n get hash(): number {\n return this._innerQuery.hash;\n }\n}\n\n/**\n * Schema-aware query modifier builder implementation\n * This version provides full type safety for nested relationships\n */\nclass SchemaAwareQueryModifierBuilderImpl<\n S extends SchemaStructure,\n TableName extends TableNames<S>,\n RelatedFields extends RelatedFieldsMap = {},\n> implements SchemaAwareQueryModifierBuilder<S, TableName, RelatedFields> {\n private options: QueryOptions<TableModel<GetTable<S, TableName>>, boolean> = {};\n\n constructor(\n private readonly tableName: TableName,\n private readonly schema: S\n ) {}\n\n where(conditions: WhereInput<TableModel<GetTable<S, TableName>>>): this {\n this.options.where = { ...this.options.where, ...conditions };\n return this;\n }\n\n select(...fields: ((keyof TableModel<GetTable<S, TableName>> & string) | '*')[]): this {\n if (this.options.select) {\n throw new Error('Select can only be called once per query');\n }\n this.options.select = fields;\n return this;\n }\n\n limit(count: number): this {\n this.options.limit = count;\n return this;\n }\n\n offset(count: number): this {\n this.options.offset = count;\n return this;\n }\n\n orderBy(\n field: keyof TableModel<GetTable<S, TableName>> & string,\n direction: 'asc' | 'desc' = 'asc'\n ): this {\n this.options.orderBy = {\n ...this.options.orderBy,\n [field]: direction,\n } as Partial<Record<keyof TableModel<GetTable<S, TableName>>, 'asc' | 'desc'>>;\n return this;\n }\n\n // Schema-aware implementation for nested relationships with full type inference\n related<\n Field extends TableRelationships<S, TableName>['field'],\n Rel extends GetRelationship<S, TableName, Field>,\n RelatedFields2 extends RelatedFieldsMap = {},\n >(\n relatedField: Field,\n modifier?: SchemaAwareQueryModifier<S, Rel['to'], RelatedFields2>\n ): SchemaAwareQueryModifierBuilderImpl<\n S,\n TableName,\n RelatedFields & {\n [K in Field]: {\n to: Rel['to'];\n cardinality: Rel['cardinality'];\n relatedFields: RelatedFields2;\n };\n }\n > {\n if (!this.options.related) {\n this.options.related = [];\n }\n\n const exists = this.options.related.some((r) => (r.alias || r.relatedTable) === relatedField);\n\n if (!exists) {\n // Look up the relationship from schema\n const relationship = this.schema.relationships.find(\n (r) => r.from === this.tableName && r.field === relatedField\n );\n\n if (!relationship) {\n throw new Error(\n `Relationship '${String(relatedField)}' not found for table '${this.tableName}'`\n );\n }\n\n const relatedTable = relationship.to;\n const cardinality = relationship.cardinality;\n const foreignKeyField = cardinality === 'many' ? this.tableName : relatedField;\n\n this.options.related.push({\n relatedTable,\n alias: relatedField as string,\n modifier: modifier as QueryModifier<GenericModel>,\n cardinality,\n foreignKeyField: foreignKeyField as string,\n } as RelatedQuery & { foreignKeyField: string });\n }\n return this as any;\n }\n\n _getOptions(): QueryOptions<TableModel<GetTable<S, TableName>>, boolean> {\n return this.options;\n }\n}\n\n/**\n * Fluent query builder for constructing queries with chainable methods\n * Now with full type inference from schema constant AND related field accumulation!\n */\nexport class QueryBuilder<\n const S extends SchemaStructure,\n const TableName extends TableNames<S>,\n const R = void,\n const RelatedFields extends RelatedFieldsMap = {},\n const IsOne extends boolean = false,\n> {\n constructor(\n private readonly schema: S,\n private readonly tableName: TableName,\n private readonly executer: Executor<GetTable<S, TableName>, R> = () => undefined as R,\n private options: QueryOptions<TableModel<GetTable<S, TableName>>, IsOne> = {}\n ) {}\n\n /**\n * Add additional where conditions\n */\n where(\n conditions: WhereInput<TableModel<GetTable<S, TableName>>>\n ): QueryBuilder<S, TableName, R, RelatedFields, IsOne> {\n this.options.where = { ...this.options.where, ...conditions };\n return this;\n }\n\n /**\n * Specify fields to select\n */\n select(\n ...fields: ((keyof TableModel<GetTable<S, TableName>> & string) | '*')[]\n ): QueryBuilder<S, TableName, R, RelatedFields, IsOne> {\n if (this.options.select) {\n throw new Error('Select can only be called once per query');\n }\n this.options.select = fields;\n return this;\n }\n\n /**\n * Add ordering to the query (only for non-live queries)\n */\n orderBy(\n field: TableFieldNames<GetTable<S, TableName>>,\n direction: 'asc' | 'desc' = 'asc'\n ): QueryBuilder<S, TableName, R, RelatedFields, IsOne> {\n this.options.orderBy = {\n ...this.options.orderBy,\n [field]: direction,\n } as Partial<Record<keyof TableModel<GetTable<S, TableName>>, 'asc' | 'desc'>>;\n return this;\n }\n\n /**\n * Add limit to the query (only for non-live queries)\n */\n limit(count: number): QueryBuilder<S, TableName, R, RelatedFields, IsOne> {\n this.options.limit = count;\n return this;\n }\n\n /**\n * Add offset to the query (only for non-live queries)\n */\n offset(count: number): QueryBuilder<S, TableName, R, RelatedFields, IsOne> {\n this.options.offset = count;\n return this;\n }\n\n one(): QueryBuilder<S, TableName, R, RelatedFields, true> {\n return new QueryBuilder<S, TableName, R, RelatedFields, true>(\n this.schema,\n this.tableName,\n this.executer,\n { ...this.options, isOne: true }\n );\n }\n\n /**\n * Include related data via subqueries\n * Field and cardinality are validated against schema relationships\n * Now accumulates the related field in the type!\n */\n related<\n Field extends TableRelationships<S, TableName>['field'],\n Rel extends GetRelationship<S, TableName, Field>,\n RelatedFields2 extends RelatedFieldsMap = {},\n >(\n field: Field,\n modifierOrCardinality?:\n | SchemaAwareQueryModifier<S, Rel['to'], RelatedFields2>\n | Rel['cardinality'],\n modifier?: SchemaAwareQueryModifier<S, Rel['to'], RelatedFields2>\n ): QueryBuilder<\n S,\n TableName,\n R,\n RelatedFields & {\n [K in Field]: {\n to: Rel['to'];\n cardinality: Rel['cardinality'];\n relatedFields: RelatedFields2;\n };\n },\n IsOne\n > {\n if (!this.options.related) {\n this.options.related = [];\n }\n\n // Check if field already exists\n const exists = this.options.related.some((r) => (r.alias || r.relatedTable) === field);\n\n if (exists) {\n return this as any;\n }\n\n // Look up relationship metadata from schema\n const relationship = this.schema.relationships.find(\n (r) => r.from === this.tableName && r.field === field\n );\n\n if (!relationship) {\n throw new Error(`Relationship '${String(field)}' not found for table '${this.tableName}'`);\n }\n\n // Determine cardinality and modifier based on arguments\n let actualCardinality: 'one' | 'many';\n let actualModifier: SchemaAwareQueryModifier<S, Rel['to']> | undefined;\n\n if (typeof modifierOrCardinality === 'function') {\n // Signature: related(field, modifier)\n actualCardinality = relationship.cardinality;\n actualModifier = modifierOrCardinality;\n } else if (modifierOrCardinality === 'one' || modifierOrCardinality === 'many') {\n // Signature: related(field, cardinality, modifier)\n actualCardinality = modifierOrCardinality;\n actualModifier = modifier;\n } else {\n // Signature: related(field)\n actualCardinality = relationship.cardinality;\n actualModifier = undefined;\n }\n\n // Determine foreign key field based on cardinality\n let foreignKeyField: string =\n actualCardinality === 'many' ? (this.tableName as string) : (field as string);\n\n if (actualCardinality === 'many') {\n // For one-to-many, we need to find the field on the child table that points back to the parent\n // We look for a relationship from Child -> Parent\n const reverseRelationships = this.schema.relationships.filter(\n (r) => r.from === relationship.to && r.to === this.tableName && r.cardinality === 'one'\n );\n\n if (reverseRelationships.length > 0) {\n // Prioritize field that matches parent table name\n const exactMatch = reverseRelationships.find((r) => r.field === this.tableName);\n if (exactMatch) {\n foreignKeyField = exactMatch.field;\n } else {\n foreignKeyField = reverseRelationships[0].field;\n }\n } else {\n // Fallback heuristics\n if (this.tableName.startsWith(`${relationship.to}_`)) {\n // If parent table is \"game_database\" and child is \"game\", try \"database\"\n foreignKeyField = this.tableName.slice(relationship.to.length + 1);\n }\n }\n }\n\n // Cast the schema-aware modifier to the runtime type\n // At runtime, QueryModifierBuilderImpl will work correctly with the schema\n const wrappedModifier = actualModifier as QueryModifier<GenericModel> | undefined;\n\n this.options.related.push({\n relatedTable: relationship.to,\n alias: field as string,\n modifier: wrappedModifier,\n cardinality: actualCardinality,\n foreignKeyField: foreignKeyField as any,\n } as RelatedQuery & { foreignKeyField: string });\n\n return this as any;\n }\n\n /**\n * Get the current query options\n */\n getOptions(): QueryOptions<TableModel<GetTable<S, TableName>>, IsOne> {\n return this.options;\n }\n\n /**\n * Build query methods for SELECT and LIVE SELECT (custom implementation)\n * @returns FinalQuery object with select() method for custom usage\n */\n build(): FinalQuery<S, TableName, GetTable<S, TableName>, RelatedFields, IsOne, R> {\n return new FinalQuery<S, TableName, GetTable<S, TableName>, RelatedFields, IsOne, R>(\n this.tableName,\n this.options,\n this.schema,\n this.executer\n );\n }\n}\n\nexport function cyrb53(str: string, seed: number = 0): number {\n let h1 = 0xdeadbeef ^ seed,\n h2 = 0x41c6ce57 ^ seed;\n for (let i = 0, ch; i < str.length; i++) {\n ch = str.charCodeAt(i);\n h1 = Math.imul(h1 ^ ch, 2654435761);\n h2 = Math.imul(h2 ^ ch, 1597334677);\n }\n h1 = Math.imul(h1 ^ (h1 >>> 16), 2246822507);\n h1 ^= Math.imul(h2 ^ (h2 >>> 13), 3266489909);\n h2 = Math.imul(h2 ^ (h2 >>> 16), 2246822507);\n h2 ^= Math.imul(h1 ^ (h1 >>> 13), 3266489909);\n\n return 4294967296 * (2097151 & h2) + (h1 >>> 0);\n}\n\nexport function extractSubqueryQueryInfos<S extends SchemaStructure>(\n schema: S,\n parentTableName: string,\n options: QueryOptions<GenericModel, boolean>,\n executer: Executor<{ columns: Record<string, ColumnSchema> }>\n): InnerQuery<{ columns: Record<string, ColumnSchema> }, boolean>[] {\n if (!options.related) {\n return [];\n }\n\n return options.related.map((rel) => {\n // Get base options from modifier\n const subOptions =\n rel\n .modifier?.(new SchemaAwareQueryModifierBuilderImpl(rel.relatedTable, schema))\n ._getOptions() ?? {};\n\n // Find relationship to determine how to filter\n const relationship = schema.relationships.find(\n (r) => r.from === parentTableName && r.field === rel.alias\n );\n\n if (relationship) {\n // Determine foreign key field\n // rel.alias is guaranteed to be defined if relationship is found (matched r.field)\n // oxlint-disable-next-line no-non-null-assertion -- alias is guaranteed defined when relationship is found\n let foreignKeyField = rel.alias!;\n\n if (relationship.cardinality === 'many') {\n // For one-to-many, we need to find the field on the child table that points back to the parent\n // We look for a relationship from Child -> Parent\n const reverseRelationships = schema.relationships.filter(\n (r) => r.from === rel.relatedTable && r.to === parentTableName && r.cardinality === 'one'\n );\n\n if (reverseRelationships.length > 0) {\n // Prioritize field that matches parent table name\n const exactMatch = reverseRelationships.find((r) => r.field === parentTableName);\n if (exactMatch) {\n foreignKeyField = exactMatch.field;\n } else {\n foreignKeyField = reverseRelationships[0].field;\n }\n } else {\n // Fallback heuristics\n if (parentTableName.startsWith(`${rel.relatedTable}_`)) {\n // If parent table is \"game_database\" and child is \"game\", try \"database\"\n foreignKeyField = parentTableName.slice(rel.relatedTable.length + 1);\n } else {\n // Default to parent table name\n foreignKeyField = parentTableName;\n }\n }\n }\n\n // Add parent filter to where clause\n subOptions.where = subOptions.where || {};\n\n if (relationship.cardinality === 'many') {\n // One-to-Many: Child has foreign key to parent\n // WHERE $parentIds ∋ child.parent_id\n (subOptions.where as any)[foreignKeyField] = { _op: '∋', _val: '$parentIds', _swap: true };\n } else {\n // One-to-One: Parent has foreign key to child\n // WHERE $parent_<foreignKeyField> ∋ child.id\n // We use a dynamic variable name derived from the foreign key field on the parent\n (subOptions.where as any).id = {\n _op: '∋',\n _val: `$parent_${foreignKeyField}`,\n _swap: true,\n };\n }\n }\n\n return new InnerQuery(rel.relatedTable, subOptions, schema, executer);\n });\n}\n\n/**\n * Build a query string from query options\n * @param method - The query method (SELECT or LIVE SELECT)\n * @param tableName - The table name to query\n * @param options - The query options (where, select, orderBy, etc.)\n * @param schema - Optional schema for resolving nested relationships\n * @returns QueryInfo with the generated SQL and variables\n */\nexport function buildQueryFromOptions<TModel extends GenericModel, IsOne extends boolean>(\n method: 'SELECT' | 'LIVE SELECT' | 'LIVE SELECT DIFF' | 'UPDATE' | 'DELETE',\n tableName: string,\n options: QueryOptions<TModel, IsOne>,\n schema: SchemaStructure,\n patches?: any[]\n): QueryInfo {\n if (options.isOne) {\n options.limit = 1;\n }\n const isLiveQuery = method === 'LIVE SELECT' || method === 'LIVE SELECT DIFF';\n\n // Parse where conditions to convert string IDs to RecordId\n const parsedWhere = options.where\n ? parseObjectIdsToRecordId(options.where, tableName)\n : undefined;\n\n // Build SELECT clause\n let selectClause = '*';\n\n if (method === 'LIVE SELECT DIFF') {\n selectClause = '';\n } else {\n if (options.select && options.select.length > 0) {\n selectClause = options.select.join(', ');\n }\n }\n\n // Build related subqueries (fetch clauses)\n let fetchClauses = '';\n if (!isLiveQuery && options.related && options.related.length > 0) {\n const subqueries = options.related.map((rel) => buildSubquery(rel, schema));\n fetchClauses = ', ' + subqueries.join(', ');\n }\n\n // Start building the query\n let query = '';\n\n if (method === 'UPDATE') {\n query = `UPDATE ${tableName}`;\n } else if (method === 'DELETE') {\n query = `DELETE FROM ${tableName}`;\n } else {\n query = `${method}${selectClause ? ` ${selectClause}` : ''}${fetchClauses} FROM ${tableName}`;\n }\n\n // Build WHERE clause\n const vars: Record<string, unknown> = {};\n if (parsedWhere && Object.keys(parsedWhere).length > 0) {\n const conditions: string[] = [];\n\n // Build a single condition for `field`, binding its value under `varName`.\n // Supports operator objects `{ _op, _val, _swap }` (e.g. `{ _op: '<=', _val:\n // 5 }`); a `$`-prefixed string `_val` references an existing param verbatim.\n // Plain values mean equality (`field = $varName`).\n const buildCondition = (field: string, value: unknown, varName: string): string => {\n if (value && typeof value === 'object' && '_op' in value && '_val' in value) {\n const { _op, _val, _swap } = value as { _op: string; _val: unknown; _swap?: boolean };\n let rightSide: string;\n if (typeof _val === 'string' && _val.startsWith('$')) {\n rightSide = _val;\n } else {\n vars[varName] = _val;\n rightSide = `$${varName}`;\n }\n return _swap ? `${rightSide} ${_op} ${field}` : `${field} ${_op} ${rightSide}`;\n }\n vars[varName] = value;\n return `${field} = $${varName}`;\n };\n\n for (const [key, value] of Object.entries(parsedWhere)) {\n // OR-group: `{ _or: [ {field: val}, {field: {_op,_val}}, ... ] }` compiles\n // to one parenthesised `(c1 OR c2 ...)` conjunct. Each branch condition gets\n // a unique, position-indexed param name (`or0`, `or1`, …) so it never\n // collides with a top-level condition on the same field (e.g. a `white =\n // $white` filter alongside an opponent `_or` on white/black) — keeping the\n // surql + vars, and thus the query hash, stable and deterministic.\n if (key === '_or' && Array.isArray(value)) {\n const orParts: string[] = [];\n let i = 0;\n for (const branch of value) {\n if (branch && typeof branch === 'object') {\n for (const [bField, bVal] of Object.entries(branch as Record<string, unknown>)) {\n orParts.push(buildCondition(bField, bVal, `or${i++}`));\n }\n }\n }\n if (orParts.length > 0) conditions.push(`(${orParts.join(' OR ')})`);\n continue;\n }\n\n conditions.push(buildCondition(key, value, key));\n }\n\n if (conditions.length > 0) query += ` WHERE ${conditions.join(' AND ')}`;\n }\n\n // Add PATCH for UPDATE\n if (method === 'UPDATE' && patches) {\n query += ` PATCH ${JSON.stringify(patches)}`;\n }\n\n // Add ORDER BY, LIMIT, START only for non-live queries and non-update/delete queries (unless supported)\n // SurrealDB UPDATE/DELETE supports WHERE, but LIMIT/START/ORDER BY might be restricted or behave differently.\n // For now, let's allow them if they are set, as SurrealDB supports them for DELETE/UPDATE.\n if (!isLiveQuery) {\n if (options.orderBy && Object.keys(options.orderBy).length > 0) {\n const orderClauses = Object.entries(options.orderBy).map(\n ([field, direction]) => `${field} ${direction}`\n );\n query += ` ORDER BY ${orderClauses.join(', ')}`;\n }\n\n if (options.limit !== undefined) {\n query += ` LIMIT ${options.limit}`;\n }\n\n if (options.offset !== undefined) {\n query += ` START ${options.offset}`;\n }\n }\n\n query += ';';\n\n return {\n query,\n hash: cyrb53(\n `${query}::${Object.entries(vars)\n .map(([key, value]) => `${key}=${value}`)\n .join('&')}`,\n 0\n ),\n vars: Object.keys(vars).length > 0 ? vars : undefined,\n };\n}\n\n/**\n * Build a subquery for a related field\n */\nfunction buildSubquery(\n rel: RelatedQuery & { foreignKeyField?: string },\n schema: SchemaStructure\n): string {\n const { relatedTable, alias, modifier, cardinality } = rel;\n const foreignKeyField = rel.foreignKeyField || alias;\n\n let subquerySelect = '*';\n let subqueryWhere = '';\n let subqueryOrderBy = '';\n let subqueryLimit = '';\n\n // If there's a modifier, apply it to get the sub-options\n if (modifier) {\n const modifierBuilder = new SchemaAwareQueryModifierBuilderImpl(relatedTable, schema);\n modifier(modifierBuilder);\n const subOptions = modifierBuilder._getOptions();\n\n // Build sub-select\n if (subOptions.select && subOptions.select.length > 0) {\n subquerySelect = subOptions.select.join(', ');\n }\n\n // Build sub-where\n if (subOptions.where && Object.keys(subOptions.where).length > 0) {\n const parsedSubWhere = parseObjectIdsToRecordId(subOptions.where, relatedTable) as Record<\n string,\n unknown\n >;\n const conditions = Object.entries(parsedSubWhere).map(([key, value]) => {\n if (value instanceof RecordId) {\n return `${key} = ${value.toString()}`;\n }\n return `${key} = ${JSON.stringify(value)}`;\n });\n subqueryWhere = ` AND ${conditions.join(' AND ')}`;\n }\n\n // Build sub-orderBy\n if (subOptions.orderBy && Object.keys(subOptions.orderBy).length > 0) {\n const orderClauses = Object.entries(subOptions.orderBy).map(\n ([field, direction]) => `${field} ${direction}`\n );\n subqueryOrderBy = ` ORDER BY ${orderClauses.join(', ')}`;\n }\n\n // Build sub-limit\n if (subOptions.limit !== undefined) {\n subqueryLimit = ` LIMIT ${subOptions.limit}`;\n }\n\n // Handle nested relationships\n if (subOptions.related && subOptions.related.length > 0) {\n // Resolve nested relationship metadata if schema is available\n const resolvedNestedRels = subOptions.related.map((nestedRel) => {\n if (schema) {\n // Look up the actual relationship metadata from schema\n const relationship = schema.relationships.find(\n (r) => r.from === relatedTable && r.field === nestedRel.alias\n );\n\n if (relationship) {\n // Use the resolved table name and add foreign key field\n const nestedForeignKeyField =\n relationship.cardinality === 'many' ? relatedTable : nestedRel.alias;\n\n return {\n ...nestedRel,\n relatedTable: relationship.to,\n cardinality: relationship.cardinality,\n foreignKeyField: nestedForeignKeyField,\n } as RelatedQuery & { foreignKeyField: string };\n }\n }\n return nestedRel;\n });\n\n const nestedSubqueries = resolvedNestedRels.map((nestedRel) =>\n buildSubquery(nestedRel, schema)\n );\n subquerySelect += ', ' + nestedSubqueries.join(', ');\n }\n }\n\n // Determine the WHERE condition based on cardinality\n let whereCondition: string;\n if (cardinality === 'one') {\n // For one-to-one, the related table's id matches parent's foreign key field\n whereCondition = `WHERE id=$parent.${foreignKeyField}`;\n // Add LIMIT 1 for one-to-one relationships if not already set\n if (!subqueryLimit) {\n subqueryLimit = ' LIMIT 1';\n }\n } else {\n // For one-to-many, the related table has a foreign key field pointing to parent's id\n whereCondition = `WHERE ${foreignKeyField}=$parent.id`;\n }\n\n // Build the complete subquery\n let subquery = `(SELECT ${subquerySelect} FROM ${relatedTable} ${whereCondition}${subqueryWhere}${subqueryOrderBy}${subqueryLimit})`;\n\n // For one-to-one relationships, select the first element\n if (cardinality === 'one') {\n subquery += '[0]';\n }\n\n subquery += ` AS ${alias}`;\n\n return subquery;\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -92,6 +92,76 @@ describe('QueryBuilder', () => {
|
|
|
92
92
|
});
|
|
93
93
|
});
|
|
94
94
|
|
|
95
|
+
it('should build a comparison operator condition via { _op, _val }', () => {
|
|
96
|
+
const builder = new QueryBuilder(testSchema, 'user', (q) => q.selectQuery);
|
|
97
|
+
builder.where({ created_at: { _op: '<=', _val: 5 } });
|
|
98
|
+
const result = builder.build().run();
|
|
99
|
+
|
|
100
|
+
expect(result.query).toBe('SELECT * FROM user WHERE created_at <= $created_at;');
|
|
101
|
+
expect(result.vars).toEqual({ created_at: 5 });
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
it('should build an OR group via _or with position-indexed params', () => {
|
|
105
|
+
const builder = new QueryBuilder(testSchema, 'user', (q) => q.selectQuery);
|
|
106
|
+
builder.where({ _or: [{ username: 'x' }, { email: 'x' }] });
|
|
107
|
+
const result = builder.build().run();
|
|
108
|
+
|
|
109
|
+
expect(result.query).toBe('SELECT * FROM user WHERE (username = $or0 OR email = $or1);');
|
|
110
|
+
expect(result.vars).toEqual({ or0: 'x', or1: 'x' });
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
it('should not collide an _or branch with a top-level condition on the same field', () => {
|
|
114
|
+
// Mirrors the game filter where a color filter (white = me) coexists with an
|
|
115
|
+
// opponent OR on white/black: the OR branch must use its own param name.
|
|
116
|
+
const builder = new QueryBuilder(testSchema, 'user', (q) => q.selectQuery);
|
|
117
|
+
builder.where({ username: 'me', _or: [{ username: 'opp' }, { email: 'opp' }] });
|
|
118
|
+
const result = builder.build().run();
|
|
119
|
+
|
|
120
|
+
expect(result.query).toBe(
|
|
121
|
+
'SELECT * FROM user WHERE username = $username AND (username = $or0 OR email = $or1);'
|
|
122
|
+
);
|
|
123
|
+
expect(result.vars).toEqual({ username: 'me', or0: 'opp', or1: 'opp' });
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
it('should combine equality + comparison + OR group + order/limit/offset', () => {
|
|
127
|
+
// The shape the filtered game list produces: scope equality, a date floor as
|
|
128
|
+
// an integer sort_index comparison, an opponent OR group, paginated.
|
|
129
|
+
const builder = new QueryBuilder(testSchema, 'user', (q) => q.selectQuery);
|
|
130
|
+
builder
|
|
131
|
+
.where({ email: 'e', created_at: { _op: '<=', _val: 5 }, _or: [{ username: 'p' }, { email: 'p' }] })
|
|
132
|
+
.orderBy('created_at', 'asc')
|
|
133
|
+
.limit(50)
|
|
134
|
+
.offset(0);
|
|
135
|
+
const result = builder.build().run();
|
|
136
|
+
|
|
137
|
+
expect(result.query).toBe(
|
|
138
|
+
'SELECT * FROM user WHERE email = $email AND created_at <= $created_at AND ' +
|
|
139
|
+
'(username = $or0 OR email = $or1) ORDER BY created_at asc LIMIT 50 START 0;'
|
|
140
|
+
);
|
|
141
|
+
expect(result.vars).toEqual({ email: 'e', created_at: 5, or0: 'p', or1: 'p' });
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
it('should produce a stable hash for the same logical filtered query', () => {
|
|
145
|
+
const make = () =>
|
|
146
|
+
new QueryBuilder(testSchema, 'user', (q) => q.selectQuery)
|
|
147
|
+
.where({ email: 'e', _or: [{ username: 'p' }, { email: 'p' }] })
|
|
148
|
+
.orderBy('created_at', 'asc')
|
|
149
|
+
.limit(50)
|
|
150
|
+
.offset(0)
|
|
151
|
+
.build()
|
|
152
|
+
.run();
|
|
153
|
+
expect(make().hash).toBe(make().hash);
|
|
154
|
+
|
|
155
|
+
const different = new QueryBuilder(testSchema, 'user', (q) => q.selectQuery)
|
|
156
|
+
.where({ email: 'e', _or: [{ username: 'q' }, { email: 'q' }] })
|
|
157
|
+
.orderBy('created_at', 'asc')
|
|
158
|
+
.limit(50)
|
|
159
|
+
.offset(0)
|
|
160
|
+
.build()
|
|
161
|
+
.run();
|
|
162
|
+
expect(different.hash).not.toBe(make().hash);
|
|
163
|
+
});
|
|
164
|
+
|
|
95
165
|
it('should build query with select fields', () => {
|
|
96
166
|
const builder = new QueryBuilder(testSchema, 'user', (q) => q.selectQuery);
|
|
97
167
|
builder.select('username', 'email');
|
package/src/query-builder.ts
CHANGED
|
@@ -7,6 +7,7 @@ import type {
|
|
|
7
7
|
RelatedQuery,
|
|
8
8
|
SchemaAwareQueryModifier,
|
|
9
9
|
SchemaAwareQueryModifierBuilder,
|
|
10
|
+
WhereInput,
|
|
10
11
|
} from './types';
|
|
11
12
|
import type {
|
|
12
13
|
TableNames,
|
|
@@ -300,7 +301,7 @@ class SchemaAwareQueryModifierBuilderImpl<
|
|
|
300
301
|
private readonly schema: S
|
|
301
302
|
) {}
|
|
302
303
|
|
|
303
|
-
where(conditions:
|
|
304
|
+
where(conditions: WhereInput<TableModel<GetTable<S, TableName>>>): this {
|
|
304
305
|
this.options.where = { ...this.options.where, ...conditions };
|
|
305
306
|
return this;
|
|
306
307
|
}
|
|
@@ -413,7 +414,7 @@ export class QueryBuilder<
|
|
|
413
414
|
* Add additional where conditions
|
|
414
415
|
*/
|
|
415
416
|
where(
|
|
416
|
-
conditions:
|
|
417
|
+
conditions: WhereInput<TableModel<GetTable<S, TableName>>>
|
|
417
418
|
): QueryBuilder<S, TableName, R, RelatedFields, IsOne> {
|
|
418
419
|
this.options.where = { ...this.options.where, ...conditions };
|
|
419
420
|
return this;
|
|
@@ -753,32 +754,52 @@ export function buildQueryFromOptions<TModel extends GenericModel, IsOne extends
|
|
|
753
754
|
const vars: Record<string, unknown> = {};
|
|
754
755
|
if (parsedWhere && Object.keys(parsedWhere).length > 0) {
|
|
755
756
|
const conditions: string[] = [];
|
|
756
|
-
for (const [key, value] of Object.entries(parsedWhere)) {
|
|
757
|
-
const varName = key;
|
|
758
757
|
|
|
759
|
-
|
|
758
|
+
// Build a single condition for `field`, binding its value under `varName`.
|
|
759
|
+
// Supports operator objects `{ _op, _val, _swap }` (e.g. `{ _op: '<=', _val:
|
|
760
|
+
// 5 }`); a `$`-prefixed string `_val` references an existing param verbatim.
|
|
761
|
+
// Plain values mean equality (`field = $varName`).
|
|
762
|
+
const buildCondition = (field: string, value: unknown, varName: string): string => {
|
|
760
763
|
if (value && typeof value === 'object' && '_op' in value && '_val' in value) {
|
|
761
764
|
const { _op, _val, _swap } = value as { _op: string; _val: unknown; _swap?: boolean };
|
|
762
|
-
|
|
763
|
-
let rightSide = '';
|
|
765
|
+
let rightSide: string;
|
|
764
766
|
if (typeof _val === 'string' && _val.startsWith('$')) {
|
|
765
767
|
rightSide = _val;
|
|
766
768
|
} else {
|
|
767
769
|
vars[varName] = _val;
|
|
768
770
|
rightSide = `$${varName}`;
|
|
769
771
|
}
|
|
772
|
+
return _swap ? `${rightSide} ${_op} ${field}` : `${field} ${_op} ${rightSide}`;
|
|
773
|
+
}
|
|
774
|
+
vars[varName] = value;
|
|
775
|
+
return `${field} = $${varName}`;
|
|
776
|
+
};
|
|
770
777
|
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
778
|
+
for (const [key, value] of Object.entries(parsedWhere)) {
|
|
779
|
+
// OR-group: `{ _or: [ {field: val}, {field: {_op,_val}}, ... ] }` compiles
|
|
780
|
+
// to one parenthesised `(c1 OR c2 ...)` conjunct. Each branch condition gets
|
|
781
|
+
// a unique, position-indexed param name (`or0`, `or1`, …) so it never
|
|
782
|
+
// collides with a top-level condition on the same field (e.g. a `white =
|
|
783
|
+
// $white` filter alongside an opponent `_or` on white/black) — keeping the
|
|
784
|
+
// surql + vars, and thus the query hash, stable and deterministic.
|
|
785
|
+
if (key === '_or' && Array.isArray(value)) {
|
|
786
|
+
const orParts: string[] = [];
|
|
787
|
+
let i = 0;
|
|
788
|
+
for (const branch of value) {
|
|
789
|
+
if (branch && typeof branch === 'object') {
|
|
790
|
+
for (const [bField, bVal] of Object.entries(branch as Record<string, unknown>)) {
|
|
791
|
+
orParts.push(buildCondition(bField, bVal, `or${i++}`));
|
|
792
|
+
}
|
|
793
|
+
}
|
|
775
794
|
}
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
conditions.push(`${key} = $${varName}`);
|
|
795
|
+
if (orParts.length > 0) conditions.push(`(${orParts.join(' OR ')})`);
|
|
796
|
+
continue;
|
|
779
797
|
}
|
|
798
|
+
|
|
799
|
+
conditions.push(buildCondition(key, value, key));
|
|
780
800
|
}
|
|
781
|
-
|
|
801
|
+
|
|
802
|
+
if (conditions.length > 0) query += ` WHERE ${conditions.join(' AND ')}`;
|
|
782
803
|
}
|
|
783
804
|
|
|
784
805
|
// Add PATCH for UPDATE
|
package/src/types.ts
CHANGED
|
@@ -36,9 +36,40 @@ export interface RelatedQuery {
|
|
|
36
36
|
cardinality: 'one' | 'many';
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
+
/**
|
|
40
|
+
* Comparison-operator descriptor for a single WHERE field, e.g.
|
|
41
|
+
* `{ _op: '<=', _val: 5 }` → `field <= $field`. A `$`-prefixed string `_val`
|
|
42
|
+
* references an existing query param verbatim; `_swap: true` flips the operands
|
|
43
|
+
* (`$val _op field`). Plain values still mean equality (`field = $field`).
|
|
44
|
+
*/
|
|
45
|
+
export interface ComparisonOp {
|
|
46
|
+
_op: '=' | '!=' | '>' | '>=' | '<' | '<=' | (string & {});
|
|
47
|
+
_val: unknown;
|
|
48
|
+
_swap?: boolean;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/** A single WHERE field value: an equality value or a comparison descriptor. */
|
|
52
|
+
export type WhereFieldValue<V> = V | ComparisonOp;
|
|
53
|
+
|
|
54
|
+
/** A flat conjunction of field conditions (equality or comparison). */
|
|
55
|
+
export type WhereConditions<TModel extends GenericModel> = {
|
|
56
|
+
[K in keyof TModel]?: WhereFieldValue<TModel[K]>;
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* WHERE input for `.where()`. Supports equality (`{ field: value }`), comparison
|
|
61
|
+
* operators (`{ field: { _op, _val } }`), and a single top-level `_or` group of
|
|
62
|
+
* condition fragments that compile to a parenthesised `(... OR ...)` conjunct —
|
|
63
|
+
* e.g. `{ _or: [{ white: x }, { black: x }] }` → `(white = $or0 OR black = $or1)`.
|
|
64
|
+
* Backward-compatible with plain `Partial<TModel>` equality objects.
|
|
65
|
+
*/
|
|
66
|
+
export type WhereInput<TModel extends GenericModel> = WhereConditions<TModel> & {
|
|
67
|
+
_or?: WhereConditions<TModel>[];
|
|
68
|
+
};
|
|
69
|
+
|
|
39
70
|
export interface QueryOptions<TModel extends GenericModel, IsOne extends boolean> {
|
|
40
71
|
select?: ((keyof TModel & string) | '*')[];
|
|
41
|
-
where?:
|
|
72
|
+
where?: WhereInput<TModel>;
|
|
42
73
|
limit?: number;
|
|
43
74
|
offset?: number;
|
|
44
75
|
orderBy?: Partial<Record<keyof TModel, 'asc' | 'desc'>>;
|
|
@@ -78,7 +109,7 @@ export type SchemaAwareQueryModifier<
|
|
|
78
109
|
|
|
79
110
|
// Simplified query builder interface for modifying subqueries
|
|
80
111
|
export interface QueryModifierBuilder<TModel extends GenericModel> {
|
|
81
|
-
where(conditions:
|
|
112
|
+
where(conditions: WhereInput<TModel>): this;
|
|
82
113
|
select(...fields: ((keyof TModel & string) | '*')[]): this;
|
|
83
114
|
limit(count: number): this;
|
|
84
115
|
offset(count: number): this;
|
|
@@ -93,7 +124,7 @@ export interface SchemaAwareQueryModifierBuilder<
|
|
|
93
124
|
TableName extends TableNames<S>,
|
|
94
125
|
RelatedFields extends Record<string, any> = {},
|
|
95
126
|
> {
|
|
96
|
-
where(conditions:
|
|
127
|
+
where(conditions: WhereInput<TableModel<GetTable<S, TableName>>>): this;
|
|
97
128
|
select(...fields: ((keyof TableModel<GetTable<S, TableName>> & string) | '*')[]): this;
|
|
98
129
|
limit(count: number): this;
|
|
99
130
|
offset(count: number): this;
|