@spooky-sync/query-builder 0.0.1-canary.207 → 0.0.1-canary.209
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 +17 -2
- package/dist/index.d.mts.map +1 -1
- package/dist/index.d.ts +17 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +26 -5
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +25 -6
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +2 -0
- package/src/query-builder.test.ts +14 -6
- package/src/query-builder.ts +37 -11
- package/src/types.ts +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -328,7 +328,7 @@ type WhereConditions<TModel extends GenericModel> = { [K in keyof TModel]?: Wher
|
|
|
328
328
|
* WHERE input for `.where()`. Supports equality (`{ field: value }`), comparison
|
|
329
329
|
* operators (`{ field: { _op, _val } }`), and a single top-level `_or` group of
|
|
330
330
|
* condition fragments that compile to a parenthesised `(... OR ...)` conjunct —
|
|
331
|
-
* e.g. `{ _or: [{ white: x }, { black: x }] }` → `(white = $
|
|
331
|
+
* e.g. `{ _or: [{ white: x }, { black: x }] }` → `(white = $white__or0 OR black = $black__or1)`.
|
|
332
332
|
* Backward-compatible with plain `Partial<TModel>` equality objects.
|
|
333
333
|
*/
|
|
334
334
|
type WhereInput<TModel extends GenericModel> = WhereConditions<TModel> & {
|
|
@@ -535,6 +535,21 @@ declare class QueryBuilder<const S extends SchemaStructure, const TableName exte
|
|
|
535
535
|
*/
|
|
536
536
|
build(): FinalQuery<S, TableName, GetTable<S, TableName>, RelatedFields, IsOne, R>;
|
|
537
537
|
}
|
|
538
|
+
/**
|
|
539
|
+
* The surql param name an `_or` branch condition binds under: the branch FIELD,
|
|
540
|
+
* a `__or` marker and the branch's position. The position alone makes it unique
|
|
541
|
+
* within the query; the field prefix is what lets a consumer type the value by
|
|
542
|
+
* looking the column up (see {@link baseFieldOfParam}). Non-identifier
|
|
543
|
+
* characters (a nested path like `database.owner`) are folded to `_` so the
|
|
544
|
+
* result is a legal param name.
|
|
545
|
+
*/
|
|
546
|
+
declare function orParamName(field: string, index: number): string;
|
|
547
|
+
/**
|
|
548
|
+
* Inverse of {@link orParamName}: the field a param name was built from, or the
|
|
549
|
+
* name itself when it is a plain top-level param (`field = $field`). Lets a
|
|
550
|
+
* consumer resolve `white__or0` back to the `white` column.
|
|
551
|
+
*/
|
|
552
|
+
declare function baseFieldOfParam(name: string): string;
|
|
538
553
|
declare function cyrb53(str: string, seed?: number): number;
|
|
539
554
|
/**
|
|
540
555
|
* Build a query string from query options
|
|
@@ -548,5 +563,5 @@ declare function buildQueryFromOptions<TModel extends GenericModel, IsOne extend
|
|
|
548
563
|
//# sourceMappingURL=query-builder.d.ts.map
|
|
549
564
|
|
|
550
565
|
//#endregion
|
|
551
|
-
export { type AccessDefinition, type BackendNames, type BackendRoutes, type BucketConfig, type BucketDefinitionSchema, type BucketNames, type BuildRelatedFields, type BuildResultModelMany, type BuildResultModelOne, type Cardinality, type ColumnSchema, type ComparisonOp, type Executor, type ExtractFieldNames, FinalQuery, type GenericModel, type GenericSchema, type GetCardinality, type GetRelationship, type GetRelationshipFields, type GetTable, type InferRelatedModelFromMetadata, InnerQuery, type LiveQueryOptions, QueryBuilder, type QueryInfo, type QueryModifier, type QueryModifierBuilder, type QueryOptions, type QueryPlan, type QueryResult, RecordId, type RelatedField, type RelatedFieldMapEntry, type RelatedFieldsMap, type RelatedQuery, type RelationPlan, type RelationshipDefinition, type RelationshipFields, type RelationshipFields$1 as RelationshipFieldsFromSchema, type RelationshipMetadata, type RelationshipsMetadata, type RoutePayload, type SchemaAwareQueryModifier, type SchemaAwareQueryModifierBuilder, type SchemaMetadataStructure, type SchemaStructure, type SchemaToIndexed, type TableModel, type TableNames, type TableRelationships, type TableSchemaMetadata, type TypeNameToTypeMap, type ValueType, type WhereComparison, type WhereConditions, type WhereFieldValue, type WhereInput, type WhereNode, type WhereOr, type WithRelated, buildQueryFromOptions, cyrb53 };
|
|
566
|
+
export { type AccessDefinition, type BackendNames, type BackendRoutes, type BucketConfig, type BucketDefinitionSchema, type BucketNames, type BuildRelatedFields, type BuildResultModelMany, type BuildResultModelOne, type Cardinality, type ColumnSchema, type ComparisonOp, type Executor, type ExtractFieldNames, FinalQuery, type GenericModel, type GenericSchema, type GetCardinality, type GetRelationship, type GetRelationshipFields, type GetTable, type InferRelatedModelFromMetadata, InnerQuery, type LiveQueryOptions, QueryBuilder, type QueryInfo, type QueryModifier, type QueryModifierBuilder, type QueryOptions, type QueryPlan, type QueryResult, RecordId, type RelatedField, type RelatedFieldMapEntry, type RelatedFieldsMap, type RelatedQuery, type RelationPlan, type RelationshipDefinition, type RelationshipFields, type RelationshipFields$1 as RelationshipFieldsFromSchema, type RelationshipMetadata, type RelationshipsMetadata, type RoutePayload, type SchemaAwareQueryModifier, type SchemaAwareQueryModifierBuilder, type SchemaMetadataStructure, type SchemaStructure, type SchemaToIndexed, type TableModel, type TableNames, type TableRelationships, type TableSchemaMetadata, type TypeNameToTypeMap, type ValueType, type WhereComparison, type WhereConditions, type WhereFieldValue, type WhereInput, type WhereNode, type WhereOr, type WithRelated, baseFieldOfParam, buildQueryFromOptions, cyrb53, orParamName };
|
|
552
567
|
//# sourceMappingURL=index.d.mts.map
|
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":";;;;;;AAGY,KAAA,SAAA,GAAS,QAAA,GAAA,QAAA,GAAA,SAAA,GAAA,MAAA,GAAA,MAAA,GAAA,YAAA;AAQrB;AAEA;;;;;AA+BiB,KAjCL,QAAA,GAiCK,MAAmB,GAAA,KAGD,GAAA,MAAA,GAAY,SAAA;AAQnC,UA1CK,YAAA,CA0CM;EAKN,SAAA,IAAA,EA9CA,SA8CoB;EAUpB,SAAA,QAAA,EAAA,OAAuB;EAAA,SAAA,QAAA,CAAA,EAAA,OAAA;WAEN,QAAA,CAAA,EAAA,OAAA;WAIE,IAAA,CAAA,EA1DlB,QA0DkB;EAAoB,SAAA,MAAA,CAAA,EAAA,OAAA;EAQ5C;EAaA,SAAA,KAAA,CAAA,EAAA,OAAgB;EAAA;;;;WACN,KAAA,CAAA,EAAA,OAAA;;;;AAMtB;;;;;;;;EAIoB,SAAA,MAAA,CAAA,EAAA,OAAA;AAgCpB;;;;AAKoC,UArGnB,mBAAA,CAqGmB;WAAf,IAAA,EAAA,MAAA;EAAM,SAAA,OAAA,EAAA;IAQV,UAAA,UAAA,EAAsB,MAAA,CAAA,EA1GJ,YA0GI;EActB,CAAA;EAAe,SAAA,UAAA,EAAA,SAAA,MAAA,EAAA;;;;;AAYX,KA5HT,WAAA,GA4HS,KAAA,GAAA,MAAA;;;;AAE+B,UAzHnC,oBAAA,CAyHmC;EAGnC,SAAA,KAAA,EAAA,MAAA;EAA2B,SAAA,KAAA,EAAA,MAAA;WAEV,WAAA,EA3HV,WA2HU;;;AAGlC;;;AACiB,UAxHA,uBAAA,CAwHA;EAAM,SAAA,MAAA,EAAA;IAGN,UAAA,SAAA,EAAA,MAAA,CAAA,EAzHiB,mBA0HjB;EASL,CAAA;EAAW,SAAA,aAAA,EAAA;IAAW,UAAA,SAAA,EAAA,MAAA,CAAA,EAAA;MAChC,UAAA,SAAA,EAAA,MAAA,CAAA,EAhIkC,oBAgIlC;IAA8B,CAAA;;;AAKhC;;;AAA0E,KA7H9D,iBAAA,GA6H8D;QAAZ,EAAA,MAAA;QAC5D,EAAA,MAAA;SAA8B,EAAA,OAAA;MAClB,EAAA,IAAA;MAA8B,EAAA,OAAA;YAAtC,EAzHQ,UAyHR;CAAO;AAIb;;;;AAA6D,KAtHjD,gBAsHiD,CAAA,UAtHtB,YAsHsB,CAAA,GAtHN,CAsHM,SAAA;EAGjD,KAAA,EAAA,IAAA;CAAa,GAxHrB,iBAwHqB,CAxHH,CAwHG,CAAA,MAAA,CAAA,CAAA,EAAA,GAvHrB,iBAuHqB,CAvHH,CAuHG,CAAA,MAAA,CAAA,CAAA;;;;AAGf,KArHE,cAqHF,CAAA,UArH2B,YAqH3B,CAAA,GArH2C,CAqH3C,SAAA;UAAc,EAAA,IAAA;CAAC,GAlHrB,gBAkHqB,CAlHJ,CAkHI,CAAA,GAAA,IAAA,GAjHrB,gBAiHqB,CAjHJ,CAiHI,CAAA;AAGzB;;;;AAKI,UAzFa,gBAAA,CAyFb;WAE+B,MAAA,EAAA;IAAG,SAAA,MAAA,EAzFjB,MAyFiB,CAAA,MAAA,EAzFF,YAyFE,CAAA;;WAAxB,MAAA,EAAA;IAAgC,SAAA,MAAA,EAtFzB,MAsFyB,CAAA,MAAA,EAtFV,YAsFU,CAAA;;;AAAqC,UA9ElE,sBAAA,CA8EkE;WAAnB,IAAA,EAAA,MAAA;WAAsB,OAAA,CAAA,EAAA,MAAA;WAEnD,iBAAA,CAAA,EAAA,SAAA,MAAA,EAAA;WAAG,cAAA,CAAA,EAAA,OAAA;;;;;AAA2C,UAlEhE,eAAA,CAkEgE;WAAG,MAAA,EAAA,SAAA;IAAnB,SAAA,IAAA,EAAA,MAAA;IAAsB,SAAA,OAAA,EA/DjE,MA+DiE,CAAA,MAAA,EA/DlD,YA+DkD,CAAA;IAHnF,SAAA,UAAA,EAAA,SAAA,MAAA,EAAA;EAAQ,CAAA,EAAA;EAMP,SAAA,aAAY,EAAA,SAAA;IAAA,SAAA,IAAA,EAAA,MAAA;IACL,SAAA,KAAA,EAAA,MAAA;IACa,SAAA,EAAA,EAAA,MAAA;IAAb,SAAA,WAAA,EA7Dc,WA6Dd;KACc;WAAG,QAAA,EA5DR,MA4DQ,CAAA,MAAA,EA5DO,2BA4DP,CAAA;WAAjB,MAAA,CAAA,EA3DQ,MA2DR,CAAA,MAAA,EA3DuB,gBA2DvB,CAAA;WACR,OAAA,CAAA,EAAA,SA3D0B,sBA2D1B,EAAA;;AAA2B,UAxDd,2BAAA,CAwDc;EAAC,SAAA,WAAA,EAAA,MAAA;EAE3B,SAAA,MAAA,EAxDc,MAwDM,CAAA,MAAA,EAxDS,0BAwDT,CAAA;;AACb,UAtDK,0BAAA,CAsDL;WACa,IAAA,EAtDR,MAsDQ,CAAA,MAAA,EAtDO,8BAsDP,CAAA;;AACC,UApDT,8BAAA,CAoDS;WAAG,IAAA,EAnDZ,SAmDY;WAAjB,QAAA,EAAA,OAAA;;;AAEqB,KA5CrB,WA4CqB,CAAA,UA5CC,eA4CD,CAAA,GA3C/B,CA2C+B,CAAA,SAAA,CAAA,SAAA,SA3CD,sBA2CC,EAAA,GA1C3B,CA0C2B,CAAA,SAAA,CAAA,CAAA,MAAA,CAAA,CAAA,MAAA,CAAA,GAAA,KAAA;;AAAkB,KAtCvC,YAsCuC,CAAA,UAtChB,eAsCgB,EAAA,UAtCW,WAsCX,CAtCuB,CAsCvB,CAAA,CAAA,GArCjD,CAqCiD,CAAA,SAAA,CAAA,SAAA,SArCnB,sBAqCmB,EAAA,GApC7C,OAoC6C,CApCrC,CAoCqC,CAAA,SAAA,CAAA,CAAA,MAAA,CAAA,EAAA;MAAG,EApCV,CAoCU;UAAG;;AAAG,KAhChD,YAgCgD,CAAA,UAhCzB,eAgCyB,CAAA,GAAA,MAhCA,CAgCA,CAAA,UAAA,CAAA,GAAA,MAAA;;AACvC,KA9BT,aA8BS,CAAA,UA7BT,eA6BS,EAAA,UA5BT,YA4BS,CA5BI,CA4BJ,CAAA,CAAA,GAAA,MA3BX,CA2BW,CAAA,UAAA,CAAA,CA3BG,CA2BH,CAAA,CAAA,QAAA,CAAA,GAAA,MAAA;;AAAM,KAxBf,YAwBe,CAAA,UAvBf,eAuBe,EAAA,UAtBf,YAsBe,CAtBF,CAsBE,CAAA,EAAA,UArBf,aAqBe,CArBD,CAqBC,EArBE,CAqBF,CAAA,CAAA,GAAA,CAAA,MApBhB,YAoBgB,CApBH,CAoBG,EApBA,CAoBA,EApBG,CAoBH,CAAA,CAAA,SAAA,CAAA,KAAA,CAAA,GAnBvB,MAmBuB,CAAA,MAAA,EAAA,KAAA,CAAA,GAlBvB,QAkBuB,CAAA,QAjBb,oBAiBN,CAjB2B,CAiB3B,EAjB8B,CAiB9B,EAjBiC,CAiBjC,CAAA,GAjBsC,iBAiBtC,CAjBwD,YAiBxD,CAjBqE,CAiBrE,EAjBwE,CAiBxE,EAjB2E,CAiB3E,CAAA,CAjB8E,CAiB9E,CAAA,CAAA,MAAA,CAAA,CAAA,EAAY,GAAA,QAfN,oBAiBW,CAjBU,CAiBV,EAjBa,CAiBb,EAjBgB,CAiBhB,CAAA,IAjBsB,iBAiBtB,CAjBwC,YAiBxC,CAjBqD,CAiBrD,EAjBwD,CAiBxD,EAjB2D,CAiB3D,CAAA,CAjB8D,CAiB9D,CAAA,CAAA,MAAA,CAAA,CAAA,EAAA,CAAA;KAdpB,YAeO,CAAA,UAdA,eAcA,EAAA,UAbA,YAaA,CAba,CAab,CAAA,EAAA,UAZA,aAYA,CAZc,CAYd,EAZiB,CAYjB,CAAA,CAAA,GAXR,CAWQ,CAAA,UAAA,CAAA,CAXM,CAWN,CAAA,CAAA,QAAA,CAAA,CAXmB,CAWnB,CAAA,CAAA,MAAA,CAAA;KATP,oBAUoB,CAAA,UATb,eASa,EAAA,UARb,YAQa,CARA,CAQA,CAAA,EAAA,UAPb,aAOa,CAPC,CAOD,EAPI,CAOJ,CAAA,CAAA,GAAA,QAAb,MALE,YAKF,CALe,CAKf,EALkB,CAKlB,EALqB,CAKrB,CAAA,GAL0B,YAK1B,CALuC,CAKvC,EAL0C,CAK1C,EAL6C,CAK7C,CAAA,CALgD,CAKhD,CAAA,CAAA,UAAA,CAAA,SAAA,IAAA,GAAA,KAAA,GALsF,CAKtF,SAJJ,YAKkB,CALL,CAKK,EALF,CAKE,EALC,CAKD,CAAA,CAAA,GAAA,MAAA;KAHrB,oBAGwB,CAAA,UAFjB,eAEiB,EAAA,UADjB,YACiB,CADJ,CACI,CAAA,EAAA,UAAjB,aAAiB,CAAH,CAAG,EAAA,CAAA,CAAA,CAAA,GAAA,QAAjB,MAEE,YAFF,CAEe,CAFf,EAEkB,CAFlB,EAEqB,CAFrB,CAAA,GAE0B,YAF1B,CAEuC,CAFvC,EAE0C,CAF1C,EAE6C,CAF7C,CAAA,CAEgD,CAFhD,CAAA,CAAA,UAAA,CAAA,SAAA,IAAA,GAE8E,CAF9E,GAAA,KAAA,SAGJ,YADmB,CACN,CADM,EACH,CADG,EACA,CADA,CAAA,CAAA,GAAA,MAAA;KAGtB,QAHyB,CAAA,CAAA,CAAA,GAAA,QAAG,MAGA,CAHA,GAGI,CAHJ,CAGM,CAHN,CAAA;;;;AAAK,KAQ1B,QAR0B,CAAA,UAQP,eARO,EAAA,aAQuB,UARvB,CAQkC,CARlC,CAAA,CAAA,GAQwC,OARxC,CASpC,CAToC,CAAA,QAAA,CAAA,CAAA,MAAA,CAAA,EAAA;MAAsB,EAUlD,IAVkD;;;;;AACpD,KAeI,UAfJ,CAAA,UAeyB,eAfzB,CAAA,GAe4C,CAf5C,CAAA,QAAA,CAAA,CAAA,MAAA,CAAA,CAAA,MAAA,CAAA;;AAAY;;AAEa,KAkBrB,eAlBqB,CAAA,UAAA;SAAI,EAkBY,MAlBZ,CAAA,MAAA,EAkB2B,YAlB3B,CAAA;WAmB7B,CAnB+B,CAAA,SAAA,CAAA,GAAA,MAAA;;AAKvC;;AAA+B,KAmBnB,UAnBmB,CAAA,UAAA;SAAyC,EAmB5B,MAnB4B,CAAA,MAAA,EAmBb,YAnBa,CAAA;aACtE,MAmBY,CAnBZ,CAAA,SAAA,CAAA,GAmB2B,cAnB3B,CAmB0C,CAnB1C,CAAA,SAAA,CAAA,CAmBuD,CAnBvD,CAAA,CAAA;;;AAOF;AAAsB,KAkBV,kBAlBU,CAAA,UAkBmB,eAlBnB,EAAA,kBAAA,MAAA,CAAA,GAkBgE,OAlBhE,CAmBpB,CAnBoB,CAAA,eAAA,CAAA,CAAA,MAAA,CAAA,EAAA;MAAW,EAoBvB,SApBuB;;;AAKjC;;AAAgE,KAqBpD,oBArBoD,CAAA,UAsBpD,eAtBoD,EAAA,kBAAA,MAAA,CAAA,GAwB5D,kBAxB4D,CAwBzC,CAxByC,EAwBtC,SAxBsC,CAAA,CAAA,OAAA,CAAA;;;;AAMpD,KAuBA,eAvBU,CAAA,UAwBV,eAxBU,EAAA,kBAAA,MAAA,EAAA,cAAA,MAAA,CAAA,GA2BlB,OA3BkB,CA2BV,OA3BU,CA2BF,CA3BE,CAAA,eAAA,CAAA,CAAA,MAAA,CAAA,EAAA;EAAA,IAAA,EA2BkC,SA3BlC;;OAAsB,EA2BmC,KA3BnC;;;;;AACD,KA+B/B,eA/B+B,CAAA,UA+BL,eA/BK,CAAA,GAAA;EAM/B,MAAA,EAAA,QA2BF,CA3BoB,CAAA,QAAA,CAAA,CAAA,MAAA,CAAA,CAAA,MAAA,CAAA,GA2BU,OA3BV,CA2BkB,CA3BlB,CAAA,QAAA,CAAA,CAAA,MAAA,CAAA,EAAA;IAAW,IAAA,EA2BoC,CA3BpC;EACvC,CAAA,CAAA;eADoF,EAAA,QA8B5E,CA9BmF,CAAA,QAAA,CAAA,CAAA,MAAA,CAAA,CAAA,MAAA,CAAA,GAAA,QA+BjF,OAvBA,CAuBQ,CAvBU,CAAA,eAAA,CAAA,CAAA,MAAA,CAAA,EAAA;IAAA,IAAA,EAuB0B,CAvB1B;EAClB,CAAA,CAAA,CAAA,OAAA,CAAA,GAsB4D,OAtB5D,CAuBJ,OAvBI,CAuBI,CAvBJ,CAAA,eAAA,CAAA,CAAA,MAAA,CAAA,EAAA;IAEW,IAAA,EAqB6B,CArB7B;EAAG,CAAA,CAAA,EAAA;IAAtB,KAAA,EAsBa,CAtBb;EAAkB,CAAA,CAAA,EAKV,EAAe;;;;KCrSf,YAAA,GAAe;KACf,aAAA,GAAgB,eAAe;ADV3C;AAQA;AAEA;AAA6B,KCKjB,YDLiB,CAAA,UAAA,MAAA,EAAA,CAAA,CAAA,GCKmB,qBDLnB,CCKyC,CDLzC,ECK4C,CDL5C,CAAA,GAAA,MAAA;AACZ,UCOA,SAAA,CDPA;OAIC,EAAA,MAAA;EAAQ,IAAA,EAAA,MAAA;EA0BT,IAAA,CAAA,ECpBR,MDoBQ,CAAA,MAAA,EAAmB,OAAA,CAAA;EAWxB;AAKZ;AAUA;;;MAMoC,CAAA,EC9C3B,SD8C2B;;AAQpC;AAaA;;;;;AACsB,UC3DL,eAAA,CD2DK;OAClB,EAAA,MAAA;MC1DE,YD0DgB,CAAA,KAAA,CAAA;EAAC,KAAA,EAAA,OAAA;EAKX,QAAA,CAAA,EAAA,MAAc;EAAA,IAAA,CAAA,EAAA,OAAA;;;AAGL,UC3DJ,OAAA,CD2DI;MC1Df,eD0DF,EAAA;;;;AAiCJ;;AAEoC,KCtFxB,SAAA,GAAY,eDsFY,GCtFM,ODsFN;;;;;AAWpC;AAcA;AAAgC,UCvGf,SAAA,CDuGe;OAGK,EAAA,MAAA;;QAOX,CAAA,EAAA,MAAA,EAAA;OAEU,CAAA,EC/G1B,SD+G0B,EAAA;SAAf,CAAA,EAAA,CAAA,KAAA,EAAA,MAAA,EAAA,SAAA,EAAA,KAAA,GAAA,MAAA,CAAA,EAAA;OACc,CAAA,EAAA,MAAA;QAAf,CAAA,EAAA,MAAA;WACU,CAAA,EC7GhB,YD6GgB,EAAA;EAAsB;AAGpD;;;;;EAKiB,GAAA,CAAA,EAAA,OAAA,EAAA;;;;;AAIjB;AAUA;;AAAkC,UCnHjB,YAAA,CDmHiB;OAChC,EAAA,MAAA;OAA8B,EAAA,MAAA;aAC1B,EAAA,KAAA,GAAA,MAAA;EAAC,eAAA,EAAA,MAAA;EAIK,MAAA,CAAA,EAAA,MAAY,EAAA;EAAA,KAAA,CAAA,ECnHd,SDmHc,EAAA;SAAW,CAAA,EAAA,CAAA,KAAA,EAAA,MAAA,EAAA,SAAA,EAAA,KAAA,GAAA,MAAA,CAAA,EAAA;OAAuC,CAAA,EAAA,MAAA;WAAZ,CAAA,EChHhD,YDgHgD,EAAA;;AAC9B,UC9Gf,YAAA,CD8Ge;;cACY,EAAA,MAAA;;EAA/B,KAAA,CAAA,EAAA,MAAA;EAID;EAAY,QAAA,CAAA,EC7GX,wBD6GW,CC7Gc,eD6Gd,EAAA,MAAA,CAAA;;aAAoC,EAAA,KAAA,GAAA,MAAA;;AAG5D;;;;;;AAGwB,UCxGP,YAAA,CDwGO;EAAC,GAAA,EAAA,GAAA,GAAA,IAAA,GAAA,GAAA,GAAA,IAAA,GAAA,GAAA,GAAA,IAAA,GAAA,CAAA,MAAA,GAAA,CAAA,CAAA,CAAA;EAGb,IAAA,EAAA,OAAA;EAAY,KAAA,CAAA,EAAA,OAAA;;;AAEZ,KCtGA,eDsGA,CAAA,CAAA,CAAA,GCtGqB,CDsGrB,GCtGyB,YDsGzB;;AACiB,KCpGjB,eDoGiB,CAAA,eCpGc,YDoGd,CAAA,GAAA,QAAjB,MCnGE,MDmGF,ICnGY,eDmGZ,CCnG4B,MDmG5B,CCnGmC,CDmGnC,CAAA,CAAA;;;;;;;;AAIE,KC7FF,UD6FE,CAAA,eC7FwB,YD6FxB,CAAA,GC7FwC,eD6FxC,CC7FwD,MD6FxD,CAAA,GAAA;KAAgC,CAAA,EC5FtC,eD4FsC,CC5FtB,MD4FsB,CAAA,EAAA;;AAAkC,UCzF/D,YDyF+D,CAAA,eCzFnC,YDyFmC,EAAA,cAAA,OAAA,CAAA,CAAA;QAAG,CAAA,EAAA,CAAA,CAAA,MCxFhE,MDwFgE,GAAA,MAAA,CAAA,GAAA,GAAA,CAAA,EAAA;OAAnB,CAAA,ECvFtD,UDuFsD,CCvF3C,MDuF2C,CAAA;OAAsB,CAAA,EAAA,MAAA;QAEnD,CAAA,EAAA,MAAA;SAAG,CAAA,ECtF1B,ODsF0B,CCtFlB,MDsFkB,CAAA,MCtFL,MDsFK,EAAA,KAAA,GAAA,MAAA,CAAA,CAAA;;SAAxB,CAAA,ECpFF,YDoFE,EAAA;OAAiC,CAAA,ECnFrC,KDmFqC;;AAAkC,KChFrE,gBDgFqE,CAAA,eChFrC,YDgFqC,CAAA,GChFrB,IDgFqB,CC/E/E,YD+E+E,CC/ElE,MD+EkE,EAAA,OAAA,CAAA,EAAA,SAAA,CAAA;AAAhB,KChErD,aDgEqD,CAAA,eChExB,YDgEwB,CAAA,GAAA,CAAA,OAAA,EC/DtD,oBD+DsD,CC/DjC,MD+DiC,CAAA,EAAA,GC9D5D,oBD8D4D,CC9DvC,MD8DuC,CAAA;AAAsB,KC3D3E,wBD2D2E,CAAA,UC1D3E,eD0D2E,EAAA,kBCzDnE,UDyDmE,CCzDxD,CDyDwD,CAAA,EAAA,sBCxD/D,MDwD+D,CAAA,MAAA,EAAA,GAAA,CAAA,GAAA,CAAA,CAAA,CAAA,GAAA,CAAA,OAAA,ECtD5E,+BDsD4E,CCtD5C,CDsD4C,ECtDzC,SDsDyC,EAAA,CAAA,CAAA,CAAA,EAAA,GCrDlF,+BDqDkF,CCrDlD,CDqDkD,ECrD/C,SDqD+C,ECrDpC,aDqDoC,CAAA;AAHnF,UC/Ca,oBD+Cb,CAAA,eC/CiD,YD+CjD,CAAA,CAAA;EAAQ,KAAA,CAAA,UAAA,EC9CQ,UD8CR,CC9CmB,MD8CnB,CAAA,CAAA,EAAA,IAAA;EAMP,MAAA,CAAA,GAAA,MAAY,EAAA,CAAA,CAAA,MCnDW,MDmDX,GAAA,MAAA,CAAA,GAAA,GAAA,CAAA,EAAA,CAAA,EAAA,IAAA;EAAA,KAAA,CAAA,KAAA,EAAA,MAAA,CAAA,EAAA,IAAA;QACL,CAAA,KAAA,EAAA,MAAA,CAAA,EAAA,IAAA;SACa,CAAA,KAAA,EAAA,MClDF,MDkDE,GAAA,MAAA,EAAA,SAAA,CAAA,EAAA,KAAA,GAAA,MAAA,CAAA,EAAA,IAAA;SAAb,CAAA,cAAA,MAAA,CAAA,CAAA,YAAA,ECjDkC,KDiDlC,EAAA,QAAA,CAAA,ECjDoD,aDiDpD,CAAA,GAAA,CAAA,CAAA,EAAA,IAAA;aACc,EAAA,ECjDT,YDiDS,CCjDI,MDiDJ,EAAA,OAAA,CAAA;;AAAd,UC7CK,+BD6CL,CAAA,UC5CA,eD4CA,EAAA,kBC3CQ,UD2CR,CC3CmB,CD2CnB,CAAA,EAAA,sBC1CY,MD0CZ,CAAA,MAAA,EAAA,GAAA,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA;OACR,CAAA,UAAA,ECzCgB,UDyChB,CCzC2B,UDyC3B,CCzCsC,QDyCtC,CCzC+C,CDyC/C,ECzCkD,SDyClD,CAAA,CAAA,CAAA,CAAA,EAAA,IAAA;QAAc,CAAA,GAAA,MAAA,EAAA,CAAA,CAAA,MCxCU,UDwCV,CCxCqB,QDwCrB,CCxC8B,CDwC9B,ECxCiC,SDwCjC,CAAA,CAAA,GAAA,MAAA,CAAA,GAAA,GAAA,CAAA,EAAA,CAAA,EAAA,IAAA;OAAa,CAAA,KAAA,EAAA,MAAA,CAAA,EAAA,IAAA;EAAC,MAAA,CAAA,KAAA,EAAA,MAAA,CAAA,EAAA,IAAA;EAE3B,OAAA,CAAA,KAAA,EAAA,MCtCY,UDsCQ,CCtCG,QDsCH,CCtCY,CDsCZ,ECtCe,SDsCf,CAAA,CAAA,GAAA,MAAA,EAAA,SAAA,CAAA,EAAA,KAAA,GAAA,MAAA,CAAA,EAAA,IAAA;EAAA,OAAA,CAAA,cClCP,kBDkCO,CClCY,CDkCZ,EClCe,SDkCf,CAAA,CAAA,OAAA,CAAA,EAAA,YCjCT,eDiCS,CCjCO,CDiCP,ECjCU,SDiCV,ECjCqB,KDiCrB,CAAA,EAAA,uBChCE,MDgCF,CAAA,MAAA,EAAA,GAAA,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA,YAAA,EC9BP,KD8BO,EAAA,QAAA,CAAA,EC7BV,wBD6BU,CC7Be,CD6Bf,EC7BkB,GD6BlB,CAAA,IAAA,CAAA,EC7B6B,cD6B7B,CAAA,CAAA,EC5BpB,+BD4BoB,CC3BrB,CD2BqB,EC1BrB,SD0BqB,ECzBrB,aDyBqB,GAAA,QCxBb,KDyBA,GAAA;IACa,EAAA,ECzBb,GDyBa,CAAA,IAAA,CAAA;IAAb,WAAA,ECxBS,GDwBT,CAAA,aAAA,CAAA;IACc,aAAA,ECxBH,cDwBG;EAAG,CAAA;aAEF,EAAA,ECtBV,YDsBU,CCtBG,UDsBH,CCtBc,QDsBd,CCtBuB,CDsBvB,ECtB0B,SDsB1B,CAAA,CAAA,EAAA,OAAA,CAAA;;;;;;AAA8B,KCf7C,kBDe6C,CAAA,eCfX,YDeW,CAAA,GAAA,QAAnB,MCdxB,MDcwB,GCdf,CDce,SAAA,IAAA,GAAA,YAAA,GAAA,YAAA,GAAA,YAAA,GAAA,KAAA,GCZhC,MDYgC,CCZzB,CDYyB,CAAA,SAAA,MAAA,GAAA,MAAA,EAAA,GAAA,IAAA,GAAA,SAAA,GCX9B,CDW8B,GAAA,KAAA,SCT9B,MDSoD,CAAA;;;;;AACpD,KCJI,6BDIJ,CAAA,eCFS,aDET,EAAA,kBAAA,MAAA,EAAA,kBAAA,MAAA,EAAA,aAAA,CAAA,GCGN,aDHM,SCGgB,MDHhB,CAAA,MAAA,ECG+B,MDH/B,CAAA,MAAA,ECG8C,sBDH9C,CAAA,CAAA,GCIF,SDJE,SAAA,MCIsB,aDJtB,GCKA,SDLA,SAAA,MCKwB,aDLxB,CCKsC,SDLtC,CAAA,GCME,aDNF,CCMgB,SDNhB,CAAA,CCM2B,SDN3B,CAAA,CAAA,OAAA,CAAA,GAAA,GAAA,GAAA,GAAA,GAAA,GAAA;;AAAY;;;AAIK,KCWb,cDXa,CAAA,kBAAA,MAAA,EAAA,kBAAA,MAAA,EAAA,aAAA,CAAA,GCYvB,aDZuB,SCYD,MDZC,CAAA,MAAA,ECYc,MDZd,CAAA,MAAA,ECY6B,sBDZ7B,CAAA,CAAA,GCanB,SDbmB,SAAA,MCaK,aDbL,GCcjB,SDdiB,SAAA,MCcO,aDdP,CCcqB,SDdrB,CAAA,GCef,aDfe,CCeD,SDfC,CAAA,CCeU,SDfV,CAAA,CAAA,aAAA,CAAA,GAAA,MAAA,GAAA,MAAA,GAAA,MAAA;;;;;AAGE,KCqBf,WDrBe,CAAA,eCsBV,aDtBU,EAAA,eCuBV,MDvBU,CAAA,MAAA,EAAA,GAAA,CAAA,EAAA,kBAAA,MAAA,EAAA,kBAAA,MAAA,EAAA,aAAA,CAAA,GC2BvB,SD3BuB,SAAA,MC2BC,MD3BD,GC4BvB,ID5BuB,CC4BlB,MD5BkB,EC4BV,SD5BU,CAAA,GAAA,QC6Bf,SD7BkB,GC6BN,cD7BM,CC6BS,SD7BT,EC6BoB,SD7BpB,EC6B+B,aD7B/B,CAAA,SAAA,KAAA,GC8BpB,6BD9BoB,CC8BU,MD9BV,EC8BkB,SD9BlB,EC8B6B,CD9B7B,EC8BgC,aD9BhC,CAAA,GAAA,IAAA,GC+BpB,6BD/BoB,CC+BU,MD/BV,EC+BkB,SD/BlB,EC+B6B,CD/B7B,EC+BgC,aD/BhC,CAAA,EAAA,GAAA,IAAA,KCiC1B,MDjC6B;;;;;AAAK,KCuC1B,qBDvC0B,CAAA,kBAAA,MAAA,EAAA,aAAA,CAAA,GCwCpC,aDxCoC,SCwCd,MDxCc,CAAA,MAAA,ECwCC,MDxCD,CAAA,MAAA,EAAA,GAAA,CAAA,CAAA,GCyChC,SDzCgC,SAAA,MCyCR,aDzCQ,GAAA,MC0CxB,aD1CwB,CC0CV,SD1CU,CAAA,GAAA,MAAA,GAAA,KAAA,GAAA,KAAA;;;;;;;;AAClB;;;AAEiB,UCqDpB,sBDrDoB,CAAA,QAAA,GAAA,CAAA,CAAA;;EAAG,KAAA,ECuD/B,KDvD+B;EAK5B;EAAQ,KAAA,EAAA,MAAA;;aAAoD,EAAA,KAAA,GAAA,MAAA;;AACtE,KCwDU,qBAAA,GAAwB,MDxDlC,CAAA,MAAA,ECwDiD,MDxDjD,CAAA,MAAA,ECwDgE,sBDxDhE,CAAA,CAAA;;;;KE9HU;EFvIA,OAAA,EEuI8B,MFvIrB,CAAA,MAAA,EEuIoC,YFvIpC,CAAA;AAQrB,CAAA,EAAA,IAAY,IAAA,CAAA,GAAQ,CAAA,KAAA,EEgIX,UFhIW,CEgIA,CFhIA,EAAA,OAAA,CAAA,EAAA,GEiIf,CFjIe;AAEH,cEiIJ,UFjIgB,CAAA,UAAA;EAAA,OAAA,EEkIN,MFlIM,CAAA,MAAA,EEkIS,YFlIT,CAAA;iBACZ,OAAA,EAAA,IAAA,IAAA,CAAA,CAAA;mBAIC,UAAA;EAAQ,iBAAA,OAAA;EA0BT,iBAAA,MAAmB;EAWxB,iBAAW,QAAA;EAKN,QAAA,KAAA;EAUA,QAAA,UAAA;EAAuB,QAAA,YAAA;UAEN,gBAAA;UAIE,WAAA;EAAoB,WAAA,CAAA,UAAA,EAAA,MAAA,EAAA,OAAA,EE+E1B,YF/E0B,CE+Eb,UF/Ea,CE+EF,CF/EE,CAAA,EE+EE,KF/EF,CAAA,EAAA,MAAA,EEgF3B,eFhF2B,EAAA,QAAA,EEiFzB,QFjFyB,CAAA,GAAA,EEiFX,CFjFW,CAAA;EAQ5C,IAAA,SAAA,CAAA,CAAA,EEqGO,SFrGU;EAajB,IAAA,UAAA,CAAA,CAAA,EE4FQ,UF5FQ,CAAA;IAAA,OAAA,EE4Fc,MF5Fd,CAAA,MAAA,EE4F6B,YF5F7B,CAAA;KAAW,OAAA,CAAA,EAAA;MAAgB,WAAA,CAAA,CAAA,EEgGlC,SFhGkC;MACnD,eAAA,CAAA,CAAA,EEmGqB,SFnGrB;MAAkB,SAAA,CAAA,CAAA,EAAA,MAAA;MAClB,IAAA,CAAA,CAAA,EAAA,MAAA;MAAkB,KAAA,CAAA,CAAA,EAAA,OAAA;EAAC,GAAA,CAAA,CAAA,EEkHP,CFlHO;EAKX,gBAAA,CAAc,OAAA,EAAA,GAAA,EAAA,CAAA,EEiHiB,SFjHjB;EAAA,gBAAA,CAAA,CAAA,EEqHG,SFrHH;YAAW,CAAA,CAAA,EEyHd,YFzHc,CEyHD,UFzHC,CEyHU,CFzHV,CAAA,EEyHc,KFzHd,CAAA;;;;;AAIjC,KEmIQ,iBFnIR,CAAA,sBEmIgD,gBFnIhD,CAAA,GAAA,MEmI0E,aFnI1E;AAAgB,KEqIR,oBAAA,GFrIQ;EAgCH,EAAA,EAAA,MAAA;EAAgB,WAAA,EAAA,KAAA,GAAA,MAAA;eAEG,EEsGnB,gBFtGmB;;AAGA,KEsGxB,gBAAA,GAAmB,MFtGK,CAAA,MAAA,EEsGU,oBFtGV,CAAA;;;AAQpC;AAciB,KEqFL,kBFrFoB,CAAA,UEsFpB,eFtFoB,EAAA,sBEuFR,gBFvFQ,CAAA,GAAA,QAAA,MEyFlB,aFzFkB,GEyFF,WFzFE,CE0F5B,CF1F4B,EE2F5B,aF3F4B,CE2Fd,CF3Fc,CAAA,CAAA,IAAA,CAAA,EE4F5B,aF5F4B,CE4Fd,CF5Fc,CAAA,CAAA,eAAA,CAAA,EE6F5B,aF7F4B,CE6Fd,CF7Fc,CAAA,CAAA,aAAA,CAAA,SAAA,KAAA,GAAA,IAAA,GAAA,KAAA,CAAA;AAGV,KE8FV,mBF9FU,CAAA,UE+FV,eF/FU,EAAA,kBEgGF,UFhGE,CEgGS,CFhGT,CAAA,EAAA,sBEiGE,gBFjGF,CAAA,GEkGlB,IFlGkB,CEkGb,UFlGa,CEkGF,QFlGE,CEkGO,CFlGP,EEkGU,SFlGV,CAAA,CAAA,EEkGuB,iBFlGvB,CEkGyC,aFlGzC,CAAA,CAAA,GEmGpB,kBFnGoB,CEmGD,CFnGC,EEmGE,aFnGF,CAAA;AAOI,KE8Fd,oBF9Fc,CAAA,UE+Fd,eF/Fc,EAAA,kBEgGN,UFhGM,CEgGK,CFhGL,CAAA,EAAA,sBEiGF,gBFjGE,CAAA,GAAA,CEkGrB,IFlGqB,CEkGhB,UFlGgB,CEkGL,QFlGK,CEkGI,CFlGJ,EEkGO,SFlGP,CAAA,CAAA,EEkGoB,iBFlGpB,CEkGsC,aFlGtC,CAAA,CAAA,GEmGxB,kBFnGwB,CEmGL,CFnGK,EEmGF,aFnGE,CAAA,CAAA,EAAA;;;;;AAII,KEqGlB,WFrGkB,CAAA,UEsGlB,eFtGkB,EAAA,kBEuGV,UFvGU,CEuGC,CFvGD,CAAA,EAAA,sBEwGN,gBFxGM,EAAA,cAAA,OAAA,CAAA,GE0G1B,KF1G0B,SAAA,IAAA,GE2G1B,mBF3G0B,CE2GN,CF3GM,EE2GH,SF3GG,EE2GQ,aF3GR,CAAA,GE4G1B,oBF5G0B,CE4GL,CF5GK,EE4GF,SF5GE,EE4GS,aF5GT,CAAA;AAAsB,cE8GvC,UF9GuC,CAAA,UE+GxC,eF/GwC,EAAA,kBEgHhC,UFhHgC,CEgHrB,CFhHqB,CAAA,EAAA,UAAA;EAGnC,OAAA,EE8GM,MF9GN,CAAA,MAAA,EE8GqB,YF9GM,CAAA;CAAA,EAAA,sBEgHpB,gBFhHoB,EAAA,cAAA,OAAA,EAAA,IAAA,IAAA,CAAA,CAAA;mBAEV,SAAA;mBAAf,OAAA;EAAM,iBAAA,MAAA;EAGR,iBAAA,QAAA;EAA0B,QAAA,WAAA;aACX,CAAA,SAAA,EEiHA,SFjHA,EAAA,OAAA,EEkHF,YFlHE,CEkHW,UFlHX,CEkHsB,CFlHtB,CAAA,EEkH0B,KFlH1B,CAAA,EAAA,MAAA,EEmHH,CFnHG,EAAA,QAAA,EEoHD,QFpHC,CEoHQ,CFpHR,EEoHW,CFpHX,CAAA;KAAf,CAAA,CAAA,EE8HR,CF9HQ;EAAM,gBAAA,CAAA,OAAA,EAAA,GAAA,EAAA,CAAA,EEkIa,SFlIb;EAGN,gBAAA,CAAA,CAAA,EEmIK,SFnIL;EAUL,UAAA,CAAA,CAAA,EE6HI,SF7HO;EAAA,IAAA,UAAA,CAAA,CAAA,EEiIH,UFjIG,CEiIQ,CFjIR,EEiIW,KFjIX,EEiIkB,CFjIlB,CAAA;MAAW,KAAA,CAAA,CAAA,EAAA,OAAA;MAChC,IAAA,CAAA,CAAA,EAAA,MAAA;;;;AAKF;;AAAmC,cEuQtB,YFvQsB,CAAA,gBEwQjB,eFxQiB,EAAA,wBEyQT,UFzQS,CEyQE,CFzQF,CAAA,EAAA,UAAA,IAAA,EAAA,4BE2QL,gBF3QK,GAAA,CAAA,CAAA,EAAA,oBAAA,OAAA,GAAA,KAAA,CAAA,CAAA;mBAAuC,MAAA;mBAAZ,SAAA;mBAC5D,QAAA;UAA8B,OAAA;aAClB,CAAA,MAAA,EE6Qe,CF7Qf,EAAA,SAAA,EE8QkB,SF9QlB,EAAA,QAAA,CAAA,EE+QiB,QF/QjB,CE+Q0B,QF/Q1B,CE+QmC,CF/QnC,EE+QsC,SF/QtC,CAAA,EE+QkD,CF/QlD,CAAA,EAAA,OAAA,CAAA,EEgRO,YFhRP,CEgRoB,UFhRpB,CEgR+B,QFhR/B,CEgRwC,CFhRxC,EEgR2C,SFhR3C,CAAA,CAAA,EEgRwD,KFhRxD,CAAA;;;;EAIF,KAAA,CAAA,UAAY,EEmRR,UFnRQ,CEmRG,UFnRH,CEmRc,QFnRd,CEmRuB,CFnRvB,EEmR0B,SFnR1B,CAAA,CAAA,CAAA,CAAA,EEoRnB,YFpRmB,CEoRN,CFpRM,EEoRH,SFpRG,EEoRQ,CFpRR,EEoRW,aFpRX,EEoR0B,KFpR1B,CAAA;EAAA;;;EAAqC,MAAA,CAAA,GAAA,MAAA,EAAA,CAAA,CAAA,MEmStC,UFnSsC,CEmS3B,QFnS2B,CEmSlB,CFnSkB,EEmSf,SFnSe,CAAA,CAAA,GAAA,MAAA,CAAA,GAAA,GAAA,CAAA,EAAA,CAAA,EEoSxD,YFpSwD,CEoS3C,CFpS2C,EEoSxC,SFpSwC,EEoS7B,CFpS6B,EEoS1B,aFpS0B,EEoSX,KFpSW,CAAA;EAGjD;;;SAEa,CAAA,KAAA,EE2Sd,eF3Sc,CE2SE,QF3SF,CE2SW,CF3SX,EE2Sc,SF3Sd,CAAA,CAAA,EAAA,SAAA,CAAA,EAAA,KAAA,GAAA,MAAA,CAAA,EE6SpB,YF7SoB,CE6SP,CF7SO,EE6SJ,SF7SI,EE6SO,CF7SP,EE6SU,aF7SV,EE6SyB,KF7SzB,CAAA;;;;EACA,KAAA,CAAA,KAAA,EAAA,MAAA,CAAA,EEwTD,YFxTC,CEwTY,CFxTZ,EEwTe,SFxTf,EEwT0B,CFxT1B,EEwT6B,aFxT7B,EEwT4C,KFxT5C,CAAA;EAGb;;;QAEa,CAAA,KAAA,EAAA,MAAA,CAAA,EE2TA,YF3TA,CE2Ta,CF3Tb,EE2TgB,SF3ThB,EE2T2B,CF3T3B,EE2T8B,aF3T9B,EE2T6C,KF3T7C,CAAA;KAAb,CAAA,CAAA,EEgUH,YFhUG,CEgUU,CFhUV,EEgUa,SFhUb,EEgUwB,CFhUxB,EEgU2B,aFhU3B,EAAA,IAAA,CAAA;;;;;;SAEkB,CAAA,cE6UZ,kBF7UY,CE6UO,CF7UP,EE6UU,SF7UV,CAAA,CAAA,OAAA,CAAA,EAAA,YE8Ud,eF9Uc,CE8UE,CF9UF,EE8UK,SF9UL,EE8UgB,KF9UhB,CAAA,EAAA,uBE+UH,gBF/UG,GAAA,CAAA,CAAA,CAAA,CAAA,KAAA,EEiVnB,KFjVmB,EAAA,qBAAA,CAAA,EEmVtB,wBFnVsB,CEmVG,CFnVH,EEmVM,GFnVN,CAAA,IAAA,CAAA,EEmViB,cFnVjB,CAAA,GEoVtB,GFpVsB,CAAA,aAAA,CAAA,EAAA,QAAA,CAAA,EEqVf,wBFrVe,CEqVU,CFrVV,EEqVa,GFrVb,CAAA,IAAA,CAAA,EEqVwB,cFrVxB,CAAA,CAAA,EEsVzB,YFtVyB,CEuV1B,CFvV0B,EEwV1B,SFxV0B,EEyV1B,CFzV0B,EE0V1B,aF1V0B,GAAA,QE2VlB,KF3VD,GAAA;IACP,EAAA,EE2VQ,GF3VR,CAAA,IAAA,CAAA;IAE+B,WAAA,EE0Vd,GF1Vc,CAAA,aAAA,CAAA;IAAG,aAAA,EE2Vf,cF3Ve;EAAG,CAAA,IE8VrC,KF9VU,CAAA;;;;YAAqE,CAAA,CAAA,EE4bnE,YF5bmE,CE4btD,UF5bsD,CE4b3C,QF5b2C,CE4blC,CF5bkC,EE4b/B,SF5b+B,CAAA,CAAA,EE4blB,KF5bkB,CAAA;;;;;OAE1C,CAAA,CAAA,EEkc9B,UFlc8B,CEkcnB,CFlcmB,EEkchB,SFlcgB,EEkcL,QFlcK,CEkcI,CFlcJ,EEkcO,SFlcP,CAAA,EEkcmB,aFlcnB,EEkckC,KFlclC,EEkcyC,CFlczC,CAAA;;AAAM,iBE4c/B,MAAA,CF5c+B,GAAA,EAAA,MAAA,EAAA,IAAA,CAAA,EAAA,MAAA,CAAA,EAAA,MAAA;;;AACzC;;;;;;AAKuB,iBE4iBb,qBF5iBa,CAAA,eE4iBwB,YF5iBxB,EAAA,cAAA,OAAA,CAAA,CAAA,MAAA,EAAA,QAAA,GAAA,aAAA,GAAA,kBAAA,GAAA,QAAA,GAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EE+iBlB,YF/iBkB,CE+iBL,MF/iBK,EE+iBG,KF/iBH,CAAA,EAAA,MAAA,EEgjBnB,eFhjBmB,EAAA,OAAA,CAAA,EAAA,GAAA,EAAA,CAAA,EEkjB1B,SFljB0B"}
|
|
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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CEkGyC,aFlGzC,CAAA,CAAA,GEmGpB,kBFnGoB,CEmGD,CFnGC,EEmGE,aFnGF,CAAA;AAOI,KE8Fd,oBF9Fc,CAAA,UE+Fd,eF/Fc,EAAA,kBEgGN,UFhGM,CEgGK,CFhGL,CAAA,EAAA,sBEiGF,gBFjGE,CAAA,GAAA,CEkGrB,IFlGqB,CEkGhB,UFlGgB,CEkGL,QFlGK,CEkGI,CFlGJ,EEkGO,SFlGP,CAAA,CAAA,EEkGoB,iBFlGpB,CEkGsC,aFlGtC,CAAA,CAAA,GEmGxB,kBFnGwB,CEmGL,CFnGK,EEmGF,aFnGE,CAAA,CAAA,EAAA;;;;;AAII,KEqGlB,WFrGkB,CAAA,UEsGlB,eFtGkB,EAAA,kBEuGV,UFvGU,CEuGC,CFvGD,CAAA,EAAA,sBEwGN,gBFxGM,EAAA,cAAA,OAAA,CAAA,GE0G1B,KF1G0B,SAAA,IAAA,GE2G1B,mBF3G0B,CE2GN,CF3GM,EE2GH,SF3GG,EE2GQ,aF3GR,CAAA,GE4G1B,oBF5G0B,CE4GL,CF5GK,EE4GF,SF5GE,EE4GS,aF5GT,CAAA;AAAsB,cE8GvC,UF9GuC,CAAA,UE+GxC,eF/GwC,EAAA,kBEgHhC,UFhHgC,CEgHrB,CFhHqB,CAAA,EAAA,UAAA;EAGnC,OAAA,EE8GM,MF9GN,CAAA,MAAA,EE8GqB,YF9GM,CAAA;CAAA,EAAA,sBEgHpB,gBFhHoB,EAAA,cAAA,OAAA,EAAA,IAAA,IAAA,CAAA,CAAA;mBAEV,SAAA;mBAAf,OAAA;EAAM,iBAAA,MAAA;EAGR,iBAAA,QAAA;EAA0B,QAAA,WAAA;aACX,CAAA,SAAA,EEiHA,SFjHA,EAAA,OAAA,EEkHF,YFlHE,CEkHW,UFlHX,CEkHsB,CFlHtB,CAAA,EEkH0B,KFlH1B,CAAA,EAAA,MAAA,EEmHH,CFnHG,EAAA,QAAA,EEoHD,QFpHC,CEoHQ,CFpHR,EEoHW,CFpHX,CAAA;KAAf,CAAA,CAAA,EE8HR,CF9HQ;EAAM,gBAAA,CAAA,OAAA,EAAA,GAAA,EAAA,CAAA,EEkIa,SFlIb;EAGN,gBAAA,CAAA,CAAA,EEmIK,SFnIL;EAUL,UAAA,CAAA,CAAA,EE6HI,SF7HO;EAAA,IAAA,UAAA,CAAA,CAAA,EEiIH,UFjIG,CEiIQ,CFjIR,EEiIW,KFjIX,EEiIkB,CFjIlB,CAAA;MAAW,KAAA,CAAA,CAAA,EAAA,OAAA;MAChC,IAAA,CAAA,CAAA,EAAA,MAAA;;;;AAKF;;AAAmC,cEuQtB,YFvQsB,CAAA,gBEwQjB,eFxQiB,EAAA,wBEyQT,UFzQS,CEyQE,CFzQF,CAAA,EAAA,UAAA,IAAA,EAAA,4BE2QL,gBF3QK,GAAA,CAAA,CAAA,EAAA,oBAAA,OAAA,GAAA,KAAA,CAAA,CAAA;mBAAuC,MAAA;mBAAZ,SAAA;mBAC5D,QAAA;UAA8B,OAAA;aAClB,CAAA,MAAA,EE6Qe,CF7Qf,EAAA,SAAA,EE8QkB,SF9QlB,EAAA,QAAA,CAAA,EE+QiB,QF/QjB,CE+Q0B,QF/Q1B,CE+QmC,CF/QnC,EE+QsC,SF/QtC,CAAA,EE+QkD,CF/QlD,CAAA,EAAA,OAAA,CAAA,EEgRO,YFhRP,CEgRoB,UFhRpB,CEgR+B,QFhR/B,CEgRwC,CFhRxC,EEgR2C,SFhR3C,CAAA,CAAA,EEgRwD,KFhRxD,CAAA;;;;EAIF,KAAA,CAAA,UAAY,EEmRR,UFnRQ,CEmRG,UFnRH,CEmRc,QFnRd,CEmRuB,CFnRvB,EEmR0B,SFnR1B,CAAA,CAAA,CAAA,CAAA,EEoRnB,YFpRmB,CEoRN,CFpRM,EEoRH,SFpRG,EEoRQ,CFpRR,EEoRW,aFpRX,EEoR0B,KFpR1B,CAAA;EAAA;;;EAAqC,MAAA,CAAA,GAAA,MAAA,EAAA,CAAA,CAAA,MEmStC,UFnSsC,CEmS3B,QFnS2B,CEmSlB,CFnSkB,EEmSf,SFnSe,CAAA,CAAA,GAAA,MAAA,CAAA,GAAA,GAAA,CAAA,EAAA,CAAA,EEoSxD,YFpSwD,CEoS3C,CFpS2C,EEoSxC,SFpSwC,EEoS7B,CFpS6B,EEoS1B,aFpS0B,EEoSX,KFpSW,CAAA;EAGjD;;;SAEa,CAAA,KAAA,EE2Sd,eF3Sc,CE2SE,QF3SF,CE2SW,CF3SX,EE2Sc,SF3Sd,CAAA,CAAA,EAAA,SAAA,CAAA,EAAA,KAAA,GAAA,MAAA,CAAA,EE6SpB,YF7SoB,CE6SP,CF7SO,EE6SJ,SF7SI,EE6SO,CF7SP,EE6SU,aF7SV,EE6SyB,KF7SzB,CAAA;;;;EACA,KAAA,CAAA,KAAA,EAAA,MAAA,CAAA,EEwTD,YFxTC,CEwTY,CFxTZ,EEwTe,SFxTf,EEwT0B,CFxT1B,EEwT6B,aFxT7B,EEwT4C,KFxT5C,CAAA;EAGb;;;QAEa,CAAA,KAAA,EAAA,MAAA,CAAA,EE2TA,YF3TA,CE2Ta,CF3Tb,EE2TgB,SF3ThB,EE2T2B,CF3T3B,EE2T8B,aF3T9B,EE2T6C,KF3T7C,CAAA;KAAb,CAAA,CAAA,EEgUH,YFhUG,CEgUU,CFhUV,EEgUa,SFhUb,EEgUwB,CFhUxB,EEgU2B,aFhU3B,EAAA,IAAA,CAAA;;;;;;SAEkB,CAAA,cE6UZ,kBF7UY,CE6UO,CF7UP,EE6UU,SF7UV,CAAA,CAAA,OAAA,CAAA,EAAA,YE8Ud,eF9Uc,CE8UE,CF9UF,EE8UK,SF9UL,EE8UgB,KF9UhB,CAAA,EAAA,uBE+UH,gBF/UG,GAAA,CAAA,CAAA,CAAA,CAAA,KAAA,EEiVnB,KFjVmB,EAAA,qBAAA,CAAA,EEmVtB,wBFnVsB,CEmVG,CFnVH,EEmVM,GFnVN,CAAA,IAAA,CAAA,EEmViB,cFnVjB,CAAA,GEoVtB,GFpVsB,CAAA,aAAA,CAAA,EAAA,QAAA,CAAA,EEqVf,wBFrVe,CEqVU,CFrVV,EEqVa,GFrVb,CAAA,IAAA,CAAA,EEqVwB,cFrVxB,CAAA,CAAA,EEsVzB,YFtVyB,CEuV1B,CFvV0B,EEwV1B,SFxV0B,EEyV1B,CFzV0B,EE0V1B,aF1V0B,GAAA,QE2VlB,KF3VD,GAAA;IACP,EAAA,EE2VQ,GF3VR,CAAA,IAAA,CAAA;IAE+B,WAAA,EE0Vd,GF1Vc,CAAA,aAAA,CAAA;IAAG,aAAA,EE2Vf,cF3Ve;EAAG,CAAA,IE8VrC,KF9VU,CAAA;;;;YAAqE,CAAA,CAAA,EE4bnE,YF5bmE,CE4btD,UF5bsD,CE4b3C,QF5b2C,CE4blC,CF5bkC,EE4b/B,SF5b+B,CAAA,CAAA,EE4blB,KF5bkB,CAAA;;;;;OAE1C,CAAA,CAAA,EEkc9B,UFlc8B,CEkcnB,CFlcmB,EEkchB,SFlcgB,EEkcL,QFlcK,CEkcI,CFlcJ,EEkcO,SFlcP,CAAA,EEkcmB,aFlcnB,EEkckC,KFlclC,EEkcyC,CFlczC,CAAA;;;;;;;;;;AAGpC,iBEidW,WAAA,CFjdC,KAAA,EAAA,MAAA,EAAA,KAAA,EAAA,MAAA,CAAA,EAAA,MAAA;;;;;;AAGY,iBEudb,gBAAA,CFvda,IAAA,EAAA,MAAA,CAAA,EAAA,MAAA;AAAjB,iBE4dI,MAAA,CF5dJ,GAAA,EAAA,MAAA,EAAA,IAAA,CAAA,EAAA,MAAA,CAAA,EAAA,MAAA;;;;;;;;;AAQkB,iBE0jBd,qBF1jBc,CAAA,eE0jBuB,YF1jBvB,EAAA,cAAA,OAAA,CAAA,CAAA,MAAA,EAAA,QAAA,GAAA,aAAA,GAAA,kBAAA,GAAA,QAAA,GAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EE6jBnB,YF7jBmB,CE6jBN,MF7jBM,EE6jBE,KF7jBF,CAAA,EAAA,MAAA,EE8jBpB,eF9jBoB,EAAA,OAAA,CAAA,EAAA,GAAA,EAAA,CAAA,EEgkB3B,SFhkB2B"}
|
package/dist/index.d.ts
CHANGED
|
@@ -328,7 +328,7 @@ type WhereConditions<TModel extends GenericModel> = { [K in keyof TModel]?: Wher
|
|
|
328
328
|
* WHERE input for `.where()`. Supports equality (`{ field: value }`), comparison
|
|
329
329
|
* operators (`{ field: { _op, _val } }`), and a single top-level `_or` group of
|
|
330
330
|
* condition fragments that compile to a parenthesised `(... OR ...)` conjunct —
|
|
331
|
-
* e.g. `{ _or: [{ white: x }, { black: x }] }` → `(white = $
|
|
331
|
+
* e.g. `{ _or: [{ white: x }, { black: x }] }` → `(white = $white__or0 OR black = $black__or1)`.
|
|
332
332
|
* Backward-compatible with plain `Partial<TModel>` equality objects.
|
|
333
333
|
*/
|
|
334
334
|
type WhereInput<TModel extends GenericModel> = WhereConditions<TModel> & {
|
|
@@ -535,6 +535,21 @@ declare class QueryBuilder<const S extends SchemaStructure, const TableName exte
|
|
|
535
535
|
*/
|
|
536
536
|
build(): FinalQuery<S, TableName, GetTable<S, TableName>, RelatedFields, IsOne, R>;
|
|
537
537
|
}
|
|
538
|
+
/**
|
|
539
|
+
* The surql param name an `_or` branch condition binds under: the branch FIELD,
|
|
540
|
+
* a `__or` marker and the branch's position. The position alone makes it unique
|
|
541
|
+
* within the query; the field prefix is what lets a consumer type the value by
|
|
542
|
+
* looking the column up (see {@link baseFieldOfParam}). Non-identifier
|
|
543
|
+
* characters (a nested path like `database.owner`) are folded to `_` so the
|
|
544
|
+
* result is a legal param name.
|
|
545
|
+
*/
|
|
546
|
+
declare function orParamName(field: string, index: number): string;
|
|
547
|
+
/**
|
|
548
|
+
* Inverse of {@link orParamName}: the field a param name was built from, or the
|
|
549
|
+
* name itself when it is a plain top-level param (`field = $field`). Lets a
|
|
550
|
+
* consumer resolve `white__or0` back to the `white` column.
|
|
551
|
+
*/
|
|
552
|
+
declare function baseFieldOfParam(name: string): string;
|
|
538
553
|
declare function cyrb53(str: string, seed?: number): number;
|
|
539
554
|
/**
|
|
540
555
|
* Build a query string from query options
|
|
@@ -548,5 +563,5 @@ declare function buildQueryFromOptions<TModel extends GenericModel, IsOne extend
|
|
|
548
563
|
//# sourceMappingURL=query-builder.d.ts.map
|
|
549
564
|
|
|
550
565
|
//#endregion
|
|
551
|
-
export { type AccessDefinition, type BackendNames, type BackendRoutes, type BucketConfig, type BucketDefinitionSchema, type BucketNames, type BuildRelatedFields, type BuildResultModelMany, type BuildResultModelOne, type Cardinality, type ColumnSchema, type ComparisonOp, type Executor, type ExtractFieldNames, FinalQuery, type GenericModel, type GenericSchema, type GetCardinality, type GetRelationship, type GetRelationshipFields, type GetTable, type InferRelatedModelFromMetadata, InnerQuery, type LiveQueryOptions, QueryBuilder, type QueryInfo, type QueryModifier, type QueryModifierBuilder, type QueryOptions, type QueryPlan, type QueryResult, RecordId, type RelatedField, type RelatedFieldMapEntry, type RelatedFieldsMap, type RelatedQuery, type RelationPlan, type RelationshipDefinition, type RelationshipFields, type RelationshipFields$1 as RelationshipFieldsFromSchema, type RelationshipMetadata, type RelationshipsMetadata, type RoutePayload, type SchemaAwareQueryModifier, type SchemaAwareQueryModifierBuilder, type SchemaMetadataStructure, type SchemaStructure, type SchemaToIndexed, type TableModel, type TableNames, type TableRelationships, type TableSchemaMetadata, type TypeNameToTypeMap, type ValueType, type WhereComparison, type WhereConditions, type WhereFieldValue, type WhereInput, type WhereNode, type WhereOr, type WithRelated, buildQueryFromOptions, cyrb53 };
|
|
566
|
+
export { type AccessDefinition, type BackendNames, type BackendRoutes, type BucketConfig, type BucketDefinitionSchema, type BucketNames, type BuildRelatedFields, type BuildResultModelMany, type BuildResultModelOne, type Cardinality, type ColumnSchema, type ComparisonOp, type Executor, type ExtractFieldNames, FinalQuery, type GenericModel, type GenericSchema, type GetCardinality, type GetRelationship, type GetRelationshipFields, type GetTable, type InferRelatedModelFromMetadata, InnerQuery, type LiveQueryOptions, QueryBuilder, type QueryInfo, type QueryModifier, type QueryModifierBuilder, type QueryOptions, type QueryPlan, type QueryResult, RecordId, type RelatedField, type RelatedFieldMapEntry, type RelatedFieldsMap, type RelatedQuery, type RelationPlan, type RelationshipDefinition, type RelationshipFields, type RelationshipFields$1 as RelationshipFieldsFromSchema, type RelationshipMetadata, type RelationshipsMetadata, type RoutePayload, type SchemaAwareQueryModifier, type SchemaAwareQueryModifierBuilder, type SchemaMetadataStructure, type SchemaStructure, type SchemaToIndexed, type TableModel, type TableNames, type TableRelationships, type TableSchemaMetadata, type TypeNameToTypeMap, type ValueType, type WhereComparison, type WhereConditions, type WhereFieldValue, type WhereInput, type WhereNode, type WhereOr, type WithRelated, baseFieldOfParam, buildQueryFromOptions, cyrb53, orParamName };
|
|
552
567
|
//# sourceMappingURL=index.d.ts.map
|
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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CEkGyC,aFlGzC,CAAA,CAAA,GEmGpB,kBFnGoB,CEmGD,CFnGC,EEmGE,aFnGF,CAAA;AAOI,KE8Fd,oBF9Fc,CAAA,UE+Fd,eF/Fc,EAAA,kBEgGN,UFhGM,CEgGK,CFhGL,CAAA,EAAA,sBEiGF,gBFjGE,CAAA,GAAA,CEkGrB,IFlGqB,CEkGhB,UFlGgB,CEkGL,QFlGK,CEkGI,CFlGJ,EEkGO,SFlGP,CAAA,CAAA,EEkGoB,iBFlGpB,CEkGsC,aFlGtC,CAAA,CAAA,GEmGxB,kBFnGwB,CEmGL,CFnGK,EEmGF,aFnGE,CAAA,CAAA,EAAA;;;;;AAII,KEqGlB,WFrGkB,CAAA,UEsGlB,eFtGkB,EAAA,kBEuGV,UFvGU,CEuGC,CFvGD,CAAA,EAAA,sBEwGN,gBFxGM,EAAA,cAAA,OAAA,CAAA,GE0G1B,KF1G0B,SAAA,IAAA,GE2G1B,mBF3G0B,CE2GN,CF3GM,EE2GH,SF3GG,EE2GQ,aF3GR,CAAA,GE4G1B,oBF5G0B,CE4GL,CF5GK,EE4GF,SF5GE,EE4GS,aF5GT,CAAA;AAAsB,cE8GvC,UF9GuC,CAAA,UE+GxC,eF/GwC,EAAA,kBEgHhC,UFhHgC,CEgHrB,CFhHqB,CAAA,EAAA,UAAA;EAGnC,OAAA,EE8GM,MF9GN,CAAA,MAAA,EE8GqB,YF9GM,CAAA;CAAA,EAAA,sBEgHpB,gBFhHoB,EAAA,cAAA,OAAA,EAAA,IAAA,IAAA,CAAA,CAAA;mBAEV,SAAA;mBAAf,OAAA;EAAM,iBAAA,MAAA;EAGR,iBAAA,QAAA;EAA0B,QAAA,WAAA;aACX,CAAA,SAAA,EEiHA,SFjHA,EAAA,OAAA,EEkHF,YFlHE,CEkHW,UFlHX,CEkHsB,CFlHtB,CAAA,EEkH0B,KFlH1B,CAAA,EAAA,MAAA,EEmHH,CFnHG,EAAA,QAAA,EEoHD,QFpHC,CEoHQ,CFpHR,EEoHW,CFpHX,CAAA;KAAf,CAAA,CAAA,EE8HR,CF9HQ;EAAM,gBAAA,CAAA,OAAA,EAAA,GAAA,EAAA,CAAA,EEkIa,SFlIb;EAGN,gBAAA,CAAA,CAAA,EEmIK,SFnIL;EAUL,UAAA,CAAA,CAAA,EE6HI,SF7HO;EAAA,IAAA,UAAA,CAAA,CAAA,EEiIH,UFjIG,CEiIQ,CFjIR,EEiIW,KFjIX,EEiIkB,CFjIlB,CAAA;MAAW,KAAA,CAAA,CAAA,EAAA,OAAA;MAChC,IAAA,CAAA,CAAA,EAAA,MAAA;;;;AAKF;;AAAmC,cEuQtB,YFvQsB,CAAA,gBEwQjB,eFxQiB,EAAA,wBEyQT,UFzQS,CEyQE,CFzQF,CAAA,EAAA,UAAA,IAAA,EAAA,4BE2QL,gBF3QK,GAAA,CAAA,CAAA,EAAA,oBAAA,OAAA,GAAA,KAAA,CAAA,CAAA;mBAAuC,MAAA;mBAAZ,SAAA;mBAC5D,QAAA;UAA8B,OAAA;aAClB,CAAA,MAAA,EE6Qe,CF7Qf,EAAA,SAAA,EE8QkB,SF9QlB,EAAA,QAAA,CAAA,EE+QiB,QF/QjB,CE+Q0B,QF/Q1B,CE+QmC,CF/QnC,EE+QsC,SF/QtC,CAAA,EE+QkD,CF/QlD,CAAA,EAAA,OAAA,CAAA,EEgRO,YFhRP,CEgRoB,UFhRpB,CEgR+B,QFhR/B,CEgRwC,CFhRxC,EEgR2C,SFhR3C,CAAA,CAAA,EEgRwD,KFhRxD,CAAA;;;;EAIF,KAAA,CAAA,UAAY,EEmRR,UFnRQ,CEmRG,UFnRH,CEmRc,QFnRd,CEmRuB,CFnRvB,EEmR0B,SFnR1B,CAAA,CAAA,CAAA,CAAA,EEoRnB,YFpRmB,CEoRN,CFpRM,EEoRH,SFpRG,EEoRQ,CFpRR,EEoRW,aFpRX,EEoR0B,KFpR1B,CAAA;EAAA;;;EAAqC,MAAA,CAAA,GAAA,MAAA,EAAA,CAAA,CAAA,MEmStC,UFnSsC,CEmS3B,QFnS2B,CEmSlB,CFnSkB,EEmSf,SFnSe,CAAA,CAAA,GAAA,MAAA,CAAA,GAAA,GAAA,CAAA,EAAA,CAAA,EEoSxD,YFpSwD,CEoS3C,CFpS2C,EEoSxC,SFpSwC,EEoS7B,CFpS6B,EEoS1B,aFpS0B,EEoSX,KFpSW,CAAA;EAGjD;;;SAEa,CAAA,KAAA,EE2Sd,eF3Sc,CE2SE,QF3SF,CE2SW,CF3SX,EE2Sc,SF3Sd,CAAA,CAAA,EAAA,SAAA,CAAA,EAAA,KAAA,GAAA,MAAA,CAAA,EE6SpB,YF7SoB,CE6SP,CF7SO,EE6SJ,SF7SI,EE6SO,CF7SP,EE6SU,aF7SV,EE6SyB,KF7SzB,CAAA;;;;EACA,KAAA,CAAA,KAAA,EAAA,MAAA,CAAA,EEwTD,YFxTC,CEwTY,CFxTZ,EEwTe,SFxTf,EEwT0B,CFxT1B,EEwT6B,aFxT7B,EEwT4C,KFxT5C,CAAA;EAGb;;;QAEa,CAAA,KAAA,EAAA,MAAA,CAAA,EE2TA,YF3TA,CE2Ta,CF3Tb,EE2TgB,SF3ThB,EE2T2B,CF3T3B,EE2T8B,aF3T9B,EE2T6C,KF3T7C,CAAA;KAAb,CAAA,CAAA,EEgUH,YFhUG,CEgUU,CFhUV,EEgUa,SFhUb,EEgUwB,CFhUxB,EEgU2B,aFhU3B,EAAA,IAAA,CAAA;;;;;;SAEkB,CAAA,cE6UZ,kBF7UY,CE6UO,CF7UP,EE6UU,SF7UV,CAAA,CAAA,OAAA,CAAA,EAAA,YE8Ud,eF9Uc,CE8UE,CF9UF,EE8UK,SF9UL,EE8UgB,KF9UhB,CAAA,EAAA,uBE+UH,gBF/UG,GAAA,CAAA,CAAA,CAAA,CAAA,KAAA,EEiVnB,KFjVmB,EAAA,qBAAA,CAAA,EEmVtB,wBFnVsB,CEmVG,CFnVH,EEmVM,GFnVN,CAAA,IAAA,CAAA,EEmViB,cFnVjB,CAAA,GEoVtB,GFpVsB,CAAA,aAAA,CAAA,EAAA,QAAA,CAAA,EEqVf,wBFrVe,CEqVU,CFrVV,EEqVa,GFrVb,CAAA,IAAA,CAAA,EEqVwB,cFrVxB,CAAA,CAAA,EEsVzB,YFtVyB,CEuV1B,CFvV0B,EEwV1B,SFxV0B,EEyV1B,CFzV0B,EE0V1B,aF1V0B,GAAA,QE2VlB,KF3VD,GAAA;IACP,EAAA,EE2VQ,GF3VR,CAAA,IAAA,CAAA;IAE+B,WAAA,EE0Vd,GF1Vc,CAAA,aAAA,CAAA;IAAG,aAAA,EE2Vf,cF3Ve;EAAG,CAAA,IE8VrC,KF9VU,CAAA;;;;YAAqE,CAAA,CAAA,EE4bnE,YF5bmE,CE4btD,UF5bsD,CE4b3C,QF5b2C,CE4blC,CF5bkC,EE4b/B,SF5b+B,CAAA,CAAA,EE4blB,KF5bkB,CAAA;;;;;OAE1C,CAAA,CAAA,EEkc9B,UFlc8B,CEkcnB,CFlcmB,EEkchB,SFlcgB,EEkcL,QFlcK,CEkcI,CFlcJ,EEkcO,SFlcP,CAAA,EEkcmB,aFlcnB,EEkckC,KFlclC,EEkcyC,CFlczC,CAAA;;AAAM,iBE4c/B,MAAA,CF5c+B,GAAA,EAAA,MAAA,EAAA,IAAA,CAAA,EAAA,MAAA,CAAA,EAAA,MAAA;;;AACzC;;;;;;AAKuB,iBE4iBb,qBF5iBa,CAAA,eE4iBwB,YF5iBxB,EAAA,cAAA,OAAA,CAAA,CAAA,MAAA,EAAA,QAAA,GAAA,aAAA,GAAA,kBAAA,GAAA,QAAA,GAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EE+iBlB,YF/iBkB,CE+iBL,MF/iBK,EE+iBG,KF/iBH,CAAA,EAAA,MAAA,EEgjBnB,eFhjBmB,EAAA,OAAA,CAAA,EAAA,GAAA,EAAA,CAAA,EEkjB1B,SFljB0B"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/table-schema.ts","../src/types.ts","../src/query-builder.ts"],"sourcesContent":[],"mappings":";;;;;;AAGY,KAAA,SAAA,GAAS,QAAA,GAAA,QAAA,GAAA,SAAA,GAAA,MAAA,GAAA,MAAA,GAAA,YAAA;AAQrB;AAEA;;;;;AA+BiB,KAjCL,QAAA,GAiCK,MAAmB,GAAA,KAGD,GAAA,MAAA,GAAY,SAAA;AAQnC,UA1CK,YAAA,CA0CM;EAKN,SAAA,IAAA,EA9CA,SA8CoB;EAUpB,SAAA,QAAA,EAAA,OAAuB;EAAA,SAAA,QAAA,CAAA,EAAA,OAAA;WAEN,QAAA,CAAA,EAAA,OAAA;WAIE,IAAA,CAAA,EA1DlB,QA0DkB;EAAoB,SAAA,MAAA,CAAA,EAAA,OAAA;EAQ5C;EAaA,SAAA,KAAA,CAAA,EAAA,OAAgB;EAAA;;;;WACN,KAAA,CAAA,EAAA,OAAA;;;;AAMtB;;;;;;;;EAIoB,SAAA,MAAA,CAAA,EAAA,OAAA;AAgCpB;;;;AAKoC,UArGnB,mBAAA,CAqGmB;WAAf,IAAA,EAAA,MAAA;EAAM,SAAA,OAAA,EAAA;IAQV,UAAA,UAAA,EAAsB,MAAA,CAAA,EA1GJ,YA0GI;EActB,CAAA;EAAe,SAAA,UAAA,EAAA,SAAA,MAAA,EAAA;;;;;AAYX,KA5HT,WAAA,GA4HS,KAAA,GAAA,MAAA;;;;AAE+B,UAzHnC,oBAAA,CAyHmC;EAGnC,SAAA,KAAA,EAAA,MAAA;EAA2B,SAAA,KAAA,EAAA,MAAA;WAEV,WAAA,EA3HV,WA2HU;;;AAGlC;;;AACiB,UAxHA,uBAAA,CAwHA;EAAM,SAAA,MAAA,EAAA;IAGN,UAAA,SAAA,EAAA,MAAA,CAAA,EAzHiB,mBA0HjB;EASL,CAAA;EAAW,SAAA,aAAA,EAAA;IAAW,UAAA,SAAA,EAAA,MAAA,CAAA,EAAA;MAChC,UAAA,SAAA,EAAA,MAAA,CAAA,EAhIkC,oBAgIlC;IAA8B,CAAA;;;AAKhC;;;AAA0E,KA7H9D,iBAAA,GA6H8D;QAAZ,EAAA,MAAA;QAC5D,EAAA,MAAA;SAA8B,EAAA,OAAA;MAClB,EAAA,IAAA;MAA8B,EAAA,OAAA;YAAtC,EAzHQ,UAyHR;CAAO;AAIb;;;;AAA6D,KAtHjD,gBAsHiD,CAAA,UAtHtB,YAsHsB,CAAA,GAtHN,CAsHM,SAAA;EAGjD,KAAA,EAAA,IAAA;CAAa,GAxHrB,iBAwHqB,CAxHH,CAwHG,CAAA,MAAA,CAAA,CAAA,EAAA,GAvHrB,iBAuHqB,CAvHH,CAuHG,CAAA,MAAA,CAAA,CAAA;;;;AAGf,KArHE,cAqHF,CAAA,UArH2B,YAqH3B,CAAA,GArH2C,CAqH3C,SAAA;UAAc,EAAA,IAAA;CAAC,GAlHrB,gBAkHqB,CAlHJ,CAkHI,CAAA,GAAA,IAAA,GAjHrB,gBAiHqB,CAjHJ,CAiHI,CAAA;AAGzB;;;;AAKI,UAzFa,gBAAA,CAyFb;WAE+B,MAAA,EAAA;IAAG,SAAA,MAAA,EAzFjB,MAyFiB,CAAA,MAAA,EAzFF,YAyFE,CAAA;;WAAxB,MAAA,EAAA;IAAgC,SAAA,MAAA,EAtFzB,MAsFyB,CAAA,MAAA,EAtFV,YAsFU,CAAA;;;AAAqC,UA9ElE,sBAAA,CA8EkE;WAAnB,IAAA,EAAA,MAAA;WAAsB,OAAA,CAAA,EAAA,MAAA;WAEnD,iBAAA,CAAA,EAAA,SAAA,MAAA,EAAA;WAAG,cAAA,CAAA,EAAA,OAAA;;;;;AAA2C,UAlEhE,eAAA,CAkEgE;WAAG,MAAA,EAAA,SAAA;IAAnB,SAAA,IAAA,EAAA,MAAA;IAAsB,SAAA,OAAA,EA/DjE,MA+DiE,CAAA,MAAA,EA/DlD,YA+DkD,CAAA;IAHnF,SAAA,UAAA,EAAA,SAAA,MAAA,EAAA;EAAQ,CAAA,EAAA;EAMP,SAAA,aAAY,EAAA,SAAA;IAAA,SAAA,IAAA,EAAA,MAAA;IACL,SAAA,KAAA,EAAA,MAAA;IACa,SAAA,EAAA,EAAA,MAAA;IAAb,SAAA,WAAA,EA7Dc,WA6Dd;KACc;WAAG,QAAA,EA5DR,MA4DQ,CAAA,MAAA,EA5DO,2BA4DP,CAAA;WAAjB,MAAA,CAAA,EA3DQ,MA2DR,CAAA,MAAA,EA3DuB,gBA2DvB,CAAA;WACR,OAAA,CAAA,EAAA,SA3D0B,sBA2D1B,EAAA;;AAA2B,UAxDd,2BAAA,CAwDc;EAAC,SAAA,WAAA,EAAA,MAAA;EAE3B,SAAA,MAAA,EAxDc,MAwDM,CAAA,MAAA,EAxDS,0BAwDT,CAAA;;AACb,UAtDK,0BAAA,CAsDL;WACa,IAAA,EAtDR,MAsDQ,CAAA,MAAA,EAtDO,8BAsDP,CAAA;;AACC,UApDT,8BAAA,CAoDS;WAAG,IAAA,EAnDZ,SAmDY;WAAjB,QAAA,EAAA,OAAA;;;AAEqB,KA5CrB,WA4CqB,CAAA,UA5CC,eA4CD,CAAA,GA3C/B,CA2C+B,CAAA,SAAA,CAAA,SAAA,SA3CD,sBA2CC,EAAA,GA1C3B,CA0C2B,CAAA,SAAA,CAAA,CAAA,MAAA,CAAA,CAAA,MAAA,CAAA,GAAA,KAAA;;AAAkB,KAtCvC,YAsCuC,CAAA,UAtChB,eAsCgB,EAAA,UAtCW,WAsCX,CAtCuB,CAsCvB,CAAA,CAAA,GArCjD,CAqCiD,CAAA,SAAA,CAAA,SAAA,SArCnB,sBAqCmB,EAAA,GApC7C,OAoC6C,CApCrC,CAoCqC,CAAA,SAAA,CAAA,CAAA,MAAA,CAAA,EAAA;MAAG,EApCV,CAoCU;UAAG;;AAAG,KAhChD,YAgCgD,CAAA,UAhCzB,eAgCyB,CAAA,GAAA,MAhCA,CAgCA,CAAA,UAAA,CAAA,GAAA,MAAA;;AACvC,KA9BT,aA8BS,CAAA,UA7BT,eA6BS,EAAA,UA5BT,YA4BS,CA5BI,CA4BJ,CAAA,CAAA,GAAA,MA3BX,CA2BW,CAAA,UAAA,CAAA,CA3BG,CA2BH,CAAA,CAAA,QAAA,CAAA,GAAA,MAAA;;AAAM,KAxBf,YAwBe,CAAA,UAvBf,eAuBe,EAAA,UAtBf,YAsBe,CAtBF,CAsBE,CAAA,EAAA,UArBf,aAqBe,CArBD,CAqBC,EArBE,CAqBF,CAAA,CAAA,GAAA,CAAA,MApBhB,YAoBgB,CApBH,CAoBG,EApBA,CAoBA,EApBG,CAoBH,CAAA,CAAA,SAAA,CAAA,KAAA,CAAA,GAnBvB,MAmBuB,CAAA,MAAA,EAAA,KAAA,CAAA,GAlBvB,QAkBuB,CAAA,QAjBb,oBAiBN,CAjB2B,CAiB3B,EAjB8B,CAiB9B,EAjBiC,CAiBjC,CAAA,GAjBsC,iBAiBtC,CAjBwD,YAiBxD,CAjBqE,CAiBrE,EAjBwE,CAiBxE,EAjB2E,CAiB3E,CAAA,CAjB8E,CAiB9E,CAAA,CAAA,MAAA,CAAA,CAAA,EAAY,GAAA,QAfN,oBAiBW,CAjBU,CAiBV,EAjBa,CAiBb,EAjBgB,CAiBhB,CAAA,IAjBsB,iBAiBtB,CAjBwC,YAiBxC,CAjBqD,CAiBrD,EAjBwD,CAiBxD,EAjB2D,CAiB3D,CAAA,CAjB8D,CAiB9D,CAAA,CAAA,MAAA,CAAA,CAAA,EAAA,CAAA;KAdpB,YAeO,CAAA,UAdA,eAcA,EAAA,UAbA,YAaA,CAba,CAab,CAAA,EAAA,UAZA,aAYA,CAZc,CAYd,EAZiB,CAYjB,CAAA,CAAA,GAXR,CAWQ,CAAA,UAAA,CAAA,CAXM,CAWN,CAAA,CAAA,QAAA,CAAA,CAXmB,CAWnB,CAAA,CAAA,MAAA,CAAA;KATP,oBAUoB,CAAA,UATb,eASa,EAAA,UARb,YAQa,CARA,CAQA,CAAA,EAAA,UAPb,aAOa,CAPC,CAOD,EAPI,CAOJ,CAAA,CAAA,GAAA,QAAb,MALE,YAKF,CALe,CAKf,EALkB,CAKlB,EALqB,CAKrB,CAAA,GAL0B,YAK1B,CALuC,CAKvC,EAL0C,CAK1C,EAL6C,CAK7C,CAAA,CALgD,CAKhD,CAAA,CAAA,UAAA,CAAA,SAAA,IAAA,GAAA,KAAA,GALsF,CAKtF,SAJJ,YAKkB,CALL,CAKK,EALF,CAKE,EALC,CAKD,CAAA,CAAA,GAAA,MAAA;KAHrB,oBAGwB,CAAA,UAFjB,eAEiB,EAAA,UADjB,YACiB,CADJ,CACI,CAAA,EAAA,UAAjB,aAAiB,CAAH,CAAG,EAAA,CAAA,CAAA,CAAA,GAAA,QAAjB,MAEE,YAFF,CAEe,CAFf,EAEkB,CAFlB,EAEqB,CAFrB,CAAA,GAE0B,YAF1B,CAEuC,CAFvC,EAE0C,CAF1C,EAE6C,CAF7C,CAAA,CAEgD,CAFhD,CAAA,CAAA,UAAA,CAAA,SAAA,IAAA,GAE8E,CAF9E,GAAA,KAAA,SAGJ,YADmB,CACN,CADM,EACH,CADG,EACA,CADA,CAAA,CAAA,GAAA,MAAA;KAGtB,QAHyB,CAAA,CAAA,CAAA,GAAA,QAAG,MAGA,CAHA,GAGI,CAHJ,CAGM,CAHN,CAAA;;;;AAAK,KAQ1B,QAR0B,CAAA,UAQP,eARO,EAAA,aAQuB,UARvB,CAQkC,CARlC,CAAA,CAAA,GAQwC,OARxC,CASpC,CAToC,CAAA,QAAA,CAAA,CAAA,MAAA,CAAA,EAAA;MAAsB,EAUlD,IAVkD;;;;;AACpD,KAeI,UAfJ,CAAA,UAeyB,eAfzB,CAAA,GAe4C,CAf5C,CAAA,QAAA,CAAA,CAAA,MAAA,CAAA,CAAA,MAAA,CAAA;;AAAY;;AAEa,KAkBrB,eAlBqB,CAAA,UAAA;SAAI,EAkBY,MAlBZ,CAAA,MAAA,EAkB2B,YAlB3B,CAAA;WAmB7B,CAnB+B,CAAA,SAAA,CAAA,GAAA,MAAA;;AAKvC;;AAA+B,KAmBnB,UAnBmB,CAAA,UAAA;SAAyC,EAmB5B,MAnB4B,CAAA,MAAA,EAmBb,YAnBa,CAAA;aACtE,MAmBY,CAnBZ,CAAA,SAAA,CAAA,GAmB2B,cAnB3B,CAmB0C,CAnB1C,CAAA,SAAA,CAAA,CAmBuD,CAnBvD,CAAA,CAAA;;;AAOF;AAAsB,KAkBV,kBAlBU,CAAA,UAkBmB,eAlBnB,EAAA,kBAAA,MAAA,CAAA,GAkBgE,OAlBhE,CAmBpB,CAnBoB,CAAA,eAAA,CAAA,CAAA,MAAA,CAAA,EAAA;MAAW,EAoBvB,SApBuB;;;AAKjC;;AAAgE,KAqBpD,oBArBoD,CAAA,UAsBpD,eAtBoD,EAAA,kBAAA,MAAA,CAAA,GAwB5D,kBAxB4D,CAwBzC,CAxByC,EAwBtC,SAxBsC,CAAA,CAAA,OAAA,CAAA;;;;AAMpD,KAuBA,eAvBU,CAAA,UAwBV,eAxBU,EAAA,kBAAA,MAAA,EAAA,cAAA,MAAA,CAAA,GA2BlB,OA3BkB,CA2BV,OA3BU,CA2BF,CA3BE,CAAA,eAAA,CAAA,CAAA,MAAA,CAAA,EAAA;EAAA,IAAA,EA2BkC,SA3BlC;;OAAsB,EA2BmC,KA3BnC;;;;;AACD,KA+B/B,eA/B+B,CAAA,UA+BL,eA/BK,CAAA,GAAA;EAM/B,MAAA,EAAA,QA2BF,CA3BoB,CAAA,QAAA,CAAA,CAAA,MAAA,CAAA,CAAA,MAAA,CAAA,GA2BU,OA3BV,CA2BkB,CA3BlB,CAAA,QAAA,CAAA,CAAA,MAAA,CAAA,EAAA;IAAW,IAAA,EA2BoC,CA3BpC;EACvC,CAAA,CAAA;eADoF,EAAA,QA8B5E,CA9BmF,CAAA,QAAA,CAAA,CAAA,MAAA,CAAA,CAAA,MAAA,CAAA,GAAA,QA+BjF,OAvBA,CAuBQ,CAvBU,CAAA,eAAA,CAAA,CAAA,MAAA,CAAA,EAAA;IAAA,IAAA,EAuB0B,CAvB1B;EAClB,CAAA,CAAA,CAAA,OAAA,CAAA,GAsB4D,OAtB5D,CAuBJ,OAvBI,CAuBI,CAvBJ,CAAA,eAAA,CAAA,CAAA,MAAA,CAAA,EAAA;IAEW,IAAA,EAqB6B,CArB7B;EAAG,CAAA,CAAA,EAAA;IAAtB,KAAA,EAsBa,CAtBb;EAAkB,CAAA,CAAA,EAKV,EAAe;;;;KCrSf,YAAA,GAAe;KACf,aAAA,GAAgB,eAAe;ADV3C;AAQA;AAEA;AAA6B,KCKjB,YDLiB,CAAA,UAAA,MAAA,EAAA,CAAA,CAAA,GCKmB,qBDLnB,CCKyC,CDLzC,ECK4C,CDL5C,CAAA,GAAA,MAAA;AACZ,UCOA,SAAA,CDPA;OAIC,EAAA,MAAA;EAAQ,IAAA,EAAA,MAAA;EA0BT,IAAA,CAAA,ECpBR,MDoBQ,CAAA,MAAA,EAAmB,OAAA,CAAA;EAWxB;AAKZ;AAUA;;;MAMoC,CAAA,EC9C3B,SD8C2B;;AAQpC;AAaA;;;;;AACsB,UC3DL,eAAA,CD2DK;OAClB,EAAA,MAAA;MC1DE,YD0DgB,CAAA,KAAA,CAAA;EAAC,KAAA,EAAA,OAAA;EAKX,QAAA,CAAA,EAAA,MAAc;EAAA,IAAA,CAAA,EAAA,OAAA;;;AAGL,UC3DJ,OAAA,CD2DI;MC1Df,eD0DF,EAAA;;;;AAiCJ;;AAEoC,KCtFxB,SAAA,GAAY,eDsFY,GCtFM,ODsFN;;;;;AAWpC;AAcA;AAAgC,UCvGf,SAAA,CDuGe;OAGK,EAAA,MAAA;;QAOX,CAAA,EAAA,MAAA,EAAA;OAEU,CAAA,EC/G1B,SD+G0B,EAAA;SAAf,CAAA,EAAA,CAAA,KAAA,EAAA,MAAA,EAAA,SAAA,EAAA,KAAA,GAAA,MAAA,CAAA,EAAA;OACc,CAAA,EAAA,MAAA;QAAf,CAAA,EAAA,MAAA;WACU,CAAA,EC7GhB,YD6GgB,EAAA;EAAsB;AAGpD;;;;;EAKiB,GAAA,CAAA,EAAA,OAAA,EAAA;;;;;AAIjB;AAUA;;AAAkC,UCnHjB,YAAA,CDmHiB;OAChC,EAAA,MAAA;OAA8B,EAAA,MAAA;aAC1B,EAAA,KAAA,GAAA,MAAA;EAAC,eAAA,EAAA,MAAA;EAIK,MAAA,CAAA,EAAA,MAAY,EAAA;EAAA,KAAA,CAAA,ECnHd,SDmHc,EAAA;SAAW,CAAA,EAAA,CAAA,KAAA,EAAA,MAAA,EAAA,SAAA,EAAA,KAAA,GAAA,MAAA,CAAA,EAAA;OAAuC,CAAA,EAAA,MAAA;WAAZ,CAAA,EChHhD,YDgHgD,EAAA;;AAC9B,UC9Gf,YAAA,CD8Ge;;cACY,EAAA,MAAA;;EAA/B,KAAA,CAAA,EAAA,MAAA;EAID;EAAY,QAAA,CAAA,EC7GX,wBD6GW,CC7Gc,eD6Gd,EAAA,MAAA,CAAA;;aAAoC,EAAA,KAAA,GAAA,MAAA;;AAG5D;;;;;;AAGwB,UCxGP,YAAA,CDwGO;EAAC,GAAA,EAAA,GAAA,GAAA,IAAA,GAAA,GAAA,GAAA,IAAA,GAAA,GAAA,GAAA,IAAA,GAAA,CAAA,MAAA,GAAA,CAAA,CAAA,CAAA;EAGb,IAAA,EAAA,OAAA;EAAY,KAAA,CAAA,EAAA,OAAA;;;AAEZ,KCtGA,eDsGA,CAAA,CAAA,CAAA,GCtGqB,CDsGrB,GCtGyB,YDsGzB;;AACiB,KCpGjB,eDoGiB,CAAA,eCpGc,YDoGd,CAAA,GAAA,QAAjB,MCnGE,MDmGF,ICnGY,eDmGZ,CCnG4B,MDmG5B,CCnGmC,CDmGnC,CAAA,CAAA;;;;;;;;AAIE,KC7FF,UD6FE,CAAA,eC7FwB,YD6FxB,CAAA,GC7FwC,eD6FxC,CC7FwD,MD6FxD,CAAA,GAAA;KAAgC,CAAA,EC5FtC,eD4FsC,CC5FtB,MD4FsB,CAAA,EAAA;;AAAkC,UCzF/D,YDyF+D,CAAA,eCzFnC,YDyFmC,EAAA,cAAA,OAAA,CAAA,CAAA;QAAG,CAAA,EAAA,CAAA,CAAA,MCxFhE,MDwFgE,GAAA,MAAA,CAAA,GAAA,GAAA,CAAA,EAAA;OAAnB,CAAA,ECvFtD,UDuFsD,CCvF3C,MDuF2C,CAAA;OAAsB,CAAA,EAAA,MAAA;QAEnD,CAAA,EAAA,MAAA;SAAG,CAAA,ECtF1B,ODsF0B,CCtFlB,MDsFkB,CAAA,MCtFL,MDsFK,EAAA,KAAA,GAAA,MAAA,CAAA,CAAA;;SAAxB,CAAA,ECpFF,YDoFE,EAAA;OAAiC,CAAA,ECnFrC,KDmFqC;;AAAkC,KChFrE,gBDgFqE,CAAA,eChFrC,YDgFqC,CAAA,GChFrB,IDgFqB,CC/E/E,YD+E+E,CC/ElE,MD+EkE,EAAA,OAAA,CAAA,EAAA,SAAA,CAAA;AAAhB,KChErD,aDgEqD,CAAA,eChExB,YDgEwB,CAAA,GAAA,CAAA,OAAA,EC/DtD,oBD+DsD,CC/DjC,MD+DiC,CAAA,EAAA,GC9D5D,oBD8D4D,CC9DvC,MD8DuC,CAAA;AAAsB,KC3D3E,wBD2D2E,CAAA,UC1D3E,eD0D2E,EAAA,kBCzDnE,UDyDmE,CCzDxD,CDyDwD,CAAA,EAAA,sBCxD/D,MDwD+D,CAAA,MAAA,EAAA,GAAA,CAAA,GAAA,CAAA,CAAA,CAAA,GAAA,CAAA,OAAA,ECtD5E,+BDsD4E,CCtD5C,CDsD4C,ECtDzC,SDsDyC,EAAA,CAAA,CAAA,CAAA,EAAA,GCrDlF,+BDqDkF,CCrDlD,CDqDkD,ECrD/C,SDqD+C,ECrDpC,aDqDoC,CAAA;AAHnF,UC/Ca,oBD+Cb,CAAA,eC/CiD,YD+CjD,CAAA,CAAA;EAAQ,KAAA,CAAA,UAAA,EC9CQ,UD8CR,CC9CmB,MD8CnB,CAAA,CAAA,EAAA,IAAA;EAMP,MAAA,CAAA,GAAA,MAAY,EAAA,CAAA,CAAA,MCnDW,MDmDX,GAAA,MAAA,CAAA,GAAA,GAAA,CAAA,EAAA,CAAA,EAAA,IAAA;EAAA,KAAA,CAAA,KAAA,EAAA,MAAA,CAAA,EAAA,IAAA;QACL,CAAA,KAAA,EAAA,MAAA,CAAA,EAAA,IAAA;SACa,CAAA,KAAA,EAAA,MClDF,MDkDE,GAAA,MAAA,EAAA,SAAA,CAAA,EAAA,KAAA,GAAA,MAAA,CAAA,EAAA,IAAA;SAAb,CAAA,cAAA,MAAA,CAAA,CAAA,YAAA,ECjDkC,KDiDlC,EAAA,QAAA,CAAA,ECjDoD,aDiDpD,CAAA,GAAA,CAAA,CAAA,EAAA,IAAA;aACc,EAAA,ECjDT,YDiDS,CCjDI,MDiDJ,EAAA,OAAA,CAAA;;AAAd,UC7CK,+BD6CL,CAAA,UC5CA,eD4CA,EAAA,kBC3CQ,UD2CR,CC3CmB,CD2CnB,CAAA,EAAA,sBC1CY,MD0CZ,CAAA,MAAA,EAAA,GAAA,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA;OACR,CAAA,UAAA,ECzCgB,UDyChB,CCzC2B,UDyC3B,CCzCsC,QDyCtC,CCzC+C,CDyC/C,ECzCkD,SDyClD,CAAA,CAAA,CAAA,CAAA,EAAA,IAAA;QAAc,CAAA,GAAA,MAAA,EAAA,CAAA,CAAA,MCxCU,UDwCV,CCxCqB,QDwCrB,CCxC8B,CDwC9B,ECxCiC,SDwCjC,CAAA,CAAA,GAAA,MAAA,CAAA,GAAA,GAAA,CAAA,EAAA,CAAA,EAAA,IAAA;OAAa,CAAA,KAAA,EAAA,MAAA,CAAA,EAAA,IAAA;EAAC,MAAA,CAAA,KAAA,EAAA,MAAA,CAAA,EAAA,IAAA;EAE3B,OAAA,CAAA,KAAA,EAAA,MCtCY,UDsCQ,CCtCG,QDsCH,CCtCY,CDsCZ,ECtCe,SDsCf,CAAA,CAAA,GAAA,MAAA,EAAA,SAAA,CAAA,EAAA,KAAA,GAAA,MAAA,CAAA,EAAA,IAAA;EAAA,OAAA,CAAA,cClCP,kBDkCO,CClCY,CDkCZ,EClCe,SDkCf,CAAA,CAAA,OAAA,CAAA,EAAA,YCjCT,eDiCS,CCjCO,CDiCP,ECjCU,SDiCV,ECjCqB,KDiCrB,CAAA,EAAA,uBChCE,MDgCF,CAAA,MAAA,EAAA,GAAA,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA,YAAA,EC9BP,KD8BO,EAAA,QAAA,CAAA,EC7BV,wBD6BU,CC7Be,CD6Bf,EC7BkB,GD6BlB,CAAA,IAAA,CAAA,EC7B6B,cD6B7B,CAAA,CAAA,EC5BpB,+BD4BoB,CC3BrB,CD2BqB,EC1BrB,SD0BqB,ECzBrB,aDyBqB,GAAA,QCxBb,KDyBA,GAAA;IACa,EAAA,ECzBb,GDyBa,CAAA,IAAA,CAAA;IAAb,WAAA,ECxBS,GDwBT,CAAA,aAAA,CAAA;IACc,aAAA,ECxBH,cDwBG;EAAG,CAAA;aAEF,EAAA,ECtBV,YDsBU,CCtBG,UDsBH,CCtBc,QDsBd,CCtBuB,CDsBvB,ECtB0B,SDsB1B,CAAA,CAAA,EAAA,OAAA,CAAA;;;;;;AAA8B,KCf7C,kBDe6C,CAAA,eCfX,YDeW,CAAA,GAAA,QAAnB,MCdxB,MDcwB,GCdf,CDce,SAAA,IAAA,GAAA,YAAA,GAAA,YAAA,GAAA,YAAA,GAAA,KAAA,GCZhC,MDYgC,CCZzB,CDYyB,CAAA,SAAA,MAAA,GAAA,MAAA,EAAA,GAAA,IAAA,GAAA,SAAA,GCX9B,CDW8B,GAAA,KAAA,SCT9B,MDSoD,CAAA;;;;;AACpD,KCJI,6BDIJ,CAAA,eCFS,aDET,EAAA,kBAAA,MAAA,EAAA,kBAAA,MAAA,EAAA,aAAA,CAAA,GCGN,aDHM,SCGgB,MDHhB,CAAA,MAAA,ECG+B,MDH/B,CAAA,MAAA,ECG8C,sBDH9C,CAAA,CAAA,GCIF,SDJE,SAAA,MCIsB,aDJtB,GCKA,SDLA,SAAA,MCKwB,aDLxB,CCKsC,SDLtC,CAAA,GCME,aDNF,CCMgB,SDNhB,CAAA,CCM2B,SDN3B,CAAA,CAAA,OAAA,CAAA,GAAA,GAAA,GAAA,GAAA,GAAA,GAAA;;AAAY;;;AAIK,KCWb,cDXa,CAAA,kBAAA,MAAA,EAAA,kBAAA,MAAA,EAAA,aAAA,CAAA,GCYvB,aDZuB,SCYD,MDZC,CAAA,MAAA,ECYc,MDZd,CAAA,MAAA,ECY6B,sBDZ7B,CAAA,CAAA,GCanB,SDbmB,SAAA,MCaK,aDbL,GCcjB,SDdiB,SAAA,MCcO,aDdP,CCcqB,SDdrB,CAAA,GCef,aDfe,CCeD,SDfC,CAAA,CCeU,SDfV,CAAA,CAAA,aAAA,CAAA,GAAA,MAAA,GAAA,MAAA,GAAA,MAAA;;;;;AAGE,KCqBf,WDrBe,CAAA,eCsBV,aDtBU,EAAA,eCuBV,MDvBU,CAAA,MAAA,EAAA,GAAA,CAAA,EAAA,kBAAA,MAAA,EAAA,kBAAA,MAAA,EAAA,aAAA,CAAA,GC2BvB,SD3BuB,SAAA,MC2BC,MD3BD,GC4BvB,ID5BuB,CC4BlB,MD5BkB,EC4BV,SD5BU,CAAA,GAAA,QC6Bf,SD7BkB,GC6BN,cD7BM,CC6BS,SD7BT,EC6BoB,SD7BpB,EC6B+B,aD7B/B,CAAA,SAAA,KAAA,GC8BpB,6BD9BoB,CC8BU,MD9BV,EC8BkB,SD9BlB,EC8B6B,CD9B7B,EC8BgC,aD9BhC,CAAA,GAAA,IAAA,GC+BpB,6BD/BoB,CC+BU,MD/BV,EC+BkB,SD/BlB,EC+B6B,CD/B7B,EC+BgC,aD/BhC,CAAA,EAAA,GAAA,IAAA,KCiC1B,MDjC6B;;;;;AAAK,KCuC1B,qBDvC0B,CAAA,kBAAA,MAAA,EAAA,aAAA,CAAA,GCwCpC,aDxCoC,SCwCd,MDxCc,CAAA,MAAA,ECwCC,MDxCD,CAAA,MAAA,EAAA,GAAA,CAAA,CAAA,GCyChC,SDzCgC,SAAA,MCyCR,aDzCQ,GAAA,MC0CxB,aD1CwB,CC0CV,SD1CU,CAAA,GAAA,MAAA,GAAA,KAAA,GAAA,KAAA;;;;;;;;AAClB;;;AAEiB,UCqDpB,sBDrDoB,CAAA,QAAA,GAAA,CAAA,CAAA;;EAAG,KAAA,ECuD/B,KDvD+B;EAK5B;EAAQ,KAAA,EAAA,MAAA;;aAAoD,EAAA,KAAA,GAAA,MAAA;;AACtE,KCwDU,qBAAA,GAAwB,MDxDlC,CAAA,MAAA,ECwDiD,MDxDjD,CAAA,MAAA,ECwDgE,sBDxDhE,CAAA,CAAA;;;;KE9HU;EFvIA,OAAA,EEuI8B,MFvIrB,CAAA,MAAA,EEuIoC,YFvIpC,CAAA;AAQrB,CAAA,EAAA,IAAY,IAAA,CAAA,GAAQ,CAAA,KAAA,EEgIX,UFhIW,CEgIA,CFhIA,EAAA,OAAA,CAAA,EAAA,GEiIf,CFjIe;AAEH,cEiIJ,UFjIgB,CAAA,UAAA;EAAA,OAAA,EEkIN,MFlIM,CAAA,MAAA,EEkIS,YFlIT,CAAA;iBACZ,OAAA,EAAA,IAAA,IAAA,CAAA,CAAA;mBAIC,UAAA;EAAQ,iBAAA,OAAA;EA0BT,iBAAA,MAAmB;EAWxB,iBAAW,QAAA;EAKN,QAAA,KAAA;EAUA,QAAA,UAAA;EAAuB,QAAA,YAAA;UAEN,gBAAA;UAIE,WAAA;EAAoB,WAAA,CAAA,UAAA,EAAA,MAAA,EAAA,OAAA,EE+E1B,YF/E0B,CE+Eb,UF/Ea,CE+EF,CF/EE,CAAA,EE+EE,KF/EF,CAAA,EAAA,MAAA,EEgF3B,eFhF2B,EAAA,QAAA,EEiFzB,QFjFyB,CAAA,GAAA,EEiFX,CFjFW,CAAA;EAQ5C,IAAA,SAAA,CAAA,CAAA,EEqGO,SFrGU;EAajB,IAAA,UAAA,CAAA,CAAA,EE4FQ,UF5FQ,CAAA;IAAA,OAAA,EE4Fc,MF5Fd,CAAA,MAAA,EE4F6B,YF5F7B,CAAA;KAAW,OAAA,CAAA,EAAA;MAAgB,WAAA,CAAA,CAAA,EEgGlC,SFhGkC;MACnD,eAAA,CAAA,CAAA,EEmGqB,SFnGrB;MAAkB,SAAA,CAAA,CAAA,EAAA,MAAA;MAClB,IAAA,CAAA,CAAA,EAAA,MAAA;MAAkB,KAAA,CAAA,CAAA,EAAA,OAAA;EAAC,GAAA,CAAA,CAAA,EEkHP,CFlHO;EAKX,gBAAA,CAAc,OAAA,EAAA,GAAA,EAAA,CAAA,EEiHiB,SFjHjB;EAAA,gBAAA,CAAA,CAAA,EEqHG,SFrHH;YAAW,CAAA,CAAA,EEyHd,YFzHc,CEyHD,UFzHC,CEyHU,CFzHV,CAAA,EEyHc,KFzHd,CAAA;;;;;AAIjC,KEmIQ,iBFnIR,CAAA,sBEmIgD,gBFnIhD,CAAA,GAAA,MEmI0E,aFnI1E;AAAgB,KEqIR,oBAAA,GFrIQ;EAgCH,EAAA,EAAA,MAAA;EAAgB,WAAA,EAAA,KAAA,GAAA,MAAA;eAEG,EEsGnB,gBFtGmB;;AAGA,KEsGxB,gBAAA,GAAmB,MFtGK,CAAA,MAAA,EEsGU,oBFtGV,CAAA;;;AAQpC;AAciB,KEqFL,kBFrFoB,CAAA,UEsFpB,eFtFoB,EAAA,sBEuFR,gBFvFQ,CAAA,GAAA,QAAA,MEyFlB,aFzFkB,GEyFF,WFzFE,CE0F5B,CF1F4B,EE2F5B,aF3F4B,CE2Fd,CF3Fc,CAAA,CAAA,IAAA,CAAA,EE4F5B,aF5F4B,CE4Fd,CF5Fc,CAAA,CAAA,eAAA,CAAA,EE6F5B,aF7F4B,CE6Fd,CF7Fc,CAAA,CAAA,aAAA,CAAA,SAAA,KAAA,GAAA,IAAA,GAAA,KAAA,CAAA;AAGV,KE8FV,mBF9FU,CAAA,UE+FV,eF/FU,EAAA,kBEgGF,UFhGE,CEgGS,CFhGT,CAAA,EAAA,sBEiGE,gBFjGF,CAAA,GEkGlB,IFlGkB,CEkGb,UFlGa,CEkGF,QFlGE,CEkGO,CFlGP,EEkGU,SFlGV,CAAA,CAAA,EEkGuB,iBFlGvB,CEkGyC,aFlGzC,CAAA,CAAA,GEmGpB,kBFnGoB,CEmGD,CFnGC,EEmGE,aFnGF,CAAA;AAOI,KE8Fd,oBF9Fc,CAAA,UE+Fd,eF/Fc,EAAA,kBEgGN,UFhGM,CEgGK,CFhGL,CAAA,EAAA,sBEiGF,gBFjGE,CAAA,GAAA,CEkGrB,IFlGqB,CEkGhB,UFlGgB,CEkGL,QFlGK,CEkGI,CFlGJ,EEkGO,SFlGP,CAAA,CAAA,EEkGoB,iBFlGpB,CEkGsC,aFlGtC,CAAA,CAAA,GEmGxB,kBFnGwB,CEmGL,CFnGK,EEmGF,aFnGE,CAAA,CAAA,EAAA;;;;;AAII,KEqGlB,WFrGkB,CAAA,UEsGlB,eFtGkB,EAAA,kBEuGV,UFvGU,CEuGC,CFvGD,CAAA,EAAA,sBEwGN,gBFxGM,EAAA,cAAA,OAAA,CAAA,GE0G1B,KF1G0B,SAAA,IAAA,GE2G1B,mBF3G0B,CE2GN,CF3GM,EE2GH,SF3GG,EE2GQ,aF3GR,CAAA,GE4G1B,oBF5G0B,CE4GL,CF5GK,EE4GF,SF5GE,EE4GS,aF5GT,CAAA;AAAsB,cE8GvC,UF9GuC,CAAA,UE+GxC,eF/GwC,EAAA,kBEgHhC,UFhHgC,CEgHrB,CFhHqB,CAAA,EAAA,UAAA;EAGnC,OAAA,EE8GM,MF9GN,CAAA,MAAA,EE8GqB,YF9GM,CAAA;CAAA,EAAA,sBEgHpB,gBFhHoB,EAAA,cAAA,OAAA,EAAA,IAAA,IAAA,CAAA,CAAA;mBAEV,SAAA;mBAAf,OAAA;EAAM,iBAAA,MAAA;EAGR,iBAAA,QAAA;EAA0B,QAAA,WAAA;aACX,CAAA,SAAA,EEiHA,SFjHA,EAAA,OAAA,EEkHF,YFlHE,CEkHW,UFlHX,CEkHsB,CFlHtB,CAAA,EEkH0B,KFlH1B,CAAA,EAAA,MAAA,EEmHH,CFnHG,EAAA,QAAA,EEoHD,QFpHC,CEoHQ,CFpHR,EEoHW,CFpHX,CAAA;KAAf,CAAA,CAAA,EE8HR,CF9HQ;EAAM,gBAAA,CAAA,OAAA,EAAA,GAAA,EAAA,CAAA,EEkIa,SFlIb;EAGN,gBAAA,CAAA,CAAA,EEmIK,SFnIL;EAUL,UAAA,CAAA,CAAA,EE6HI,SF7HO;EAAA,IAAA,UAAA,CAAA,CAAA,EEiIH,UFjIG,CEiIQ,CFjIR,EEiIW,KFjIX,EEiIkB,CFjIlB,CAAA;MAAW,KAAA,CAAA,CAAA,EAAA,OAAA;MAChC,IAAA,CAAA,CAAA,EAAA,MAAA;;;;AAKF;;AAAmC,cEuQtB,YFvQsB,CAAA,gBEwQjB,eFxQiB,EAAA,wBEyQT,UFzQS,CEyQE,CFzQF,CAAA,EAAA,UAAA,IAAA,EAAA,4BE2QL,gBF3QK,GAAA,CAAA,CAAA,EAAA,oBAAA,OAAA,GAAA,KAAA,CAAA,CAAA;mBAAuC,MAAA;mBAAZ,SAAA;mBAC5D,QAAA;UAA8B,OAAA;aAClB,CAAA,MAAA,EE6Qe,CF7Qf,EAAA,SAAA,EE8QkB,SF9QlB,EAAA,QAAA,CAAA,EE+QiB,QF/QjB,CE+Q0B,QF/Q1B,CE+QmC,CF/QnC,EE+QsC,SF/QtC,CAAA,EE+QkD,CF/QlD,CAAA,EAAA,OAAA,CAAA,EEgRO,YFhRP,CEgRoB,UFhRpB,CEgR+B,QFhR/B,CEgRwC,CFhRxC,EEgR2C,SFhR3C,CAAA,CAAA,EEgRwD,KFhRxD,CAAA;;;;EAIF,KAAA,CAAA,UAAY,EEmRR,UFnRQ,CEmRG,UFnRH,CEmRc,QFnRd,CEmRuB,CFnRvB,EEmR0B,SFnR1B,CAAA,CAAA,CAAA,CAAA,EEoRnB,YFpRmB,CEoRN,CFpRM,EEoRH,SFpRG,EEoRQ,CFpRR,EEoRW,aFpRX,EEoR0B,KFpR1B,CAAA;EAAA;;;EAAqC,MAAA,CAAA,GAAA,MAAA,EAAA,CAAA,CAAA,MEmStC,UFnSsC,CEmS3B,QFnS2B,CEmSlB,CFnSkB,EEmSf,SFnSe,CAAA,CAAA,GAAA,MAAA,CAAA,GAAA,GAAA,CAAA,EAAA,CAAA,EEoSxD,YFpSwD,CEoS3C,CFpS2C,EEoSxC,SFpSwC,EEoS7B,CFpS6B,EEoS1B,aFpS0B,EEoSX,KFpSW,CAAA;EAGjD;;;SAEa,CAAA,KAAA,EE2Sd,eF3Sc,CE2SE,QF3SF,CE2SW,CF3SX,EE2Sc,SF3Sd,CAAA,CAAA,EAAA,SAAA,CAAA,EAAA,KAAA,GAAA,MAAA,CAAA,EE6SpB,YF7SoB,CE6SP,CF7SO,EE6SJ,SF7SI,EE6SO,CF7SP,EE6SU,aF7SV,EE6SyB,KF7SzB,CAAA;;;;EACA,KAAA,CAAA,KAAA,EAAA,MAAA,CAAA,EEwTD,YFxTC,CEwTY,CFxTZ,EEwTe,SFxTf,EEwT0B,CFxT1B,EEwT6B,aFxT7B,EEwT4C,KFxT5C,CAAA;EAGb;;;QAEa,CAAA,KAAA,EAAA,MAAA,CAAA,EE2TA,YF3TA,CE2Ta,CF3Tb,EE2TgB,SF3ThB,EE2T2B,CF3T3B,EE2T8B,aF3T9B,EE2T6C,KF3T7C,CAAA;KAAb,CAAA,CAAA,EEgUH,YFhUG,CEgUU,CFhUV,EEgUa,SFhUb,EEgUwB,CFhUxB,EEgU2B,aFhU3B,EAAA,IAAA,CAAA;;;;;;SAEkB,CAAA,cE6UZ,kBF7UY,CE6UO,CF7UP,EE6UU,SF7UV,CAAA,CAAA,OAAA,CAAA,EAAA,YE8Ud,eF9Uc,CE8UE,CF9UF,EE8UK,SF9UL,EE8UgB,KF9UhB,CAAA,EAAA,uBE+UH,gBF/UG,GAAA,CAAA,CAAA,CAAA,CAAA,KAAA,EEiVnB,KFjVmB,EAAA,qBAAA,CAAA,EEmVtB,wBFnVsB,CEmVG,CFnVH,EEmVM,GFnVN,CAAA,IAAA,CAAA,EEmViB,cFnVjB,CAAA,GEoVtB,GFpVsB,CAAA,aAAA,CAAA,EAAA,QAAA,CAAA,EEqVf,wBFrVe,CEqVU,CFrVV,EEqVa,GFrVb,CAAA,IAAA,CAAA,EEqVwB,cFrVxB,CAAA,CAAA,EEsVzB,YFtVyB,CEuV1B,CFvV0B,EEwV1B,SFxV0B,EEyV1B,CFzV0B,EE0V1B,aF1V0B,GAAA,QE2VlB,KF3VD,GAAA;IACP,EAAA,EE2VQ,GF3VR,CAAA,IAAA,CAAA;IAE+B,WAAA,EE0Vd,GF1Vc,CAAA,aAAA,CAAA;IAAG,aAAA,EE2Vf,cF3Ve;EAAG,CAAA,IE8VrC,KF9VU,CAAA;;;;YAAqE,CAAA,CAAA,EE4bnE,YF5bmE,CE4btD,UF5bsD,CE4b3C,QF5b2C,CE4blC,CF5bkC,EE4b/B,SF5b+B,CAAA,CAAA,EE4blB,KF5bkB,CAAA;;;;;OAE1C,CAAA,CAAA,EEkc9B,UFlc8B,CEkcnB,CFlcmB,EEkchB,SFlcgB,EEkcL,QFlcK,CEkcI,CFlcJ,EEkcO,SFlcP,CAAA,EEkcmB,aFlcnB,EEkckC,KFlclC,EEkcyC,CFlczC,CAAA;;;;;;;;;;AAGpC,iBEidW,WAAA,CFjdC,KAAA,EAAA,MAAA,EAAA,KAAA,EAAA,MAAA,CAAA,EAAA,MAAA;;;;;;AAGY,iBEudb,gBAAA,CFvda,IAAA,EAAA,MAAA,CAAA,EAAA,MAAA;AAAjB,iBE4dI,MAAA,CF5dJ,GAAA,EAAA,MAAA,EAAA,IAAA,CAAA,EAAA,MAAA,CAAA,EAAA,MAAA;;;;;;;;;AAQkB,iBE0jBd,qBF1jBc,CAAA,eE0jBuB,YF1jBvB,EAAA,cAAA,OAAA,CAAA,CAAA,MAAA,EAAA,QAAA,GAAA,aAAA,GAAA,kBAAA,GAAA,QAAA,GAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,OAAA,EE6jBnB,YF7jBmB,CE6jBN,MF7jBM,EE6jBE,KF7jBF,CAAA,EAAA,MAAA,EE8jBpB,eF9jBoB,EAAA,OAAA,CAAA,EAAA,GAAA,EAAA,CAAA,EEgkB3B,SFhkB2B"}
|
package/dist/index.js
CHANGED
|
@@ -327,6 +327,26 @@ var QueryBuilder = class QueryBuilder {
|
|
|
327
327
|
return new FinalQuery(this.tableName, this.options, this.schema, this.executer);
|
|
328
328
|
}
|
|
329
329
|
};
|
|
330
|
+
/**
|
|
331
|
+
* The surql param name an `_or` branch condition binds under: the branch FIELD,
|
|
332
|
+
* a `__or` marker and the branch's position. The position alone makes it unique
|
|
333
|
+
* within the query; the field prefix is what lets a consumer type the value by
|
|
334
|
+
* looking the column up (see {@link baseFieldOfParam}). Non-identifier
|
|
335
|
+
* characters (a nested path like `database.owner`) are folded to `_` so the
|
|
336
|
+
* result is a legal param name.
|
|
337
|
+
*/
|
|
338
|
+
function orParamName(field, index) {
|
|
339
|
+
return `${field.replace(/[^A-Za-z0-9_]/g, "_")}__or${index}`;
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Inverse of {@link orParamName}: the field a param name was built from, or the
|
|
343
|
+
* name itself when it is a plain top-level param (`field = $field`). Lets a
|
|
344
|
+
* consumer resolve `white__or0` back to the `white` column.
|
|
345
|
+
*/
|
|
346
|
+
function baseFieldOfParam(name) {
|
|
347
|
+
const m = /^(.+)__or\d+$/.exec(name);
|
|
348
|
+
return m ? m[1] : name;
|
|
349
|
+
}
|
|
330
350
|
function cyrb53(str, seed = 0) {
|
|
331
351
|
let h1 = 3735928559 ^ seed, h2 = 1103547991 ^ seed;
|
|
332
352
|
for (let i = 0, ch; i < str.length; i++) {
|
|
@@ -413,7 +433,7 @@ function buildQueryFromOptions(method, tableName, options, schema, patches) {
|
|
|
413
433
|
if (key === "_or" && Array.isArray(value)) {
|
|
414
434
|
const orParts = [];
|
|
415
435
|
let i = 0;
|
|
416
|
-
for (const branch of value) if (branch && typeof branch === "object") for (const [bField, bVal] of Object.entries(branch)) orParts.push(buildCondition(bField, bVal,
|
|
436
|
+
for (const branch of value) if (branch && typeof branch === "object") for (const [bField, bVal] of Object.entries(branch)) orParts.push(buildCondition(bField, bVal, orParamName(bField, i++)));
|
|
417
437
|
if (orParts.length > 0) conditions.push(`(${orParts.join(" OR ")})`);
|
|
418
438
|
continue;
|
|
419
439
|
}
|
|
@@ -513,10 +533,9 @@ function buildRelationPlan(rel, schema) {
|
|
|
513
533
|
* baked `value` when the param is absent), so a query's rows are slaved to
|
|
514
534
|
* its `params` (its identity) and can never come from a different query's
|
|
515
535
|
* baked plan. Only safe at the TOP LEVEL, where the field is a schema column
|
|
516
|
-
* that survives `
|
|
517
|
-
* relation sub-wheres (rendered with a params-less ctx) or `_or` branches
|
|
518
|
-
* (bound under synthetic `
|
|
519
|
-
* stay baked.
|
|
536
|
+
* that survives `parseQueryParams` and the caller passes `params`. NOT used
|
|
537
|
+
* for relation sub-wheres (rendered with a params-less ctx) or `_or` branches
|
|
538
|
+
* (bound under synthetic `white__or0` names) - those stay baked.
|
|
520
539
|
*/
|
|
521
540
|
function buildWhereNodes(parsedWhere, slaveToParams = false) {
|
|
522
541
|
const toComparison = (field, value, slave) => {
|
|
@@ -629,6 +648,8 @@ Object.defineProperty(exports, 'RecordId', {
|
|
|
629
648
|
return surrealdb.RecordId;
|
|
630
649
|
}
|
|
631
650
|
});
|
|
651
|
+
exports.baseFieldOfParam = baseFieldOfParam;
|
|
632
652
|
exports.buildQueryFromOptions = buildQueryFromOptions;
|
|
633
653
|
exports.cyrb53 = cyrb53;
|
|
654
|
+
exports.orParamName = orParamName;
|
|
634
655
|
//# sourceMappingURL=index.js.map
|
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 WhereInput,\n QueryPlan,\n RelationPlan,\n WhereNode,\n WhereComparison,\n ComparisonOp,\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 * Reject a query clause that references an `-- @opaque` column.\n *\n * An `@opaque` value is synced down to the client but never held server-side, so\n * the SSP has nothing to evaluate a predicate against. Left unchecked, the\n * failure is silent and asymmetric: the local cache DOES hold the value, so the\n * clause filters correctly on screen while the server-side membership set it is\n * compared against was computed without it. The result reads as rows randomly\n * appearing and vanishing rather than as an error, so fail loudly at the call\n * site instead.\n *\n * `clause` names the offending API ('where', 'orderBy', …) for the message.\n */\nfunction assertNotOpaque(\n schema: SchemaStructure,\n tableName: string,\n clause: string,\n fields: readonly string[]\n): void {\n const table = schema.tables.find((t) => t.name === tableName);\n if (!table) return;\n for (const field of fields) {\n // A nested path (`meta.secret`) is checked against its root, since the column\n // flag lives on `meta`. Comparison operators use `{ field: { _op, _val } }`\n // rather than a name suffix, so the key is always the bare column name.\n const column: ColumnSchema | undefined =\n table.columns[field] ?? table.columns[field.split('.')[0]];\n if (column?.opaque) {\n throw new Error(\n `Cannot use '${field}' in ${clause}(): it is marked '-- @opaque' on ` +\n `${tableName}, so the sync engine never stores its value and cannot ` +\n `evaluate it. Read the field from query results instead, or remove ` +\n `'-- @opaque' from the schema if you need to query on it.`\n );\n }\n }\n}\n\n/** Every column name a `where` clause touches, including `_or` branches. */\nfunction whereFieldNames(conditions: Record<string, unknown>): string[] {\n const out: string[] = [];\n for (const [key, value] of Object.entries(conditions)) {\n if (key === '_or') {\n for (const branch of (value ?? []) as Record<string, unknown>[]) {\n out.push(...whereFieldNames(branch ?? {}));\n }\n continue;\n }\n out.push(key);\n }\n return out;\n}\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 assertNotOpaque(\n this.schema,\n this.tableName,\n 'where',\n whereFieldNames(conditions as Record<string, unknown>)\n );\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 assertNotOpaque(this.schema, this.tableName, 'orderBy', [field]);\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 // No such relationship in the client schema — e.g. a table owned by a\n // devOnly backend (the outbox `job`) that a free/Cloudflare deployment\n // never provisions, so codegen omits it + its relationships. Skip the\n // projection instead of throwing, which would take the whole query\n // (and its other `.related()` siblings — author, comments) down.\n // Mirrors the server's \"unpermitted subquery → empty\" degradation.\n if (typeof console !== 'undefined') {\n console.warn(\n `[sp00ky] .related('${String(relatedField)}') skipped — no such relationship on '${this.tableName}' in the client schema`\n );\n }\n return this as any;\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 assertNotOpaque(\n this.schema,\n this.tableName,\n 'where',\n whereFieldNames(conditions as Record<string, unknown>)\n );\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 assertNotOpaque(this.schema, this.tableName, 'orderBy', [field as string]);\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 // See the note on the other `.related()` overload: skip an unknown\n // relationship (warn) rather than throwing, so a table absent from the\n // client schema (e.g. the free-plan `job` outbox) can't crash the query.\n if (typeof console !== 'undefined') {\n console.warn(\n `[sp00ky] .related('${String(field)}') skipped — no such relationship on '${this.tableName}' in the client schema`\n );\n }\n return this as any;\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 // Engine-neutral plan mirrors the SELECT above for non-SurrealQL backends.\n // Only SELECT carries a plan; the isOne→limit=1 mutation above is already\n // reflected in `options.limit`, so the plan sees it too.\n plan: method === 'SELECT' ? buildQueryPlan(tableName, options, schema) : undefined,\n };\n}\n\n/**\n * Build the engine-neutral {@link QueryPlan} for a SELECT. Mirrors the string\n * assembly in {@link buildQueryFromOptions} / {@link buildSubquery} exactly so a\n * non-SurrealQL backend produces results identical to the SurrealQL path.\n */\nfunction buildQueryPlan<TModel extends GenericModel, IsOne extends boolean>(\n tableName: string,\n options: QueryOptions<TModel, IsOne>,\n schema: SchemaStructure\n): QueryPlan {\n const plan: QueryPlan = { table: tableName };\n\n if (options.select && options.select.length > 0 && !options.select.includes('*')) {\n plan.select = options.select.filter((f) => f !== '*') as string[];\n }\n\n const parsedWhere = options.where\n ? (parseObjectIdsToRecordId(options.where, tableName) as Record<string, unknown>)\n : undefined;\n if (parsedWhere && Object.keys(parsedWhere).length > 0) {\n // slaveToParams: top-level filters materialize from `params` (the query's\n // identity), not a baked literal — see buildWhereNodes. Prevents a query's\n // rows ever coming from a different query's plan.\n const nodes = buildWhereNodes(parsedWhere, true);\n if (nodes.length > 0) plan.where = nodes;\n }\n\n if (options.orderBy && Object.keys(options.orderBy).length > 0) {\n plan.orderBy = Object.entries(options.orderBy).map(\n ([field, direction]) => [field, direction as 'asc' | 'desc']\n );\n }\n\n if (options.limit !== undefined) plan.limit = options.limit;\n if (options.offset !== undefined) plan.offset = options.offset;\n\n if (options.related && options.related.length > 0) {\n plan.relations = options.related.map((rel) => buildRelationPlan(rel, schema));\n }\n\n return plan;\n}\n\n/**\n * Engine-neutral counterpart of {@link buildSubquery}. Resolves the same\n * cardinality / foreign-key / nested-relation metadata but returns a structured\n * {@link RelationPlan} instead of a SurrealQL subquery string.\n */\nfunction buildRelationPlan(\n rel: RelatedQuery & { foreignKeyField?: string },\n schema: SchemaStructure\n): RelationPlan {\n const { relatedTable, alias, modifier, cardinality } = rel;\n // Same fallback chain as buildSubquery (`rel.foreignKeyField || alias`); the\n // top-level foreignKeyField is already reverse-resolved by `.related()`.\n const foreignKeyField = (rel.foreignKeyField || alias || relatedTable) as string;\n\n const plan: RelationPlan = {\n alias: (alias || relatedTable) as string,\n table: relatedTable,\n cardinality,\n foreignKeyField,\n };\n\n if (modifier) {\n const modifierBuilder = new SchemaAwareQueryModifierBuilderImpl(relatedTable, schema);\n modifier(modifierBuilder as any);\n const subOptions = modifierBuilder._getOptions();\n\n if (subOptions.select && subOptions.select.length > 0 && !subOptions.select.includes('*')) {\n plan.select = subOptions.select.filter((f) => f !== '*') as string[];\n }\n\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 nodes = buildWhereNodes(parsedSubWhere);\n if (nodes.length > 0) plan.where = nodes;\n }\n\n if (subOptions.orderBy && Object.keys(subOptions.orderBy).length > 0) {\n plan.orderBy = Object.entries(subOptions.orderBy).map(\n ([field, direction]) => [field, direction as 'asc' | 'desc']\n );\n }\n\n if (subOptions.limit !== undefined) plan.limit = subOptions.limit;\n\n // Nested relations: re-resolve exactly as buildSubquery does — the child's\n // foreignKeyField comes from the relatedTable-based lookup, not the reverse\n // heuristic used for top-level relations.\n if (subOptions.related && subOptions.related.length > 0) {\n const resolvedNestedRels = subOptions.related.map((nestedRel) => {\n const relationship = schema.relationships.find(\n (r) => r.from === relatedTable && r.field === nestedRel.alias\n );\n if (relationship) {\n const nestedForeignKeyField =\n relationship.cardinality === 'many' ? relatedTable : (nestedRel.alias as string);\n return {\n ...nestedRel,\n relatedTable: relationship.to,\n cardinality: relationship.cardinality,\n foreignKeyField: nestedForeignKeyField,\n } as RelatedQuery & { foreignKeyField: string };\n }\n return nestedRel;\n });\n plan.relations = resolvedNestedRels.map((nestedRel) => buildRelationPlan(nestedRel, schema));\n }\n }\n\n // one-to-one gets an implicit per-parent LIMIT 1 (matches buildSubquery).\n if (cardinality === 'one' && plan.limit === undefined) {\n plan.limit = 1;\n }\n\n return plan;\n}\n\n/**\n * Convert a parsed WHERE object (string IDs already → RecordId) into the\n * engine-neutral {@link WhereNode}[] conjunction. Mirrors the `_or` / comparison\n * / equality handling in {@link buildQueryFromOptions}. A `$`-prefixed `_val`\n * becomes a `paramRef` (with the leading `$` stripped).\n */\n/**\n * @param slaveToParams When true, top-level plain/operator-literal comparisons\n * ALSO carry a `paramRef` equal to the field name — the same var name\n * `buildQueryFromOptions` binds the value under (`field = $field`). The\n * engines then materialize by reading `params[field]` (falling back to the\n * baked `value` when the param is absent), so a query's rows are slaved to\n * its `params` (its identity) and can never come from a different query's\n * baked plan. Only safe at the TOP LEVEL, where the field is a schema column\n * that survives `parseParams` and the caller passes `params`. NOT used for\n * relation sub-wheres (rendered with a params-less ctx) or `_or` branches\n * (bound under synthetic `or0…` names that `parseParams` strips) — those\n * stay baked.\n */\nfunction buildWhereNodes(\n parsedWhere: Record<string, unknown>,\n slaveToParams = false\n): WhereNode[] {\n const toComparison = (field: string, value: unknown, slave: boolean): WhereComparison => {\n if (value && typeof value === 'object' && '_op' in value && '_val' in value) {\n const { _op, _val, _swap } = value as ComparisonOp;\n if (typeof _val === 'string' && _val.startsWith('$')) {\n return { field, op: _op, value: undefined, paramRef: _val.slice(1), swap: _swap };\n }\n // Literal operand: keep `value` as a fallback and add `paramRef: field`\n // (slave mode) so materialization reads the query's own `params[field]`.\n return slave\n ? { field, op: _op, value: _val, paramRef: field, swap: _swap }\n : { field, op: _op, value: _val, swap: _swap };\n }\n return slave ? { field, op: '=', value, paramRef: field } : { field, op: '=', value };\n };\n\n const nodes: WhereNode[] = [];\n for (const [key, value] of Object.entries(parsedWhere)) {\n if (key === '_or' && Array.isArray(value)) {\n const or: WhereComparison[] = [];\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 // OR branches bind under synthetic `or0…` names (see\n // buildQueryFromOptions) that parseParams strips — keep them baked.\n or.push(toComparison(bField, bVal, false));\n }\n }\n }\n if (or.length > 0) nodes.push({ or });\n continue;\n }\n nodes.push(toComparison(key, value, slaveToParams));\n }\n return nodes;\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 QueryPlan,\n RelationPlan,\n WhereNode,\n WhereComparison,\n ComparisonOp,\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 * Reject a query clause that references an `-- @opaque` column.\n *\n * An `@opaque` value is synced down to the client but never held server-side, so\n * the SSP has nothing to evaluate a predicate against. Left unchecked, the\n * failure is silent and asymmetric: the local cache DOES hold the value, so the\n * clause filters correctly on screen while the server-side membership set it is\n * compared against was computed without it. The result reads as rows randomly\n * appearing and vanishing rather than as an error, so fail loudly at the call\n * site instead.\n *\n * `clause` names the offending API ('where', 'orderBy', …) for the message.\n */\nfunction assertNotOpaque(\n schema: SchemaStructure,\n tableName: string,\n clause: string,\n fields: readonly string[]\n): void {\n const table = schema.tables.find((t) => t.name === tableName);\n if (!table) return;\n for (const field of fields) {\n // A nested path (`meta.secret`) is checked against its root, since the column\n // flag lives on `meta`. Comparison operators use `{ field: { _op, _val } }`\n // rather than a name suffix, so the key is always the bare column name.\n const column: ColumnSchema | undefined =\n table.columns[field] ?? table.columns[field.split('.')[0]];\n if (column?.opaque) {\n throw new Error(\n `Cannot use '${field}' in ${clause}(): it is marked '-- @opaque' on ` +\n `${tableName}, so the sync engine never stores its value and cannot ` +\n `evaluate it. Read the field from query results instead, or remove ` +\n `'-- @opaque' from the schema if you need to query on it.`\n );\n }\n }\n}\n\n/** Every column name a `where` clause touches, including `_or` branches. */\nfunction whereFieldNames(conditions: Record<string, unknown>): string[] {\n const out: string[] = [];\n for (const [key, value] of Object.entries(conditions)) {\n if (key === '_or') {\n for (const branch of (value ?? []) as Record<string, unknown>[]) {\n out.push(...whereFieldNames(branch ?? {}));\n }\n continue;\n }\n out.push(key);\n }\n return out;\n}\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 assertNotOpaque(\n this.schema,\n this.tableName,\n 'where',\n whereFieldNames(conditions as Record<string, unknown>)\n );\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 assertNotOpaque(this.schema, this.tableName, 'orderBy', [field]);\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 // No such relationship in the client schema — e.g. a table owned by a\n // devOnly backend (the outbox `job`) that a free/Cloudflare deployment\n // never provisions, so codegen omits it + its relationships. Skip the\n // projection instead of throwing, which would take the whole query\n // (and its other `.related()` siblings — author, comments) down.\n // Mirrors the server's \"unpermitted subquery → empty\" degradation.\n if (typeof console !== 'undefined') {\n console.warn(\n `[sp00ky] .related('${String(relatedField)}') skipped — no such relationship on '${this.tableName}' in the client schema`\n );\n }\n return this as any;\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 assertNotOpaque(\n this.schema,\n this.tableName,\n 'where',\n whereFieldNames(conditions as Record<string, unknown>)\n );\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 assertNotOpaque(this.schema, this.tableName, 'orderBy', [field as string]);\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 // See the note on the other `.related()` overload: skip an unknown\n // relationship (warn) rather than throwing, so a table absent from the\n // client schema (e.g. the free-plan `job` outbox) can't crash the query.\n if (typeof console !== 'undefined') {\n console.warn(\n `[sp00ky] .related('${String(field)}') skipped — no such relationship on '${this.tableName}' in the client schema`\n );\n }\n return this as any;\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\n/**\n * The surql param name an `_or` branch condition binds under: the branch FIELD,\n * a `__or` marker and the branch's position. The position alone makes it unique\n * within the query; the field prefix is what lets a consumer type the value by\n * looking the column up (see {@link baseFieldOfParam}). Non-identifier\n * characters (a nested path like `database.owner`) are folded to `_` so the\n * result is a legal param name.\n */\nexport function orParamName(field: string, index: number): string {\n return `${field.replace(/[^A-Za-z0-9_]/g, '_')}__or${index}`;\n}\n\n/**\n * Inverse of {@link orParamName}: the field a param name was built from, or the\n * name itself when it is a plain top-level param (`field = $field`). Lets a\n * consumer resolve `white__or0` back to the `white` column.\n */\nexport function baseFieldOfParam(name: string): string {\n const m = /^(.+)__or\\d+$/.exec(name);\n return m ? m[1] : name;\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 (`white__or0`, `black__or1`, …) so\n // it never collides with a top-level condition on the same field (e.g. a\n // `white = $white` filter alongside an opponent `_or` on white/black) -\n // keeping the surql + vars, and thus the query hash, stable and\n // deterministic. The FIELD is part of the name on purpose: the consumer\n // types a param by looking its name up in the table's columns\n // (`parseQueryParams` in @spooky-sync/core), and a name it cannot resolve\n // used to be dropped from the registration, which left `$or0` unbound and\n // every `_or` query matching nothing.\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, orParamName(bField, 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 // Engine-neutral plan mirrors the SELECT above for non-SurrealQL backends.\n // Only SELECT carries a plan; the isOne→limit=1 mutation above is already\n // reflected in `options.limit`, so the plan sees it too.\n plan: method === 'SELECT' ? buildQueryPlan(tableName, options, schema) : undefined,\n };\n}\n\n/**\n * Build the engine-neutral {@link QueryPlan} for a SELECT. Mirrors the string\n * assembly in {@link buildQueryFromOptions} / {@link buildSubquery} exactly so a\n * non-SurrealQL backend produces results identical to the SurrealQL path.\n */\nfunction buildQueryPlan<TModel extends GenericModel, IsOne extends boolean>(\n tableName: string,\n options: QueryOptions<TModel, IsOne>,\n schema: SchemaStructure\n): QueryPlan {\n const plan: QueryPlan = { table: tableName };\n\n if (options.select && options.select.length > 0 && !options.select.includes('*')) {\n plan.select = options.select.filter((f) => f !== '*') as string[];\n }\n\n const parsedWhere = options.where\n ? (parseObjectIdsToRecordId(options.where, tableName) as Record<string, unknown>)\n : undefined;\n if (parsedWhere && Object.keys(parsedWhere).length > 0) {\n // slaveToParams: top-level filters materialize from `params` (the query's\n // identity), not a baked literal — see buildWhereNodes. Prevents a query's\n // rows ever coming from a different query's plan.\n const nodes = buildWhereNodes(parsedWhere, true);\n if (nodes.length > 0) plan.where = nodes;\n }\n\n if (options.orderBy && Object.keys(options.orderBy).length > 0) {\n plan.orderBy = Object.entries(options.orderBy).map(\n ([field, direction]) => [field, direction as 'asc' | 'desc']\n );\n }\n\n if (options.limit !== undefined) plan.limit = options.limit;\n if (options.offset !== undefined) plan.offset = options.offset;\n\n if (options.related && options.related.length > 0) {\n plan.relations = options.related.map((rel) => buildRelationPlan(rel, schema));\n }\n\n return plan;\n}\n\n/**\n * Engine-neutral counterpart of {@link buildSubquery}. Resolves the same\n * cardinality / foreign-key / nested-relation metadata but returns a structured\n * {@link RelationPlan} instead of a SurrealQL subquery string.\n */\nfunction buildRelationPlan(\n rel: RelatedQuery & { foreignKeyField?: string },\n schema: SchemaStructure\n): RelationPlan {\n const { relatedTable, alias, modifier, cardinality } = rel;\n // Same fallback chain as buildSubquery (`rel.foreignKeyField || alias`); the\n // top-level foreignKeyField is already reverse-resolved by `.related()`.\n const foreignKeyField = (rel.foreignKeyField || alias || relatedTable) as string;\n\n const plan: RelationPlan = {\n alias: (alias || relatedTable) as string,\n table: relatedTable,\n cardinality,\n foreignKeyField,\n };\n\n if (modifier) {\n const modifierBuilder = new SchemaAwareQueryModifierBuilderImpl(relatedTable, schema);\n modifier(modifierBuilder as any);\n const subOptions = modifierBuilder._getOptions();\n\n if (subOptions.select && subOptions.select.length > 0 && !subOptions.select.includes('*')) {\n plan.select = subOptions.select.filter((f) => f !== '*') as string[];\n }\n\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 nodes = buildWhereNodes(parsedSubWhere);\n if (nodes.length > 0) plan.where = nodes;\n }\n\n if (subOptions.orderBy && Object.keys(subOptions.orderBy).length > 0) {\n plan.orderBy = Object.entries(subOptions.orderBy).map(\n ([field, direction]) => [field, direction as 'asc' | 'desc']\n );\n }\n\n if (subOptions.limit !== undefined) plan.limit = subOptions.limit;\n\n // Nested relations: re-resolve exactly as buildSubquery does — the child's\n // foreignKeyField comes from the relatedTable-based lookup, not the reverse\n // heuristic used for top-level relations.\n if (subOptions.related && subOptions.related.length > 0) {\n const resolvedNestedRels = subOptions.related.map((nestedRel) => {\n const relationship = schema.relationships.find(\n (r) => r.from === relatedTable && r.field === nestedRel.alias\n );\n if (relationship) {\n const nestedForeignKeyField =\n relationship.cardinality === 'many' ? relatedTable : (nestedRel.alias as string);\n return {\n ...nestedRel,\n relatedTable: relationship.to,\n cardinality: relationship.cardinality,\n foreignKeyField: nestedForeignKeyField,\n } as RelatedQuery & { foreignKeyField: string };\n }\n return nestedRel;\n });\n plan.relations = resolvedNestedRels.map((nestedRel) => buildRelationPlan(nestedRel, schema));\n }\n }\n\n // one-to-one gets an implicit per-parent LIMIT 1 (matches buildSubquery).\n if (cardinality === 'one' && plan.limit === undefined) {\n plan.limit = 1;\n }\n\n return plan;\n}\n\n/**\n * Convert a parsed WHERE object (string IDs already → RecordId) into the\n * engine-neutral {@link WhereNode}[] conjunction. Mirrors the `_or` / comparison\n * / equality handling in {@link buildQueryFromOptions}. A `$`-prefixed `_val`\n * becomes a `paramRef` (with the leading `$` stripped).\n */\n/**\n * @param slaveToParams When true, top-level plain/operator-literal comparisons\n * ALSO carry a `paramRef` equal to the field name — the same var name\n * `buildQueryFromOptions` binds the value under (`field = $field`). The\n * engines then materialize by reading `params[field]` (falling back to the\n * baked `value` when the param is absent), so a query's rows are slaved to\n * its `params` (its identity) and can never come from a different query's\n * baked plan. Only safe at the TOP LEVEL, where the field is a schema column\n * that survives `parseQueryParams` and the caller passes `params`. NOT used\n * for relation sub-wheres (rendered with a params-less ctx) or `_or` branches\n * (bound under synthetic `white__or0` names) - those stay baked.\n */\nfunction buildWhereNodes(\n parsedWhere: Record<string, unknown>,\n slaveToParams = false\n): WhereNode[] {\n const toComparison = (field: string, value: unknown, slave: boolean): WhereComparison => {\n if (value && typeof value === 'object' && '_op' in value && '_val' in value) {\n const { _op, _val, _swap } = value as ComparisonOp;\n if (typeof _val === 'string' && _val.startsWith('$')) {\n return { field, op: _op, value: undefined, paramRef: _val.slice(1), swap: _swap };\n }\n // Literal operand: keep `value` as a fallback and add `paramRef: field`\n // (slave mode) so materialization reads the query's own `params[field]`.\n return slave\n ? { field, op: _op, value: _val, paramRef: field, swap: _swap }\n : { field, op: _op, value: _val, swap: _swap };\n }\n return slave ? { field, op: '=', value, paramRef: field } : { field, op: '=', value };\n };\n\n const nodes: WhereNode[] = [];\n for (const [key, value] of Object.entries(parsedWhere)) {\n if (key === '_or' && Array.isArray(value)) {\n const or: WhereComparison[] = [];\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 // OR branches bind under synthetic `white__or0` names (see\n // orParamName / buildQueryFromOptions); the plan keeps them baked.\n or.push(toComparison(bField, bVal, false));\n }\n }\n }\n if (or.length > 0) nodes.push({ or });\n continue;\n }\n nodes.push(toComparison(key, value, slaveToParams));\n }\n return nodes;\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
|
@@ -326,6 +326,26 @@ var QueryBuilder = class QueryBuilder {
|
|
|
326
326
|
return new FinalQuery(this.tableName, this.options, this.schema, this.executer);
|
|
327
327
|
}
|
|
328
328
|
};
|
|
329
|
+
/**
|
|
330
|
+
* The surql param name an `_or` branch condition binds under: the branch FIELD,
|
|
331
|
+
* a `__or` marker and the branch's position. The position alone makes it unique
|
|
332
|
+
* within the query; the field prefix is what lets a consumer type the value by
|
|
333
|
+
* looking the column up (see {@link baseFieldOfParam}). Non-identifier
|
|
334
|
+
* characters (a nested path like `database.owner`) are folded to `_` so the
|
|
335
|
+
* result is a legal param name.
|
|
336
|
+
*/
|
|
337
|
+
function orParamName(field, index) {
|
|
338
|
+
return `${field.replace(/[^A-Za-z0-9_]/g, "_")}__or${index}`;
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Inverse of {@link orParamName}: the field a param name was built from, or the
|
|
342
|
+
* name itself when it is a plain top-level param (`field = $field`). Lets a
|
|
343
|
+
* consumer resolve `white__or0` back to the `white` column.
|
|
344
|
+
*/
|
|
345
|
+
function baseFieldOfParam(name) {
|
|
346
|
+
const m = /^(.+)__or\d+$/.exec(name);
|
|
347
|
+
return m ? m[1] : name;
|
|
348
|
+
}
|
|
329
349
|
function cyrb53(str, seed = 0) {
|
|
330
350
|
let h1 = 3735928559 ^ seed, h2 = 1103547991 ^ seed;
|
|
331
351
|
for (let i = 0, ch; i < str.length; i++) {
|
|
@@ -412,7 +432,7 @@ function buildQueryFromOptions(method, tableName, options, schema, patches) {
|
|
|
412
432
|
if (key === "_or" && Array.isArray(value)) {
|
|
413
433
|
const orParts = [];
|
|
414
434
|
let i = 0;
|
|
415
|
-
for (const branch of value) if (branch && typeof branch === "object") for (const [bField, bVal] of Object.entries(branch)) orParts.push(buildCondition(bField, bVal,
|
|
435
|
+
for (const branch of value) if (branch && typeof branch === "object") for (const [bField, bVal] of Object.entries(branch)) orParts.push(buildCondition(bField, bVal, orParamName(bField, i++)));
|
|
416
436
|
if (orParts.length > 0) conditions.push(`(${orParts.join(" OR ")})`);
|
|
417
437
|
continue;
|
|
418
438
|
}
|
|
@@ -512,10 +532,9 @@ function buildRelationPlan(rel, schema) {
|
|
|
512
532
|
* baked `value` when the param is absent), so a query's rows are slaved to
|
|
513
533
|
* its `params` (its identity) and can never come from a different query's
|
|
514
534
|
* baked plan. Only safe at the TOP LEVEL, where the field is a schema column
|
|
515
|
-
* that survives `
|
|
516
|
-
* relation sub-wheres (rendered with a params-less ctx) or `_or` branches
|
|
517
|
-
* (bound under synthetic `
|
|
518
|
-
* stay baked.
|
|
535
|
+
* that survives `parseQueryParams` and the caller passes `params`. NOT used
|
|
536
|
+
* for relation sub-wheres (rendered with a params-less ctx) or `_or` branches
|
|
537
|
+
* (bound under synthetic `white__or0` names) - those stay baked.
|
|
519
538
|
*/
|
|
520
539
|
function buildWhereNodes(parsedWhere, slaveToParams = false) {
|
|
521
540
|
const toComparison = (field, value, slave) => {
|
|
@@ -619,5 +638,5 @@ function buildSubquery(rel, schema) {
|
|
|
619
638
|
}
|
|
620
639
|
|
|
621
640
|
//#endregion
|
|
622
|
-
export { FinalQuery, InnerQuery, QueryBuilder, RecordId, buildQueryFromOptions, cyrb53 };
|
|
641
|
+
export { FinalQuery, InnerQuery, QueryBuilder, RecordId, baseFieldOfParam, buildQueryFromOptions, cyrb53, orParamName };
|
|
623
642
|
//# sourceMappingURL=index.mjs.map
|
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 WhereInput,\n QueryPlan,\n RelationPlan,\n WhereNode,\n WhereComparison,\n ComparisonOp,\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 * Reject a query clause that references an `-- @opaque` column.\n *\n * An `@opaque` value is synced down to the client but never held server-side, so\n * the SSP has nothing to evaluate a predicate against. Left unchecked, the\n * failure is silent and asymmetric: the local cache DOES hold the value, so the\n * clause filters correctly on screen while the server-side membership set it is\n * compared against was computed without it. The result reads as rows randomly\n * appearing and vanishing rather than as an error, so fail loudly at the call\n * site instead.\n *\n * `clause` names the offending API ('where', 'orderBy', …) for the message.\n */\nfunction assertNotOpaque(\n schema: SchemaStructure,\n tableName: string,\n clause: string,\n fields: readonly string[]\n): void {\n const table = schema.tables.find((t) => t.name === tableName);\n if (!table) return;\n for (const field of fields) {\n // A nested path (`meta.secret`) is checked against its root, since the column\n // flag lives on `meta`. Comparison operators use `{ field: { _op, _val } }`\n // rather than a name suffix, so the key is always the bare column name.\n const column: ColumnSchema | undefined =\n table.columns[field] ?? table.columns[field.split('.')[0]];\n if (column?.opaque) {\n throw new Error(\n `Cannot use '${field}' in ${clause}(): it is marked '-- @opaque' on ` +\n `${tableName}, so the sync engine never stores its value and cannot ` +\n `evaluate it. Read the field from query results instead, or remove ` +\n `'-- @opaque' from the schema if you need to query on it.`\n );\n }\n }\n}\n\n/** Every column name a `where` clause touches, including `_or` branches. */\nfunction whereFieldNames(conditions: Record<string, unknown>): string[] {\n const out: string[] = [];\n for (const [key, value] of Object.entries(conditions)) {\n if (key === '_or') {\n for (const branch of (value ?? []) as Record<string, unknown>[]) {\n out.push(...whereFieldNames(branch ?? {}));\n }\n continue;\n }\n out.push(key);\n }\n return out;\n}\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 assertNotOpaque(\n this.schema,\n this.tableName,\n 'where',\n whereFieldNames(conditions as Record<string, unknown>)\n );\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 assertNotOpaque(this.schema, this.tableName, 'orderBy', [field]);\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 // No such relationship in the client schema — e.g. a table owned by a\n // devOnly backend (the outbox `job`) that a free/Cloudflare deployment\n // never provisions, so codegen omits it + its relationships. Skip the\n // projection instead of throwing, which would take the whole query\n // (and its other `.related()` siblings — author, comments) down.\n // Mirrors the server's \"unpermitted subquery → empty\" degradation.\n if (typeof console !== 'undefined') {\n console.warn(\n `[sp00ky] .related('${String(relatedField)}') skipped — no such relationship on '${this.tableName}' in the client schema`\n );\n }\n return this as any;\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 assertNotOpaque(\n this.schema,\n this.tableName,\n 'where',\n whereFieldNames(conditions as Record<string, unknown>)\n );\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 assertNotOpaque(this.schema, this.tableName, 'orderBy', [field as string]);\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 // See the note on the other `.related()` overload: skip an unknown\n // relationship (warn) rather than throwing, so a table absent from the\n // client schema (e.g. the free-plan `job` outbox) can't crash the query.\n if (typeof console !== 'undefined') {\n console.warn(\n `[sp00ky] .related('${String(field)}') skipped — no such relationship on '${this.tableName}' in the client schema`\n );\n }\n return this as any;\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 // Engine-neutral plan mirrors the SELECT above for non-SurrealQL backends.\n // Only SELECT carries a plan; the isOne→limit=1 mutation above is already\n // reflected in `options.limit`, so the plan sees it too.\n plan: method === 'SELECT' ? buildQueryPlan(tableName, options, schema) : undefined,\n };\n}\n\n/**\n * Build the engine-neutral {@link QueryPlan} for a SELECT. Mirrors the string\n * assembly in {@link buildQueryFromOptions} / {@link buildSubquery} exactly so a\n * non-SurrealQL backend produces results identical to the SurrealQL path.\n */\nfunction buildQueryPlan<TModel extends GenericModel, IsOne extends boolean>(\n tableName: string,\n options: QueryOptions<TModel, IsOne>,\n schema: SchemaStructure\n): QueryPlan {\n const plan: QueryPlan = { table: tableName };\n\n if (options.select && options.select.length > 0 && !options.select.includes('*')) {\n plan.select = options.select.filter((f) => f !== '*') as string[];\n }\n\n const parsedWhere = options.where\n ? (parseObjectIdsToRecordId(options.where, tableName) as Record<string, unknown>)\n : undefined;\n if (parsedWhere && Object.keys(parsedWhere).length > 0) {\n // slaveToParams: top-level filters materialize from `params` (the query's\n // identity), not a baked literal — see buildWhereNodes. Prevents a query's\n // rows ever coming from a different query's plan.\n const nodes = buildWhereNodes(parsedWhere, true);\n if (nodes.length > 0) plan.where = nodes;\n }\n\n if (options.orderBy && Object.keys(options.orderBy).length > 0) {\n plan.orderBy = Object.entries(options.orderBy).map(\n ([field, direction]) => [field, direction as 'asc' | 'desc']\n );\n }\n\n if (options.limit !== undefined) plan.limit = options.limit;\n if (options.offset !== undefined) plan.offset = options.offset;\n\n if (options.related && options.related.length > 0) {\n plan.relations = options.related.map((rel) => buildRelationPlan(rel, schema));\n }\n\n return plan;\n}\n\n/**\n * Engine-neutral counterpart of {@link buildSubquery}. Resolves the same\n * cardinality / foreign-key / nested-relation metadata but returns a structured\n * {@link RelationPlan} instead of a SurrealQL subquery string.\n */\nfunction buildRelationPlan(\n rel: RelatedQuery & { foreignKeyField?: string },\n schema: SchemaStructure\n): RelationPlan {\n const { relatedTable, alias, modifier, cardinality } = rel;\n // Same fallback chain as buildSubquery (`rel.foreignKeyField || alias`); the\n // top-level foreignKeyField is already reverse-resolved by `.related()`.\n const foreignKeyField = (rel.foreignKeyField || alias || relatedTable) as string;\n\n const plan: RelationPlan = {\n alias: (alias || relatedTable) as string,\n table: relatedTable,\n cardinality,\n foreignKeyField,\n };\n\n if (modifier) {\n const modifierBuilder = new SchemaAwareQueryModifierBuilderImpl(relatedTable, schema);\n modifier(modifierBuilder as any);\n const subOptions = modifierBuilder._getOptions();\n\n if (subOptions.select && subOptions.select.length > 0 && !subOptions.select.includes('*')) {\n plan.select = subOptions.select.filter((f) => f !== '*') as string[];\n }\n\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 nodes = buildWhereNodes(parsedSubWhere);\n if (nodes.length > 0) plan.where = nodes;\n }\n\n if (subOptions.orderBy && Object.keys(subOptions.orderBy).length > 0) {\n plan.orderBy = Object.entries(subOptions.orderBy).map(\n ([field, direction]) => [field, direction as 'asc' | 'desc']\n );\n }\n\n if (subOptions.limit !== undefined) plan.limit = subOptions.limit;\n\n // Nested relations: re-resolve exactly as buildSubquery does — the child's\n // foreignKeyField comes from the relatedTable-based lookup, not the reverse\n // heuristic used for top-level relations.\n if (subOptions.related && subOptions.related.length > 0) {\n const resolvedNestedRels = subOptions.related.map((nestedRel) => {\n const relationship = schema.relationships.find(\n (r) => r.from === relatedTable && r.field === nestedRel.alias\n );\n if (relationship) {\n const nestedForeignKeyField =\n relationship.cardinality === 'many' ? relatedTable : (nestedRel.alias as string);\n return {\n ...nestedRel,\n relatedTable: relationship.to,\n cardinality: relationship.cardinality,\n foreignKeyField: nestedForeignKeyField,\n } as RelatedQuery & { foreignKeyField: string };\n }\n return nestedRel;\n });\n plan.relations = resolvedNestedRels.map((nestedRel) => buildRelationPlan(nestedRel, schema));\n }\n }\n\n // one-to-one gets an implicit per-parent LIMIT 1 (matches buildSubquery).\n if (cardinality === 'one' && plan.limit === undefined) {\n plan.limit = 1;\n }\n\n return plan;\n}\n\n/**\n * Convert a parsed WHERE object (string IDs already → RecordId) into the\n * engine-neutral {@link WhereNode}[] conjunction. Mirrors the `_or` / comparison\n * / equality handling in {@link buildQueryFromOptions}. A `$`-prefixed `_val`\n * becomes a `paramRef` (with the leading `$` stripped).\n */\n/**\n * @param slaveToParams When true, top-level plain/operator-literal comparisons\n * ALSO carry a `paramRef` equal to the field name — the same var name\n * `buildQueryFromOptions` binds the value under (`field = $field`). The\n * engines then materialize by reading `params[field]` (falling back to the\n * baked `value` when the param is absent), so a query's rows are slaved to\n * its `params` (its identity) and can never come from a different query's\n * baked plan. Only safe at the TOP LEVEL, where the field is a schema column\n * that survives `parseParams` and the caller passes `params`. NOT used for\n * relation sub-wheres (rendered with a params-less ctx) or `_or` branches\n * (bound under synthetic `or0…` names that `parseParams` strips) — those\n * stay baked.\n */\nfunction buildWhereNodes(\n parsedWhere: Record<string, unknown>,\n slaveToParams = false\n): WhereNode[] {\n const toComparison = (field: string, value: unknown, slave: boolean): WhereComparison => {\n if (value && typeof value === 'object' && '_op' in value && '_val' in value) {\n const { _op, _val, _swap } = value as ComparisonOp;\n if (typeof _val === 'string' && _val.startsWith('$')) {\n return { field, op: _op, value: undefined, paramRef: _val.slice(1), swap: _swap };\n }\n // Literal operand: keep `value` as a fallback and add `paramRef: field`\n // (slave mode) so materialization reads the query's own `params[field]`.\n return slave\n ? { field, op: _op, value: _val, paramRef: field, swap: _swap }\n : { field, op: _op, value: _val, swap: _swap };\n }\n return slave ? { field, op: '=', value, paramRef: field } : { field, op: '=', value };\n };\n\n const nodes: WhereNode[] = [];\n for (const [key, value] of Object.entries(parsedWhere)) {\n if (key === '_or' && Array.isArray(value)) {\n const or: WhereComparison[] = [];\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 // OR branches bind under synthetic `or0…` names (see\n // buildQueryFromOptions) that parseParams strips — keep them baked.\n or.push(toComparison(bField, bVal, false));\n }\n }\n }\n if (or.length > 0) nodes.push({ or });\n continue;\n }\n nodes.push(toComparison(key, value, slaveToParams));\n }\n return nodes;\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 QueryPlan,\n RelationPlan,\n WhereNode,\n WhereComparison,\n ComparisonOp,\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 * Reject a query clause that references an `-- @opaque` column.\n *\n * An `@opaque` value is synced down to the client but never held server-side, so\n * the SSP has nothing to evaluate a predicate against. Left unchecked, the\n * failure is silent and asymmetric: the local cache DOES hold the value, so the\n * clause filters correctly on screen while the server-side membership set it is\n * compared against was computed without it. The result reads as rows randomly\n * appearing and vanishing rather than as an error, so fail loudly at the call\n * site instead.\n *\n * `clause` names the offending API ('where', 'orderBy', …) for the message.\n */\nfunction assertNotOpaque(\n schema: SchemaStructure,\n tableName: string,\n clause: string,\n fields: readonly string[]\n): void {\n const table = schema.tables.find((t) => t.name === tableName);\n if (!table) return;\n for (const field of fields) {\n // A nested path (`meta.secret`) is checked against its root, since the column\n // flag lives on `meta`. Comparison operators use `{ field: { _op, _val } }`\n // rather than a name suffix, so the key is always the bare column name.\n const column: ColumnSchema | undefined =\n table.columns[field] ?? table.columns[field.split('.')[0]];\n if (column?.opaque) {\n throw new Error(\n `Cannot use '${field}' in ${clause}(): it is marked '-- @opaque' on ` +\n `${tableName}, so the sync engine never stores its value and cannot ` +\n `evaluate it. Read the field from query results instead, or remove ` +\n `'-- @opaque' from the schema if you need to query on it.`\n );\n }\n }\n}\n\n/** Every column name a `where` clause touches, including `_or` branches. */\nfunction whereFieldNames(conditions: Record<string, unknown>): string[] {\n const out: string[] = [];\n for (const [key, value] of Object.entries(conditions)) {\n if (key === '_or') {\n for (const branch of (value ?? []) as Record<string, unknown>[]) {\n out.push(...whereFieldNames(branch ?? {}));\n }\n continue;\n }\n out.push(key);\n }\n return out;\n}\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 assertNotOpaque(\n this.schema,\n this.tableName,\n 'where',\n whereFieldNames(conditions as Record<string, unknown>)\n );\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 assertNotOpaque(this.schema, this.tableName, 'orderBy', [field]);\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 // No such relationship in the client schema — e.g. a table owned by a\n // devOnly backend (the outbox `job`) that a free/Cloudflare deployment\n // never provisions, so codegen omits it + its relationships. Skip the\n // projection instead of throwing, which would take the whole query\n // (and its other `.related()` siblings — author, comments) down.\n // Mirrors the server's \"unpermitted subquery → empty\" degradation.\n if (typeof console !== 'undefined') {\n console.warn(\n `[sp00ky] .related('${String(relatedField)}') skipped — no such relationship on '${this.tableName}' in the client schema`\n );\n }\n return this as any;\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 assertNotOpaque(\n this.schema,\n this.tableName,\n 'where',\n whereFieldNames(conditions as Record<string, unknown>)\n );\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 assertNotOpaque(this.schema, this.tableName, 'orderBy', [field as string]);\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 // See the note on the other `.related()` overload: skip an unknown\n // relationship (warn) rather than throwing, so a table absent from the\n // client schema (e.g. the free-plan `job` outbox) can't crash the query.\n if (typeof console !== 'undefined') {\n console.warn(\n `[sp00ky] .related('${String(field)}') skipped — no such relationship on '${this.tableName}' in the client schema`\n );\n }\n return this as any;\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\n/**\n * The surql param name an `_or` branch condition binds under: the branch FIELD,\n * a `__or` marker and the branch's position. The position alone makes it unique\n * within the query; the field prefix is what lets a consumer type the value by\n * looking the column up (see {@link baseFieldOfParam}). Non-identifier\n * characters (a nested path like `database.owner`) are folded to `_` so the\n * result is a legal param name.\n */\nexport function orParamName(field: string, index: number): string {\n return `${field.replace(/[^A-Za-z0-9_]/g, '_')}__or${index}`;\n}\n\n/**\n * Inverse of {@link orParamName}: the field a param name was built from, or the\n * name itself when it is a plain top-level param (`field = $field`). Lets a\n * consumer resolve `white__or0` back to the `white` column.\n */\nexport function baseFieldOfParam(name: string): string {\n const m = /^(.+)__or\\d+$/.exec(name);\n return m ? m[1] : name;\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 (`white__or0`, `black__or1`, …) so\n // it never collides with a top-level condition on the same field (e.g. a\n // `white = $white` filter alongside an opponent `_or` on white/black) -\n // keeping the surql + vars, and thus the query hash, stable and\n // deterministic. The FIELD is part of the name on purpose: the consumer\n // types a param by looking its name up in the table's columns\n // (`parseQueryParams` in @spooky-sync/core), and a name it cannot resolve\n // used to be dropped from the registration, which left `$or0` unbound and\n // every `_or` query matching nothing.\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, orParamName(bField, 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 // Engine-neutral plan mirrors the SELECT above for non-SurrealQL backends.\n // Only SELECT carries a plan; the isOne→limit=1 mutation above is already\n // reflected in `options.limit`, so the plan sees it too.\n plan: method === 'SELECT' ? buildQueryPlan(tableName, options, schema) : undefined,\n };\n}\n\n/**\n * Build the engine-neutral {@link QueryPlan} for a SELECT. Mirrors the string\n * assembly in {@link buildQueryFromOptions} / {@link buildSubquery} exactly so a\n * non-SurrealQL backend produces results identical to the SurrealQL path.\n */\nfunction buildQueryPlan<TModel extends GenericModel, IsOne extends boolean>(\n tableName: string,\n options: QueryOptions<TModel, IsOne>,\n schema: SchemaStructure\n): QueryPlan {\n const plan: QueryPlan = { table: tableName };\n\n if (options.select && options.select.length > 0 && !options.select.includes('*')) {\n plan.select = options.select.filter((f) => f !== '*') as string[];\n }\n\n const parsedWhere = options.where\n ? (parseObjectIdsToRecordId(options.where, tableName) as Record<string, unknown>)\n : undefined;\n if (parsedWhere && Object.keys(parsedWhere).length > 0) {\n // slaveToParams: top-level filters materialize from `params` (the query's\n // identity), not a baked literal — see buildWhereNodes. Prevents a query's\n // rows ever coming from a different query's plan.\n const nodes = buildWhereNodes(parsedWhere, true);\n if (nodes.length > 0) plan.where = nodes;\n }\n\n if (options.orderBy && Object.keys(options.orderBy).length > 0) {\n plan.orderBy = Object.entries(options.orderBy).map(\n ([field, direction]) => [field, direction as 'asc' | 'desc']\n );\n }\n\n if (options.limit !== undefined) plan.limit = options.limit;\n if (options.offset !== undefined) plan.offset = options.offset;\n\n if (options.related && options.related.length > 0) {\n plan.relations = options.related.map((rel) => buildRelationPlan(rel, schema));\n }\n\n return plan;\n}\n\n/**\n * Engine-neutral counterpart of {@link buildSubquery}. Resolves the same\n * cardinality / foreign-key / nested-relation metadata but returns a structured\n * {@link RelationPlan} instead of a SurrealQL subquery string.\n */\nfunction buildRelationPlan(\n rel: RelatedQuery & { foreignKeyField?: string },\n schema: SchemaStructure\n): RelationPlan {\n const { relatedTable, alias, modifier, cardinality } = rel;\n // Same fallback chain as buildSubquery (`rel.foreignKeyField || alias`); the\n // top-level foreignKeyField is already reverse-resolved by `.related()`.\n const foreignKeyField = (rel.foreignKeyField || alias || relatedTable) as string;\n\n const plan: RelationPlan = {\n alias: (alias || relatedTable) as string,\n table: relatedTable,\n cardinality,\n foreignKeyField,\n };\n\n if (modifier) {\n const modifierBuilder = new SchemaAwareQueryModifierBuilderImpl(relatedTable, schema);\n modifier(modifierBuilder as any);\n const subOptions = modifierBuilder._getOptions();\n\n if (subOptions.select && subOptions.select.length > 0 && !subOptions.select.includes('*')) {\n plan.select = subOptions.select.filter((f) => f !== '*') as string[];\n }\n\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 nodes = buildWhereNodes(parsedSubWhere);\n if (nodes.length > 0) plan.where = nodes;\n }\n\n if (subOptions.orderBy && Object.keys(subOptions.orderBy).length > 0) {\n plan.orderBy = Object.entries(subOptions.orderBy).map(\n ([field, direction]) => [field, direction as 'asc' | 'desc']\n );\n }\n\n if (subOptions.limit !== undefined) plan.limit = subOptions.limit;\n\n // Nested relations: re-resolve exactly as buildSubquery does — the child's\n // foreignKeyField comes from the relatedTable-based lookup, not the reverse\n // heuristic used for top-level relations.\n if (subOptions.related && subOptions.related.length > 0) {\n const resolvedNestedRels = subOptions.related.map((nestedRel) => {\n const relationship = schema.relationships.find(\n (r) => r.from === relatedTable && r.field === nestedRel.alias\n );\n if (relationship) {\n const nestedForeignKeyField =\n relationship.cardinality === 'many' ? relatedTable : (nestedRel.alias as string);\n return {\n ...nestedRel,\n relatedTable: relationship.to,\n cardinality: relationship.cardinality,\n foreignKeyField: nestedForeignKeyField,\n } as RelatedQuery & { foreignKeyField: string };\n }\n return nestedRel;\n });\n plan.relations = resolvedNestedRels.map((nestedRel) => buildRelationPlan(nestedRel, schema));\n }\n }\n\n // one-to-one gets an implicit per-parent LIMIT 1 (matches buildSubquery).\n if (cardinality === 'one' && plan.limit === undefined) {\n plan.limit = 1;\n }\n\n return plan;\n}\n\n/**\n * Convert a parsed WHERE object (string IDs already → RecordId) into the\n * engine-neutral {@link WhereNode}[] conjunction. Mirrors the `_or` / comparison\n * / equality handling in {@link buildQueryFromOptions}. A `$`-prefixed `_val`\n * becomes a `paramRef` (with the leading `$` stripped).\n */\n/**\n * @param slaveToParams When true, top-level plain/operator-literal comparisons\n * ALSO carry a `paramRef` equal to the field name — the same var name\n * `buildQueryFromOptions` binds the value under (`field = $field`). The\n * engines then materialize by reading `params[field]` (falling back to the\n * baked `value` when the param is absent), so a query's rows are slaved to\n * its `params` (its identity) and can never come from a different query's\n * baked plan. Only safe at the TOP LEVEL, where the field is a schema column\n * that survives `parseQueryParams` and the caller passes `params`. NOT used\n * for relation sub-wheres (rendered with a params-less ctx) or `_or` branches\n * (bound under synthetic `white__or0` names) - those stay baked.\n */\nfunction buildWhereNodes(\n parsedWhere: Record<string, unknown>,\n slaveToParams = false\n): WhereNode[] {\n const toComparison = (field: string, value: unknown, slave: boolean): WhereComparison => {\n if (value && typeof value === 'object' && '_op' in value && '_val' in value) {\n const { _op, _val, _swap } = value as ComparisonOp;\n if (typeof _val === 'string' && _val.startsWith('$')) {\n return { field, op: _op, value: undefined, paramRef: _val.slice(1), swap: _swap };\n }\n // Literal operand: keep `value` as a fallback and add `paramRef: field`\n // (slave mode) so materialization reads the query's own `params[field]`.\n return slave\n ? { field, op: _op, value: _val, paramRef: field, swap: _swap }\n : { field, op: _op, value: _val, swap: _swap };\n }\n return slave ? { field, op: '=', value, paramRef: field } : { field, op: '=', value };\n };\n\n const nodes: WhereNode[] = [];\n for (const [key, value] of Object.entries(parsedWhere)) {\n if (key === '_or' && Array.isArray(value)) {\n const or: WhereComparison[] = [];\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 // OR branches bind under synthetic `white__or0` names (see\n // orParamName / buildQueryFromOptions); the plan keeps them baked.\n or.push(toComparison(bField, bVal, false));\n }\n }\n }\n if (or.length > 0) nodes.push({ or });\n continue;\n }\n nodes.push(toComparison(key, value, slaveToParams));\n }\n return nodes;\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
package/src/index.ts
CHANGED
|
@@ -106,8 +106,10 @@ describe('QueryBuilder', () => {
|
|
|
106
106
|
builder.where({ _or: [{ username: 'x' }, { email: 'x' }] });
|
|
107
107
|
const result = builder.build().run();
|
|
108
108
|
|
|
109
|
-
expect(result.query).toBe(
|
|
110
|
-
|
|
109
|
+
expect(result.query).toBe(
|
|
110
|
+
'SELECT * FROM user WHERE (username = $username__or0 OR email = $email__or1);'
|
|
111
|
+
);
|
|
112
|
+
expect(result.vars).toEqual({ username__or0: 'x', email__or1: 'x' });
|
|
111
113
|
});
|
|
112
114
|
|
|
113
115
|
it('should not collide an _or branch with a top-level condition on the same field', () => {
|
|
@@ -118,9 +120,10 @@ describe('QueryBuilder', () => {
|
|
|
118
120
|
const result = builder.build().run();
|
|
119
121
|
|
|
120
122
|
expect(result.query).toBe(
|
|
121
|
-
'SELECT * FROM user WHERE username = $username AND
|
|
123
|
+
'SELECT * FROM user WHERE username = $username AND ' +
|
|
124
|
+
'(username = $username__or0 OR email = $email__or1);'
|
|
122
125
|
);
|
|
123
|
-
expect(result.vars).toEqual({ username: 'me',
|
|
126
|
+
expect(result.vars).toEqual({ username: 'me', username__or0: 'opp', email__or1: 'opp' });
|
|
124
127
|
});
|
|
125
128
|
|
|
126
129
|
it('should combine equality + comparison + OR group + order/limit/offset', () => {
|
|
@@ -136,9 +139,14 @@ describe('QueryBuilder', () => {
|
|
|
136
139
|
|
|
137
140
|
expect(result.query).toBe(
|
|
138
141
|
'SELECT * FROM user WHERE email = $email AND created_at <= $created_at AND ' +
|
|
139
|
-
'(username = $
|
|
142
|
+
'(username = $username__or0 OR email = $email__or1) ORDER BY created_at asc LIMIT 50 START 0;'
|
|
140
143
|
);
|
|
141
|
-
expect(result.vars).toEqual({
|
|
144
|
+
expect(result.vars).toEqual({
|
|
145
|
+
email: 'e',
|
|
146
|
+
created_at: 5,
|
|
147
|
+
username__or0: 'p',
|
|
148
|
+
email__or1: 'p',
|
|
149
|
+
});
|
|
142
150
|
});
|
|
143
151
|
|
|
144
152
|
it('should produce a stable hash for the same logical filtered query', () => {
|
package/src/query-builder.ts
CHANGED
|
@@ -691,6 +691,28 @@ export class QueryBuilder<
|
|
|
691
691
|
}
|
|
692
692
|
}
|
|
693
693
|
|
|
694
|
+
/**
|
|
695
|
+
* The surql param name an `_or` branch condition binds under: the branch FIELD,
|
|
696
|
+
* a `__or` marker and the branch's position. The position alone makes it unique
|
|
697
|
+
* within the query; the field prefix is what lets a consumer type the value by
|
|
698
|
+
* looking the column up (see {@link baseFieldOfParam}). Non-identifier
|
|
699
|
+
* characters (a nested path like `database.owner`) are folded to `_` so the
|
|
700
|
+
* result is a legal param name.
|
|
701
|
+
*/
|
|
702
|
+
export function orParamName(field: string, index: number): string {
|
|
703
|
+
return `${field.replace(/[^A-Za-z0-9_]/g, '_')}__or${index}`;
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
/**
|
|
707
|
+
* Inverse of {@link orParamName}: the field a param name was built from, or the
|
|
708
|
+
* name itself when it is a plain top-level param (`field = $field`). Lets a
|
|
709
|
+
* consumer resolve `white__or0` back to the `white` column.
|
|
710
|
+
*/
|
|
711
|
+
export function baseFieldOfParam(name: string): string {
|
|
712
|
+
const m = /^(.+)__or\d+$/.exec(name);
|
|
713
|
+
return m ? m[1] : name;
|
|
714
|
+
}
|
|
715
|
+
|
|
694
716
|
export function cyrb53(str: string, seed: number = 0): number {
|
|
695
717
|
let h1 = 0xdeadbeef ^ seed,
|
|
696
718
|
h2 = 0x41c6ce57 ^ seed;
|
|
@@ -867,17 +889,22 @@ export function buildQueryFromOptions<TModel extends GenericModel, IsOne extends
|
|
|
867
889
|
for (const [key, value] of Object.entries(parsedWhere)) {
|
|
868
890
|
// OR-group: `{ _or: [ {field: val}, {field: {_op,_val}}, ... ] }` compiles
|
|
869
891
|
// to one parenthesised `(c1 OR c2 ...)` conjunct. Each branch condition gets
|
|
870
|
-
// a unique, position-indexed param name (`
|
|
871
|
-
// collides with a top-level condition on the same field (e.g. a
|
|
872
|
-
// $white` filter alongside an opponent `_or` on white/black)
|
|
873
|
-
// surql + vars, and thus the query hash, stable and
|
|
892
|
+
// a unique, position-indexed param name (`white__or0`, `black__or1`, …) so
|
|
893
|
+
// it never collides with a top-level condition on the same field (e.g. a
|
|
894
|
+
// `white = $white` filter alongside an opponent `_or` on white/black) -
|
|
895
|
+
// keeping the surql + vars, and thus the query hash, stable and
|
|
896
|
+
// deterministic. The FIELD is part of the name on purpose: the consumer
|
|
897
|
+
// types a param by looking its name up in the table's columns
|
|
898
|
+
// (`parseQueryParams` in @spooky-sync/core), and a name it cannot resolve
|
|
899
|
+
// used to be dropped from the registration, which left `$or0` unbound and
|
|
900
|
+
// every `_or` query matching nothing.
|
|
874
901
|
if (key === '_or' && Array.isArray(value)) {
|
|
875
902
|
const orParts: string[] = [];
|
|
876
903
|
let i = 0;
|
|
877
904
|
for (const branch of value) {
|
|
878
905
|
if (branch && typeof branch === 'object') {
|
|
879
906
|
for (const [bField, bVal] of Object.entries(branch as Record<string, unknown>)) {
|
|
880
|
-
orParts.push(buildCondition(bField, bVal,
|
|
907
|
+
orParts.push(buildCondition(bField, bVal, orParamName(bField, i++)));
|
|
881
908
|
}
|
|
882
909
|
}
|
|
883
910
|
}
|
|
@@ -1070,10 +1097,9 @@ function buildRelationPlan(
|
|
|
1070
1097
|
* baked `value` when the param is absent), so a query's rows are slaved to
|
|
1071
1098
|
* its `params` (its identity) and can never come from a different query's
|
|
1072
1099
|
* baked plan. Only safe at the TOP LEVEL, where the field is a schema column
|
|
1073
|
-
* that survives `
|
|
1074
|
-
* relation sub-wheres (rendered with a params-less ctx) or `_or` branches
|
|
1075
|
-
* (bound under synthetic `
|
|
1076
|
-
* stay baked.
|
|
1100
|
+
* that survives `parseQueryParams` and the caller passes `params`. NOT used
|
|
1101
|
+
* for relation sub-wheres (rendered with a params-less ctx) or `_or` branches
|
|
1102
|
+
* (bound under synthetic `white__or0` names) - those stay baked.
|
|
1077
1103
|
*/
|
|
1078
1104
|
function buildWhereNodes(
|
|
1079
1105
|
parsedWhere: Record<string, unknown>,
|
|
@@ -1101,8 +1127,8 @@ function buildWhereNodes(
|
|
|
1101
1127
|
for (const branch of value) {
|
|
1102
1128
|
if (branch && typeof branch === 'object') {
|
|
1103
1129
|
for (const [bField, bVal] of Object.entries(branch as Record<string, unknown>)) {
|
|
1104
|
-
// OR branches bind under synthetic `
|
|
1105
|
-
// buildQueryFromOptions)
|
|
1130
|
+
// OR branches bind under synthetic `white__or0` names (see
|
|
1131
|
+
// orParamName / buildQueryFromOptions); the plan keeps them baked.
|
|
1106
1132
|
or.push(toComparison(bField, bVal, false));
|
|
1107
1133
|
}
|
|
1108
1134
|
}
|
package/src/types.ts
CHANGED
|
@@ -133,7 +133,7 @@ export type WhereConditions<TModel extends GenericModel> = {
|
|
|
133
133
|
* WHERE input for `.where()`. Supports equality (`{ field: value }`), comparison
|
|
134
134
|
* operators (`{ field: { _op, _val } }`), and a single top-level `_or` group of
|
|
135
135
|
* condition fragments that compile to a parenthesised `(... OR ...)` conjunct —
|
|
136
|
-
* e.g. `{ _or: [{ white: x }, { black: x }] }` → `(white = $
|
|
136
|
+
* e.g. `{ _or: [{ white: x }, { black: x }] }` → `(white = $white__or0 OR black = $black__or1)`.
|
|
137
137
|
* Backward-compatible with plain `Partial<TModel>` equality objects.
|
|
138
138
|
*/
|
|
139
139
|
export type WhereInput<TModel extends GenericModel> = WhereConditions<TModel> & {
|