@rapiq/sql 2.0.0-beta.0 → 2.0.0-beta.1

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 CHANGED
@@ -116,6 +116,16 @@ declare abstract class FiltersBaseAdapter<RelationsAdapter extends IRelationsAda
116
116
  * worst (e.g. `lower(integer)` on postgres).
117
117
  */
118
118
  isCaseFoldable(_field: string): boolean;
119
+ /**
120
+ * Resolve a parsed field name to the identifier the database knows.
121
+ * Backends with column metadata override this to map property names
122
+ * to column names (e.g. `realmId` -> `realm_id`); the default is the
123
+ * identity, matching schemaless SQL usage.
124
+ *
125
+ * @param name last path segment (property name)
126
+ * @param relationPath dotted relation prefix, if any
127
+ */
128
+ resolveFieldName(name: string, _relationPath?: string): string;
119
129
  where(field: string, operator: string, value?: unknown): this;
120
130
  whereRaw(sql: string, ...values: unknown[]): this;
121
131
  buildParamPlaceholder(): string;
@@ -225,6 +235,16 @@ declare abstract class SortBaseAdapter implements ISortAdapter {
225
235
  clear(): void;
226
236
  protected abstract rootAlias(): string | undefined;
227
237
  protected abstract escapeField(field: string): string;
238
+ /**
239
+ * Resolve a parsed field name to the identifier the database knows.
240
+ * Backends with column metadata override this to map property names
241
+ * to column names (e.g. `realmId` -> `realm_id`); the default is the
242
+ * identity, matching schemaless SQL usage.
243
+ *
244
+ * @param name last path segment (property name)
245
+ * @param relationPath dotted relation prefix, if any
246
+ */
247
+ resolveFieldName(name: string, _relationPath?: string): string;
228
248
  abstract execute(): void;
229
249
  add(input: string, value: `${SortDirection}`): void;
230
250
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/helpers/relation-alias.ts","../src/helpers/field.ts","../src/helpers/like.ts","../src/helpers/name-split.ts","../src/helpers/param-placeholder-indexer.ts","../src/types.ts","../src/helpers/root-alias.ts","../src/visitor/types.ts","../src/adapter/filters/types.ts","../src/adapter/filters/base.ts","../src/dialect/types.ts","../src/dialect/mssql.ts","../src/dialect/mysql.ts","../src/dialect/oracle.ts","../src/dialect/pg.ts","../src/dialect/resolve.ts","../src/dialect/sqlite.ts","../src/adapter/filters/module.ts","../src/adapter/pagination/types.ts","../src/adapter/pagination/base.ts","../src/adapter/pagination/module.ts","../src/adapter/sort/types.ts","../src/adapter/sort/base.ts","../src/adapter/sort/module.ts","../src/adapter/types.ts","../src/adapter/relations/types.ts","../src/adapter/relations/base.ts","../src/adapter/relations/module.ts","../src/adapter/fields/types.ts","../src/adapter/fields/base.ts","../src/adapter/fields/module.ts","../src/adapter/module.ts","../src/visitor/fields.ts","../src/visitor/filters.ts","../src/visitor/pagination.ts","../src/visitor/relations.ts","../src/visitor/sort.ts","../src/visitor/module.ts"],"mappings":";;KAOY,mBAAmB;;;;;;;;;;iBAiCf,mBAAmB;;;KC7B9B;EACD;EACA;EACA;;iBAGY,WACZ,eACA,oBACA,gBAAe,kBACf;;;;;;;iBCVY,kBAAkB;;;iBCJlB,WAAW;iBAaX,UAAU;;;cCbb;YACC;cAEE;EAIZ;EAKA;;;;KCZQ,YACR,eAAe,sBAAsB,wBACpC,SAAS;;;iBCAE,cACZ,eAAe,sBAAsB,qBACvC,gBAAgB,YAAY,UAAW,YAAY;iBAQrC,cAAc,gBAAgB,cAAe,SAAS;;;KCZ1D;;;;;;;EAOR;GAEC;;;;UCPY,wBAAwB;EACrC;EAEA;EAEA,MAAM,eAAe,kBAAkB;EACvC,SAAS,gBAAgB;EAEzB,WAAW;EAEX;EACA,wBAAwB;EAExB;EACA,eAAe;EAEf,OAAO,eAAe,qBAAqB;EAE3C;EAEA,SAAS;EAET,eAAe;EAEf,MACI,UAAU,iBAEV,OAAO,GACP,yBACA;EAGJ;EAEA;;;;uBC/BkB,mBAClB,yBAAyB,oBAAoB,8BACpC;;;;;;EAMT;EAEA;YAEU,WAAW;YAEX,yBAA0B;YAE1B;YAID,YACL,WAAW;EAaf;qBAUmB;qBAEA,iBAAiB;qBAEjB,YAAY;WAEtB,OAAO,eAAe,qBAAqB;WAE3C;WAEA;;;;;EAMT;;;;;;EASA,SAAS;;;;;;;EAUT,eAAe;EAMf,MAAM,eAAe,kBAAkB;EAOvC,SAAS,gBAAgB;EAYzB;EAIA,wBAAwB;EAQxB,WAAW;EA8BX,MACI,UAAU,iBAEV,OAAO,GACP,yBACA;YAmBM,mBACN,UAAU,oBACZ,OAAO,IAAK;EASd,0BAA0B,OAAO;EAMjC;EAIA,eAAe;EAMf;EAIA;;;;KC9MQ;;;;;;;EAOR,UAAU,eAAe,qBAAqB;;;;;;;;EAQ9C,YAAY;EACZ,cAAc;EACd,mBAAmB;;;;cCbV,OAAQ;;;cCFR,OAAQ;;;cCAR,QAAS;;;cCAT,IAAK;;;;;;;;iBCyCF,eAAe,eAAgB;;;cCpClC,QAAS;;;KCFV;EACR;IACA;cAES,uBAAuB;YACtB,SAAS;cAKf,WAAW,kBACX,SAAS;EAQb;EAIA,iBAAiB;EAIjB,YAAY;EAIH;EAIT,OAAO,eAAe,qBAAqB;EAQlC,SAAS;EAUlB;EAWA;;;;UCnEa,2BAA2B;EACxC,SAAS;EACT,UAAU;;;;uBCFQ,iCAAiC;EAC5C;EAEA;EAIP;EAOA,SAAS;EAIT,UAAU;WAMD;;;;cCxBA,0BAA0B;EACnC;;;;UCAa,qBAAqB;EAClC,IAAI,eAAe,UAAU;;;;uBCCX,2BAA2B;YACnC,WAAW;YAEX,OAAQ,kBAAkB;YAI3B,YACL,WAAW;EAQf;qBAMmB;qBAEA,YAAY;WAEtB;EAIT,IAAI,eAAe,UAAU;;;;EAS7B;YAYU,eAAe;;;;KCrDjB;EACR;EACA,eAAe;;cAGN,oBAAoB;YACnB,SAAU;cAGhB,WAAW,kBACX,SAAS;EAOb,YAAY;EAQZ;EAQA;;;;;;;KCzBQ;;;;;;;EAOR;;;;;EAMA,UAAU;;;;;;UAOG;EACb;EACA;;;;;;;UAQa,aACb;EAEA,WAAY;EAEZ,QAAS;EAET,SAAU;EAEV,YAAa;EAEb,MAAO;;;;;;;EAQP,QAAQ,OAAO,QAAQ,UAAU,iBAAiB;EAElD;;;;;;;KAQQ;;;;EAIR;;;;EAIA;;;;EAIA;;;;EAIA;EACA;EACA;;;;;EAKA;;;;UC1Fa,0BAA0B;EACvC,IAAI;EAEJ,WAAW;;KAGH,kBACR,kBACA;KAGQ;;;;EAIR;;;;;;;;EASA,gBAAgB;;KAGR,0BAA0B;EAClC,OAAO;;;;uBC3BW,gCAAgC;;;;;;;;;;;YAWxC;IACN;IACA;IACA;;YAGM,eAAgB;YAIjB,YAAa,UAAS;;;;;;;EAa/B,WAAW;EAMX;WAMS;EAIT,IAAI;EA6BJ,IAAI;;;;EAOJ;;;;cCvFS,yBAAyB;YACxB,SAAU;cAIR,UAAS;EAQrB;;;;UCba,uBAAuB;EACpC,IAAI,eAAe,cAAc;;;;uBCCf,6BAA6B;YACrC,WAAW;;;;;;YAOX;IAAU;IAAc,cAAc;;YAIvC,YACL,WAAW;EAQf;qBAMmB;qBAEA,YAAY;WAEtB;EAIT,IAAI,eAAe,cAAc;;;;EASjC;EAeA,WAAW;;;;KC7DH;EACR;EACA,eAAe;;cAGN,sBAAsB;YACrB,SAAU;cAGhB,WAAW,kBACX,SAAS;EAOb,YAAY;EAQZ;EAQA;;;;KCrBQ,iBAAiB;EACzB;;;;;;EAOA,gBAAgB;;cAGP,mBAAmB,aAAa;WACzB,WAAY;WAEZ,QAAS;WAET,SAAU;WAEV,YAAa;WAEb,MAAO;cAIX,SAAS;EA4BrB;;;;;;EAeA,QAAQ,OAAO,QAAQ,UAAS,iBAAuB;;;;KCxE/C,2BAA2B;cAE1B,yBAAyB,eAAe,iBACrD,cAAc;YACA,SAAS;YAET,SAAS;cAGf,SAAS,gBACT,UAAS;EAMb,WAAW,MAAM,SAAS;EAM1B,YAAY,MAAM,UAAU;;;;cCfnB,0BAA0B,gBAAgB,kBACnD,eAAe;YACL,SAAU;YAEV,SAAU;YAEV,qBAAsB;cAG5B,SAAS,iBACT,UAAS;EAQb,iBAAiB,MAAM,OAAO,oBAAoB,SAAS;EAgB3D,oBAAoB,MAAM,OAAO,oBAAoB,aAAa;EAqBlE,oBAAoB,MAAM,OAAO,oBAAoB,aAAa;EAIlE,yBAAyB,MAAM,OAAO,oBAAoB,mBAAmB;EAI7E,uBAAuB,MAAM,OAAO,oBAAoB,gBAAgB;EAIxE,4BAA4B,MAAM,OAAO,oBAAoB,sBAAsB;EAInF,kBAAkB,MAAM,OAAO,oBAAoB,mBAAmB;EAItE,cAAc,MAAM,OAAO,oBAAoB,iBAAiB;EAIhE,iBAAiB,MAAM,OAAO,oBAAoB,qBAAqB;EAIvE,eAAe,MAAM,OAAO,oBAAoB,yBAAyB;EAMzE,mBAAmB;EAMnB,qBAAqB,MAAM,OAAO,oBAAoB,YAAY,SAAS,WAAW;EAYtF,sBAAsB,MAAM,OAAO,oBAAoB,wBAAwB;EAI/E,yBAAyB,MAAM,OAAO,oBAAoB,4BAA4B;EAItF,oBAAoB,MAAM,OAAO,oBAAoB,sBAAsB;EAI3E,uBAAuB,MAAM,OAAO,oBAAoB,0BAA0B;EAIlF,oBAAoB,MAAM,OAAO,oBAAoB,qBAAqB;EAI1E,uBAAuB,MAAM,OAAO,oBAAoB,yBAAyB;EAIjF,iBAAiB,MAAM,OAAO,oBAAoB,OAAO,mBAAmB;EAqB5E,aAAa,MAAM,UAAU;EAqD7B,YAAY,MAAM,SAAS;;;;;;YAWjB,QAAQ,mBAAmB,kBAAkB,mBAAoB;;;;;YA2CjE,cAAc,eAAe,gBAAgB,eAAgB;YA+B7D,UAAU,eAAe,iBAAiB,oBAAmB;;;;;;YAe7D,gBAAgB,eAAe,gBAAgB,oBAAqB;;;;;;;YAUpE,kBAAkB,eAAe;YAIjC,oBAAoB;;;;KC5UtB,2BAA2B;cAE1B,6BAA6B,mBAAmB;YAC/C,SAAS;YAET,SAAS;cAGf,SAAS,oBACT,UAAS;EAMb,gBAAgB,MAAM,aAAa;;;;KCV3B,6BAA6B;cAE5B,4BAA4B,kBAAkB,oBAC3D,iBAAiB;YACH,SAAS;YAET,SAAS;cAGf,SAAS,mBACT,UAAS;EAMb,cAAc,MAAM,WAAW;EAM/B,eAAe,MAAM,YAAY;;;;KCtBzB,yBAAyB;cAExB,wBAAwB,cAAc,eACnD,aAAa;YACC,SAAS;YAET,SAAS;cAGf,SAAS,cACT,UAAS;EAMb,UAAU,MAAM,OAAO;EAMvB,WAAW,MAAM,QAAQ;;;;cCMhB,wBAAwB,cAAc,eAC/C,eAAe,iBACf,cAAc,iBACd,gBAAgB,kBAChB,eAAe,kBACf,mBAAmB,qBACnB,kBAAkB,oBAClB,iBAAiB,oBACjB,cAAc,eACd,aAAa;YACH,WAAY;YAEZ,SAAS;WAEH,QAAS;WAET,SAAU;WAEV,YAAa;WAEb,WAAY;WAEZ,OAAQ;cAIZ,SAAS,cAAc,UAAS;EAa5C,WAAW,OAAO,QAAQ;EAU1B,YAAY,MAAM,SAAS;EAI3B,WAAW,MAAM,QAAQ;EAIzB,aAAa,MAAM,UAAU;EAI7B,YAAY,MAAM,SAAU;EAI5B,gBAAgB,MAAM,aAAa;EAInC,eAAe,OAAO,YAAa;EAInC,cAAc,MAAM,WAAW;EAI/B,WAAW,MAAM,QAAQ;EAIzB,UAAU,MAAM,OAAO"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/helpers/relation-alias.ts","../src/helpers/field.ts","../src/helpers/like.ts","../src/helpers/name-split.ts","../src/helpers/param-placeholder-indexer.ts","../src/types.ts","../src/helpers/root-alias.ts","../src/visitor/types.ts","../src/adapter/filters/types.ts","../src/adapter/filters/base.ts","../src/dialect/types.ts","../src/dialect/mssql.ts","../src/dialect/mysql.ts","../src/dialect/oracle.ts","../src/dialect/pg.ts","../src/dialect/resolve.ts","../src/dialect/sqlite.ts","../src/adapter/filters/module.ts","../src/adapter/pagination/types.ts","../src/adapter/pagination/base.ts","../src/adapter/pagination/module.ts","../src/adapter/sort/types.ts","../src/adapter/sort/base.ts","../src/adapter/sort/module.ts","../src/adapter/types.ts","../src/adapter/relations/types.ts","../src/adapter/relations/base.ts","../src/adapter/relations/module.ts","../src/adapter/fields/types.ts","../src/adapter/fields/base.ts","../src/adapter/fields/module.ts","../src/adapter/module.ts","../src/visitor/fields.ts","../src/visitor/filters.ts","../src/visitor/pagination.ts","../src/visitor/relations.ts","../src/visitor/sort.ts","../src/visitor/module.ts"],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -206,6 +206,18 @@ var FiltersBaseAdapter = class {
206
206
  isCaseFoldable(_field) {
207
207
  return true;
208
208
  }
209
+ /**
210
+ * Resolve a parsed field name to the identifier the database knows.
211
+ * Backends with column metadata override this to map property names
212
+ * to column names (e.g. `realmId` -> `realm_id`); the default is the
213
+ * identity, matching schemaless SQL usage.
214
+ *
215
+ * @param name last path segment (property name)
216
+ * @param relationPath dotted relation prefix, if any
217
+ */
218
+ resolveFieldName(name, _relationPath) {
219
+ return name;
220
+ }
209
221
  where(field, operator, value) {
210
222
  return this.whereRaw(`${this.buildField(field)} ${operator} ${this.buildParamPlaceholder()}`, value);
211
223
  }
@@ -227,8 +239,9 @@ var FiltersBaseAdapter = class {
227
239
  if (inputNormalized.split(".").includes(ITSELF)) throw AdapterError.featureUnsupported("filters:itself");
228
240
  const output = parseField(inputNormalized, this.rootAlias(), (path) => this.relations.buildAlias(path));
229
241
  if (output.relation) this.relations.add(output.relation);
230
- if (output.prefix) return `${this.escapeField(output.prefix)}.${this.escapeField(output.name)}`;
231
- return this.escapeField(output.name);
242
+ const name = this.resolveFieldName(output.name, output.relation);
243
+ if (output.prefix) return `${this.escapeField(output.prefix)}.${this.escapeField(name)}`;
244
+ return this.escapeField(name);
232
245
  }
233
246
  merge(query, operator = "and", isInverted = false) {
234
247
  if (query.conditions.length > 0) {
@@ -703,6 +716,18 @@ var SortBaseAdapter = class {
703
716
  clear() {
704
717
  this.value = {};
705
718
  }
719
+ /**
720
+ * Resolve a parsed field name to the identifier the database knows.
721
+ * Backends with column metadata override this to map property names
722
+ * to column names (e.g. `realmId` -> `realm_id`); the default is the
723
+ * identity, matching schemaless SQL usage.
724
+ *
725
+ * @param name last path segment (property name)
726
+ * @param relationPath dotted relation prefix, if any
727
+ */
728
+ resolveFieldName(name, _relationPath) {
729
+ return name;
730
+ }
706
731
  add(input, value) {
707
732
  const name = this.normalizeField(input);
708
733
  this.value[name] = value;
@@ -722,8 +747,9 @@ var SortBaseAdapter = class {
722
747
  normalizeField(input) {
723
748
  const output = parseField(input, this.rootAlias(), (path) => this.relations.buildAlias(path));
724
749
  if (output.relation) this.relations.add(output.relation);
725
- if (output.prefix) return `${this.escapeField(output.prefix)}.${this.escapeField(output.name)}`;
726
- return this.escapeField(output.name);
750
+ const name = this.resolveFieldName(output.name, output.relation);
751
+ if (output.prefix) return `${this.escapeField(output.prefix)}.${this.escapeField(name)}`;
752
+ return this.escapeField(name);
727
753
  }
728
754
  };
729
755
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/helpers/name-split.ts","../src/helpers/relation-alias.ts","../src/helpers/field.ts","../src/helpers/like.ts","../src/helpers/param-placeholder-indexer.ts","../src/helpers/root-alias.ts","../src/adapter/fields/base.ts","../src/adapter/fields/module.ts","../src/adapter/filters/base.ts","../src/adapter/filters/module.ts","../src/visitor/fields.ts","../src/visitor/filters.ts","../src/visitor/pagination.ts","../src/visitor/relations.ts","../src/visitor/sort.ts","../src/visitor/module.ts","../src/adapter/pagination/base.ts","../src/adapter/pagination/module.ts","../src/adapter/relations/base.ts","../src/adapter/relations/module.ts","../src/adapter/sort/base.ts","../src/adapter/sort/module.ts","../src/adapter/module.ts","../src/dialect/mssql.ts","../src/dialect/mysql.ts","../src/dialect/oracle.ts","../src/dialect/pg.ts","../src/dialect/sqlite.ts","../src/dialect/resolve.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport function splitFirst(input: string) : [string, string | undefined] {\n const separatorIndex = input.indexOf('.');\n\n if (separatorIndex === -1) {\n return [input, ''];\n }\n\n return [\n input.substring(0, separatorIndex),\n input.substring(separatorIndex + 1),\n ];\n}\n\nexport function splitLast(input: string) : [string, string | undefined] {\n const separatorIndex = input.lastIndexOf('.');\n\n if (separatorIndex === -1) {\n return [input, ''];\n }\n\n return [\n input.substring(0, separatorIndex),\n input.substring(separatorIndex + 1),\n ];\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport type RelationAliasFn = (path: string) => string;\n\n/**\n * The tightest identifier limit among the shipped dialect presets:\n * PostgreSQL truncates identifiers to 63 bytes (silently, with a\n * NOTICE), so an alias longer than that would lose its uniqueness\n * guarantee on the way into the database.\n */\nconst MAX_ALIAS_LENGTH = 63;\n\n/**\n * FNV-1a (32 bit) — deterministic, dependency-free disambiguator for\n * aliases that exceed the identifier limit.\n */\nfunction hashPath(input: string) : string {\n let hash = 0x811c9dc5;\n for (let i = 0; i < input.length; i++) {\n hash ^= input.charCodeAt(i);\n hash = Math.imul(hash, 0x01000193);\n }\n\n return (hash >>> 0).toString(36);\n}\n\n/**\n * Default join-alias derivation: every path segment is length-prefixed\n * (e.g. `role.realm` -> `r4_role_5_realm`). Unlike replacing dots with\n * underscores, this is injective even when relation names contain `_`.\n * Aliases that would exceed the database identifier limit are bounded:\n * a readable prefix plus a hash of the full path — otherwise engines\n * such as PostgreSQL would truncate them (silently collapsing long,\n * distinct paths onto one alias).\n */\nexport function buildRelationAlias(path: string) : string {\n const segments = path.split('.');\n const alias = `r${segments.map((segment) => `${segment.length}_${segment}`).join('_')}`;\n if (alias.length <= MAX_ALIAS_LENGTH) {\n return alias;\n }\n\n const suffix = `_h${hashPath(path)}`;\n\n return `${alias.substring(0, MAX_ALIAS_LENGTH - suffix.length)}${suffix}`;\n}\n","/*\n * Copyright (c) 2025-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { splitLast } from './name-split';\nimport type { RelationAliasFn } from './relation-alias';\nimport { buildRelationAlias } from './relation-alias';\n\ntype Field = {\n prefix?: string,\n relation?: string,\n name: string\n};\n\nexport function parseField(\n input: string,\n rootAlias?: string,\n relationAlias: RelationAliasFn = buildRelationAlias,\n) : Field {\n const [relation, name] = splitLast(input);\n if (!name) {\n if (rootAlias) {\n return {\n prefix: rootAlias,\n name: relation,\n };\n }\n\n return { name: relation };\n }\n\n return {\n relation,\n prefix: relationAlias(relation),\n name,\n };\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\n/**\n * Escape LIKE pattern wildcards (incl. the MSSQL bracket range)\n * so user input matches literally under `ESCAPE '\\'`.\n */\nexport function escapeLikePattern(input: string) : string {\n return input.replace(/[\\\\%_[]/g, (character) => `\\\\${character}`);\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport class ParamPlaceholderIndexer {\n protected index : number;\n\n constructor(index?: number) {\n this.index = index ?? 0;\n }\n\n next() {\n this.index++;\n return this.index;\n }\n\n reset() {\n this.index = 0;\n }\n}\n","/*\n * Copyright (c) 2025-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { RootAliasFn } from '../types';\n\nexport function toRootAliasFn<\n TARGET extends Record<string, any> = Record<string, any>,\n>(input: string | RootAliasFn<TARGET>) : RootAliasFn<TARGET> {\n if (typeof input === 'function') {\n return input;\n }\n\n return () => input;\n}\n\nexport function isRootAliasFn(input: string | RootAliasFn) : input is RootAliasFn {\n return typeof input === 'function';\n}\n","/*\n * Copyright (c) 2025-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { FieldOperator } from '@rapiq/core';\nimport { parseField } from '../../helpers';\nimport type { RelationsBaseAdapter } from '../relations';\nimport type { IFieldsAdapter } from './types';\n\nexport abstract class FieldsBaseAdapter implements IFieldsAdapter {\n protected relations: RelationsBaseAdapter;\n\n /**\n * selection fields.\n *\n * e.g. ['name', 'project.id']\n */\n protected value : { name: string, operator?: `${FieldOperator}` }[];\n\n // -----------------------------------------------------------\n\n protected constructor(\n relations: RelationsBaseAdapter,\n ) {\n this.relations = relations;\n this.value = [];\n }\n\n // -----------------------------------------------------------\n\n clear() {\n this.value = [];\n }\n\n // -----------------------------------------------------------\n\n protected abstract rootAlias() : string | undefined;\n\n protected abstract escapeField(field: string) : string;\n\n abstract execute() : void;\n\n // -----------------------------------------------------------\n\n add(input: string, operator?: `${FieldOperator}`) {\n const name = this.buildField(input);\n\n this.value.push({ name, operator });\n }\n\n /**\n * Escaped selection columns (excluded fields are dropped).\n */\n getColumns() : string[] {\n const output : string[] = [];\n\n for (let i = 0; i < this.value.length; i++) {\n const element = this.value[i] as { name: string, operator?: `${FieldOperator}` };\n if (element.operator === FieldOperator.EXCLUDE) {\n continue;\n }\n\n output.push(element.name);\n }\n\n return output;\n }\n\n buildField(input: string) {\n const rootAlias = this.rootAlias();\n\n const output = parseField(input, rootAlias, (path) => this.relations.buildAlias(path));\n if (output.relation) {\n this.relations.add(output.relation);\n }\n\n if (output.prefix) {\n return `${this.escapeField(output.prefix)}.${this.escapeField(output.name)}`;\n }\n\n return this.escapeField(output.name);\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { RelationsAdapter } from '../relations';\nimport { FieldsBaseAdapter } from './base';\n\nexport type FieldsContainerOptions = {\n rootAlias?: string,\n escapeField?: (input: string) => string\n};\n\nexport class FieldsAdapter extends FieldsBaseAdapter {\n protected options : FieldsContainerOptions;\n\n constructor(\n relations: RelationsAdapter,\n options: FieldsContainerOptions,\n ) {\n super(relations);\n\n this.options = options;\n }\n\n escapeField(field: string) : string {\n if (this.options.escapeField) {\n return this.options.escapeField(field);\n }\n\n return field;\n }\n\n rootAlias(): string | undefined {\n if (this.options.rootAlias) {\n return this.options.rootAlias;\n }\n\n return undefined;\n }\n\n execute() {\n\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { AdapterError, ITSELF } from '@rapiq/core';\nimport { ParamPlaceholderIndexer, parseField } from '../../helpers';\nimport type { IRelationsAdapter } from '../relations';\nimport type { IFiltersAdapter } from './types';\n\nexport abstract class FiltersBaseAdapter<\n RelationsAdapter extends IRelationsAdapter = IRelationsAdapter,\n> implements IFiltersAdapter {\n /**\n * where conditions\n *\n * e.g. ['\"foo.bar\" = \"1\"' ]\n */\n conditions: string[];\n\n params : unknown[];\n\n protected relations: RelationsAdapter;\n\n protected paramPlaceholderIndexer : ParamPlaceholderIndexer;\n\n protected fieldPrefix: string;\n\n // -----------------------------------------------------------\n\n protected constructor(\n relations: RelationsAdapter,\n ) {\n this.conditions = [];\n this.params = [];\n\n this.relations = relations;\n\n this.paramPlaceholderIndexer = new ParamPlaceholderIndexer();\n this.fieldPrefix = '';\n }\n\n // -----------------------------------------------------------\n\n clear() {\n this.conditions = [];\n this.params = [];\n\n this.paramPlaceholderIndexer.reset();\n this.fieldPrefix = '';\n }\n\n // -----------------------------------------------------------\n\n protected abstract rootAlias() : string | undefined;\n\n protected abstract paramPlaceholder(index: number) : string;\n\n protected abstract escapeField(field: string) : string;\n\n abstract regexp(field: string, placeholder: string, ignoreCase: boolean) : string;\n\n abstract execute(): void;\n\n abstract child() : this;\n\n /**\n * Whether the dialect can build regular-expression conditions.\n * Anchored operators fall back to LIKE otherwise.\n */\n isRegexpSupported() : boolean {\n return true;\n }\n\n /**\n * Fold an expression for a case-insensitive equality comparison\n * (eq/ne/in/nin on strings). Dialects whose plain `=` already\n * compares case-insensitively return the input unchanged.\n */\n caseFold(input: string) : string {\n return `lower(${input})`;\n }\n\n /**\n * Whether equality comparisons on this field may case-fold at all.\n * Backends with column metadata override this to exempt non-string\n * columns — folding them is wasted work at best and a type error at\n * worst (e.g. `lower(integer)` on postgres).\n */\n isCaseFoldable(_field: string) : boolean {\n return true;\n }\n\n // -----------------------------------------------------------\n\n where(field: string, operator: string, value?: unknown) {\n return this.whereRaw(\n `${this.buildField(field)} ${operator} ${this.buildParamPlaceholder()}`,\n value,\n );\n }\n\n whereRaw(sql: string, ...values: unknown[]) {\n this.conditions.push(sql);\n\n if (values) {\n this.params.push(...values);\n }\n\n return this;\n }\n\n // -----------------------------------------------------------\n\n buildParamPlaceholder() : string {\n return this.paramPlaceholder(this.paramPlaceholderIndexer.next());\n }\n\n buildParamsPlaceholders(input: unknown[]) : string[] {\n return input.map(\n (_) => this.paramPlaceholder(this.paramPlaceholderIndexer.next()),\n );\n }\n\n // -----------------------------------------------------------\n\n buildField(input: string) : string {\n let inputNormalized : string;\n\n if (this.fieldPrefix) {\n inputNormalized = this.fieldPrefix + input;\n } else {\n inputNormalized = input;\n }\n\n // the ITSELF marker references an array element itself —\n // a joined relation row is not a scalar column, so SQL has\n // no rendering for it (dialect JSON support may follow).\n if (inputNormalized.split('.').includes(ITSELF)) {\n throw AdapterError.featureUnsupported('filters:itself');\n }\n\n const output = parseField(inputNormalized, this.rootAlias(), (path) => this.relations.buildAlias(path));\n if (output.relation) {\n this.relations.add(output.relation);\n }\n\n if (output.prefix) {\n return `${this.escapeField(output.prefix)}.${this.escapeField(output.name)}`;\n }\n\n return this.escapeField(output.name);\n }\n\n // -----------------------------------------------------------\n\n merge<\n T extends IFiltersAdapter,\n >(\n query: T,\n operator: 'and' | 'or' = 'and',\n isInverted : boolean = false,\n ) : this {\n if (query.conditions.length > 0) {\n let sql = query.conditions.join(` ${operator} `);\n\n // single conditions are atomic terms or already wrapped compounds;\n // a leading '(' says nothing about the whole expression\n // (e.g. '(a or b) or c'), so wrap by condition count.\n if (query.conditions.length > 1) {\n sql = `(${sql})`;\n }\n\n this.conditions.push(`${isInverted ? 'not ' : ''}${sql}`);\n this.params.push(...query.params);\n }\n\n return this;\n }\n\n protected setChildAttributes<\n T extends FiltersBaseAdapter,\n >(child: T) : T {\n child.setFieldPrefix(this.fieldPrefix);\n child.setLastPlaceholderIndexer(this.paramPlaceholderIndexer);\n\n return child;\n }\n\n // -----------------------------------------------------------\n\n setLastPlaceholderIndexer(input: ParamPlaceholderIndexer) {\n this.paramPlaceholderIndexer = input;\n }\n\n // -----------------------------------------------------------\n\n getFieldPrefix(): string {\n return this.fieldPrefix;\n }\n\n setFieldPrefix(prefix: string) {\n this.fieldPrefix = prefix;\n }\n\n // -----------------------------------------------------------\n\n getQuery(): string {\n return this.conditions.join(' and ');\n }\n\n getQueryAndParameters(): [string, unknown[]] {\n return [\n this.getQuery(),\n this.params,\n ];\n }\n}\n","/*\n * Copyright (c) 2025-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { AdapterError } from '@rapiq/core';\nimport type { DialectOptions } from '../../dialect';\nimport type { RelationsAdapter } from '../relations';\nimport { FiltersBaseAdapter } from './base';\n\nexport type FiltersContainerOptions = {\n rootAlias?: string,\n} & DialectOptions;\n\nexport class FiltersAdapter extends FiltersBaseAdapter {\n protected options: FiltersContainerOptions;\n\n // -----------------------------------------------------------\n\n constructor(\n relations: RelationsAdapter,\n options: FiltersContainerOptions,\n ) {\n super(relations);\n this.options = options;\n }\n\n // -----------------------------------------------------------\n\n rootAlias() : string | undefined {\n return this.options.rootAlias;\n }\n\n paramPlaceholder(index: number) {\n return this.options.paramPlaceholder(index);\n }\n\n escapeField(field: string) : string {\n return this.options.escapeField(field);\n }\n\n override isRegexpSupported() : boolean {\n return typeof this.options.regexp !== 'undefined';\n }\n\n regexp(field: string, placeholder: string, ignoreCase: boolean) : string {\n if (!this.options.regexp) {\n throw AdapterError.featureUnsupported('regexp');\n }\n\n return this.options.regexp(field, placeholder, ignoreCase);\n }\n\n override caseFold(input: string) : string {\n if (this.options.caseFold) {\n return this.options.caseFold(input);\n }\n\n return super.caseFold(input);\n }\n\n // -----------------------------------------------------------\n\n child() : this {\n const child = new FiltersAdapter(\n this.relations as unknown as RelationsAdapter,\n this.options,\n );\n\n this.setChildAttributes(child);\n\n return child as this;\n }\n\n execute() {\n\n }\n}\n","/*\n * Copyright (c) 2025-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type {\n FieldOperator, \n IField, \n IFieldVisitor, \n IFields, \n IFieldsVisitor,\n} from '@rapiq/core';\nimport type { IFieldsAdapter } from '../adapter';\nimport type { VisitorOptions } from './types';\n\nexport type FieldsInterpreterOptions = VisitorOptions;\n\nexport class FieldsVisitor implements IFieldsVisitor<IFieldsAdapter>,\nIFieldVisitor<IFieldsAdapter> {\n protected adapter: IFieldsAdapter;\n\n protected options: FieldsInterpreterOptions = {};\n\n constructor(\n adapter: IFieldsAdapter,\n options: FieldsInterpreterOptions = {},\n ) {\n this.adapter = adapter;\n this.options = options;\n }\n\n visitField(expr: IField): IFieldsAdapter {\n this.adapter.add(expr.name, expr.operator as FieldOperator);\n\n return this.adapter;\n }\n\n visitFields(expr: IFields): IFieldsAdapter {\n for (const item of expr.value) {\n item.accept(this);\n }\n\n return this.adapter;\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type {\n IFilterVisitor,\n IFiltersVisitor,\n} from '@rapiq/core';\nimport {\n AdapterError,\n Filter,\n FilterFieldOperator,\n\n FilterRegexFlag,\n Filters,\n createFilterRegex,\n} from '@rapiq/core';\nimport type { IFiltersAdapter } from '../adapter';\nimport { escapeLikePattern } from '../helpers';\nimport type { VisitorOptions } from './types';\n\nexport class FiltersVisitor implements IFiltersVisitor<IFiltersAdapter>,\n IFilterVisitor<IFiltersAdapter> {\n protected adapter : IFiltersAdapter;\n\n protected options : VisitorOptions;\n\n protected caseSensitiveFields : Set<string>;\n\n constructor(\n adapter: IFiltersAdapter,\n options: VisitorOptions = {},\n ) {\n this.adapter = adapter;\n this.options = options;\n\n this.caseSensitiveFields = new Set(options.caseSensitive || []);\n }\n\n visitFilterEqual(expr: Filter<FilterFieldOperator.EQUAL>): IFiltersAdapter {\n if (expr.value === null) {\n return this.adapter.whereRaw(`${this.adapter.buildField(expr.field)} is null`);\n }\n\n if (this.isCaseInsensitive(expr.field, expr.value)) {\n const field = this.adapter.buildField(expr.field);\n return this.adapter.whereRaw(\n `${this.adapter.caseFold(field)} = ${this.adapter.caseFold(this.adapter.buildParamPlaceholder())}`,\n expr.value,\n );\n }\n\n return this.adapter.where(expr.field, '=', expr.value);\n }\n\n visitFilterNotEqual(expr: Filter<FilterFieldOperator.NOT_EQUAL>): IFiltersAdapter {\n const field = this.adapter.buildField(expr.field);\n if (expr.value === null) {\n return this.adapter.whereRaw(`${field} is not null`);\n }\n\n if (this.isCaseInsensitive(expr.field, expr.value)) {\n return this.whereComplement(\n field,\n `${this.adapter.caseFold(field)} <> ${this.adapter.caseFold(this.adapter.buildParamPlaceholder())}`,\n expr.value,\n );\n }\n\n return this.whereComplement(\n field,\n `${field} <> ${this.adapter.buildParamPlaceholder()}`,\n expr.value,\n );\n }\n\n visitFilterLessThan(expr: Filter<FilterFieldOperator.LESS_THAN>): IFiltersAdapter {\n return this.adapter.where(expr.field, '<', expr.value);\n }\n\n visitFilterLessThanEqual(expr: Filter<FilterFieldOperator.LESS_THAN_EQUAL>): IFiltersAdapter {\n return this.adapter.where(expr.field, '<=', expr.value);\n }\n\n visitFilterGreaterThan(expr: Filter<FilterFieldOperator.GREATER_THAN>): IFiltersAdapter {\n return this.adapter.where(expr.field, '>', expr.value);\n }\n\n visitFilterGreaterThanEqual(expr: Filter<FilterFieldOperator.GREATER_THAN_EQUAL>): IFiltersAdapter {\n return this.adapter.where(expr.field, '>=', expr.value);\n }\n\n visitFilterExists(expr: Filter<FilterFieldOperator.EXISTS, boolean>): IFiltersAdapter {\n return this.adapter.whereRaw(`${this.adapter.buildField(expr.field)} is ${expr.value ? 'not ' : ''}null`);\n }\n\n visitFilterIn(expr: Filter<FilterFieldOperator.IN, unknown[]>): IFiltersAdapter {\n return this.whereIn(expr.field, expr.value, false);\n }\n\n visitFilterNotIn(expr: Filter<FilterFieldOperator.NOT_IN, unknown[]>): IFiltersAdapter {\n return this.whereIn(expr.field, expr.value, true);\n }\n\n visitFilterMod(expr: Filter<FilterFieldOperator.MOD, [number, number]>): IFiltersAdapter {\n const params = this.adapter.buildParamsPlaceholders(expr.value);\n const sql = `mod(${this.adapter.buildField(expr.field)}, ${params[0]}) = ${params[1]}`;\n return this.adapter.whereRaw(sql, ...expr.value);\n }\n\n visitFilterSize(): IFiltersAdapter {\n // no SQL rendering yet — an array-length check needs per-dialect\n // JSON-array support (json_array_length/JSON_LENGTH/cardinality).\n throw AdapterError.featureUnsupported('filters:size');\n }\n\n visitFilterElemMatch(expr: Filter<FilterFieldOperator.ELEM_MATCH, Filter | Filters>): IFiltersAdapter {\n const oldPrefix = this.adapter.getFieldPrefix();\n\n this.adapter.setFieldPrefix(`${oldPrefix}${expr.field}.`);\n\n expr.value.accept(this);\n\n this.adapter.setFieldPrefix(oldPrefix);\n\n return this.adapter;\n }\n\n visitFilterStartsWith(expr: Filter<FilterFieldOperator.STARTS_WITH, unknown>): IFiltersAdapter {\n return this.whereAnchored(expr.field, expr.value, FilterRegexFlag.STARTS_WITH);\n }\n\n visitFilterNotStartsWith(expr: Filter<FilterFieldOperator.NOT_STARTS_WITH, unknown>): IFiltersAdapter {\n return this.whereAnchored(expr.field, expr.value, FilterRegexFlag.STARTS_WITH | FilterRegexFlag.NEGATION);\n }\n\n visitFilterEndsWith(expr: Filter<FilterFieldOperator.ENDS_WITH, unknown>): IFiltersAdapter {\n return this.whereAnchored(expr.field, expr.value, FilterRegexFlag.ENDS_WITH);\n }\n\n visitFilterNotEndsWith(expr: Filter<FilterFieldOperator.NOT_ENDS_WITH, unknown>): IFiltersAdapter {\n return this.whereAnchored(expr.field, expr.value, FilterRegexFlag.ENDS_WITH | FilterRegexFlag.NEGATION);\n }\n\n visitFilterContains(expr: Filter<FilterFieldOperator.CONTAINS, unknown>): IFiltersAdapter {\n return this.whereAnchored(expr.field, expr.value, FilterRegexFlag.CONTAINS);\n }\n\n visitFilterNotContains(expr: Filter<FilterFieldOperator.NOT_CONTAINS, unknown>): IFiltersAdapter {\n return this.whereAnchored(expr.field, expr.value, FilterRegexFlag.CONTAINS | FilterRegexFlag.NEGATION);\n }\n\n visitFilterRegex(expr: Filter<FilterFieldOperator.REGEX, RegExp | string>): IFiltersAdapter {\n const isRegExp = expr.value instanceof RegExp;\n\n // anything else (a cross-realm RegExp, a number, null) must not be\n // bound raw as the pattern parameter — fail typed, like @rapiq/memory.\n if (!isRegExp && typeof expr.value !== 'string') {\n throw AdapterError.featureUnsupported('filters:regex:value');\n }\n\n const source = isRegExp ? expr.value.source : expr.value;\n const ignoreCase = isRegExp ? expr.value.ignoreCase : false;\n\n const sql = this.adapter.regexp(\n this.adapter.buildField(expr.field),\n this.adapter.buildParamPlaceholder(),\n ignoreCase,\n );\n\n return this.adapter.whereRaw(sql, source);\n }\n\n visitFilters(expr: Filters): IFiltersAdapter {\n const adapter = this.adapter.child();\n const visitor = new FiltersVisitor(\n adapter,\n this.options,\n );\n\n for (let i = 0; i < expr.value.length; i++) {\n const child = expr.value[i];\n if (child instanceof Filter) {\n child.accept(visitor);\n }\n\n if (child instanceof Filters) {\n child.accept(visitor);\n }\n }\n\n switch (expr.operator) {\n case 'or': {\n this.adapter.merge(\n adapter,\n 'or',\n );\n break;\n }\n case 'nor': {\n this.adapter.merge(\n adapter,\n 'or',\n true,\n );\n break;\n }\n case 'not': {\n this.adapter.merge(\n adapter,\n 'and',\n true,\n );\n break;\n }\n default: {\n this.adapter.merge(\n adapter,\n 'and',\n );\n }\n }\n\n return adapter;\n }\n\n visitFilter(expr: Filter): IFiltersAdapter {\n throw AdapterError.operatorUnsupported(expr.operator);\n }\n\n // -----------------------------------------------------------\n\n /**\n * Render an IN/NOT IN condition.\n * A null element also matches the absence of a value (IS NULL);\n * an empty list matches no row (every row when negated).\n */\n protected whereIn(fieldName: string, input: unknown[], negated: boolean) : IFiltersAdapter {\n if (input.length === 0) {\n return this.adapter.whereRaw(negated ? '1 = 1' : '1 = 0');\n }\n\n const values = input.filter((value) => value !== null);\n const field = this.adapter.buildField(fieldName);\n const nullCondition = `${field} is ${negated ? 'not ' : ''}null`;\n if (values.length === 0) {\n return this.adapter.whereRaw(nullCondition);\n }\n\n let inCondition : string;\n if (\n this.isCaseFoldableField(fieldName) &&\n values.some((value) => typeof value === 'string')\n ) {\n const placeholders = values.map((value) => {\n const placeholder = this.adapter.buildParamPlaceholder();\n return typeof value === 'string' ? this.adapter.caseFold(placeholder) : placeholder;\n });\n inCondition = `${this.adapter.caseFold(field)} ${negated ? 'not ' : ''}in(${placeholders.join(', ')})`;\n } else {\n inCondition = `${field} ${negated ? 'not ' : ''}in(${this.adapter.buildParamsPlaceholders(values).join(', ')})`;\n }\n if (values.length === input.length) {\n if (negated) {\n return this.whereComplement(field, inCondition, ...values);\n }\n\n return this.adapter.whereRaw(inCondition, ...values);\n }\n\n return this.adapter.whereRaw(\n `(${inCondition} ${negated ? 'and' : 'or'} ${nullCondition})`,\n ...values,\n );\n }\n\n /**\n * Render a startsWith/endsWith/contains condition (or its negation)\n * as a regexp condition, falling back to LIKE on regexp-less dialects.\n */\n protected whereAnchored(field: string, value: unknown, flag: number) : IFiltersAdapter {\n if (!this.adapter.isRegexpSupported()) {\n const escaped = escapeLikePattern(`${value}`);\n\n let pattern : string;\n if (flag & FilterRegexFlag.STARTS_WITH) {\n pattern = `${escaped}%`;\n } else if (flag & FilterRegexFlag.ENDS_WITH) {\n pattern = `%${escaped}`;\n } else {\n pattern = `%${escaped}%`;\n }\n\n return this.whereLike(field, pattern, !!(flag & FilterRegexFlag.NEGATION));\n }\n\n const regex = createFilterRegex(`${value}`, flag);\n if (!(flag & FilterRegexFlag.NEGATION)) {\n return this.visitFilterRegex(new Filter(FilterFieldOperator.REGEX, field, regex));\n }\n\n const fieldBuilt = this.adapter.buildField(field);\n const sql = this.adapter.regexp(\n fieldBuilt,\n this.adapter.buildParamPlaceholder(),\n regex.ignoreCase,\n );\n\n return this.whereComplement(fieldBuilt, sql, regex.source);\n }\n\n protected whereLike(field: string, pattern: string, negated = false) : IFiltersAdapter {\n const fieldBuilt = this.adapter.buildField(field);\n const condition = `${fieldBuilt} ${negated ? 'not ' : ''}like ${this.adapter.buildParamPlaceholder()} escape '\\\\'`;\n if (negated) {\n return this.whereComplement(fieldBuilt, condition, pattern);\n }\n\n return this.adapter.whereRaw(condition, pattern);\n }\n\n /**\n * Render a negated condition null-inclusively. Negated operators are\n * exact complements of their positive twins (complement law), but the\n * bare SQL negation follows three-valued logic and drops NULL rows.\n */\n protected whereComplement(field: string, sql: string, ...values: unknown[]) : IFiltersAdapter {\n return this.adapter.whereRaw(`(${sql} or ${field} is null)`, ...values);\n }\n\n /**\n * Equality-family comparisons (eq/ne/in/nin) match string values\n * case-insensitively unless the field is opted out via the\n * `caseSensitive` visitor option or the adapter exempts it\n * (non-string columns never fold).\n */\n protected isCaseInsensitive(field: string, value: unknown) : boolean {\n return typeof value === 'string' && this.isCaseFoldableField(field);\n }\n\n protected isCaseFoldableField(field: string) : boolean {\n const path = `${this.adapter.getFieldPrefix()}${field}`;\n\n return !this.caseSensitiveFields.has(path) &&\n this.adapter.isCaseFoldable(path);\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IPaginationVisitor, Pagination } from '@rapiq/core';\nimport type { IPaginationAdapter } from '../adapter';\nimport type { VisitorOptions } from './types';\n\nexport type PaginationVisitorOptions = VisitorOptions;\n\nexport class PaginationVisitor implements IPaginationVisitor<IPaginationAdapter> {\n protected adapter: IPaginationAdapter;\n\n protected options: PaginationVisitorOptions = {};\n\n constructor(\n adapter: IPaginationAdapter,\n options: PaginationVisitorOptions = {},\n ) {\n this.adapter = adapter;\n this.options = options;\n }\n\n visitPagination(expr: Pagination): IPaginationAdapter {\n this.adapter.setLimit(expr.limit);\n this.adapter.setOffset(expr.offset);\n\n return this.adapter;\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type {\n IRelationVisitor, \n IRelationsVisitor, \n Relation, \n Relations,\n} from '@rapiq/core';\nimport type { IRelationsAdapter } from '../adapter';\nimport type { VisitorOptions } from './types';\n\nexport type RelationInterpreterOptions = VisitorOptions;\n\nexport class RelationsVisitor implements IRelationsVisitor<IRelationsAdapter>,\nIRelationVisitor<IRelationsAdapter> {\n protected adapter: IRelationsAdapter;\n\n protected options: RelationInterpreterOptions = {};\n\n constructor(\n adapter: IRelationsAdapter,\n options: RelationInterpreterOptions = {},\n ) {\n this.adapter = adapter;\n this.options = options;\n }\n\n visitRelation(expr: Relation): IRelationsAdapter {\n this.adapter.add(expr.name);\n\n return this.adapter;\n }\n\n visitRelations(expr: Relations): IRelationsAdapter {\n for (const item of expr.value) {\n item.accept(this);\n }\n\n return this.adapter;\n }\n}\n","/*\n * Copyright (c) 2025-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type {\n ISortVisitor, \n ISortsVisitor, \n Sort, \n Sorts,\n} from '@rapiq/core';\nimport type { ISortAdapter } from '../adapter';\nimport type { VisitorOptions } from './types';\n\nexport type SortInterpreterOptions = VisitorOptions;\n\nexport class SortsVisitor implements ISortsVisitor<ISortAdapter>,\nISortVisitor<ISortAdapter> {\n protected adapter: ISortAdapter;\n\n protected options: SortInterpreterOptions;\n\n constructor(\n adapter: ISortAdapter,\n options: SortInterpreterOptions = {},\n ) {\n this.adapter = adapter;\n this.options = options;\n }\n\n visitSort(expr: Sort): ISortAdapter {\n this.adapter.add(expr.name, expr.operator);\n\n return this.adapter;\n }\n\n visitSorts(expr: Sorts): ISortAdapter {\n for (const item of expr.value) {\n item.accept(this);\n }\n\n return this.adapter;\n }\n}\n","/*\n * Copyright (c) 2025-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type {\n Field,\n Fields,\n Filter,\n Filters,\n IFieldVisitor,\n IFieldsVisitor,\n IFilterVisitor,\n IFiltersVisitor,\n IPaginationVisitor,\n IQueryVisitor,\n IRelationVisitor,\n IRelationsVisitor,\n ISortVisitor,\n ISortsVisitor,\n Pagination,\n Query, \n Relation, \n Relations, \n Sort, \n Sorts,\n} from '@rapiq/core';\nimport type {\n IFieldsAdapter,\n IFiltersAdapter,\n IPaginationAdapter,\n IRelationsAdapter,\n IRootAdapter,\n ISortAdapter,\n} from '../adapter';\nimport { FieldsVisitor } from './fields';\nimport { FiltersVisitor } from './filters';\nimport { PaginationVisitor } from './pagination';\nimport { RelationsVisitor } from './relations';\nimport { SortsVisitor } from './sort';\nimport type { VisitorOptions } from './types';\n\nexport class QueryVisitor implements IQueryVisitor<IRootAdapter>,\n IFieldsVisitor<IFieldsAdapter>,\n IFieldVisitor<IFieldsAdapter>,\n IFiltersVisitor<IFiltersAdapter>,\n IFilterVisitor<IFiltersAdapter>,\n IPaginationVisitor<IPaginationAdapter>,\n IRelationsVisitor<IRelationsAdapter>,\n IRelationVisitor<IRelationsAdapter>,\n ISortsVisitor<ISortAdapter>,\n ISortVisitor<ISortAdapter> {\n protected container : IRootAdapter;\n\n protected options: VisitorOptions;\n\n public readonly fields : FieldsVisitor;\n\n public readonly filters : FiltersVisitor;\n\n public readonly pagination : PaginationVisitor;\n\n public readonly relations : RelationsVisitor;\n\n public readonly sorts : SortsVisitor;\n\n // -----------------------------------------------------------\n\n constructor(adapter: IRootAdapter, options: VisitorOptions = {}) {\n this.container = adapter;\n this.options = options;\n\n this.fields = new FieldsVisitor(adapter.fields, options);\n this.filters = new FiltersVisitor(adapter.filters, options);\n this.pagination = new PaginationVisitor(adapter.pagination, options);\n this.relations = new RelationsVisitor(adapter.relations, options);\n this.sorts = new SortsVisitor(adapter.sort, options);\n }\n\n // -----------------------------------------------------------\n\n visitQuery(input: Query): IRootAdapter {\n input.relations.accept(this.relations);\n input.fields.accept(this.fields);\n input.filters.accept(this.filters);\n input.pagination.accept(this.pagination);\n input.sorts.accept(this.sorts);\n\n return this.container;\n }\n\n visitFields(expr: Fields): IFieldsAdapter {\n return expr.accept(this.fields);\n }\n\n visitField(expr: Field): IFieldsAdapter {\n return expr.accept(this.fields);\n }\n\n visitFilters(expr: Filters): IFiltersAdapter {\n return expr.accept(this.filters);\n }\n\n visitFilter(expr: Filter) : IFiltersAdapter {\n return expr.accept(this.filters);\n }\n\n visitPagination(expr: Pagination): IPaginationAdapter {\n return expr.accept(this.pagination);\n }\n\n visitRelations(input: Relations) : IRelationsAdapter {\n return input.accept(this.relations);\n }\n\n visitRelation(expr: Relation): IRelationsAdapter {\n return expr.accept(this.relations);\n }\n\n visitSorts(expr: Sorts): ISortAdapter {\n return expr.accept(this.sorts);\n }\n\n visitSort(expr: Sort): ISortAdapter {\n return expr.accept(this.sorts);\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IPaginationAdapter } from './types';\n\nexport abstract class PaginationBaseAdapter implements IPaginationAdapter {\n public limit : number | undefined;\n\n public offset : number | undefined;\n\n // -----------------------------------------------------------\n\n clear() {\n this.limit = undefined;\n this.offset = undefined;\n }\n\n // -----------------------------------------------------------\n\n setLimit(limit?: number) {\n this.limit = limit;\n }\n\n setOffset(offset?: number) {\n this.offset = offset;\n }\n\n // -----------------------------------------------------------\n\n abstract execute() : void;\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { PaginationBaseAdapter } from './base';\n\nexport class PaginationAdapter extends PaginationBaseAdapter {\n execute() {\n\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { RelationAliasFn } from '../../helpers';\nimport { buildRelationAlias, splitFirst } from '../../helpers';\nimport type { IRelationsAdapter, RelationsAdapterBaseOptions } from './types';\n\nexport abstract class RelationsBaseAdapter implements IRelationsAdapter {\n /**\n * joins\n *\n * [alias].project.user.name\n *\n * JOIN xxx.yyy as yyy\n *\n * { path: \"xxx.zzz\", name: \"zzz\" }[]\n * @protected\n */\n protected value : {\n path: string,\n name: string,\n executed?: boolean\n }[];\n\n protected relationAlias : RelationAliasFn;\n\n // -----------------------------------------------------------\n\n protected constructor(options: RelationsAdapterBaseOptions = {}) {\n this.value = [];\n this.relationAlias = options.relationAlias ?? buildRelationAlias;\n }\n\n // -----------------------------------------------------------\n\n /**\n * Join alias for a relation path (e.g. `role.realm` ->\n * `r4_role_5_realm`).\n * The single derivation point shared by join application and the\n * field references built by the fields/filters/sort adapters.\n */\n buildAlias(path: string) : string {\n return this.relationAlias(path);\n }\n\n // -----------------------------------------------------------\n\n clear() {\n this.value = [];\n }\n\n // -----------------------------------------------------------\n\n abstract execute() : void;\n\n // -----------------------------------------------------------\n\n add(relation: string) {\n if (this.has(relation)) {\n return true;\n }\n\n let path : string | undefined;\n let last : string | undefined = relation;\n\n while (last) {\n let relationName: string;\n [relationName, last] = splitFirst(last);\n\n path = path ?\n `${path}.${relationName}` :\n relationName;\n\n if (this.has(path)) {\n continue;\n }\n\n this.value.push({\n path,\n name: relationName,\n });\n }\n\n return true;\n }\n\n has(name: string) {\n return this.value.some((join) => join.path === name);\n }\n\n /**\n * Canonical relation paths (parents included), e.g. ['items', 'items.realm'].\n */\n getPaths() : string[] {\n return this.value.map((join) => join.path);\n }\n}\n","/*\n * Copyright (c) 2025-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { RelationsBaseAdapter } from './base';\nimport type { RelationsAdapterOptions } from './types';\n\nexport class RelationsAdapter extends RelationsBaseAdapter {\n protected options : RelationsAdapterOptions;\n\n // -----------------------------------------------------------\n\n constructor(options: RelationsAdapterOptions = {}) {\n super(options);\n\n this.options = options;\n }\n\n // -----------------------------------------------------------\n\n execute() {\n\n }\n}\n","/*\n * Copyright (c) 2025-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { SortDirection } from '@rapiq/core';\nimport { parseField } from '../../helpers';\nimport type { RelationsBaseAdapter } from '../relations';\nimport type { ISortAdapter } from './types';\n\nexport abstract class SortBaseAdapter implements ISortAdapter {\n protected relations: RelationsBaseAdapter;\n\n protected value : Record<string, `${SortDirection}`>;\n\n // -----------------------------------------------------------\n\n protected constructor(\n relations: RelationsBaseAdapter,\n ) {\n this.relations = relations;\n this.value = {};\n }\n\n // -----------------------------------------------------------\n\n clear() {\n this.value = {};\n }\n\n // -----------------------------------------------------------\n\n protected abstract rootAlias() : string | undefined;\n\n protected abstract escapeField(field: string) : string;\n\n abstract execute() : void;\n\n // -----------------------------------------------------------\n\n add(input: string, value: `${SortDirection}`) {\n const name = this.normalizeField(input);\n\n this.value[name] = value;\n }\n\n /**\n * Escaped ORDER BY entries, e.g. ['\"user\".\"age\" DESC'].\n */\n getOrderBy() : string[] {\n const keys = Object.keys(this.value);\n const output : string[] = [];\n\n for (const key_ of keys) {\n const key = key_ as string;\n output.push(`${key} ${this.value[key]}`);\n }\n\n return output;\n }\n\n protected normalizeField(input: string) {\n const output = parseField(input, this.rootAlias(), (path) => this.relations.buildAlias(path));\n if (output.relation) {\n this.relations.add(output.relation);\n }\n\n if (output.prefix) {\n return `${this.escapeField(output.prefix)}.${this.escapeField(output.name)}`;\n }\n\n return this.escapeField(output.name);\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { RelationsAdapter } from '../relations';\nimport { SortBaseAdapter } from './base';\n\nexport type SortContainerOptions = {\n rootAlias?: string,\n escapeField?: (input: string) => string\n};\n\nexport class SortAdapter extends SortBaseAdapter {\n protected options : SortContainerOptions;\n\n constructor(\n relations: RelationsAdapter,\n options: SortContainerOptions,\n ) {\n super(relations);\n\n this.options = options;\n }\n\n escapeField(field: string) : string {\n if (this.options.escapeField) {\n return this.options.escapeField(field);\n }\n\n return field;\n }\n\n rootAlias(): string | undefined {\n if (this.options.rootAlias) {\n return this.options.rootAlias;\n }\n\n return undefined;\n }\n\n execute() {\n\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IQuery } from '@rapiq/core';\nimport { QueryVisitor } from '../visitor';\nimport type { DialectOptions } from '../dialect';\nimport type { RelationAliasFn } from '../helpers';\nimport type {\n ExecuteOptions,\n IRootAdapter,\n SqlFragments,\n} from './types';\nimport { FieldsAdapter } from './fields';\nimport { FiltersAdapter } from './filters';\nimport { PaginationAdapter } from './pagination';\nimport { RelationsAdapter } from './relations';\nimport { SortAdapter } from './sort';\n\nexport type AdapterOptions = DialectOptions & {\n rootAlias?: string,\n\n /**\n * Derive the join alias for a relation path\n * (default: length-prefixed segments, e.g. `role.realm` ->\n * `r4_role_5_realm`).\n */\n relationAlias?: RelationAliasFn,\n};\n\nexport class Adapter implements IRootAdapter<SqlFragments> {\n public readonly relations : RelationsAdapter;\n\n public readonly fields : FieldsAdapter;\n\n public readonly filters : FiltersAdapter;\n\n public readonly pagination : PaginationAdapter;\n\n public readonly sort : SortAdapter;\n\n // -----------------------------------------------------------\n\n constructor(options: AdapterOptions) {\n this.relations = new RelationsAdapter({\n join: () => true,\n relationAlias: options.relationAlias,\n });\n this.fields = new FieldsAdapter(this.relations, {\n escapeField: options.escapeField,\n rootAlias: options.rootAlias,\n });\n\n this.filters = new FiltersAdapter(this.relations, {\n paramPlaceholder: options.paramPlaceholder,\n regexp: options.regexp,\n caseFold: options.caseFold,\n escapeField: options.escapeField,\n rootAlias: options.rootAlias,\n });\n\n this.pagination = new PaginationAdapter();\n\n this.sort = new SortAdapter(this.relations, {\n escapeField: options.escapeField,\n rootAlias: options.rootAlias,\n });\n }\n\n // -----------------------------------------------------------\n\n clear() {\n this.fields.clear();\n this.filters.clear();\n this.pagination.clear();\n this.sort.clear();\n this.relations.clear();\n }\n\n // -----------------------------------------------------------\n\n /**\n * Walk `query` into the sub-adapters and collect the accumulated\n * clause fragments. Plain SQL has no backend target — it returns the\n * fragments for the caller to assemble.\n */\n execute(query: IQuery, options: ExecuteOptions = {}) : SqlFragments {\n if (options.clear ?? true) {\n this.clear();\n }\n\n query.accept(new QueryVisitor(this, options.visitor));\n\n const [where, params] = this.filters.getQueryAndParameters();\n\n return {\n columns: this.fields.getColumns(),\n where,\n params,\n orderBy: this.sort.getOrderBy(),\n limit: this.pagination.limit,\n offset: this.pagination.offset,\n relations: this.relations.getPaths(),\n };\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { DialectOptions } from './types';\n\n// no regexp support: anchored operators (startsWith, endsWith, contains)\n// fall back to LIKE; the regex operator raises a typed AdapterError.\nexport const mssql : DialectOptions = {\n paramPlaceholder: () => '?',\n escapeField: (field: string) => `[${field}]`,\n // sql server's default collations (*_CI_*) already compare `=`\n // case-insensitively; skip lower() so plain indexes stay usable.\n // Override with a lower()-wrapping caseFold when columns use\n // *_CS_* / *_BIN collations.\n caseFold: (input) => input,\n};\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { DialectOptions } from './types';\n\nexport const mysql : DialectOptions = {\n regexp: (field, placeholder) => `${field} regexp ${placeholder} = 1`,\n paramPlaceholder: () => '?',\n escapeField: (field: string) => `\\`${field}\\``,\n // mysql's default collations (*_ci) already compare `=` case-\n // insensitively; skip lower() so plain indexes stay usable.\n // Override with a lower()-wrapping caseFold when columns use\n // *_bin / *_cs collations.\n caseFold: (input) => input,\n};\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { DialectOptions } from './types';\n\nexport const oracle : DialectOptions = {\n regexp: (field, placeholder, ignoreCase) => ignoreCase ?\n `regexp_like(${field}, ${placeholder}, 'i')` :\n `regexp_like(${field}, ${placeholder})`,\n escapeField: (field: string) => `\"${field}\"`,\n paramPlaceholder: (index) => `:${index}`,\n};\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { DialectOptions } from './types';\n\nexport const pg : DialectOptions = {\n regexp: (field, placeholder, ignoreCase) => {\n const operator = ignoreCase ? '~*' : '~';\n return `${field} ${operator} ${placeholder}`;\n },\n escapeField: (field: string) => `\"${field}\"`,\n paramPlaceholder: (index) => `$${index}`,\n};\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { mysql } from './mysql';\nimport type { DialectOptions } from './types';\n\n// no regexp: stock SQLite ships without a REGEXP function (it must be\n// registered by the application), so anchored operators (startsWith,\n// endsWith, contains) fall back to LIKE and the regex operator raises\n// a typed AdapterError.\nexport const sqlite : DialectOptions = {\n paramPlaceholder: mysql.paramPlaceholder,\n escapeField: mysql.escapeField,\n};\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { mssql } from './mssql';\nimport { mysql } from './mysql';\nimport { oracle } from './oracle';\nimport { pg } from './pg';\nimport { sqlite } from './sqlite';\nimport type { DialectOptions } from './types';\n\nconst presets : Record<string, DialectOptions> = {\n // postgres family\n pg,\n postgres: pg,\n postgresql: pg,\n 'aurora-postgres': pg,\n cockroachdb: pg,\n\n // mysql family\n mysql,\n mysql2: mysql,\n mariadb: mysql,\n 'aurora-mysql': mysql,\n\n // sqlite family (embedded drivers share sqlite semantics)\n sqlite,\n sqlite3: sqlite,\n 'better-sqlite3': sqlite,\n sqljs: sqlite,\n capacitor: sqlite,\n cordova: sqlite,\n 'react-native': sqlite,\n nativescript: sqlite,\n expo: sqlite,\n\n // others\n mssql,\n oracle,\n oracledb: oracle,\n};\n\n/**\n * Resolve a driver/connection type name (e.g. TypeORM's\n * `connection.options.type` or a knex client name) to the\n * matching {@link DialectOptions} preset.\n */\nexport function resolveDialect(name: string) : DialectOptions | undefined {\n return presets[name.toLowerCase()];\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/helpers/name-split.ts","../src/helpers/relation-alias.ts","../src/helpers/field.ts","../src/helpers/like.ts","../src/helpers/param-placeholder-indexer.ts","../src/helpers/root-alias.ts","../src/adapter/fields/base.ts","../src/adapter/fields/module.ts","../src/adapter/filters/base.ts","../src/adapter/filters/module.ts","../src/visitor/fields.ts","../src/visitor/filters.ts","../src/visitor/pagination.ts","../src/visitor/relations.ts","../src/visitor/sort.ts","../src/visitor/module.ts","../src/adapter/pagination/base.ts","../src/adapter/pagination/module.ts","../src/adapter/relations/base.ts","../src/adapter/relations/module.ts","../src/adapter/sort/base.ts","../src/adapter/sort/module.ts","../src/adapter/module.ts","../src/dialect/mssql.ts","../src/dialect/mysql.ts","../src/dialect/oracle.ts","../src/dialect/pg.ts","../src/dialect/sqlite.ts","../src/dialect/resolve.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport function splitFirst(input: string) : [string, string | undefined] {\n const separatorIndex = input.indexOf('.');\n\n if (separatorIndex === -1) {\n return [input, ''];\n }\n\n return [\n input.substring(0, separatorIndex),\n input.substring(separatorIndex + 1),\n ];\n}\n\nexport function splitLast(input: string) : [string, string | undefined] {\n const separatorIndex = input.lastIndexOf('.');\n\n if (separatorIndex === -1) {\n return [input, ''];\n }\n\n return [\n input.substring(0, separatorIndex),\n input.substring(separatorIndex + 1),\n ];\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport type RelationAliasFn = (path: string) => string;\n\n/**\n * The tightest identifier limit among the shipped dialect presets:\n * PostgreSQL truncates identifiers to 63 bytes (silently, with a\n * NOTICE), so an alias longer than that would lose its uniqueness\n * guarantee on the way into the database.\n */\nconst MAX_ALIAS_LENGTH = 63;\n\n/**\n * FNV-1a (32 bit) — deterministic, dependency-free disambiguator for\n * aliases that exceed the identifier limit.\n */\nfunction hashPath(input: string) : string {\n let hash = 0x811c9dc5;\n for (let i = 0; i < input.length; i++) {\n hash ^= input.charCodeAt(i);\n hash = Math.imul(hash, 0x01000193);\n }\n\n return (hash >>> 0).toString(36);\n}\n\n/**\n * Default join-alias derivation: every path segment is length-prefixed\n * (e.g. `role.realm` -> `r4_role_5_realm`). Unlike replacing dots with\n * underscores, this is injective even when relation names contain `_`.\n * Aliases that would exceed the database identifier limit are bounded:\n * a readable prefix plus a hash of the full path — otherwise engines\n * such as PostgreSQL would truncate them (silently collapsing long,\n * distinct paths onto one alias).\n */\nexport function buildRelationAlias(path: string) : string {\n const segments = path.split('.');\n const alias = `r${segments.map((segment) => `${segment.length}_${segment}`).join('_')}`;\n if (alias.length <= MAX_ALIAS_LENGTH) {\n return alias;\n }\n\n const suffix = `_h${hashPath(path)}`;\n\n return `${alias.substring(0, MAX_ALIAS_LENGTH - suffix.length)}${suffix}`;\n}\n","/*\n * Copyright (c) 2025-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { splitLast } from './name-split';\nimport type { RelationAliasFn } from './relation-alias';\nimport { buildRelationAlias } from './relation-alias';\n\ntype Field = {\n prefix?: string,\n relation?: string,\n name: string\n};\n\nexport function parseField(\n input: string,\n rootAlias?: string,\n relationAlias: RelationAliasFn = buildRelationAlias,\n) : Field {\n const [relation, name] = splitLast(input);\n if (!name) {\n if (rootAlias) {\n return {\n prefix: rootAlias,\n name: relation,\n };\n }\n\n return { name: relation };\n }\n\n return {\n relation,\n prefix: relationAlias(relation),\n name,\n };\n}\n","/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\n/**\n * Escape LIKE pattern wildcards (incl. the MSSQL bracket range)\n * so user input matches literally under `ESCAPE '\\'`.\n */\nexport function escapeLikePattern(input: string) : string {\n return input.replace(/[\\\\%_[]/g, (character) => `\\\\${character}`);\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nexport class ParamPlaceholderIndexer {\n protected index : number;\n\n constructor(index?: number) {\n this.index = index ?? 0;\n }\n\n next() {\n this.index++;\n return this.index;\n }\n\n reset() {\n this.index = 0;\n }\n}\n","/*\n * Copyright (c) 2025-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { RootAliasFn } from '../types';\n\nexport function toRootAliasFn<\n TARGET extends Record<string, any> = Record<string, any>,\n>(input: string | RootAliasFn<TARGET>) : RootAliasFn<TARGET> {\n if (typeof input === 'function') {\n return input;\n }\n\n return () => input;\n}\n\nexport function isRootAliasFn(input: string | RootAliasFn) : input is RootAliasFn {\n return typeof input === 'function';\n}\n","/*\n * Copyright (c) 2025-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { FieldOperator } from '@rapiq/core';\nimport { parseField } from '../../helpers';\nimport type { RelationsBaseAdapter } from '../relations';\nimport type { IFieldsAdapter } from './types';\n\nexport abstract class FieldsBaseAdapter implements IFieldsAdapter {\n protected relations: RelationsBaseAdapter;\n\n /**\n * selection fields.\n *\n * e.g. ['name', 'project.id']\n */\n protected value : { name: string, operator?: `${FieldOperator}` }[];\n\n // -----------------------------------------------------------\n\n protected constructor(\n relations: RelationsBaseAdapter,\n ) {\n this.relations = relations;\n this.value = [];\n }\n\n // -----------------------------------------------------------\n\n clear() {\n this.value = [];\n }\n\n // -----------------------------------------------------------\n\n protected abstract rootAlias() : string | undefined;\n\n protected abstract escapeField(field: string) : string;\n\n abstract execute() : void;\n\n // -----------------------------------------------------------\n\n add(input: string, operator?: `${FieldOperator}`) {\n const name = this.buildField(input);\n\n this.value.push({ name, operator });\n }\n\n /**\n * Escaped selection columns (excluded fields are dropped).\n */\n getColumns() : string[] {\n const output : string[] = [];\n\n for (let i = 0; i < this.value.length; i++) {\n const element = this.value[i] as { name: string, operator?: `${FieldOperator}` };\n if (element.operator === FieldOperator.EXCLUDE) {\n continue;\n }\n\n output.push(element.name);\n }\n\n return output;\n }\n\n buildField(input: string) {\n const rootAlias = this.rootAlias();\n\n const output = parseField(input, rootAlias, (path) => this.relations.buildAlias(path));\n if (output.relation) {\n this.relations.add(output.relation);\n }\n\n if (output.prefix) {\n return `${this.escapeField(output.prefix)}.${this.escapeField(output.name)}`;\n }\n\n return this.escapeField(output.name);\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { RelationsAdapter } from '../relations';\nimport { FieldsBaseAdapter } from './base';\n\nexport type FieldsContainerOptions = {\n rootAlias?: string,\n escapeField?: (input: string) => string\n};\n\nexport class FieldsAdapter extends FieldsBaseAdapter {\n protected options : FieldsContainerOptions;\n\n constructor(\n relations: RelationsAdapter,\n options: FieldsContainerOptions,\n ) {\n super(relations);\n\n this.options = options;\n }\n\n escapeField(field: string) : string {\n if (this.options.escapeField) {\n return this.options.escapeField(field);\n }\n\n return field;\n }\n\n rootAlias(): string | undefined {\n if (this.options.rootAlias) {\n return this.options.rootAlias;\n }\n\n return undefined;\n }\n\n execute() {\n\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { AdapterError, ITSELF } from '@rapiq/core';\nimport { ParamPlaceholderIndexer, parseField } from '../../helpers';\nimport type { IRelationsAdapter } from '../relations';\nimport type { IFiltersAdapter } from './types';\n\nexport abstract class FiltersBaseAdapter<\n RelationsAdapter extends IRelationsAdapter = IRelationsAdapter,\n> implements IFiltersAdapter {\n /**\n * where conditions\n *\n * e.g. ['\"foo.bar\" = \"1\"' ]\n */\n conditions: string[];\n\n params : unknown[];\n\n protected relations: RelationsAdapter;\n\n protected paramPlaceholderIndexer : ParamPlaceholderIndexer;\n\n protected fieldPrefix: string;\n\n // -----------------------------------------------------------\n\n protected constructor(\n relations: RelationsAdapter,\n ) {\n this.conditions = [];\n this.params = [];\n\n this.relations = relations;\n\n this.paramPlaceholderIndexer = new ParamPlaceholderIndexer();\n this.fieldPrefix = '';\n }\n\n // -----------------------------------------------------------\n\n clear() {\n this.conditions = [];\n this.params = [];\n\n this.paramPlaceholderIndexer.reset();\n this.fieldPrefix = '';\n }\n\n // -----------------------------------------------------------\n\n protected abstract rootAlias() : string | undefined;\n\n protected abstract paramPlaceholder(index: number) : string;\n\n protected abstract escapeField(field: string) : string;\n\n abstract regexp(field: string, placeholder: string, ignoreCase: boolean) : string;\n\n abstract execute(): void;\n\n abstract child() : this;\n\n /**\n * Whether the dialect can build regular-expression conditions.\n * Anchored operators fall back to LIKE otherwise.\n */\n isRegexpSupported() : boolean {\n return true;\n }\n\n /**\n * Fold an expression for a case-insensitive equality comparison\n * (eq/ne/in/nin on strings). Dialects whose plain `=` already\n * compares case-insensitively return the input unchanged.\n */\n caseFold(input: string) : string {\n return `lower(${input})`;\n }\n\n /**\n * Whether equality comparisons on this field may case-fold at all.\n * Backends with column metadata override this to exempt non-string\n * columns — folding them is wasted work at best and a type error at\n * worst (e.g. `lower(integer)` on postgres).\n */\n isCaseFoldable(_field: string) : boolean {\n return true;\n }\n\n /**\n * Resolve a parsed field name to the identifier the database knows.\n * Backends with column metadata override this to map property names\n * to column names (e.g. `realmId` -> `realm_id`); the default is the\n * identity, matching schemaless SQL usage.\n *\n * @param name last path segment (property name)\n * @param relationPath dotted relation prefix, if any\n */\n resolveFieldName(name: string, _relationPath?: string) : string {\n return name;\n }\n\n // -----------------------------------------------------------\n\n where(field: string, operator: string, value?: unknown) {\n return this.whereRaw(\n `${this.buildField(field)} ${operator} ${this.buildParamPlaceholder()}`,\n value,\n );\n }\n\n whereRaw(sql: string, ...values: unknown[]) {\n this.conditions.push(sql);\n\n if (values) {\n this.params.push(...values);\n }\n\n return this;\n }\n\n // -----------------------------------------------------------\n\n buildParamPlaceholder() : string {\n return this.paramPlaceholder(this.paramPlaceholderIndexer.next());\n }\n\n buildParamsPlaceholders(input: unknown[]) : string[] {\n return input.map(\n (_) => this.paramPlaceholder(this.paramPlaceholderIndexer.next()),\n );\n }\n\n // -----------------------------------------------------------\n\n buildField(input: string) : string {\n let inputNormalized : string;\n\n if (this.fieldPrefix) {\n inputNormalized = this.fieldPrefix + input;\n } else {\n inputNormalized = input;\n }\n\n // the ITSELF marker references an array element itself —\n // a joined relation row is not a scalar column, so SQL has\n // no rendering for it (dialect JSON support may follow).\n if (inputNormalized.split('.').includes(ITSELF)) {\n throw AdapterError.featureUnsupported('filters:itself');\n }\n\n const output = parseField(inputNormalized, this.rootAlias(), (path) => this.relations.buildAlias(path));\n if (output.relation) {\n this.relations.add(output.relation);\n }\n\n const name = this.resolveFieldName(output.name, output.relation);\n\n if (output.prefix) {\n return `${this.escapeField(output.prefix)}.${this.escapeField(name)}`;\n }\n\n return this.escapeField(name);\n }\n\n // -----------------------------------------------------------\n\n merge<\n T extends IFiltersAdapter,\n >(\n query: T,\n operator: 'and' | 'or' = 'and',\n isInverted : boolean = false,\n ) : this {\n if (query.conditions.length > 0) {\n let sql = query.conditions.join(` ${operator} `);\n\n // single conditions are atomic terms or already wrapped compounds;\n // a leading '(' says nothing about the whole expression\n // (e.g. '(a or b) or c'), so wrap by condition count.\n if (query.conditions.length > 1) {\n sql = `(${sql})`;\n }\n\n this.conditions.push(`${isInverted ? 'not ' : ''}${sql}`);\n this.params.push(...query.params);\n }\n\n return this;\n }\n\n protected setChildAttributes<\n T extends FiltersBaseAdapter,\n >(child: T) : T {\n child.setFieldPrefix(this.fieldPrefix);\n child.setLastPlaceholderIndexer(this.paramPlaceholderIndexer);\n\n return child;\n }\n\n // -----------------------------------------------------------\n\n setLastPlaceholderIndexer(input: ParamPlaceholderIndexer) {\n this.paramPlaceholderIndexer = input;\n }\n\n // -----------------------------------------------------------\n\n getFieldPrefix(): string {\n return this.fieldPrefix;\n }\n\n setFieldPrefix(prefix: string) {\n this.fieldPrefix = prefix;\n }\n\n // -----------------------------------------------------------\n\n getQuery(): string {\n return this.conditions.join(' and ');\n }\n\n getQueryAndParameters(): [string, unknown[]] {\n return [\n this.getQuery(),\n this.params,\n ];\n }\n}\n","/*\n * Copyright (c) 2025-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { AdapterError } from '@rapiq/core';\nimport type { DialectOptions } from '../../dialect';\nimport type { RelationsAdapter } from '../relations';\nimport { FiltersBaseAdapter } from './base';\n\nexport type FiltersContainerOptions = {\n rootAlias?: string,\n} & DialectOptions;\n\nexport class FiltersAdapter extends FiltersBaseAdapter {\n protected options: FiltersContainerOptions;\n\n // -----------------------------------------------------------\n\n constructor(\n relations: RelationsAdapter,\n options: FiltersContainerOptions,\n ) {\n super(relations);\n this.options = options;\n }\n\n // -----------------------------------------------------------\n\n rootAlias() : string | undefined {\n return this.options.rootAlias;\n }\n\n paramPlaceholder(index: number) {\n return this.options.paramPlaceholder(index);\n }\n\n escapeField(field: string) : string {\n return this.options.escapeField(field);\n }\n\n override isRegexpSupported() : boolean {\n return typeof this.options.regexp !== 'undefined';\n }\n\n regexp(field: string, placeholder: string, ignoreCase: boolean) : string {\n if (!this.options.regexp) {\n throw AdapterError.featureUnsupported('regexp');\n }\n\n return this.options.regexp(field, placeholder, ignoreCase);\n }\n\n override caseFold(input: string) : string {\n if (this.options.caseFold) {\n return this.options.caseFold(input);\n }\n\n return super.caseFold(input);\n }\n\n // -----------------------------------------------------------\n\n child() : this {\n const child = new FiltersAdapter(\n this.relations as unknown as RelationsAdapter,\n this.options,\n );\n\n this.setChildAttributes(child);\n\n return child as this;\n }\n\n execute() {\n\n }\n}\n","/*\n * Copyright (c) 2025-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type {\n FieldOperator, \n IField, \n IFieldVisitor, \n IFields, \n IFieldsVisitor,\n} from '@rapiq/core';\nimport type { IFieldsAdapter } from '../adapter';\nimport type { VisitorOptions } from './types';\n\nexport type FieldsInterpreterOptions = VisitorOptions;\n\nexport class FieldsVisitor implements IFieldsVisitor<IFieldsAdapter>,\nIFieldVisitor<IFieldsAdapter> {\n protected adapter: IFieldsAdapter;\n\n protected options: FieldsInterpreterOptions = {};\n\n constructor(\n adapter: IFieldsAdapter,\n options: FieldsInterpreterOptions = {},\n ) {\n this.adapter = adapter;\n this.options = options;\n }\n\n visitField(expr: IField): IFieldsAdapter {\n this.adapter.add(expr.name, expr.operator as FieldOperator);\n\n return this.adapter;\n }\n\n visitFields(expr: IFields): IFieldsAdapter {\n for (const item of expr.value) {\n item.accept(this);\n }\n\n return this.adapter;\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type {\n IFilterVisitor,\n IFiltersVisitor,\n} from '@rapiq/core';\nimport {\n AdapterError,\n Filter,\n FilterFieldOperator,\n\n FilterRegexFlag,\n Filters,\n createFilterRegex,\n} from '@rapiq/core';\nimport type { IFiltersAdapter } from '../adapter';\nimport { escapeLikePattern } from '../helpers';\nimport type { VisitorOptions } from './types';\n\nexport class FiltersVisitor implements IFiltersVisitor<IFiltersAdapter>,\n IFilterVisitor<IFiltersAdapter> {\n protected adapter : IFiltersAdapter;\n\n protected options : VisitorOptions;\n\n protected caseSensitiveFields : Set<string>;\n\n constructor(\n adapter: IFiltersAdapter,\n options: VisitorOptions = {},\n ) {\n this.adapter = adapter;\n this.options = options;\n\n this.caseSensitiveFields = new Set(options.caseSensitive || []);\n }\n\n visitFilterEqual(expr: Filter<FilterFieldOperator.EQUAL>): IFiltersAdapter {\n if (expr.value === null) {\n return this.adapter.whereRaw(`${this.adapter.buildField(expr.field)} is null`);\n }\n\n if (this.isCaseInsensitive(expr.field, expr.value)) {\n const field = this.adapter.buildField(expr.field);\n return this.adapter.whereRaw(\n `${this.adapter.caseFold(field)} = ${this.adapter.caseFold(this.adapter.buildParamPlaceholder())}`,\n expr.value,\n );\n }\n\n return this.adapter.where(expr.field, '=', expr.value);\n }\n\n visitFilterNotEqual(expr: Filter<FilterFieldOperator.NOT_EQUAL>): IFiltersAdapter {\n const field = this.adapter.buildField(expr.field);\n if (expr.value === null) {\n return this.adapter.whereRaw(`${field} is not null`);\n }\n\n if (this.isCaseInsensitive(expr.field, expr.value)) {\n return this.whereComplement(\n field,\n `${this.adapter.caseFold(field)} <> ${this.adapter.caseFold(this.adapter.buildParamPlaceholder())}`,\n expr.value,\n );\n }\n\n return this.whereComplement(\n field,\n `${field} <> ${this.adapter.buildParamPlaceholder()}`,\n expr.value,\n );\n }\n\n visitFilterLessThan(expr: Filter<FilterFieldOperator.LESS_THAN>): IFiltersAdapter {\n return this.adapter.where(expr.field, '<', expr.value);\n }\n\n visitFilterLessThanEqual(expr: Filter<FilterFieldOperator.LESS_THAN_EQUAL>): IFiltersAdapter {\n return this.adapter.where(expr.field, '<=', expr.value);\n }\n\n visitFilterGreaterThan(expr: Filter<FilterFieldOperator.GREATER_THAN>): IFiltersAdapter {\n return this.adapter.where(expr.field, '>', expr.value);\n }\n\n visitFilterGreaterThanEqual(expr: Filter<FilterFieldOperator.GREATER_THAN_EQUAL>): IFiltersAdapter {\n return this.adapter.where(expr.field, '>=', expr.value);\n }\n\n visitFilterExists(expr: Filter<FilterFieldOperator.EXISTS, boolean>): IFiltersAdapter {\n return this.adapter.whereRaw(`${this.adapter.buildField(expr.field)} is ${expr.value ? 'not ' : ''}null`);\n }\n\n visitFilterIn(expr: Filter<FilterFieldOperator.IN, unknown[]>): IFiltersAdapter {\n return this.whereIn(expr.field, expr.value, false);\n }\n\n visitFilterNotIn(expr: Filter<FilterFieldOperator.NOT_IN, unknown[]>): IFiltersAdapter {\n return this.whereIn(expr.field, expr.value, true);\n }\n\n visitFilterMod(expr: Filter<FilterFieldOperator.MOD, [number, number]>): IFiltersAdapter {\n const params = this.adapter.buildParamsPlaceholders(expr.value);\n const sql = `mod(${this.adapter.buildField(expr.field)}, ${params[0]}) = ${params[1]}`;\n return this.adapter.whereRaw(sql, ...expr.value);\n }\n\n visitFilterSize(): IFiltersAdapter {\n // no SQL rendering yet — an array-length check needs per-dialect\n // JSON-array support (json_array_length/JSON_LENGTH/cardinality).\n throw AdapterError.featureUnsupported('filters:size');\n }\n\n visitFilterElemMatch(expr: Filter<FilterFieldOperator.ELEM_MATCH, Filter | Filters>): IFiltersAdapter {\n const oldPrefix = this.adapter.getFieldPrefix();\n\n this.adapter.setFieldPrefix(`${oldPrefix}${expr.field}.`);\n\n expr.value.accept(this);\n\n this.adapter.setFieldPrefix(oldPrefix);\n\n return this.adapter;\n }\n\n visitFilterStartsWith(expr: Filter<FilterFieldOperator.STARTS_WITH, unknown>): IFiltersAdapter {\n return this.whereAnchored(expr.field, expr.value, FilterRegexFlag.STARTS_WITH);\n }\n\n visitFilterNotStartsWith(expr: Filter<FilterFieldOperator.NOT_STARTS_WITH, unknown>): IFiltersAdapter {\n return this.whereAnchored(expr.field, expr.value, FilterRegexFlag.STARTS_WITH | FilterRegexFlag.NEGATION);\n }\n\n visitFilterEndsWith(expr: Filter<FilterFieldOperator.ENDS_WITH, unknown>): IFiltersAdapter {\n return this.whereAnchored(expr.field, expr.value, FilterRegexFlag.ENDS_WITH);\n }\n\n visitFilterNotEndsWith(expr: Filter<FilterFieldOperator.NOT_ENDS_WITH, unknown>): IFiltersAdapter {\n return this.whereAnchored(expr.field, expr.value, FilterRegexFlag.ENDS_WITH | FilterRegexFlag.NEGATION);\n }\n\n visitFilterContains(expr: Filter<FilterFieldOperator.CONTAINS, unknown>): IFiltersAdapter {\n return this.whereAnchored(expr.field, expr.value, FilterRegexFlag.CONTAINS);\n }\n\n visitFilterNotContains(expr: Filter<FilterFieldOperator.NOT_CONTAINS, unknown>): IFiltersAdapter {\n return this.whereAnchored(expr.field, expr.value, FilterRegexFlag.CONTAINS | FilterRegexFlag.NEGATION);\n }\n\n visitFilterRegex(expr: Filter<FilterFieldOperator.REGEX, RegExp | string>): IFiltersAdapter {\n const isRegExp = expr.value instanceof RegExp;\n\n // anything else (a cross-realm RegExp, a number, null) must not be\n // bound raw as the pattern parameter — fail typed, like @rapiq/memory.\n if (!isRegExp && typeof expr.value !== 'string') {\n throw AdapterError.featureUnsupported('filters:regex:value');\n }\n\n const source = isRegExp ? expr.value.source : expr.value;\n const ignoreCase = isRegExp ? expr.value.ignoreCase : false;\n\n const sql = this.adapter.regexp(\n this.adapter.buildField(expr.field),\n this.adapter.buildParamPlaceholder(),\n ignoreCase,\n );\n\n return this.adapter.whereRaw(sql, source);\n }\n\n visitFilters(expr: Filters): IFiltersAdapter {\n const adapter = this.adapter.child();\n const visitor = new FiltersVisitor(\n adapter,\n this.options,\n );\n\n for (let i = 0; i < expr.value.length; i++) {\n const child = expr.value[i];\n if (child instanceof Filter) {\n child.accept(visitor);\n }\n\n if (child instanceof Filters) {\n child.accept(visitor);\n }\n }\n\n switch (expr.operator) {\n case 'or': {\n this.adapter.merge(\n adapter,\n 'or',\n );\n break;\n }\n case 'nor': {\n this.adapter.merge(\n adapter,\n 'or',\n true,\n );\n break;\n }\n case 'not': {\n this.adapter.merge(\n adapter,\n 'and',\n true,\n );\n break;\n }\n default: {\n this.adapter.merge(\n adapter,\n 'and',\n );\n }\n }\n\n return adapter;\n }\n\n visitFilter(expr: Filter): IFiltersAdapter {\n throw AdapterError.operatorUnsupported(expr.operator);\n }\n\n // -----------------------------------------------------------\n\n /**\n * Render an IN/NOT IN condition.\n * A null element also matches the absence of a value (IS NULL);\n * an empty list matches no row (every row when negated).\n */\n protected whereIn(fieldName: string, input: unknown[], negated: boolean) : IFiltersAdapter {\n if (input.length === 0) {\n return this.adapter.whereRaw(negated ? '1 = 1' : '1 = 0');\n }\n\n const values = input.filter((value) => value !== null);\n const field = this.adapter.buildField(fieldName);\n const nullCondition = `${field} is ${negated ? 'not ' : ''}null`;\n if (values.length === 0) {\n return this.adapter.whereRaw(nullCondition);\n }\n\n let inCondition : string;\n if (\n this.isCaseFoldableField(fieldName) &&\n values.some((value) => typeof value === 'string')\n ) {\n const placeholders = values.map((value) => {\n const placeholder = this.adapter.buildParamPlaceholder();\n return typeof value === 'string' ? this.adapter.caseFold(placeholder) : placeholder;\n });\n inCondition = `${this.adapter.caseFold(field)} ${negated ? 'not ' : ''}in(${placeholders.join(', ')})`;\n } else {\n inCondition = `${field} ${negated ? 'not ' : ''}in(${this.adapter.buildParamsPlaceholders(values).join(', ')})`;\n }\n if (values.length === input.length) {\n if (negated) {\n return this.whereComplement(field, inCondition, ...values);\n }\n\n return this.adapter.whereRaw(inCondition, ...values);\n }\n\n return this.adapter.whereRaw(\n `(${inCondition} ${negated ? 'and' : 'or'} ${nullCondition})`,\n ...values,\n );\n }\n\n /**\n * Render a startsWith/endsWith/contains condition (or its negation)\n * as a regexp condition, falling back to LIKE on regexp-less dialects.\n */\n protected whereAnchored(field: string, value: unknown, flag: number) : IFiltersAdapter {\n if (!this.adapter.isRegexpSupported()) {\n const escaped = escapeLikePattern(`${value}`);\n\n let pattern : string;\n if (flag & FilterRegexFlag.STARTS_WITH) {\n pattern = `${escaped}%`;\n } else if (flag & FilterRegexFlag.ENDS_WITH) {\n pattern = `%${escaped}`;\n } else {\n pattern = `%${escaped}%`;\n }\n\n return this.whereLike(field, pattern, !!(flag & FilterRegexFlag.NEGATION));\n }\n\n const regex = createFilterRegex(`${value}`, flag);\n if (!(flag & FilterRegexFlag.NEGATION)) {\n return this.visitFilterRegex(new Filter(FilterFieldOperator.REGEX, field, regex));\n }\n\n const fieldBuilt = this.adapter.buildField(field);\n const sql = this.adapter.regexp(\n fieldBuilt,\n this.adapter.buildParamPlaceholder(),\n regex.ignoreCase,\n );\n\n return this.whereComplement(fieldBuilt, sql, regex.source);\n }\n\n protected whereLike(field: string, pattern: string, negated = false) : IFiltersAdapter {\n const fieldBuilt = this.adapter.buildField(field);\n const condition = `${fieldBuilt} ${negated ? 'not ' : ''}like ${this.adapter.buildParamPlaceholder()} escape '\\\\'`;\n if (negated) {\n return this.whereComplement(fieldBuilt, condition, pattern);\n }\n\n return this.adapter.whereRaw(condition, pattern);\n }\n\n /**\n * Render a negated condition null-inclusively. Negated operators are\n * exact complements of their positive twins (complement law), but the\n * bare SQL negation follows three-valued logic and drops NULL rows.\n */\n protected whereComplement(field: string, sql: string, ...values: unknown[]) : IFiltersAdapter {\n return this.adapter.whereRaw(`(${sql} or ${field} is null)`, ...values);\n }\n\n /**\n * Equality-family comparisons (eq/ne/in/nin) match string values\n * case-insensitively unless the field is opted out via the\n * `caseSensitive` visitor option or the adapter exempts it\n * (non-string columns never fold).\n */\n protected isCaseInsensitive(field: string, value: unknown) : boolean {\n return typeof value === 'string' && this.isCaseFoldableField(field);\n }\n\n protected isCaseFoldableField(field: string) : boolean {\n const path = `${this.adapter.getFieldPrefix()}${field}`;\n\n return !this.caseSensitiveFields.has(path) &&\n this.adapter.isCaseFoldable(path);\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IPaginationVisitor, Pagination } from '@rapiq/core';\nimport type { IPaginationAdapter } from '../adapter';\nimport type { VisitorOptions } from './types';\n\nexport type PaginationVisitorOptions = VisitorOptions;\n\nexport class PaginationVisitor implements IPaginationVisitor<IPaginationAdapter> {\n protected adapter: IPaginationAdapter;\n\n protected options: PaginationVisitorOptions = {};\n\n constructor(\n adapter: IPaginationAdapter,\n options: PaginationVisitorOptions = {},\n ) {\n this.adapter = adapter;\n this.options = options;\n }\n\n visitPagination(expr: Pagination): IPaginationAdapter {\n this.adapter.setLimit(expr.limit);\n this.adapter.setOffset(expr.offset);\n\n return this.adapter;\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type {\n IRelationVisitor, \n IRelationsVisitor, \n Relation, \n Relations,\n} from '@rapiq/core';\nimport type { IRelationsAdapter } from '../adapter';\nimport type { VisitorOptions } from './types';\n\nexport type RelationInterpreterOptions = VisitorOptions;\n\nexport class RelationsVisitor implements IRelationsVisitor<IRelationsAdapter>,\nIRelationVisitor<IRelationsAdapter> {\n protected adapter: IRelationsAdapter;\n\n protected options: RelationInterpreterOptions = {};\n\n constructor(\n adapter: IRelationsAdapter,\n options: RelationInterpreterOptions = {},\n ) {\n this.adapter = adapter;\n this.options = options;\n }\n\n visitRelation(expr: Relation): IRelationsAdapter {\n this.adapter.add(expr.name);\n\n return this.adapter;\n }\n\n visitRelations(expr: Relations): IRelationsAdapter {\n for (const item of expr.value) {\n item.accept(this);\n }\n\n return this.adapter;\n }\n}\n","/*\n * Copyright (c) 2025-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type {\n ISortVisitor, \n ISortsVisitor, \n Sort, \n Sorts,\n} from '@rapiq/core';\nimport type { ISortAdapter } from '../adapter';\nimport type { VisitorOptions } from './types';\n\nexport type SortInterpreterOptions = VisitorOptions;\n\nexport class SortsVisitor implements ISortsVisitor<ISortAdapter>,\nISortVisitor<ISortAdapter> {\n protected adapter: ISortAdapter;\n\n protected options: SortInterpreterOptions;\n\n constructor(\n adapter: ISortAdapter,\n options: SortInterpreterOptions = {},\n ) {\n this.adapter = adapter;\n this.options = options;\n }\n\n visitSort(expr: Sort): ISortAdapter {\n this.adapter.add(expr.name, expr.operator);\n\n return this.adapter;\n }\n\n visitSorts(expr: Sorts): ISortAdapter {\n for (const item of expr.value) {\n item.accept(this);\n }\n\n return this.adapter;\n }\n}\n","/*\n * Copyright (c) 2025-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type {\n Field,\n Fields,\n Filter,\n Filters,\n IFieldVisitor,\n IFieldsVisitor,\n IFilterVisitor,\n IFiltersVisitor,\n IPaginationVisitor,\n IQueryVisitor,\n IRelationVisitor,\n IRelationsVisitor,\n ISortVisitor,\n ISortsVisitor,\n Pagination,\n Query, \n Relation, \n Relations, \n Sort, \n Sorts,\n} from '@rapiq/core';\nimport type {\n IFieldsAdapter,\n IFiltersAdapter,\n IPaginationAdapter,\n IRelationsAdapter,\n IRootAdapter,\n ISortAdapter,\n} from '../adapter';\nimport { FieldsVisitor } from './fields';\nimport { FiltersVisitor } from './filters';\nimport { PaginationVisitor } from './pagination';\nimport { RelationsVisitor } from './relations';\nimport { SortsVisitor } from './sort';\nimport type { VisitorOptions } from './types';\n\nexport class QueryVisitor implements IQueryVisitor<IRootAdapter>,\n IFieldsVisitor<IFieldsAdapter>,\n IFieldVisitor<IFieldsAdapter>,\n IFiltersVisitor<IFiltersAdapter>,\n IFilterVisitor<IFiltersAdapter>,\n IPaginationVisitor<IPaginationAdapter>,\n IRelationsVisitor<IRelationsAdapter>,\n IRelationVisitor<IRelationsAdapter>,\n ISortsVisitor<ISortAdapter>,\n ISortVisitor<ISortAdapter> {\n protected container : IRootAdapter;\n\n protected options: VisitorOptions;\n\n public readonly fields : FieldsVisitor;\n\n public readonly filters : FiltersVisitor;\n\n public readonly pagination : PaginationVisitor;\n\n public readonly relations : RelationsVisitor;\n\n public readonly sorts : SortsVisitor;\n\n // -----------------------------------------------------------\n\n constructor(adapter: IRootAdapter, options: VisitorOptions = {}) {\n this.container = adapter;\n this.options = options;\n\n this.fields = new FieldsVisitor(adapter.fields, options);\n this.filters = new FiltersVisitor(adapter.filters, options);\n this.pagination = new PaginationVisitor(adapter.pagination, options);\n this.relations = new RelationsVisitor(adapter.relations, options);\n this.sorts = new SortsVisitor(adapter.sort, options);\n }\n\n // -----------------------------------------------------------\n\n visitQuery(input: Query): IRootAdapter {\n input.relations.accept(this.relations);\n input.fields.accept(this.fields);\n input.filters.accept(this.filters);\n input.pagination.accept(this.pagination);\n input.sorts.accept(this.sorts);\n\n return this.container;\n }\n\n visitFields(expr: Fields): IFieldsAdapter {\n return expr.accept(this.fields);\n }\n\n visitField(expr: Field): IFieldsAdapter {\n return expr.accept(this.fields);\n }\n\n visitFilters(expr: Filters): IFiltersAdapter {\n return expr.accept(this.filters);\n }\n\n visitFilter(expr: Filter) : IFiltersAdapter {\n return expr.accept(this.filters);\n }\n\n visitPagination(expr: Pagination): IPaginationAdapter {\n return expr.accept(this.pagination);\n }\n\n visitRelations(input: Relations) : IRelationsAdapter {\n return input.accept(this.relations);\n }\n\n visitRelation(expr: Relation): IRelationsAdapter {\n return expr.accept(this.relations);\n }\n\n visitSorts(expr: Sorts): ISortAdapter {\n return expr.accept(this.sorts);\n }\n\n visitSort(expr: Sort): ISortAdapter {\n return expr.accept(this.sorts);\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IPaginationAdapter } from './types';\n\nexport abstract class PaginationBaseAdapter implements IPaginationAdapter {\n public limit : number | undefined;\n\n public offset : number | undefined;\n\n // -----------------------------------------------------------\n\n clear() {\n this.limit = undefined;\n this.offset = undefined;\n }\n\n // -----------------------------------------------------------\n\n setLimit(limit?: number) {\n this.limit = limit;\n }\n\n setOffset(offset?: number) {\n this.offset = offset;\n }\n\n // -----------------------------------------------------------\n\n abstract execute() : void;\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { PaginationBaseAdapter } from './base';\n\nexport class PaginationAdapter extends PaginationBaseAdapter {\n execute() {\n\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { RelationAliasFn } from '../../helpers';\nimport { buildRelationAlias, splitFirst } from '../../helpers';\nimport type { IRelationsAdapter, RelationsAdapterBaseOptions } from './types';\n\nexport abstract class RelationsBaseAdapter implements IRelationsAdapter {\n /**\n * joins\n *\n * [alias].project.user.name\n *\n * JOIN xxx.yyy as yyy\n *\n * { path: \"xxx.zzz\", name: \"zzz\" }[]\n * @protected\n */\n protected value : {\n path: string,\n name: string,\n executed?: boolean\n }[];\n\n protected relationAlias : RelationAliasFn;\n\n // -----------------------------------------------------------\n\n protected constructor(options: RelationsAdapterBaseOptions = {}) {\n this.value = [];\n this.relationAlias = options.relationAlias ?? buildRelationAlias;\n }\n\n // -----------------------------------------------------------\n\n /**\n * Join alias for a relation path (e.g. `role.realm` ->\n * `r4_role_5_realm`).\n * The single derivation point shared by join application and the\n * field references built by the fields/filters/sort adapters.\n */\n buildAlias(path: string) : string {\n return this.relationAlias(path);\n }\n\n // -----------------------------------------------------------\n\n clear() {\n this.value = [];\n }\n\n // -----------------------------------------------------------\n\n abstract execute() : void;\n\n // -----------------------------------------------------------\n\n add(relation: string) {\n if (this.has(relation)) {\n return true;\n }\n\n let path : string | undefined;\n let last : string | undefined = relation;\n\n while (last) {\n let relationName: string;\n [relationName, last] = splitFirst(last);\n\n path = path ?\n `${path}.${relationName}` :\n relationName;\n\n if (this.has(path)) {\n continue;\n }\n\n this.value.push({\n path,\n name: relationName,\n });\n }\n\n return true;\n }\n\n has(name: string) {\n return this.value.some((join) => join.path === name);\n }\n\n /**\n * Canonical relation paths (parents included), e.g. ['items', 'items.realm'].\n */\n getPaths() : string[] {\n return this.value.map((join) => join.path);\n }\n}\n","/*\n * Copyright (c) 2025-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { RelationsBaseAdapter } from './base';\nimport type { RelationsAdapterOptions } from './types';\n\nexport class RelationsAdapter extends RelationsBaseAdapter {\n protected options : RelationsAdapterOptions;\n\n // -----------------------------------------------------------\n\n constructor(options: RelationsAdapterOptions = {}) {\n super(options);\n\n this.options = options;\n }\n\n // -----------------------------------------------------------\n\n execute() {\n\n }\n}\n","/*\n * Copyright (c) 2025-2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { SortDirection } from '@rapiq/core';\nimport { parseField } from '../../helpers';\nimport type { RelationsBaseAdapter } from '../relations';\nimport type { ISortAdapter } from './types';\n\nexport abstract class SortBaseAdapter implements ISortAdapter {\n protected relations: RelationsBaseAdapter;\n\n protected value : Record<string, `${SortDirection}`>;\n\n // -----------------------------------------------------------\n\n protected constructor(\n relations: RelationsBaseAdapter,\n ) {\n this.relations = relations;\n this.value = {};\n }\n\n // -----------------------------------------------------------\n\n clear() {\n this.value = {};\n }\n\n // -----------------------------------------------------------\n\n protected abstract rootAlias() : string | undefined;\n\n protected abstract escapeField(field: string) : string;\n\n /**\n * Resolve a parsed field name to the identifier the database knows.\n * Backends with column metadata override this to map property names\n * to column names (e.g. `realmId` -> `realm_id`); the default is the\n * identity, matching schemaless SQL usage.\n *\n * @param name last path segment (property name)\n * @param relationPath dotted relation prefix, if any\n */\n resolveFieldName(name: string, _relationPath?: string) : string {\n return name;\n }\n\n abstract execute() : void;\n\n // -----------------------------------------------------------\n\n add(input: string, value: `${SortDirection}`) {\n const name = this.normalizeField(input);\n\n this.value[name] = value;\n }\n\n /**\n * Escaped ORDER BY entries, e.g. ['\"user\".\"age\" DESC'].\n */\n getOrderBy() : string[] {\n const keys = Object.keys(this.value);\n const output : string[] = [];\n\n for (const key_ of keys) {\n const key = key_ as string;\n output.push(`${key} ${this.value[key]}`);\n }\n\n return output;\n }\n\n protected normalizeField(input: string) {\n const output = parseField(input, this.rootAlias(), (path) => this.relations.buildAlias(path));\n if (output.relation) {\n this.relations.add(output.relation);\n }\n\n const name = this.resolveFieldName(output.name, output.relation);\n\n if (output.prefix) {\n return `${this.escapeField(output.prefix)}.${this.escapeField(name)}`;\n }\n\n return this.escapeField(name);\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { RelationsAdapter } from '../relations';\nimport { SortBaseAdapter } from './base';\n\nexport type SortContainerOptions = {\n rootAlias?: string,\n escapeField?: (input: string) => string\n};\n\nexport class SortAdapter extends SortBaseAdapter {\n protected options : SortContainerOptions;\n\n constructor(\n relations: RelationsAdapter,\n options: SortContainerOptions,\n ) {\n super(relations);\n\n this.options = options;\n }\n\n escapeField(field: string) : string {\n if (this.options.escapeField) {\n return this.options.escapeField(field);\n }\n\n return field;\n }\n\n rootAlias(): string | undefined {\n if (this.options.rootAlias) {\n return this.options.rootAlias;\n }\n\n return undefined;\n }\n\n execute() {\n\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IQuery } from '@rapiq/core';\nimport { QueryVisitor } from '../visitor';\nimport type { DialectOptions } from '../dialect';\nimport type { RelationAliasFn } from '../helpers';\nimport type {\n ExecuteOptions,\n IRootAdapter,\n SqlFragments,\n} from './types';\nimport { FieldsAdapter } from './fields';\nimport { FiltersAdapter } from './filters';\nimport { PaginationAdapter } from './pagination';\nimport { RelationsAdapter } from './relations';\nimport { SortAdapter } from './sort';\n\nexport type AdapterOptions = DialectOptions & {\n rootAlias?: string,\n\n /**\n * Derive the join alias for a relation path\n * (default: length-prefixed segments, e.g. `role.realm` ->\n * `r4_role_5_realm`).\n */\n relationAlias?: RelationAliasFn,\n};\n\nexport class Adapter implements IRootAdapter<SqlFragments> {\n public readonly relations : RelationsAdapter;\n\n public readonly fields : FieldsAdapter;\n\n public readonly filters : FiltersAdapter;\n\n public readonly pagination : PaginationAdapter;\n\n public readonly sort : SortAdapter;\n\n // -----------------------------------------------------------\n\n constructor(options: AdapterOptions) {\n this.relations = new RelationsAdapter({\n join: () => true,\n relationAlias: options.relationAlias,\n });\n this.fields = new FieldsAdapter(this.relations, {\n escapeField: options.escapeField,\n rootAlias: options.rootAlias,\n });\n\n this.filters = new FiltersAdapter(this.relations, {\n paramPlaceholder: options.paramPlaceholder,\n regexp: options.regexp,\n caseFold: options.caseFold,\n escapeField: options.escapeField,\n rootAlias: options.rootAlias,\n });\n\n this.pagination = new PaginationAdapter();\n\n this.sort = new SortAdapter(this.relations, {\n escapeField: options.escapeField,\n rootAlias: options.rootAlias,\n });\n }\n\n // -----------------------------------------------------------\n\n clear() {\n this.fields.clear();\n this.filters.clear();\n this.pagination.clear();\n this.sort.clear();\n this.relations.clear();\n }\n\n // -----------------------------------------------------------\n\n /**\n * Walk `query` into the sub-adapters and collect the accumulated\n * clause fragments. Plain SQL has no backend target — it returns the\n * fragments for the caller to assemble.\n */\n execute(query: IQuery, options: ExecuteOptions = {}) : SqlFragments {\n if (options.clear ?? true) {\n this.clear();\n }\n\n query.accept(new QueryVisitor(this, options.visitor));\n\n const [where, params] = this.filters.getQueryAndParameters();\n\n return {\n columns: this.fields.getColumns(),\n where,\n params,\n orderBy: this.sort.getOrderBy(),\n limit: this.pagination.limit,\n offset: this.pagination.offset,\n relations: this.relations.getPaths(),\n };\n }\n}\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { DialectOptions } from './types';\n\n// no regexp support: anchored operators (startsWith, endsWith, contains)\n// fall back to LIKE; the regex operator raises a typed AdapterError.\nexport const mssql : DialectOptions = {\n paramPlaceholder: () => '?',\n escapeField: (field: string) => `[${field}]`,\n // sql server's default collations (*_CI_*) already compare `=`\n // case-insensitively; skip lower() so plain indexes stay usable.\n // Override with a lower()-wrapping caseFold when columns use\n // *_CS_* / *_BIN collations.\n caseFold: (input) => input,\n};\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { DialectOptions } from './types';\n\nexport const mysql : DialectOptions = {\n regexp: (field, placeholder) => `${field} regexp ${placeholder} = 1`,\n paramPlaceholder: () => '?',\n escapeField: (field: string) => `\\`${field}\\``,\n // mysql's default collations (*_ci) already compare `=` case-\n // insensitively; skip lower() so plain indexes stay usable.\n // Override with a lower()-wrapping caseFold when columns use\n // *_bin / *_cs collations.\n caseFold: (input) => input,\n};\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { DialectOptions } from './types';\n\nexport const oracle : DialectOptions = {\n regexp: (field, placeholder, ignoreCase) => ignoreCase ?\n `regexp_like(${field}, ${placeholder}, 'i')` :\n `regexp_like(${field}, ${placeholder})`,\n escapeField: (field: string) => `\"${field}\"`,\n paramPlaceholder: (index) => `:${index}`,\n};\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { DialectOptions } from './types';\n\nexport const pg : DialectOptions = {\n regexp: (field, placeholder, ignoreCase) => {\n const operator = ignoreCase ? '~*' : '~';\n return `${field} ${operator} ${placeholder}`;\n },\n escapeField: (field: string) => `\"${field}\"`,\n paramPlaceholder: (index) => `$${index}`,\n};\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { mysql } from './mysql';\nimport type { DialectOptions } from './types';\n\n// no regexp: stock SQLite ships without a REGEXP function (it must be\n// registered by the application), so anchored operators (startsWith,\n// endsWith, contains) fall back to LIKE and the regex operator raises\n// a typed AdapterError.\nexport const sqlite : DialectOptions = {\n paramPlaceholder: mysql.paramPlaceholder,\n escapeField: mysql.escapeField,\n};\n","/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { mssql } from './mssql';\nimport { mysql } from './mysql';\nimport { oracle } from './oracle';\nimport { pg } from './pg';\nimport { sqlite } from './sqlite';\nimport type { DialectOptions } from './types';\n\nconst presets : Record<string, DialectOptions> = {\n // postgres family\n pg,\n postgres: pg,\n postgresql: pg,\n 'aurora-postgres': pg,\n cockroachdb: pg,\n\n // mysql family\n mysql,\n mysql2: mysql,\n mariadb: mysql,\n 'aurora-mysql': mysql,\n\n // sqlite family (embedded drivers share sqlite semantics)\n sqlite,\n sqlite3: sqlite,\n 'better-sqlite3': sqlite,\n sqljs: sqlite,\n capacitor: sqlite,\n cordova: sqlite,\n 'react-native': sqlite,\n nativescript: sqlite,\n expo: sqlite,\n\n // others\n mssql,\n oracle,\n oracledb: oracle,\n};\n\n/**\n * Resolve a driver/connection type name (e.g. TypeORM's\n * `connection.options.type` or a knex client name) to the\n * matching {@link DialectOptions} preset.\n */\nexport function resolveDialect(name: string) : DialectOptions | undefined {\n return presets[name.toLowerCase()];\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rapiq/sql",
3
- "version": "2.0.0-beta.0",
3
+ "version": "2.0.0-beta.1",
4
4
  "description": "A SQL extension for rapiq.",
5
5
  "type": "module",
6
6
  "main": "dist/index.mjs",
@@ -16,10 +16,10 @@
16
16
  "dist/"
17
17
  ],
18
18
  "devDependencies": {
19
- "@rapiq/core": "^2.0.0-beta.0"
19
+ "@rapiq/core": "^2.0.0-beta.1"
20
20
  },
21
21
  "peerDependencies": {
22
- "@rapiq/core": "^2.0.0-beta.0"
22
+ "@rapiq/core": "^2.0.0-beta.1"
23
23
  },
24
24
  "scripts": {
25
25
  "build:types": "tsc --noEmit -p tsconfig.build.json",