@shellicar/cosmos-query-builder 1.0.0 → 1.1.0

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.
@@ -1 +1 @@
1
- "use strict";var e=Object.defineProperty,t=(t,s)=>e(t,"name",{value:s,configurable:!0}),s=class{static{t(this,"ILogger")}},r=class{static{t(this,"ICosmosQueryBuilder")}},i={eq:"=",ne:"!=",ge:">=",gt:">",le:"<=",lt:"<"},n=class extends s{static{t(this,"DefaultLogger")}debug(e,...t){}info(e,...t){}error(e,...t){}warn(e,...t){}verbose(e,...t){}},o=class extends r{static{t(this,"CosmosQueryBuilder")}_orderBy;_select="*";_groupBy=null;_join="";_from="c";_queries=[];_parameters=[];_limit;_logger;constructor(e){super(),this._logger=e?.logger??new n}get queries(){return this._queries}set queries(e){this._queries=e}get parameters(){return this._parameters}set parameters(e){this._parameters=e}handleStringFilter(e,t){return this.handleFilterObject(e,t)}handleUuidFilter(e,t){return this.handleFilterObject(e,t)}handleInstantFilter(e,t){return this.handleFilterObject(e,t)}handleFilterObject(e,t){const{__typeInfo:s,...r}=t;for(const[t,s]of Object.entries(r).filter(e=>void 0!==e[1])){const r=e,n=`@p${this._parameters.length}`,o=i[t],u=`(${r} ?? null)`;if(null!=o)this._queries.push(`${u} ${o} ${n}`);else if("ieq"===t)this._queries.push(`StringEquals(${u}, ${n}, true)`);else if("ine"===t)this._queries.push(`Not(StringEquals(${u}, ${n}, true))`);else if("like"===t)this._queries.push(`Contains(${u}, ${n}, true)`);else{if("in"!==t)throw new Error(`Unknown operator ${t}`);this._queries.push(`ARRAY_CONTAINS(${n}, ${u})`)}this._parameters.push({name:n,value:s})}}_buildQuery(e,t="c"){if(null!=e){const{__typeInfo:s,...r}=e,i=Object.keys(r);for(const s of i){const r=e[s],i=r.__typeInfo??null,n=`${t}.${s}`;if("object"!=typeof r||null==r)throw new Error(`Unhandled type ${i}`);"StringFilter"===i?this.handleStringFilter(n,r):"InstantFilter"===i?this.handleInstantFilter(n,r):"UUIDFilter"===i?this.handleUuidFilter(n,r):this._buildQuery(r,n)}}}buildQuery(e,t="c"){this._buildQuery(e,t)}orderBy(e,t){this._orderBy=null==e||null==t?void 0:`\nORDER BY\n c.${e} ${t}`}groupBy(e){this._groupBy=`\nGROUP BY\n ${e}`}select(e){this._select=e}parameter(e,t){this._parameters.push({name:e,value:t})}limit(e){this._limit=e}join(e,t){this._join=`${e} IN c.${t}`}whereFuzzy(e,t){const s=`@p${this._parameters.length}`,r=[];for(const e of t){const t=`Contains(c.${e}, ${s}, true)`;r.push(t)}const i=`(${r.join(" OR ")})`;this._queries.push(i),this._parameters.push({name:s,value:e})}whereRaw(e,t,s){const r=`@p${this._parameters.length}`,n=i[t];this._queries.push(`${e} ${n} ${r}`),this._parameters.push({name:r,value:s})}whereOr(e){const t=[];for(const s of e){const{field:e,operator:r,value:n}=s,o=`@p${this._parameters.length}`;if("isNull"===r)t.push(`(c.${e} ?? null) = null`);else if("contains"===r)t.push(`ARRAY_CONTAINS(c.${e}, ${o})`);else if("in"===r)t.push(`ARRAY_CONTAINS(${o}, c.${e})`);else{const s=i[r];null!=s&&void 0!==n&&(t.push(`c.${e} ${s} ${o}`),this._parameters.push({name:o,value:n}))}}t.length>0&&this._queries.push(`(${t.join(" OR ")})`)}where(e,t,s){const r=`@p${this._parameters.length}`;if("isNull"===t){const t=`(c.${e} ?? null) = null`;this._queries.push(t)}else if("contains"===t){if(void 0!==s){const t=`ARRAY_CONTAINS(c.${e}, ${r})`;this._queries.push(t),this._parameters.push({name:r,value:s})}}else if("in"===t){if(void 0!==s){const t=`ARRAY_CONTAINS(${r}, c.${e})`;this._queries.push(t),this._parameters.push({name:r,value:s})}}else{const n=i[t];null!=n&&void 0!==s&&(this._queries.push(`c.${e} ${n} ${r}`),this._parameters.push({name:r,value:s}))}}filter(e){const t=`@p${this._parameters.length}`;this._queries.push(e.clause.replace("@",t)),null!=e.parameter&&this._parameters.push({name:t,value:e.parameter})}query(){const e=[];if(e.push(`SELECT\n ${this._select}`),e.push(`FROM\n ${this._from}`),""!==this._join&&e.push(`JOIN\n ${this._join}`),this._queries.length>0){e.push("WHERE");const t=this._queries.join("\n AND ");e.push(t)}null!=this._orderBy&&e.push(this._orderBy),null!=this._groupBy&&e.push(this._groupBy),null!=this._limit&&(e.push("OFFSET 0"),e.push(`LIMIT ${this._limit}`));const t={query:e.join("\n"),parameters:this.parameters};return this._logger.verbose("Cosmos Query",t),t}async getOne(e){const t=this.query(),s=e.items.query(t),r=await s.fetchNext();return this._logger.verbose("Cosmos Result",{result:r}),r.resources?.[0]??null}async getAll(e,t,s){const r=this.query(),i=e.items.query(r,{continuationToken:s??void 0,maxItemCount:t??void 0});let n;try{n=await i.fetchAll()}catch(e){throw this._logger.error("Cosmos Query Error",e),e}this._logger.verbose("Cosmos Result",{result:n}),this.select("VALUE COUNT(1)"),this.orderBy();const o=this.query(),u=e.items.query(o);let l;try{l=await u.fetchAll()}catch(e){throw this._logger.error("Cosmos Count Query Error",e),e}const h=l.resources?.[0]??0;return{continuationToken:n.continuationToken,count:n.resources?.length??0,items:n.resources??[],hasMoreResults:n.hasMoreResults,totalCount:h}}patch(...e){return{operations:e.map(e=>{if("remove"===e.op)return{op:e.op,path:e.path};if(void 0!==e.value)return{op:e.op,path:e.path,value:e.value};throw new Error(`Value is required for operation: ${e.op}`)})}}};function u(e){return new o(e)}t(u,"createCosmosQueryBuilder");var l=(e=>(e.Asc="ASC",e.Desc="DESC",e))(l||{});exports.ILogger=s,exports.SortDirection=l,exports.createCosmosQueryBuilder=u;//# sourceMappingURL=index.cjs.map
1
+ "use strict";var e=Object.defineProperty,t=(t,s)=>e(t,"name",{value:s,configurable:!0}),s=class{static{t(this,"ILogger")}},r=class{static{t(this,"ICosmosQueryBuilder")}},i={eq:"=",ne:"!=",ge:">=",gt:">",le:"<=",lt:"<"},n=class extends s{static{t(this,"DefaultLogger")}debug(e,...t){}info(e,...t){}error(e,...t){}warn(e,...t){}verbose(e,...t){}},u=class extends r{static{t(this,"CosmosQueryBuilder")}_indent=" ";_orderBy=[];_select="*";_groupBy=[];_join="";_from="c";_queries=[];_parameters=[];_limit;_logger;constructor(e){super(),this._logger=e?.logger??new n}get queries(){return this._queries}set queries(e){this._queries=e}get parameters(){return this._parameters}set parameters(e){this._parameters=e}handleStringFilter(e,t){return this.handleFilterObject(e,t)}handleUuidFilter(e,t){return this.handleFilterObject(e,t)}handleInstantFilter(e,t){return this.handleFilterObject(e,t)}handleFilterObject(e,t){const{__typeInfo:s,...r}=t;for(const[t,s]of Object.entries(r).filter(e=>void 0!==e[1])){const r=e,n=`@p${this._parameters.length}`,u=i[t],h=`(${r} ?? null)`;if(null!=u)this._queries.push(`${h} ${u} ${n}`);else if("ieq"===t)this._queries.push(`StringEquals(${h}, ${n}, true)`);else if("ine"===t)this._queries.push(`Not(StringEquals(${h}, ${n}, true))`);else if("like"===t)this._queries.push(`Contains(${h}, ${n}, true)`);else{if("in"!==t)throw new Error(`Unknown operator ${t}`);this._queries.push(`ARRAY_CONTAINS(${n}, ${h})`)}this._parameters.push({name:n,value:s})}}_buildQuery(e,t="c"){if(null!=e){const{__typeInfo:s,...r}=e,i=Object.keys(r);for(const s of i){const r=e[s],i=r.__typeInfo??null,n=`${t}.${s}`;if("object"!=typeof r||null==r)throw new Error(`Unhandled type ${i}`);"StringFilter"===i?this.handleStringFilter(n,r):"InstantFilter"===i?this.handleInstantFilter(n,r):"UUIDFilter"===i?this.handleUuidFilter(n,r):this._buildQuery(r,n)}}}buildQuery(e,t="c"){this._buildQuery(e,t)}orderBy(e,t){return this._orderBy=null==e||null==t?[]:["ORDER BY",`${this._indent}c.${e} ${t}`],this}groupBy(e){return this._groupBy=["GROUP BY",`${this._indent}${e}`],this}select(e){return this._select=e,this}parameter(e,t){this._parameters.push({name:e,value:t})}limit(e){return this._limit=e,this}join(e,t){return this._join=`${e} IN c.${t}`,this}whereFuzzy(e,t){const s=`@p${this._parameters.length}`,r=[];for(const e of t){const t=`Contains(c.${e}, ${s}, true)`;r.push(t)}const i=`(${r.join(" OR ")})`;return this._queries.push(i),this._parameters.push({name:s,value:e}),this}whereRaw(e,t,s){const r=`@p${this._parameters.length}`,n=i[t];return this._queries.push(`${e} ${n} ${r}`),this._parameters.push({name:r,value:s}),this}whereOr(e){const t=[];for(const s of e){const{field:e,operator:r,value:n}=s,u=`@p${this._parameters.length}`;if("isNull"===r)t.push(`(c.${e} ?? null) = null`);else if("contains"===r)t.push(`ARRAY_CONTAINS(c.${e}, ${u})`);else if("in"===r)t.push(`ARRAY_CONTAINS(${u}, c.${e})`);else{const s=i[r];null!=s&&void 0!==n&&(t.push(`c.${e} ${s} ${u}`),this._parameters.push({name:u,value:n}))}}return t.length>0&&this._queries.push(`(${t.join(" OR ")})`),this}where(e,t,s){const r=`@p${this._parameters.length}`;if("isNull"===t){const t=`(c.${e} ?? null) = null`;this._queries.push(t)}else if("contains"===t){if(void 0!==s){const t=`ARRAY_CONTAINS(c.${e}, ${r})`;this._queries.push(t),this._parameters.push({name:r,value:s})}}else if("in"===t){if(void 0!==s){const t=`ARRAY_CONTAINS(${r}, c.${e})`;this._queries.push(t),this._parameters.push({name:r,value:s})}}else if("ieq"===t){if(void 0!==s){const t=`StringEquals(c.${e}, ${r}, true)`;this._queries.push(t),this._parameters.push({name:r,value:s})}}else if("ine"===t){if(void 0!==s){const t=`Not(StringEquals(c.${e}, ${r}, true))`;this._queries.push(t),this._parameters.push({name:r,value:s})}}else{const n=i[t];null!=n&&void 0!==s&&(this._queries.push(`c.${e} ${n} ${r}`),this._parameters.push({name:r,value:s}))}return this}filter(e){const t=`@p${this._parameters.length}`;return this._queries.push(e.clause.replace("@",t)),null!=e.parameter&&this._parameters.push({name:t,value:e.parameter}),this}query(){const e=[];if(e.push(`SELECT\n${this._indent}${this._select}`),e.push(`FROM\n${this._indent}${this._from}`),""!==this._join&&e.push(`JOIN\n${this._indent}${this._join}`),this._queries.length>0){e.push("WHERE");const t=this._queries.join(` AND\n${this._indent}`);e.push(`${this._indent}${t}`)}e.push(...this._orderBy),e.push(...this._groupBy),null!=this._limit&&(e.push("OFFSET 0"),e.push(`LIMIT ${this._limit}`));const t={query:e.join("\n"),parameters:this.parameters};return this._logger.verbose("Cosmos Query",t),t}async getOne(e){const t=this.query(),s=e.items.query(t),r=await s.fetchNext();return this._logger.verbose("Cosmos Result",{result:r}),r.resources?.[0]??null}async getAll(e,t,s){const r=this.query(),i=e.items.query(r,{continuationToken:s??void 0,maxItemCount:t??void 0});let n;try{n=await i.fetchAll()}catch(e){throw this._logger.error("Cosmos Query Error",e),e}this._logger.verbose("Cosmos Result",{result:n}),this.select("VALUE COUNT(1)"),this.orderBy();const u=this.query(),h=e.items.query(u);let o;try{o=await h.fetchAll()}catch(e){throw this._logger.error("Cosmos Count Query Error",e),e}const l=o.resources?.[0]??0;return{continuationToken:n.continuationToken,count:n.resources?.length??0,items:n.resources??[],hasMoreResults:n.hasMoreResults,totalCount:l}}patch(...e){return{operations:e.map(e=>{if("remove"===e.op)return{op:e.op,path:e.path};if(void 0!==e.value)return{op:e.op,path:e.path,value:e.value};throw new Error(`Value is required for operation: ${e.op}`)})}}};function h(e){return new u(e)}t(h,"createCosmosQueryBuilder");var o=(e=>(e.Asc="ASC",e.Desc="DESC",e))(o||{});exports.ILogger=s,exports.SortDirection=o,exports.createCosmosQueryBuilder=h;//# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/public/interfaces.ts","../../src/private/consts.ts","../../src/private/DefaultLogger.ts","../../src/private/CosmosQueryBuilder.ts","../../src/public/createCosmosQueryBuilder.ts","../../src/public/enums.ts"],"names":["SortDirection"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { JSONValue, PatchRequestBody, SqlQuerySpec } from '@azure/cosmos';\nimport type { ExtractPatchPathExpressions, ExtractPathExpressions, PatchPathValue, PathValue } from '../private/types';\nimport type { SortDirection } from './enums';\nimport type { BasicOpCode, Container, ExtendedOpCode, FetchResult, InstantFilter, StringFilter, UUIDFilter } from './types';\n\nexport abstract class ILogger {\n public abstract debug(message?: any, ...optionalParams: any[]): void;\n public abstract info(message?: any, ...optionalParams: any[]): void;\n public abstract error(message?: any, ...optionalParams: any[]): void;\n public abstract warn(message?: any, ...optionalParams: any[]): void;\n public abstract verbose(message?: any, ...optionalParams: any[]): void;\n}\n\nexport abstract class ICosmosQueryBuilder<T extends Record<string, any>> {\n /**\n * Sets the maximum number of items to return\n * @param limit Maximum number of items\n * @example\n * ```typescript\n * builder.limit(100);\n * ```\n */\n public abstract limit(limit: number): void;\n\n /**\n * Adds a JOIN clause to the query\n * @param value JOIN alias\n * @param statement Field path to join on\n * @example\n * ```typescript\n * builder.join('b', 'bones');\n * ```\n */\n public abstract join<P extends ExtractPathExpressions<T>>(value: string, statement: P): void;\n\n /**\n * Sets the SELECT clause for the query\n * @param value SELECT clause string\n * @example\n * ```typescript\n * builder.select('COUNT(1) as count, UPPER(c.name.givenName) as name');\n * ```\n */\n public abstract select(value: string): void;\n\n /**\n * Sets the GROUP BY clause for the query\n * @param value GROUP BY expression\n * @example\n * ```typescript\n * builder.groupBy('UPPER(c.sex)');\n * ```\n */\n public abstract groupBy(value: string): void;\n\n /**\n * Performs fuzzy search across multiple fields\n * @param value Search term\n * @param fields Array of field paths to search in\n * @example\n * ```typescript\n * builder.whereFuzzy('steve', ['name.givenName', 'name.familyName', 'email']);\n * ```\n */\n public abstract whereFuzzy<P extends ExtractPathExpressions<T>>(value: string, fields: [P, ...P[]]): void;\n\n /**\n * Adds a raw WHERE clause with field, operator, and value\n * @param field Field name as string\n * @param operator SQL operator (excluding isNull, contains, in)\n * @param value Value to compare against\n * @example\n * ```typescript\n * builder.whereRaw('p.id', 'eq', 'some-id');\n * ```\n */\n public abstract whereRaw(field: string, operator: Exclude<ExtendedOpCode, 'isNull' | 'contains' | 'in'>, value: JSONValue): void;\n\n /**\n * Adds an OR clause to match items satisfying any of the given conditions\n * @param conditions Array of field/operator/value conditions\n * @example\n * ```typescript\n * builder.whereOr([\n * { field: 'name.givenName', operator: 'eq', value: 'John' },\n * { field: 'name.familyName', operator: 'eq', value: 'Smith' }\n * ]);\n * ```\n */\n public abstract whereOr(conditions: Array<{ field: string; operator: ExtendedOpCode; value: JSONValue }>): void;\n\n /**\n * Creates a JSON patch document for Cosmos DB patch operations\n * @param operations Array of patch operations (set, add, replace, remove)\n * @returns Patch request body for Cosmos DB\n * @example\n * ```typescript\n * const operations = builder.patch({\n * op: 'replace',\n * path: '/name/givenName',\n * value: 'Smith',\n * });\n * const item = container.item('id', 'partitionKey');\n * await item.patch<Person>(operations);\n * ```\n */\n public abstract patch<P extends ExtractPatchPathExpressions<T>>(...operations: Array<{ path: P; op: 'set' | 'add' | 'replace'; value: PatchPathValue<T, P> } | { path: P; op: 'remove' }>): PatchRequestBody;\n\n /**\n * Builds query conditions from a structured object with type filters\n * Supports {@link StringFilter}, {@link UUIDFilter}, and {@link InstantFilter} types\n * @param query Query object with nested field filters containing __typeInfo\n * @param prefix Path prefix for nested queries (defaults to 'c')\n * @example\n * ```typescript\n * type PersonFilter = {\n * name?: {\n * givenName?: StringFilter;\n * };\n * };\n * const filter = {\n * name: {\n * givenName: { __typeInfo: 'StringFilter', eq: 'John' }\n * },\n * } satisfies PersonFilter;\n * builder.buildQuery(filter);\n * ```\n */\n public abstract buildQuery(query: Record<string, any> | undefined | null, prefix?: string): void;\n\n /**\n * Adds a WHERE clause with type-safe field access and operators\n * @param field Type-safe field path\n * @param operator SQL operator\n * @example\n * ```typescript\n * builder.where('name.givenName', 'eq', 'John');\n * builder.where('age', 'gt', 18);\n * builder.where('bones', 'contains', 'arm');\n * builder.where('name.givenName', 'in', ['John', 'Jane']);\n * builder.where('deletedAt', 'isNull');\n * ```\n */\n public abstract where<P extends ExtractPathExpressions<T>>(field: P, operator: 'isNull'): void;\n public abstract where<P extends ExtractPathExpressions<T>>(field: P, operator: 'in', value: readonly PathValue<T, P>[]): void;\n public abstract where<P extends ExtractPathExpressions<T>>(field: P, operator: 'contains', value: PathValue<T, P>[number]): void;\n public abstract where<P extends ExtractPathExpressions<T>, V extends PathValue<T, P>>(field: P, operator: BasicOpCode, value: V): void;\n\n /**\n * Clears any existing ordering\n */\n public abstract orderBy(): void;\n\n /**\n * Sets ordering by field and direction\n * @param field Field path to order by\n * @param direction Sort direction (ASC/DESC)\n */\n public abstract orderBy<P extends ExtractPathExpressions<T>>(field: P, direction: SortDirection): void;\n\n /**\n * Builds and returns the final SQL query specification\n * @returns SQL query specification with parameters\n */\n public abstract query(): SqlQuerySpec;\n\n /**\n * Executes the query and returns the first result\n * @param container Cosmos DB container to query\n * @returns First matching item or null\n */\n public abstract getOne<TSelect = T>(container: Container): Promise<TSelect | null>;\n\n /**\n * Executes the query and returns paginated results with total count\n * @param container Cosmos DB container to query\n * @param limit Maximum number of items per page\n * @param cursor Continuation token for pagination\n * @returns Paginated results with metadata\n */\n public abstract getAll<TSelect = T>(container: Container, limit?: number | null | undefined, cursor?: string | null | undefined): Promise<FetchResult<TSelect>>;\n}\n","export const operators: Record<string, string | undefined> = {\n eq: '=',\n ne: '!=',\n ge: '>=',\n gt: '>',\n le: '<=',\n lt: '<',\n} as const;\n","import { ILogger } from '../public/interfaces';\n\nexport class DefaultLogger extends ILogger {\n public debug(_message?: any, ..._optionalParams: any[]): void {}\n public info(_message?: any, ..._optionalParams: any[]): void {}\n public error(_message?: any, ..._optionalParams: any[]): void {}\n public warn(_message?: any, ..._optionalParams: any[]): void {}\n public verbose(_message?: any, ..._optionalParams: any[]): void {}\n}\n","import type { JSONValue, PatchRequestBody, SqlParameter, SqlQuerySpec } from '@azure/cosmos';\nimport type { SortDirection } from '../public/enums';\nimport { ICosmosQueryBuilder, type ILogger } from '../public/interfaces';\nimport type { BasicOpCode, Container, CosmosQueryBuilderOptions, ExtendedOpCode, FeedResponse, FetchResult, InstantFilter, StringFilter, UUIDFilter } from '../public/types';\nimport { operators } from './consts';\nimport { DefaultLogger } from './DefaultLogger';\nimport type { ExtractPatchPathExpressions, ExtractPathExpressions, PatchPathValue, PathValue, StringFilterData } from './types';\n\nexport class CosmosQueryBuilder<T extends Record<string, any>> extends ICosmosQueryBuilder<T> {\n private _orderBy?: string;\n private _select = '*';\n private _groupBy: string | null = null;\n private _join = '';\n private _from = 'c';\n private _queries: string[] = [];\n private _parameters: SqlParameter[] = [];\n private _limit: number | undefined;\n private _logger: ILogger;\n\n public constructor(options?: CosmosQueryBuilderOptions) {\n super();\n this._logger = options?.logger ?? new DefaultLogger();\n }\n\n public get queries(): string[] {\n return this._queries;\n }\n\n public set queries(value: string[]) {\n this._queries = value;\n }\n\n public get parameters(): SqlParameter[] {\n return this._parameters;\n }\n\n public set parameters(value: SqlParameter[]) {\n this._parameters = value;\n }\n\n private handleStringFilter(prefix: string, value: StringFilter) {\n return this.handleFilterObject(prefix, value);\n }\n\n private handleUuidFilter(prefix: string, value: UUIDFilter) {\n return this.handleFilterObject(prefix, value);\n }\n\n private handleInstantFilter(prefix: string, value: InstantFilter) {\n return this.handleFilterObject(prefix, value);\n }\n\n private handleFilterObject(prefix: string, value: StringFilterData & { __typeInfo: string }) {\n const { __typeInfo, ...rest } = value;\n for (const [key, value2] of Object.entries(rest).filter((x) => x[1] !== undefined)) {\n const path = prefix;\n const parameterName = `@p${this._parameters.length}`;\n const operator = operators[key];\n\n // Default to null to allow null comparison when parent object is not defined\n const queryKey = `(${path} ?? null)`;\n if (operator != null) {\n this._queries.push(`${queryKey} ${operator} ${parameterName}`);\n } else {\n if (key === 'ieq') {\n this._queries.push(`StringEquals(${queryKey}, ${parameterName}, true)`);\n } else if (key === 'ine') {\n this._queries.push(`Not(StringEquals(${queryKey}, ${parameterName}, true))`);\n } else if (key === 'like') {\n this._queries.push(`Contains(${queryKey}, ${parameterName}, true)`);\n } else if (key === 'in') {\n this._queries.push(`ARRAY_CONTAINS(${parameterName}, ${queryKey})`);\n } else {\n throw new Error(`Unknown operator ${key}`);\n }\n }\n this._parameters.push({ name: parameterName, value: value2 });\n }\n }\n\n private _buildQuery(query: Record<string, any> | null | undefined, prefix = 'c'): void {\n if (query != null) {\n const { __typeInfo, ...rest } = query;\n const queryKeys = Object.keys(rest);\n\n for (const key of queryKeys) {\n const value = query[key];\n const type: string | null = value.__typeInfo ?? null;\n const subPath = `${prefix}.${key}`;\n\n if (typeof value === 'object' && value != null) {\n if (type === 'StringFilter') {\n this.handleStringFilter(subPath, value);\n } else if (type === 'InstantFilter') {\n this.handleInstantFilter(subPath, value);\n } else if (type === 'UUIDFilter') {\n this.handleUuidFilter(subPath, value);\n } else {\n this._buildQuery(value, subPath);\n }\n } else {\n throw new Error(`Unhandled type ${type}`);\n }\n }\n }\n }\n\n public override buildQuery(query: Record<string, any> | undefined | null, prefix = 'c'): void {\n this._buildQuery(query, prefix);\n }\n\n public override orderBy(): void;\n public override orderBy<P extends ExtractPathExpressions<T>>(field: P, direction: SortDirection): void;\n public override orderBy<P extends ExtractPathExpressions<T>>(field?: P, direction?: SortDirection) {\n if (field == null || direction == null) {\n this._orderBy = undefined;\n } else {\n this._orderBy = `\\nORDER BY\\n c.${field} ${direction}`;\n }\n }\n\n public override groupBy(value: string): void {\n this._groupBy = `\\nGROUP BY\\n ${value}`;\n }\n\n public override select(value: string): void {\n this._select = value;\n }\n\n private parameter(name: string, value: JSONValue): void {\n this._parameters.push({\n name,\n value,\n });\n }\n\n public override limit(limit: number): void {\n this._limit = limit;\n }\n\n public override join<P extends ExtractPathExpressions<T>>(value: string, statement: P): void {\n this._join = `${value} IN c.${statement}`;\n }\n\n public override whereFuzzy<P extends ExtractPathExpressions<T>>(value: string, fields: [P, ...P[]]): void {\n const parameterName = `@p${this._parameters.length}`;\n const lines: string[] = [];\n for (const field of fields) {\n const clause = `Contains(c.${field}, ${parameterName}, true)`;\n lines.push(clause);\n }\n const queryLine = `(${lines.join(' OR ')})`;\n this._queries.push(queryLine);\n this._parameters.push({ name: parameterName, value });\n }\n\n public override whereRaw(field: string, operator: Exclude<ExtendedOpCode, 'isNull' | 'contains' | 'in'>, value: JSONValue): void {\n const parameterName = `@p${this._parameters.length}`;\n const sqlOperator = operators[operator];\n this._queries.push(`${field} ${sqlOperator} ${parameterName}`);\n this._parameters.push({ name: parameterName, value });\n }\n\n public override whereOr(conditions: Array<{ field: string; operator: ExtendedOpCode; value: JSONValue }>): void {\n const orClauses: string[] = [];\n for (const condition of conditions) {\n const { field, operator, value } = condition;\n const parameterName = `@p${this._parameters.length}`;\n\n if (operator === 'isNull') {\n orClauses.push(`(c.${field} ?? null) = null`);\n } else if (operator === 'contains') {\n orClauses.push(`ARRAY_CONTAINS(c.${field}, ${parameterName})`);\n } else if (operator === 'in') {\n orClauses.push(`ARRAY_CONTAINS(${parameterName}, c.${field})`);\n } else {\n const sqlOperator = operators[operator];\n if (sqlOperator != null && value !== undefined) {\n orClauses.push(`c.${field} ${sqlOperator} ${parameterName}`);\n this._parameters.push({ name: parameterName, value });\n }\n }\n }\n\n if (orClauses.length > 0) {\n this._queries.push(`(${orClauses.join(' OR ')})`);\n }\n }\n\n public override where<P extends ExtractPathExpressions<T>>(field: P, operator: 'isNull'): void;\n public override where<P extends ExtractPathExpressions<T>>(field: P, operator: 'in', value: readonly PathValue<T, P>[]): void;\n public override where<P extends ExtractPathExpressions<T>>(field: P, operator: 'contains', value: PathValue<T, P>[number]): void;\n public override where<P extends ExtractPathExpressions<T>, V extends PathValue<T, P>>(field: P, operator: BasicOpCode, value: V): void;\n public override where<P extends ExtractPathExpressions<T>, V extends PathValue<T, P>>(field: P, operator: ExtendedOpCode, value?: V | readonly V[]): void {\n const parameterName = `@p${this._parameters.length}`;\n\n if (operator === 'isNull') {\n const clause = `(c.${field} ?? null) = null`;\n this._queries.push(clause);\n } else if (operator === 'contains') {\n if (value !== undefined) {\n const clause = `ARRAY_CONTAINS(c.${field}, ${parameterName})`;\n this._queries.push(clause);\n this._parameters.push({ name: parameterName, value });\n }\n } else if (operator === 'in') {\n // Handle 'IN' operator\n if (value !== undefined) {\n const clause = `ARRAY_CONTAINS(${parameterName}, c.${field})`;\n this._queries.push(clause);\n this._parameters.push({ name: parameterName, value });\n }\n } else {\n const sqlOperator = operators[operator];\n if (sqlOperator != null && value !== undefined) {\n this._queries.push(`c.${field} ${sqlOperator} ${parameterName}`);\n this._parameters.push({ name: parameterName, value });\n }\n }\n }\n\n public filter(x: { clause: string; parameter?: JSONValue }): void {\n const paramName = `@p${this._parameters.length}`;\n this._queries.push(x.clause.replace('@', paramName));\n if (x.parameter != null) {\n this._parameters.push({\n name: paramName,\n value: x.parameter,\n });\n }\n }\n\n public override query(): SqlQuerySpec {\n const lines: string[] = [];\n lines.push(`SELECT\\n ${this._select}`);\n lines.push(`FROM\\n ${this._from}`);\n if (this._join !== '') {\n lines.push(`JOIN\\n ${this._join}`);\n }\n\n if (this._queries.length > 0) {\n lines.push('WHERE');\n const where = this._queries.join('\\n AND ');\n lines.push(where);\n }\n\n if (this._orderBy != null) {\n lines.push(this._orderBy);\n }\n if (this._groupBy != null) {\n lines.push(this._groupBy);\n }\n if (this._limit != null) {\n lines.push('OFFSET 0');\n lines.push(`LIMIT ${this._limit}`);\n }\n\n const queryText = lines.join('\\n');\n const result = {\n query: queryText,\n parameters: this.parameters,\n };\n this._logger.verbose('Cosmos Query', result);\n return result;\n }\n\n public override async getOne<TSelect = T>(container: Container): Promise<TSelect | null> {\n const itemsQuery = this.query();\n const itemsIterator = container.items.query<TSelect>(itemsQuery);\n const items = await itemsIterator.fetchNext();\n this._logger.verbose('Cosmos Result', { result: items });\n return items.resources?.[0] ?? null;\n }\n\n public override async getAll<TSelect>(container: Container, limit?: number | null | undefined, cursor?: string | null | undefined): Promise<FetchResult<TSelect>> {\n const itemsQuery = this.query();\n const itemsIterator = container.items.query<TSelect>(itemsQuery, {\n continuationToken: cursor ?? undefined,\n maxItemCount: limit ?? undefined,\n });\n let items: FeedResponse<TSelect>;\n try {\n items = await itemsIterator.fetchAll();\n } catch (err) {\n this._logger.error('Cosmos Query Error', err);\n throw err;\n }\n this._logger.verbose('Cosmos Result', { result: items });\n\n this.select('VALUE COUNT(1)');\n this.orderBy();\n\n const countQuery = this.query();\n const countIterator = container.items.query<number>(countQuery);\n\n let count: FeedResponse<number>;\n try {\n count = await countIterator.fetchAll();\n } catch (err) {\n this._logger.error('Cosmos Count Query Error', err);\n throw err;\n }\n\n const totalCount = count.resources?.[0] ?? 0;\n\n const result: FetchResult<TSelect> = {\n continuationToken: items.continuationToken,\n count: items.resources?.length ?? 0,\n items: items.resources ?? [],\n hasMoreResults: items.hasMoreResults,\n totalCount,\n };\n return result;\n }\n\n public override patch<P extends ExtractPatchPathExpressions<T>>(...operations: Array<{ path: P; op: 'set' | 'add' | 'replace'; value: PatchPathValue<T, P> } | { path: P; op: 'remove' }>): PatchRequestBody {\n const patchOperations = operations.map((opDef) => {\n if (opDef.op === 'remove') {\n return { op: opDef.op, path: opDef.path };\n }\n\n if (opDef.value !== undefined) {\n return { op: opDef.op, path: opDef.path, value: opDef.value };\n }\n\n throw new Error(`Value is required for operation: ${opDef.op}`);\n });\n\n return { operations: patchOperations };\n }\n}\n","import { CosmosQueryBuilder } from '../private/CosmosQueryBuilder';\nimport type { ICosmosQueryBuilder } from './interfaces';\nimport type { CosmosQueryBuilderOptions } from './types';\n\nexport function createCosmosQueryBuilder<T extends Record<string, any>>(options?: CosmosQueryBuilderOptions): ICosmosQueryBuilder<T> {\n return new CosmosQueryBuilder<T>(options);\n}\n","export enum SortDirection {\n Asc = 'ASC',\n Desc = 'DESC',\n}\n"]}
1
+ {"version":3,"sources":["../../src/public/interfaces.ts","../../src/private/consts.ts","../../src/private/DefaultLogger.ts","../../src/private/CosmosQueryBuilder.ts","../../src/public/createCosmosQueryBuilder.ts","../../src/public/enums.ts"],"names":["SortDirection"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { JSONValue, PatchRequestBody, SqlQuerySpec } from '@azure/cosmos';\nimport type { ExtractPatchPathExpressions, ExtractPathExpressions, PatchPathValue, PathValue } from '../private/types';\nimport type { SortDirection } from './enums';\nimport type { BasicOpCode, Container, ExtendedOpCode, FetchResult, InstantFilter, StringFilter, UUIDFilter } from './types';\n\nexport abstract class ILogger {\n public abstract debug(message?: any, ...optionalParams: any[]): void;\n public abstract info(message?: any, ...optionalParams: any[]): void;\n public abstract error(message?: any, ...optionalParams: any[]): void;\n public abstract warn(message?: any, ...optionalParams: any[]): void;\n public abstract verbose(message?: any, ...optionalParams: any[]): void;\n}\n\nexport abstract class ICosmosQueryBuilder<T extends Record<string, any>> {\n /**\n * Sets the maximum number of items to return\n * @param limit Maximum number of items\n * @example\n * ```typescript\n * builder.limit(100);\n * ```\n */\n public abstract limit(limit: number): ICosmosQueryBuilder<T>;\n\n /**\n * Adds a JOIN clause to the query\n * @param value JOIN alias\n * @param statement Field path to join on\n * @example\n * ```typescript\n * builder.join('b', 'bones');\n * ```\n */\n public abstract join<P extends ExtractPathExpressions<T>>(value: string, statement: P): ICosmosQueryBuilder<T>;\n\n /**\n * Sets the SELECT clause for the query\n * @param value SELECT clause string\n * @example\n * ```typescript\n * builder.select('COUNT(1) as count, UPPER(c.name.givenName) as name');\n * ```\n */\n public abstract select(value: string): ICosmosQueryBuilder<T>;\n\n /**\n * Sets the GROUP BY clause for the query\n * @param value GROUP BY expression\n * @example\n * ```typescript\n * builder.groupBy('UPPER(c.sex)');\n * ```\n */\n public abstract groupBy(value: string): ICosmosQueryBuilder<T>;\n\n /**\n * Performs fuzzy search across multiple fields\n * @param value Search term\n * @param fields Array of field paths to search in\n * @example\n * ```typescript\n * builder.whereFuzzy('steve', ['name.givenName', 'name.familyName', 'email']);\n * ```\n */\n public abstract whereFuzzy<P extends ExtractPathExpressions<T>>(value: string, fields: [P, ...P[]]): ICosmosQueryBuilder<T>;\n\n /**\n * Adds a raw WHERE clause with field, operator, and value\n * @param field Field name as string\n * @param operator SQL operator (excluding isNull, contains, in)\n * @param value Value to compare against\n * @example\n * ```typescript\n * builder.whereRaw('p.id', 'eq', 'some-id');\n * ```\n */\n public abstract whereRaw(field: string, operator: Exclude<ExtendedOpCode, 'isNull' | 'contains' | 'in'>, value: JSONValue): ICosmosQueryBuilder<T>;\n\n /**\n * Adds an OR clause to match items satisfying any of the given conditions\n * @param conditions Array of field/operator/value conditions\n * @example\n * ```typescript\n * builder.whereOr([\n * { field: 'name.givenName', operator: 'eq', value: 'John' },\n * { field: 'name.familyName', operator: 'eq', value: 'Smith' }\n * ]);\n * ```\n */\n public abstract whereOr(conditions: Array<{ field: string; operator: ExtendedOpCode; value: JSONValue }>): ICosmosQueryBuilder<T>;\n\n /**\n * Creates a JSON patch document for Cosmos DB patch operations\n * @param operations Array of patch operations (set, add, replace, remove)\n * @returns Patch request body for Cosmos DB\n * @example\n * ```typescript\n * const operations = builder.patch({\n * op: 'replace',\n * path: '/name/givenName',\n * value: 'Smith',\n * });\n * const item = container.item('id', 'partitionKey');\n * await item.patch<Person>(operations);\n * ```\n */\n public abstract patch<P extends ExtractPatchPathExpressions<T>>(...operations: Array<{ path: P; op: 'set' | 'add' | 'replace'; value: PatchPathValue<T, P> } | { path: P; op: 'remove' }>): PatchRequestBody;\n\n /**\n * Add a custom un-typed where clause\n * @param filter\n */\n public abstract filter(filter: { clause: string; parameter?: JSONValue }): ICosmosQueryBuilder<T>;\n\n /**\n * Builds query conditions from a structured object with type filters\n * Supports {@link StringFilter}, {@link UUIDFilter}, and {@link InstantFilter} types\n * @param query Query object with nested field filters containing __typeInfo\n * @param prefix Path prefix for nested queries (defaults to 'c')\n * @example\n * ```typescript\n * type PersonFilter = {\n * name?: {\n * givenName?: StringFilter;\n * };\n * };\n * const filter = {\n * name: {\n * givenName: { __typeInfo: 'StringFilter', eq: 'John' }\n * },\n * } satisfies PersonFilter;\n * builder.buildQuery(filter);\n * ```\n */\n public abstract buildQuery(query: Record<string, any> | undefined | null, prefix?: string): void;\n\n /**\n * Adds a WHERE clause with type-safe field access and operators\n * @param field Type-safe field path\n * @param operator SQL operator\n * @example\n * ```typescript\n * builder.where('name.givenName', 'eq', 'John');\n * builder.where('age', 'gt', 18);\n * builder.where('bones', 'contains', 'arm');\n * builder.where('name.givenName', 'in', ['John', 'Jane']);\n * builder.where('deletedAt', 'isNull');\n * ```\n */\n public abstract where<P extends ExtractPathExpressions<T>>(field: P, operator: 'isNull'): ICosmosQueryBuilder<T>;\n public abstract where<P extends ExtractPathExpressions<T>>(field: P, operator: 'in', value: readonly PathValue<T, P>[]): ICosmosQueryBuilder<T>;\n public abstract where<P extends ExtractPathExpressions<T>>(field: P, operator: 'contains', value: PathValue<T, P>[number]): ICosmosQueryBuilder<T>;\n public abstract where<P extends ExtractPathExpressions<T>, V extends PathValue<T, P>>(field: P, operator: BasicOpCode, value: V): ICosmosQueryBuilder<T>;\n\n /**\n * Clears any existing ordering\n */\n public abstract orderBy(): ICosmosQueryBuilder<T>;\n\n /**\n * Sets ordering by field and direction\n * @param field Field path to order by\n * @param direction Sort direction (ASC/DESC)\n */\n public abstract orderBy<P extends ExtractPathExpressions<T>>(field: P, direction: SortDirection): ICosmosQueryBuilder<T>;\n\n /**\n * Builds and returns the final SQL query specification\n * @returns SQL query specification with parameters\n */\n public abstract query(): SqlQuerySpec;\n\n /**\n * Executes the query and returns the first result\n * @param container Cosmos DB container to query\n * @returns First matching item or null\n */\n public abstract getOne<TSelect = T>(container: Container): Promise<TSelect | null>;\n\n /**\n * Executes the query and returns paginated results with total count\n * @param container Cosmos DB container to query\n * @param limit Maximum number of items per page\n * @param cursor Continuation token for pagination\n * @returns Paginated results with metadata\n */\n public abstract getAll<TSelect = T>(container: Container, limit?: number | null | undefined, cursor?: string | null | undefined): Promise<FetchResult<TSelect>>;\n}\n","export const operators: Record<string, string | undefined> = {\n eq: '=',\n ne: '!=',\n ge: '>=',\n gt: '>',\n le: '<=',\n lt: '<',\n} as const;\n","import { ILogger } from '../public/interfaces';\n\nexport class DefaultLogger extends ILogger {\n public debug(_message?: any, ..._optionalParams: any[]): void {}\n public info(_message?: any, ..._optionalParams: any[]): void {}\n public error(_message?: any, ..._optionalParams: any[]): void {}\n public warn(_message?: any, ..._optionalParams: any[]): void {}\n public verbose(_message?: any, ..._optionalParams: any[]): void {}\n}\n","import type { JSONValue, PatchRequestBody, SqlParameter, SqlQuerySpec } from '@azure/cosmos';\nimport type { SortDirection } from '../public/enums';\nimport { ICosmosQueryBuilder, type ILogger } from '../public/interfaces';\nimport type { BasicOpCode, Container, CosmosQueryBuilderOptions, ExtendedOpCode, FeedResponse, FetchResult, InstantFilter, StringFilter, UUIDFilter } from '../public/types';\nimport { operators } from './consts';\nimport { DefaultLogger } from './DefaultLogger';\nimport type { ExtractPatchPathExpressions, ExtractPathExpressions, PatchPathValue, PathValue, StringFilterData } from './types';\n\nexport class CosmosQueryBuilder<T extends Record<string, any>> extends ICosmosQueryBuilder<T> {\n // TODO: Allow setting\n private _indent = ' ';\n private _orderBy: string[] = [];\n private _select = '*';\n private _groupBy: string[] = [];\n private _join = '';\n private _from = 'c';\n private _queries: string[] = [];\n private _parameters: SqlParameter[] = [];\n private _limit: number | undefined;\n private _logger: ILogger;\n\n public constructor(options?: CosmosQueryBuilderOptions) {\n super();\n this._logger = options?.logger ?? new DefaultLogger();\n }\n\n public get queries(): string[] {\n return this._queries;\n }\n\n public set queries(value: string[]) {\n this._queries = value;\n }\n\n public get parameters(): SqlParameter[] {\n return this._parameters;\n }\n\n public set parameters(value: SqlParameter[]) {\n this._parameters = value;\n }\n\n private handleStringFilter(prefix: string, value: StringFilter) {\n return this.handleFilterObject(prefix, value);\n }\n\n private handleUuidFilter(prefix: string, value: UUIDFilter) {\n return this.handleFilterObject(prefix, value);\n }\n\n private handleInstantFilter(prefix: string, value: InstantFilter) {\n return this.handleFilterObject(prefix, value);\n }\n\n private handleFilterObject(prefix: string, value: StringFilterData & { __typeInfo: string }) {\n const { __typeInfo, ...rest } = value;\n for (const [key, value2] of Object.entries(rest).filter((x) => x[1] !== undefined)) {\n const path = prefix;\n const parameterName = `@p${this._parameters.length}`;\n const operator = operators[key];\n\n // Default to null to allow null comparison when parent object is not defined\n const queryKey = `(${path} ?? null)`;\n if (operator != null) {\n this._queries.push(`${queryKey} ${operator} ${parameterName}`);\n } else {\n if (key === 'ieq') {\n this._queries.push(`StringEquals(${queryKey}, ${parameterName}, true)`);\n } else if (key === 'ine') {\n this._queries.push(`Not(StringEquals(${queryKey}, ${parameterName}, true))`);\n } else if (key === 'like') {\n this._queries.push(`Contains(${queryKey}, ${parameterName}, true)`);\n } else if (key === 'in') {\n this._queries.push(`ARRAY_CONTAINS(${parameterName}, ${queryKey})`);\n } else {\n throw new Error(`Unknown operator ${key}`);\n }\n }\n this._parameters.push({ name: parameterName, value: value2 });\n }\n }\n\n private _buildQuery(query: Record<string, any> | null | undefined, prefix = 'c'): void {\n if (query != null) {\n const { __typeInfo, ...rest } = query;\n const queryKeys = Object.keys(rest);\n\n for (const key of queryKeys) {\n const value = query[key];\n const type: string | null = value.__typeInfo ?? null;\n const subPath = `${prefix}.${key}`;\n\n if (typeof value === 'object' && value != null) {\n if (type === 'StringFilter') {\n this.handleStringFilter(subPath, value);\n } else if (type === 'InstantFilter') {\n this.handleInstantFilter(subPath, value);\n } else if (type === 'UUIDFilter') {\n this.handleUuidFilter(subPath, value);\n } else {\n this._buildQuery(value, subPath);\n }\n } else {\n throw new Error(`Unhandled type ${type}`);\n }\n }\n }\n }\n\n public override buildQuery(query: Record<string, any> | undefined | null, prefix = 'c'): void {\n this._buildQuery(query, prefix);\n }\n\n public override orderBy(): ICosmosQueryBuilder<T>;\n public override orderBy<P extends ExtractPathExpressions<T>>(field: P, direction: SortDirection): ICosmosQueryBuilder<T>;\n public override orderBy<P extends ExtractPathExpressions<T>>(field?: P, direction?: SortDirection): ICosmosQueryBuilder<T> {\n if (field == null || direction == null) {\n this._orderBy = [];\n } else {\n this._orderBy = ['ORDER BY', `${this._indent}c.${field} ${direction}`];\n }\n return this;\n }\n\n public override groupBy(value: string): ICosmosQueryBuilder<T> {\n this._groupBy = ['GROUP BY', `${this._indent}${value}`];\n return this;\n }\n\n public override select(value: string): ICosmosQueryBuilder<T> {\n this._select = value;\n return this;\n }\n\n private parameter(name: string, value: JSONValue): void {\n this._parameters.push({\n name,\n value,\n });\n }\n\n public override limit(limit: number): ICosmosQueryBuilder<T> {\n this._limit = limit;\n return this;\n }\n\n public override join<P extends ExtractPathExpressions<T>>(value: string, statement: P): ICosmosQueryBuilder<T> {\n this._join = `${value} IN c.${statement}`;\n return this;\n }\n\n public override whereFuzzy<P extends ExtractPathExpressions<T>>(value: string, fields: [P, ...P[]]): ICosmosQueryBuilder<T> {\n const parameterName = `@p${this._parameters.length}`;\n const lines: string[] = [];\n for (const field of fields) {\n const clause = `Contains(c.${field}, ${parameterName}, true)`;\n lines.push(clause);\n }\n const queryLine = `(${lines.join(' OR ')})`;\n this._queries.push(queryLine);\n this._parameters.push({ name: parameterName, value });\n return this;\n }\n\n public override whereRaw(field: string, operator: Exclude<ExtendedOpCode, 'isNull' | 'contains' | 'in'>, value: JSONValue): ICosmosQueryBuilder<T> {\n const parameterName = `@p${this._parameters.length}`;\n const sqlOperator = operators[operator];\n this._queries.push(`${field} ${sqlOperator} ${parameterName}`);\n this._parameters.push({ name: parameterName, value });\n return this;\n }\n\n public override whereOr(conditions: Array<{ field: string; operator: ExtendedOpCode; value: JSONValue }>): ICosmosQueryBuilder<T> {\n const orClauses: string[] = [];\n for (const condition of conditions) {\n const { field, operator, value } = condition;\n const parameterName = `@p${this._parameters.length}`;\n\n if (operator === 'isNull') {\n orClauses.push(`(c.${field} ?? null) = null`);\n } else if (operator === 'contains') {\n orClauses.push(`ARRAY_CONTAINS(c.${field}, ${parameterName})`);\n } else if (operator === 'in') {\n orClauses.push(`ARRAY_CONTAINS(${parameterName}, c.${field})`);\n } else {\n const sqlOperator = operators[operator];\n if (sqlOperator != null && value !== undefined) {\n orClauses.push(`c.${field} ${sqlOperator} ${parameterName}`);\n this._parameters.push({ name: parameterName, value });\n }\n }\n }\n\n if (orClauses.length > 0) {\n this._queries.push(`(${orClauses.join(' OR ')})`);\n }\n return this;\n }\n\n public override where<P extends ExtractPathExpressions<T>>(field: P, operator: 'isNull'): ICosmosQueryBuilder<T>;\n public override where<P extends ExtractPathExpressions<T>>(field: P, operator: 'in', value: readonly PathValue<T, P>[]): ICosmosQueryBuilder<T>;\n public override where<P extends ExtractPathExpressions<T>>(field: P, operator: 'contains', value: PathValue<T, P>[number]): ICosmosQueryBuilder<T>;\n public override where<P extends ExtractPathExpressions<T>, V extends PathValue<T, P>>(field: P, operator: BasicOpCode, value: V): ICosmosQueryBuilder<T>;\n public override where<P extends ExtractPathExpressions<T>, V extends PathValue<T, P>>(field: P, operator: ExtendedOpCode, value?: V | readonly V[]): ICosmosQueryBuilder<T> {\n const parameterName = `@p${this._parameters.length}`;\n\n if (operator === 'isNull') {\n const clause = `(c.${field} ?? null) = null`;\n this._queries.push(clause);\n } else if (operator === 'contains') {\n if (value !== undefined) {\n const clause = `ARRAY_CONTAINS(c.${field}, ${parameterName})`;\n this._queries.push(clause);\n this._parameters.push({ name: parameterName, value });\n }\n } else if (operator === 'in') {\n // Handle 'IN' operator\n if (value !== undefined) {\n const clause = `ARRAY_CONTAINS(${parameterName}, c.${field})`;\n this._queries.push(clause);\n this._parameters.push({ name: parameterName, value });\n }\n } else if (operator === 'ieq') {\n // Handle case-insensitive equality for strings\n if (value !== undefined) {\n const clause = `StringEquals(c.${field}, ${parameterName}, true)`;\n this._queries.push(clause);\n this._parameters.push({ name: parameterName, value });\n }\n } else if (operator === 'ine') {\n // Handle case-insensitive equality for strings\n if (value !== undefined) {\n const clause = `Not(StringEquals(c.${field}, ${parameterName}, true))`;\n this._queries.push(clause);\n this._parameters.push({ name: parameterName, value });\n }\n } else {\n const sqlOperator = operators[operator];\n if (sqlOperator != null && value !== undefined) {\n this._queries.push(`c.${field} ${sqlOperator} ${parameterName}`);\n this._parameters.push({ name: parameterName, value });\n }\n }\n return this;\n }\n\n public override filter(x: { clause: string; parameter?: JSONValue }): ICosmosQueryBuilder<T> {\n const paramName = `@p${this._parameters.length}`;\n this._queries.push(x.clause.replace('@', paramName));\n if (x.parameter != null) {\n this._parameters.push({\n name: paramName,\n value: x.parameter,\n });\n }\n return this;\n }\n\n public override query(): SqlQuerySpec {\n const lines: string[] = [];\n lines.push(`SELECT\\n${this._indent}${this._select}`);\n lines.push(`FROM\\n${this._indent}${this._from}`);\n if (this._join !== '') {\n lines.push(`JOIN\\n${this._indent}${this._join}`);\n }\n\n if (this._queries.length > 0) {\n lines.push('WHERE');\n const where = this._queries.join(` AND\\n${this._indent}`);\n lines.push(`${this._indent}${where}`);\n }\n\n lines.push(...this._orderBy);\n lines.push(...this._groupBy);\n if (this._limit != null) {\n lines.push('OFFSET 0');\n lines.push(`LIMIT ${this._limit}`);\n }\n\n const queryText = lines.join('\\n');\n const result = {\n query: queryText,\n parameters: this.parameters,\n };\n this._logger.verbose('Cosmos Query', result);\n return result;\n }\n\n public override async getOne<TSelect = T>(container: Container): Promise<TSelect | null> {\n const itemsQuery = this.query();\n const itemsIterator = container.items.query<TSelect>(itemsQuery);\n const items = await itemsIterator.fetchNext();\n this._logger.verbose('Cosmos Result', { result: items });\n return items.resources?.[0] ?? null;\n }\n\n public override async getAll<TSelect>(container: Container, limit?: number | null | undefined, cursor?: string | null | undefined): Promise<FetchResult<TSelect>> {\n const itemsQuery = this.query();\n const itemsIterator = container.items.query<TSelect>(itemsQuery, {\n continuationToken: cursor ?? undefined,\n maxItemCount: limit ?? undefined,\n });\n let items: FeedResponse<TSelect>;\n try {\n items = await itemsIterator.fetchAll();\n } catch (err) {\n this._logger.error('Cosmos Query Error', err);\n throw err;\n }\n this._logger.verbose('Cosmos Result', { result: items });\n\n this.select('VALUE COUNT(1)');\n this.orderBy();\n\n const countQuery = this.query();\n const countIterator = container.items.query<number>(countQuery);\n\n let count: FeedResponse<number>;\n try {\n count = await countIterator.fetchAll();\n } catch (err) {\n this._logger.error('Cosmos Count Query Error', err);\n throw err;\n }\n\n const totalCount = count.resources?.[0] ?? 0;\n\n const result: FetchResult<TSelect> = {\n continuationToken: items.continuationToken,\n count: items.resources?.length ?? 0,\n items: items.resources ?? [],\n hasMoreResults: items.hasMoreResults,\n totalCount,\n };\n return result;\n }\n\n public override patch<P extends ExtractPatchPathExpressions<T>>(...operations: Array<{ path: P; op: 'set' | 'add' | 'replace'; value: PatchPathValue<T, P> } | { path: P; op: 'remove' }>): PatchRequestBody {\n const patchOperations = operations.map((opDef) => {\n if (opDef.op === 'remove') {\n return { op: opDef.op, path: opDef.path };\n }\n\n if (opDef.value !== undefined) {\n return { op: opDef.op, path: opDef.path, value: opDef.value };\n }\n\n throw new Error(`Value is required for operation: ${opDef.op}`);\n });\n\n return { operations: patchOperations };\n }\n}\n","import { CosmosQueryBuilder } from '../private/CosmosQueryBuilder';\nimport type { ICosmosQueryBuilder } from './interfaces';\nimport type { CosmosQueryBuilderOptions } from './types';\n\nexport function createCosmosQueryBuilder<T extends Record<string, any>>(options?: CosmosQueryBuilderOptions): ICosmosQueryBuilder<T> {\n return new CosmosQueryBuilder<T>(options);\n}\n","export enum SortDirection {\n Asc = 'ASC',\n Desc = 'DESC',\n}\n"]}
@@ -39,7 +39,7 @@ type StringFilter = {
39
39
  ne?: string;
40
40
  };
41
41
  type ExtendedOpCode = BasicOpCode | 'contains' | 'in' | 'isNull';
42
- type BasicOpCode = 'eq' | 'gt' | 'lt' | 'ge' | 'le' | 'ne';
42
+ type BasicOpCode = 'eq' | 'ieq' | 'gt' | 'lt' | 'ge' | 'le' | 'ne' | 'ine';
43
43
  type FetchResult<T> = {
44
44
  items: T[];
45
45
  continuationToken: string;
@@ -89,7 +89,7 @@ declare abstract class ICosmosQueryBuilder<T extends Record<string, any>> {
89
89
  * builder.limit(100);
90
90
  * ```
91
91
  */
92
- abstract limit(limit: number): void;
92
+ abstract limit(limit: number): ICosmosQueryBuilder<T>;
93
93
  /**
94
94
  * Adds a JOIN clause to the query
95
95
  * @param value JOIN alias
@@ -99,7 +99,7 @@ declare abstract class ICosmosQueryBuilder<T extends Record<string, any>> {
99
99
  * builder.join('b', 'bones');
100
100
  * ```
101
101
  */
102
- abstract join<P extends ExtractPathExpressions<T>>(value: string, statement: P): void;
102
+ abstract join<P extends ExtractPathExpressions<T>>(value: string, statement: P): ICosmosQueryBuilder<T>;
103
103
  /**
104
104
  * Sets the SELECT clause for the query
105
105
  * @param value SELECT clause string
@@ -108,7 +108,7 @@ declare abstract class ICosmosQueryBuilder<T extends Record<string, any>> {
108
108
  * builder.select('COUNT(1) as count, UPPER(c.name.givenName) as name');
109
109
  * ```
110
110
  */
111
- abstract select(value: string): void;
111
+ abstract select(value: string): ICosmosQueryBuilder<T>;
112
112
  /**
113
113
  * Sets the GROUP BY clause for the query
114
114
  * @param value GROUP BY expression
@@ -117,7 +117,7 @@ declare abstract class ICosmosQueryBuilder<T extends Record<string, any>> {
117
117
  * builder.groupBy('UPPER(c.sex)');
118
118
  * ```
119
119
  */
120
- abstract groupBy(value: string): void;
120
+ abstract groupBy(value: string): ICosmosQueryBuilder<T>;
121
121
  /**
122
122
  * Performs fuzzy search across multiple fields
123
123
  * @param value Search term
@@ -127,7 +127,7 @@ declare abstract class ICosmosQueryBuilder<T extends Record<string, any>> {
127
127
  * builder.whereFuzzy('steve', ['name.givenName', 'name.familyName', 'email']);
128
128
  * ```
129
129
  */
130
- abstract whereFuzzy<P extends ExtractPathExpressions<T>>(value: string, fields: [P, ...P[]]): void;
130
+ abstract whereFuzzy<P extends ExtractPathExpressions<T>>(value: string, fields: [P, ...P[]]): ICosmosQueryBuilder<T>;
131
131
  /**
132
132
  * Adds a raw WHERE clause with field, operator, and value
133
133
  * @param field Field name as string
@@ -138,7 +138,7 @@ declare abstract class ICosmosQueryBuilder<T extends Record<string, any>> {
138
138
  * builder.whereRaw('p.id', 'eq', 'some-id');
139
139
  * ```
140
140
  */
141
- abstract whereRaw(field: string, operator: Exclude<ExtendedOpCode, 'isNull' | 'contains' | 'in'>, value: JSONValue): void;
141
+ abstract whereRaw(field: string, operator: Exclude<ExtendedOpCode, 'isNull' | 'contains' | 'in'>, value: JSONValue): ICosmosQueryBuilder<T>;
142
142
  /**
143
143
  * Adds an OR clause to match items satisfying any of the given conditions
144
144
  * @param conditions Array of field/operator/value conditions
@@ -154,7 +154,7 @@ declare abstract class ICosmosQueryBuilder<T extends Record<string, any>> {
154
154
  field: string;
155
155
  operator: ExtendedOpCode;
156
156
  value: JSONValue;
157
- }>): void;
157
+ }>): ICosmosQueryBuilder<T>;
158
158
  /**
159
159
  * Creates a JSON patch document for Cosmos DB patch operations
160
160
  * @param operations Array of patch operations (set, add, replace, remove)
@@ -178,6 +178,14 @@ declare abstract class ICosmosQueryBuilder<T extends Record<string, any>> {
178
178
  path: P;
179
179
  op: 'remove';
180
180
  }>): PatchRequestBody;
181
+ /**
182
+ * Add a custom un-typed where clause
183
+ * @param filter
184
+ */
185
+ abstract filter(filter: {
186
+ clause: string;
187
+ parameter?: JSONValue;
188
+ }): ICosmosQueryBuilder<T>;
181
189
  /**
182
190
  * Builds query conditions from a structured object with type filters
183
191
  * Supports {@link StringFilter}, {@link UUIDFilter}, and {@link InstantFilter} types
@@ -212,20 +220,20 @@ declare abstract class ICosmosQueryBuilder<T extends Record<string, any>> {
212
220
  * builder.where('deletedAt', 'isNull');
213
221
  * ```
214
222
  */
215
- abstract where<P extends ExtractPathExpressions<T>>(field: P, operator: 'isNull'): void;
216
- abstract where<P extends ExtractPathExpressions<T>>(field: P, operator: 'in', value: readonly PathValue<T, P>[]): void;
217
- abstract where<P extends ExtractPathExpressions<T>>(field: P, operator: 'contains', value: PathValue<T, P>[number]): void;
218
- abstract where<P extends ExtractPathExpressions<T>, V extends PathValue<T, P>>(field: P, operator: BasicOpCode, value: V): void;
223
+ abstract where<P extends ExtractPathExpressions<T>>(field: P, operator: 'isNull'): ICosmosQueryBuilder<T>;
224
+ abstract where<P extends ExtractPathExpressions<T>>(field: P, operator: 'in', value: readonly PathValue<T, P>[]): ICosmosQueryBuilder<T>;
225
+ abstract where<P extends ExtractPathExpressions<T>>(field: P, operator: 'contains', value: PathValue<T, P>[number]): ICosmosQueryBuilder<T>;
226
+ abstract where<P extends ExtractPathExpressions<T>, V extends PathValue<T, P>>(field: P, operator: BasicOpCode, value: V): ICosmosQueryBuilder<T>;
219
227
  /**
220
228
  * Clears any existing ordering
221
229
  */
222
- abstract orderBy(): void;
230
+ abstract orderBy(): ICosmosQueryBuilder<T>;
223
231
  /**
224
232
  * Sets ordering by field and direction
225
233
  * @param field Field path to order by
226
234
  * @param direction Sort direction (ASC/DESC)
227
235
  */
228
- abstract orderBy<P extends ExtractPathExpressions<T>>(field: P, direction: SortDirection): void;
236
+ abstract orderBy<P extends ExtractPathExpressions<T>>(field: P, direction: SortDirection): ICosmosQueryBuilder<T>;
229
237
  /**
230
238
  * Builds and returns the final SQL query specification
231
239
  * @returns SQL query specification with parameters
@@ -39,7 +39,7 @@ type StringFilter = {
39
39
  ne?: string;
40
40
  };
41
41
  type ExtendedOpCode = BasicOpCode | 'contains' | 'in' | 'isNull';
42
- type BasicOpCode = 'eq' | 'gt' | 'lt' | 'ge' | 'le' | 'ne';
42
+ type BasicOpCode = 'eq' | 'ieq' | 'gt' | 'lt' | 'ge' | 'le' | 'ne' | 'ine';
43
43
  type FetchResult<T> = {
44
44
  items: T[];
45
45
  continuationToken: string;
@@ -89,7 +89,7 @@ declare abstract class ICosmosQueryBuilder<T extends Record<string, any>> {
89
89
  * builder.limit(100);
90
90
  * ```
91
91
  */
92
- abstract limit(limit: number): void;
92
+ abstract limit(limit: number): ICosmosQueryBuilder<T>;
93
93
  /**
94
94
  * Adds a JOIN clause to the query
95
95
  * @param value JOIN alias
@@ -99,7 +99,7 @@ declare abstract class ICosmosQueryBuilder<T extends Record<string, any>> {
99
99
  * builder.join('b', 'bones');
100
100
  * ```
101
101
  */
102
- abstract join<P extends ExtractPathExpressions<T>>(value: string, statement: P): void;
102
+ abstract join<P extends ExtractPathExpressions<T>>(value: string, statement: P): ICosmosQueryBuilder<T>;
103
103
  /**
104
104
  * Sets the SELECT clause for the query
105
105
  * @param value SELECT clause string
@@ -108,7 +108,7 @@ declare abstract class ICosmosQueryBuilder<T extends Record<string, any>> {
108
108
  * builder.select('COUNT(1) as count, UPPER(c.name.givenName) as name');
109
109
  * ```
110
110
  */
111
- abstract select(value: string): void;
111
+ abstract select(value: string): ICosmosQueryBuilder<T>;
112
112
  /**
113
113
  * Sets the GROUP BY clause for the query
114
114
  * @param value GROUP BY expression
@@ -117,7 +117,7 @@ declare abstract class ICosmosQueryBuilder<T extends Record<string, any>> {
117
117
  * builder.groupBy('UPPER(c.sex)');
118
118
  * ```
119
119
  */
120
- abstract groupBy(value: string): void;
120
+ abstract groupBy(value: string): ICosmosQueryBuilder<T>;
121
121
  /**
122
122
  * Performs fuzzy search across multiple fields
123
123
  * @param value Search term
@@ -127,7 +127,7 @@ declare abstract class ICosmosQueryBuilder<T extends Record<string, any>> {
127
127
  * builder.whereFuzzy('steve', ['name.givenName', 'name.familyName', 'email']);
128
128
  * ```
129
129
  */
130
- abstract whereFuzzy<P extends ExtractPathExpressions<T>>(value: string, fields: [P, ...P[]]): void;
130
+ abstract whereFuzzy<P extends ExtractPathExpressions<T>>(value: string, fields: [P, ...P[]]): ICosmosQueryBuilder<T>;
131
131
  /**
132
132
  * Adds a raw WHERE clause with field, operator, and value
133
133
  * @param field Field name as string
@@ -138,7 +138,7 @@ declare abstract class ICosmosQueryBuilder<T extends Record<string, any>> {
138
138
  * builder.whereRaw('p.id', 'eq', 'some-id');
139
139
  * ```
140
140
  */
141
- abstract whereRaw(field: string, operator: Exclude<ExtendedOpCode, 'isNull' | 'contains' | 'in'>, value: JSONValue): void;
141
+ abstract whereRaw(field: string, operator: Exclude<ExtendedOpCode, 'isNull' | 'contains' | 'in'>, value: JSONValue): ICosmosQueryBuilder<T>;
142
142
  /**
143
143
  * Adds an OR clause to match items satisfying any of the given conditions
144
144
  * @param conditions Array of field/operator/value conditions
@@ -154,7 +154,7 @@ declare abstract class ICosmosQueryBuilder<T extends Record<string, any>> {
154
154
  field: string;
155
155
  operator: ExtendedOpCode;
156
156
  value: JSONValue;
157
- }>): void;
157
+ }>): ICosmosQueryBuilder<T>;
158
158
  /**
159
159
  * Creates a JSON patch document for Cosmos DB patch operations
160
160
  * @param operations Array of patch operations (set, add, replace, remove)
@@ -178,6 +178,14 @@ declare abstract class ICosmosQueryBuilder<T extends Record<string, any>> {
178
178
  path: P;
179
179
  op: 'remove';
180
180
  }>): PatchRequestBody;
181
+ /**
182
+ * Add a custom un-typed where clause
183
+ * @param filter
184
+ */
185
+ abstract filter(filter: {
186
+ clause: string;
187
+ parameter?: JSONValue;
188
+ }): ICosmosQueryBuilder<T>;
181
189
  /**
182
190
  * Builds query conditions from a structured object with type filters
183
191
  * Supports {@link StringFilter}, {@link UUIDFilter}, and {@link InstantFilter} types
@@ -212,20 +220,20 @@ declare abstract class ICosmosQueryBuilder<T extends Record<string, any>> {
212
220
  * builder.where('deletedAt', 'isNull');
213
221
  * ```
214
222
  */
215
- abstract where<P extends ExtractPathExpressions<T>>(field: P, operator: 'isNull'): void;
216
- abstract where<P extends ExtractPathExpressions<T>>(field: P, operator: 'in', value: readonly PathValue<T, P>[]): void;
217
- abstract where<P extends ExtractPathExpressions<T>>(field: P, operator: 'contains', value: PathValue<T, P>[number]): void;
218
- abstract where<P extends ExtractPathExpressions<T>, V extends PathValue<T, P>>(field: P, operator: BasicOpCode, value: V): void;
223
+ abstract where<P extends ExtractPathExpressions<T>>(field: P, operator: 'isNull'): ICosmosQueryBuilder<T>;
224
+ abstract where<P extends ExtractPathExpressions<T>>(field: P, operator: 'in', value: readonly PathValue<T, P>[]): ICosmosQueryBuilder<T>;
225
+ abstract where<P extends ExtractPathExpressions<T>>(field: P, operator: 'contains', value: PathValue<T, P>[number]): ICosmosQueryBuilder<T>;
226
+ abstract where<P extends ExtractPathExpressions<T>, V extends PathValue<T, P>>(field: P, operator: BasicOpCode, value: V): ICosmosQueryBuilder<T>;
219
227
  /**
220
228
  * Clears any existing ordering
221
229
  */
222
- abstract orderBy(): void;
230
+ abstract orderBy(): ICosmosQueryBuilder<T>;
223
231
  /**
224
232
  * Sets ordering by field and direction
225
233
  * @param field Field path to order by
226
234
  * @param direction Sort direction (ASC/DESC)
227
235
  */
228
- abstract orderBy<P extends ExtractPathExpressions<T>>(field: P, direction: SortDirection): void;
236
+ abstract orderBy<P extends ExtractPathExpressions<T>>(field: P, direction: SortDirection): ICosmosQueryBuilder<T>;
229
237
  /**
230
238
  * Builds and returns the final SQL query specification
231
239
  * @returns SQL query specification with parameters
package/dist/esm/index.js CHANGED
@@ -1 +1 @@
1
- var e=Object.defineProperty,t=(t,s)=>e(t,"name",{value:s,configurable:!0}),s=class{static{t(this,"ILogger")}},r=class{static{t(this,"ICosmosQueryBuilder")}},i={eq:"=",ne:"!=",ge:">=",gt:">",le:"<=",lt:"<"},n=class extends s{static{t(this,"DefaultLogger")}debug(e,...t){}info(e,...t){}error(e,...t){}warn(e,...t){}verbose(e,...t){}},u=class extends r{static{t(this,"CosmosQueryBuilder")}_orderBy;_select="*";_groupBy=null;_join="";_from="c";_queries=[];_parameters=[];_limit;_logger;constructor(e){super(),this._logger=e?.logger??new n}get queries(){return this._queries}set queries(e){this._queries=e}get parameters(){return this._parameters}set parameters(e){this._parameters=e}handleStringFilter(e,t){return this.handleFilterObject(e,t)}handleUuidFilter(e,t){return this.handleFilterObject(e,t)}handleInstantFilter(e,t){return this.handleFilterObject(e,t)}handleFilterObject(e,t){const{__typeInfo:s,...r}=t;for(const[t,s]of Object.entries(r).filter(e=>void 0!==e[1])){const r=e,n=`@p${this._parameters.length}`,u=i[t],o=`(${r} ?? null)`;if(null!=u)this._queries.push(`${o} ${u} ${n}`);else if("ieq"===t)this._queries.push(`StringEquals(${o}, ${n}, true)`);else if("ine"===t)this._queries.push(`Not(StringEquals(${o}, ${n}, true))`);else if("like"===t)this._queries.push(`Contains(${o}, ${n}, true)`);else{if("in"!==t)throw new Error(`Unknown operator ${t}`);this._queries.push(`ARRAY_CONTAINS(${n}, ${o})`)}this._parameters.push({name:n,value:s})}}_buildQuery(e,t="c"){if(null!=e){const{__typeInfo:s,...r}=e,i=Object.keys(r);for(const s of i){const r=e[s],i=r.__typeInfo??null,n=`${t}.${s}`;if("object"!=typeof r||null==r)throw new Error(`Unhandled type ${i}`);"StringFilter"===i?this.handleStringFilter(n,r):"InstantFilter"===i?this.handleInstantFilter(n,r):"UUIDFilter"===i?this.handleUuidFilter(n,r):this._buildQuery(r,n)}}}buildQuery(e,t="c"){this._buildQuery(e,t)}orderBy(e,t){this._orderBy=null==e||null==t?void 0:`\nORDER BY\n c.${e} ${t}`}groupBy(e){this._groupBy=`\nGROUP BY\n ${e}`}select(e){this._select=e}parameter(e,t){this._parameters.push({name:e,value:t})}limit(e){this._limit=e}join(e,t){this._join=`${e} IN c.${t}`}whereFuzzy(e,t){const s=`@p${this._parameters.length}`,r=[];for(const e of t){const t=`Contains(c.${e}, ${s}, true)`;r.push(t)}const i=`(${r.join(" OR ")})`;this._queries.push(i),this._parameters.push({name:s,value:e})}whereRaw(e,t,s){const r=`@p${this._parameters.length}`,n=i[t];this._queries.push(`${e} ${n} ${r}`),this._parameters.push({name:r,value:s})}whereOr(e){const t=[];for(const s of e){const{field:e,operator:r,value:n}=s,u=`@p${this._parameters.length}`;if("isNull"===r)t.push(`(c.${e} ?? null) = null`);else if("contains"===r)t.push(`ARRAY_CONTAINS(c.${e}, ${u})`);else if("in"===r)t.push(`ARRAY_CONTAINS(${u}, c.${e})`);else{const s=i[r];null!=s&&void 0!==n&&(t.push(`c.${e} ${s} ${u}`),this._parameters.push({name:u,value:n}))}}t.length>0&&this._queries.push(`(${t.join(" OR ")})`)}where(e,t,s){const r=`@p${this._parameters.length}`;if("isNull"===t){const t=`(c.${e} ?? null) = null`;this._queries.push(t)}else if("contains"===t){if(void 0!==s){const t=`ARRAY_CONTAINS(c.${e}, ${r})`;this._queries.push(t),this._parameters.push({name:r,value:s})}}else if("in"===t){if(void 0!==s){const t=`ARRAY_CONTAINS(${r}, c.${e})`;this._queries.push(t),this._parameters.push({name:r,value:s})}}else{const n=i[t];null!=n&&void 0!==s&&(this._queries.push(`c.${e} ${n} ${r}`),this._parameters.push({name:r,value:s}))}}filter(e){const t=`@p${this._parameters.length}`;this._queries.push(e.clause.replace("@",t)),null!=e.parameter&&this._parameters.push({name:t,value:e.parameter})}query(){const e=[];if(e.push(`SELECT\n ${this._select}`),e.push(`FROM\n ${this._from}`),""!==this._join&&e.push(`JOIN\n ${this._join}`),this._queries.length>0){e.push("WHERE");const t=this._queries.join("\n AND ");e.push(t)}null!=this._orderBy&&e.push(this._orderBy),null!=this._groupBy&&e.push(this._groupBy),null!=this._limit&&(e.push("OFFSET 0"),e.push(`LIMIT ${this._limit}`));const t={query:e.join("\n"),parameters:this.parameters};return this._logger.verbose("Cosmos Query",t),t}async getOne(e){const t=this.query(),s=e.items.query(t),r=await s.fetchNext();return this._logger.verbose("Cosmos Result",{result:r}),r.resources?.[0]??null}async getAll(e,t,s){const r=this.query(),i=e.items.query(r,{continuationToken:s??void 0,maxItemCount:t??void 0});let n;try{n=await i.fetchAll()}catch(e){throw this._logger.error("Cosmos Query Error",e),e}this._logger.verbose("Cosmos Result",{result:n}),this.select("VALUE COUNT(1)"),this.orderBy();const u=this.query(),o=e.items.query(u);let l;try{l=await o.fetchAll()}catch(e){throw this._logger.error("Cosmos Count Query Error",e),e}const h=l.resources?.[0]??0;return{continuationToken:n.continuationToken,count:n.resources?.length??0,items:n.resources??[],hasMoreResults:n.hasMoreResults,totalCount:h}}patch(...e){return{operations:e.map(e=>{if("remove"===e.op)return{op:e.op,path:e.path};if(void 0!==e.value)return{op:e.op,path:e.path,value:e.value};throw new Error(`Value is required for operation: ${e.op}`)})}}};function o(e){return new u(e)}t(o,"createCosmosQueryBuilder");var l=(e=>(e.Asc="ASC",e.Desc="DESC",e))(l||{});export{s as ILogger,l as SortDirection,o as createCosmosQueryBuilder};//# sourceMappingURL=index.js.map
1
+ var e=Object.defineProperty,t=(t,s)=>e(t,"name",{value:s,configurable:!0}),s=class{static{t(this,"ILogger")}},r=class{static{t(this,"ICosmosQueryBuilder")}},i={eq:"=",ne:"!=",ge:">=",gt:">",le:"<=",lt:"<"},n=class extends s{static{t(this,"DefaultLogger")}debug(e,...t){}info(e,...t){}error(e,...t){}warn(e,...t){}verbose(e,...t){}},u=class extends r{static{t(this,"CosmosQueryBuilder")}_indent=" ";_orderBy=[];_select="*";_groupBy=[];_join="";_from="c";_queries=[];_parameters=[];_limit;_logger;constructor(e){super(),this._logger=e?.logger??new n}get queries(){return this._queries}set queries(e){this._queries=e}get parameters(){return this._parameters}set parameters(e){this._parameters=e}handleStringFilter(e,t){return this.handleFilterObject(e,t)}handleUuidFilter(e,t){return this.handleFilterObject(e,t)}handleInstantFilter(e,t){return this.handleFilterObject(e,t)}handleFilterObject(e,t){const{__typeInfo:s,...r}=t;for(const[t,s]of Object.entries(r).filter(e=>void 0!==e[1])){const r=e,n=`@p${this._parameters.length}`,u=i[t],h=`(${r} ?? null)`;if(null!=u)this._queries.push(`${h} ${u} ${n}`);else if("ieq"===t)this._queries.push(`StringEquals(${h}, ${n}, true)`);else if("ine"===t)this._queries.push(`Not(StringEquals(${h}, ${n}, true))`);else if("like"===t)this._queries.push(`Contains(${h}, ${n}, true)`);else{if("in"!==t)throw new Error(`Unknown operator ${t}`);this._queries.push(`ARRAY_CONTAINS(${n}, ${h})`)}this._parameters.push({name:n,value:s})}}_buildQuery(e,t="c"){if(null!=e){const{__typeInfo:s,...r}=e,i=Object.keys(r);for(const s of i){const r=e[s],i=r.__typeInfo??null,n=`${t}.${s}`;if("object"!=typeof r||null==r)throw new Error(`Unhandled type ${i}`);"StringFilter"===i?this.handleStringFilter(n,r):"InstantFilter"===i?this.handleInstantFilter(n,r):"UUIDFilter"===i?this.handleUuidFilter(n,r):this._buildQuery(r,n)}}}buildQuery(e,t="c"){this._buildQuery(e,t)}orderBy(e,t){return this._orderBy=null==e||null==t?[]:["ORDER BY",`${this._indent}c.${e} ${t}`],this}groupBy(e){return this._groupBy=["GROUP BY",`${this._indent}${e}`],this}select(e){return this._select=e,this}parameter(e,t){this._parameters.push({name:e,value:t})}limit(e){return this._limit=e,this}join(e,t){return this._join=`${e} IN c.${t}`,this}whereFuzzy(e,t){const s=`@p${this._parameters.length}`,r=[];for(const e of t){const t=`Contains(c.${e}, ${s}, true)`;r.push(t)}const i=`(${r.join(" OR ")})`;return this._queries.push(i),this._parameters.push({name:s,value:e}),this}whereRaw(e,t,s){const r=`@p${this._parameters.length}`,n=i[t];return this._queries.push(`${e} ${n} ${r}`),this._parameters.push({name:r,value:s}),this}whereOr(e){const t=[];for(const s of e){const{field:e,operator:r,value:n}=s,u=`@p${this._parameters.length}`;if("isNull"===r)t.push(`(c.${e} ?? null) = null`);else if("contains"===r)t.push(`ARRAY_CONTAINS(c.${e}, ${u})`);else if("in"===r)t.push(`ARRAY_CONTAINS(${u}, c.${e})`);else{const s=i[r];null!=s&&void 0!==n&&(t.push(`c.${e} ${s} ${u}`),this._parameters.push({name:u,value:n}))}}return t.length>0&&this._queries.push(`(${t.join(" OR ")})`),this}where(e,t,s){const r=`@p${this._parameters.length}`;if("isNull"===t){const t=`(c.${e} ?? null) = null`;this._queries.push(t)}else if("contains"===t){if(void 0!==s){const t=`ARRAY_CONTAINS(c.${e}, ${r})`;this._queries.push(t),this._parameters.push({name:r,value:s})}}else if("in"===t){if(void 0!==s){const t=`ARRAY_CONTAINS(${r}, c.${e})`;this._queries.push(t),this._parameters.push({name:r,value:s})}}else if("ieq"===t){if(void 0!==s){const t=`StringEquals(c.${e}, ${r}, true)`;this._queries.push(t),this._parameters.push({name:r,value:s})}}else if("ine"===t){if(void 0!==s){const t=`Not(StringEquals(c.${e}, ${r}, true))`;this._queries.push(t),this._parameters.push({name:r,value:s})}}else{const n=i[t];null!=n&&void 0!==s&&(this._queries.push(`c.${e} ${n} ${r}`),this._parameters.push({name:r,value:s}))}return this}filter(e){const t=`@p${this._parameters.length}`;return this._queries.push(e.clause.replace("@",t)),null!=e.parameter&&this._parameters.push({name:t,value:e.parameter}),this}query(){const e=[];if(e.push(`SELECT\n${this._indent}${this._select}`),e.push(`FROM\n${this._indent}${this._from}`),""!==this._join&&e.push(`JOIN\n${this._indent}${this._join}`),this._queries.length>0){e.push("WHERE");const t=this._queries.join(` AND\n${this._indent}`);e.push(`${this._indent}${t}`)}e.push(...this._orderBy),e.push(...this._groupBy),null!=this._limit&&(e.push("OFFSET 0"),e.push(`LIMIT ${this._limit}`));const t={query:e.join("\n"),parameters:this.parameters};return this._logger.verbose("Cosmos Query",t),t}async getOne(e){const t=this.query(),s=e.items.query(t),r=await s.fetchNext();return this._logger.verbose("Cosmos Result",{result:r}),r.resources?.[0]??null}async getAll(e,t,s){const r=this.query(),i=e.items.query(r,{continuationToken:s??void 0,maxItemCount:t??void 0});let n;try{n=await i.fetchAll()}catch(e){throw this._logger.error("Cosmos Query Error",e),e}this._logger.verbose("Cosmos Result",{result:n}),this.select("VALUE COUNT(1)"),this.orderBy();const u=this.query(),h=e.items.query(u);let o;try{o=await h.fetchAll()}catch(e){throw this._logger.error("Cosmos Count Query Error",e),e}const l=o.resources?.[0]??0;return{continuationToken:n.continuationToken,count:n.resources?.length??0,items:n.resources??[],hasMoreResults:n.hasMoreResults,totalCount:l}}patch(...e){return{operations:e.map(e=>{if("remove"===e.op)return{op:e.op,path:e.path};if(void 0!==e.value)return{op:e.op,path:e.path,value:e.value};throw new Error(`Value is required for operation: ${e.op}`)})}}};function h(e){return new u(e)}t(h,"createCosmosQueryBuilder");var o=(e=>(e.Asc="ASC",e.Desc="DESC",e))(o||{});export{s as ILogger,o as SortDirection,h as createCosmosQueryBuilder};//# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/public/interfaces.ts","../../src/private/consts.ts","../../src/private/DefaultLogger.ts","../../src/private/CosmosQueryBuilder.ts","../../src/public/createCosmosQueryBuilder.ts","../../src/public/enums.ts"],"names":["SortDirection"],"mappings":"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","file":"index.js","sourcesContent":["import type { JSONValue, PatchRequestBody, SqlQuerySpec } from '@azure/cosmos';\nimport type { ExtractPatchPathExpressions, ExtractPathExpressions, PatchPathValue, PathValue } from '../private/types';\nimport type { SortDirection } from './enums';\nimport type { BasicOpCode, Container, ExtendedOpCode, FetchResult, InstantFilter, StringFilter, UUIDFilter } from './types';\n\nexport abstract class ILogger {\n public abstract debug(message?: any, ...optionalParams: any[]): void;\n public abstract info(message?: any, ...optionalParams: any[]): void;\n public abstract error(message?: any, ...optionalParams: any[]): void;\n public abstract warn(message?: any, ...optionalParams: any[]): void;\n public abstract verbose(message?: any, ...optionalParams: any[]): void;\n}\n\nexport abstract class ICosmosQueryBuilder<T extends Record<string, any>> {\n /**\n * Sets the maximum number of items to return\n * @param limit Maximum number of items\n * @example\n * ```typescript\n * builder.limit(100);\n * ```\n */\n public abstract limit(limit: number): void;\n\n /**\n * Adds a JOIN clause to the query\n * @param value JOIN alias\n * @param statement Field path to join on\n * @example\n * ```typescript\n * builder.join('b', 'bones');\n * ```\n */\n public abstract join<P extends ExtractPathExpressions<T>>(value: string, statement: P): void;\n\n /**\n * Sets the SELECT clause for the query\n * @param value SELECT clause string\n * @example\n * ```typescript\n * builder.select('COUNT(1) as count, UPPER(c.name.givenName) as name');\n * ```\n */\n public abstract select(value: string): void;\n\n /**\n * Sets the GROUP BY clause for the query\n * @param value GROUP BY expression\n * @example\n * ```typescript\n * builder.groupBy('UPPER(c.sex)');\n * ```\n */\n public abstract groupBy(value: string): void;\n\n /**\n * Performs fuzzy search across multiple fields\n * @param value Search term\n * @param fields Array of field paths to search in\n * @example\n * ```typescript\n * builder.whereFuzzy('steve', ['name.givenName', 'name.familyName', 'email']);\n * ```\n */\n public abstract whereFuzzy<P extends ExtractPathExpressions<T>>(value: string, fields: [P, ...P[]]): void;\n\n /**\n * Adds a raw WHERE clause with field, operator, and value\n * @param field Field name as string\n * @param operator SQL operator (excluding isNull, contains, in)\n * @param value Value to compare against\n * @example\n * ```typescript\n * builder.whereRaw('p.id', 'eq', 'some-id');\n * ```\n */\n public abstract whereRaw(field: string, operator: Exclude<ExtendedOpCode, 'isNull' | 'contains' | 'in'>, value: JSONValue): void;\n\n /**\n * Adds an OR clause to match items satisfying any of the given conditions\n * @param conditions Array of field/operator/value conditions\n * @example\n * ```typescript\n * builder.whereOr([\n * { field: 'name.givenName', operator: 'eq', value: 'John' },\n * { field: 'name.familyName', operator: 'eq', value: 'Smith' }\n * ]);\n * ```\n */\n public abstract whereOr(conditions: Array<{ field: string; operator: ExtendedOpCode; value: JSONValue }>): void;\n\n /**\n * Creates a JSON patch document for Cosmos DB patch operations\n * @param operations Array of patch operations (set, add, replace, remove)\n * @returns Patch request body for Cosmos DB\n * @example\n * ```typescript\n * const operations = builder.patch({\n * op: 'replace',\n * path: '/name/givenName',\n * value: 'Smith',\n * });\n * const item = container.item('id', 'partitionKey');\n * await item.patch<Person>(operations);\n * ```\n */\n public abstract patch<P extends ExtractPatchPathExpressions<T>>(...operations: Array<{ path: P; op: 'set' | 'add' | 'replace'; value: PatchPathValue<T, P> } | { path: P; op: 'remove' }>): PatchRequestBody;\n\n /**\n * Builds query conditions from a structured object with type filters\n * Supports {@link StringFilter}, {@link UUIDFilter}, and {@link InstantFilter} types\n * @param query Query object with nested field filters containing __typeInfo\n * @param prefix Path prefix for nested queries (defaults to 'c')\n * @example\n * ```typescript\n * type PersonFilter = {\n * name?: {\n * givenName?: StringFilter;\n * };\n * };\n * const filter = {\n * name: {\n * givenName: { __typeInfo: 'StringFilter', eq: 'John' }\n * },\n * } satisfies PersonFilter;\n * builder.buildQuery(filter);\n * ```\n */\n public abstract buildQuery(query: Record<string, any> | undefined | null, prefix?: string): void;\n\n /**\n * Adds a WHERE clause with type-safe field access and operators\n * @param field Type-safe field path\n * @param operator SQL operator\n * @example\n * ```typescript\n * builder.where('name.givenName', 'eq', 'John');\n * builder.where('age', 'gt', 18);\n * builder.where('bones', 'contains', 'arm');\n * builder.where('name.givenName', 'in', ['John', 'Jane']);\n * builder.where('deletedAt', 'isNull');\n * ```\n */\n public abstract where<P extends ExtractPathExpressions<T>>(field: P, operator: 'isNull'): void;\n public abstract where<P extends ExtractPathExpressions<T>>(field: P, operator: 'in', value: readonly PathValue<T, P>[]): void;\n public abstract where<P extends ExtractPathExpressions<T>>(field: P, operator: 'contains', value: PathValue<T, P>[number]): void;\n public abstract where<P extends ExtractPathExpressions<T>, V extends PathValue<T, P>>(field: P, operator: BasicOpCode, value: V): void;\n\n /**\n * Clears any existing ordering\n */\n public abstract orderBy(): void;\n\n /**\n * Sets ordering by field and direction\n * @param field Field path to order by\n * @param direction Sort direction (ASC/DESC)\n */\n public abstract orderBy<P extends ExtractPathExpressions<T>>(field: P, direction: SortDirection): void;\n\n /**\n * Builds and returns the final SQL query specification\n * @returns SQL query specification with parameters\n */\n public abstract query(): SqlQuerySpec;\n\n /**\n * Executes the query and returns the first result\n * @param container Cosmos DB container to query\n * @returns First matching item or null\n */\n public abstract getOne<TSelect = T>(container: Container): Promise<TSelect | null>;\n\n /**\n * Executes the query and returns paginated results with total count\n * @param container Cosmos DB container to query\n * @param limit Maximum number of items per page\n * @param cursor Continuation token for pagination\n * @returns Paginated results with metadata\n */\n public abstract getAll<TSelect = T>(container: Container, limit?: number | null | undefined, cursor?: string | null | undefined): Promise<FetchResult<TSelect>>;\n}\n","export const operators: Record<string, string | undefined> = {\n eq: '=',\n ne: '!=',\n ge: '>=',\n gt: '>',\n le: '<=',\n lt: '<',\n} as const;\n","import { ILogger } from '../public/interfaces';\n\nexport class DefaultLogger extends ILogger {\n public debug(_message?: any, ..._optionalParams: any[]): void {}\n public info(_message?: any, ..._optionalParams: any[]): void {}\n public error(_message?: any, ..._optionalParams: any[]): void {}\n public warn(_message?: any, ..._optionalParams: any[]): void {}\n public verbose(_message?: any, ..._optionalParams: any[]): void {}\n}\n","import type { JSONValue, PatchRequestBody, SqlParameter, SqlQuerySpec } from '@azure/cosmos';\nimport type { SortDirection } from '../public/enums';\nimport { ICosmosQueryBuilder, type ILogger } from '../public/interfaces';\nimport type { BasicOpCode, Container, CosmosQueryBuilderOptions, ExtendedOpCode, FeedResponse, FetchResult, InstantFilter, StringFilter, UUIDFilter } from '../public/types';\nimport { operators } from './consts';\nimport { DefaultLogger } from './DefaultLogger';\nimport type { ExtractPatchPathExpressions, ExtractPathExpressions, PatchPathValue, PathValue, StringFilterData } from './types';\n\nexport class CosmosQueryBuilder<T extends Record<string, any>> extends ICosmosQueryBuilder<T> {\n private _orderBy?: string;\n private _select = '*';\n private _groupBy: string | null = null;\n private _join = '';\n private _from = 'c';\n private _queries: string[] = [];\n private _parameters: SqlParameter[] = [];\n private _limit: number | undefined;\n private _logger: ILogger;\n\n public constructor(options?: CosmosQueryBuilderOptions) {\n super();\n this._logger = options?.logger ?? new DefaultLogger();\n }\n\n public get queries(): string[] {\n return this._queries;\n }\n\n public set queries(value: string[]) {\n this._queries = value;\n }\n\n public get parameters(): SqlParameter[] {\n return this._parameters;\n }\n\n public set parameters(value: SqlParameter[]) {\n this._parameters = value;\n }\n\n private handleStringFilter(prefix: string, value: StringFilter) {\n return this.handleFilterObject(prefix, value);\n }\n\n private handleUuidFilter(prefix: string, value: UUIDFilter) {\n return this.handleFilterObject(prefix, value);\n }\n\n private handleInstantFilter(prefix: string, value: InstantFilter) {\n return this.handleFilterObject(prefix, value);\n }\n\n private handleFilterObject(prefix: string, value: StringFilterData & { __typeInfo: string }) {\n const { __typeInfo, ...rest } = value;\n for (const [key, value2] of Object.entries(rest).filter((x) => x[1] !== undefined)) {\n const path = prefix;\n const parameterName = `@p${this._parameters.length}`;\n const operator = operators[key];\n\n // Default to null to allow null comparison when parent object is not defined\n const queryKey = `(${path} ?? null)`;\n if (operator != null) {\n this._queries.push(`${queryKey} ${operator} ${parameterName}`);\n } else {\n if (key === 'ieq') {\n this._queries.push(`StringEquals(${queryKey}, ${parameterName}, true)`);\n } else if (key === 'ine') {\n this._queries.push(`Not(StringEquals(${queryKey}, ${parameterName}, true))`);\n } else if (key === 'like') {\n this._queries.push(`Contains(${queryKey}, ${parameterName}, true)`);\n } else if (key === 'in') {\n this._queries.push(`ARRAY_CONTAINS(${parameterName}, ${queryKey})`);\n } else {\n throw new Error(`Unknown operator ${key}`);\n }\n }\n this._parameters.push({ name: parameterName, value: value2 });\n }\n }\n\n private _buildQuery(query: Record<string, any> | null | undefined, prefix = 'c'): void {\n if (query != null) {\n const { __typeInfo, ...rest } = query;\n const queryKeys = Object.keys(rest);\n\n for (const key of queryKeys) {\n const value = query[key];\n const type: string | null = value.__typeInfo ?? null;\n const subPath = `${prefix}.${key}`;\n\n if (typeof value === 'object' && value != null) {\n if (type === 'StringFilter') {\n this.handleStringFilter(subPath, value);\n } else if (type === 'InstantFilter') {\n this.handleInstantFilter(subPath, value);\n } else if (type === 'UUIDFilter') {\n this.handleUuidFilter(subPath, value);\n } else {\n this._buildQuery(value, subPath);\n }\n } else {\n throw new Error(`Unhandled type ${type}`);\n }\n }\n }\n }\n\n public override buildQuery(query: Record<string, any> | undefined | null, prefix = 'c'): void {\n this._buildQuery(query, prefix);\n }\n\n public override orderBy(): void;\n public override orderBy<P extends ExtractPathExpressions<T>>(field: P, direction: SortDirection): void;\n public override orderBy<P extends ExtractPathExpressions<T>>(field?: P, direction?: SortDirection) {\n if (field == null || direction == null) {\n this._orderBy = undefined;\n } else {\n this._orderBy = `\\nORDER BY\\n c.${field} ${direction}`;\n }\n }\n\n public override groupBy(value: string): void {\n this._groupBy = `\\nGROUP BY\\n ${value}`;\n }\n\n public override select(value: string): void {\n this._select = value;\n }\n\n private parameter(name: string, value: JSONValue): void {\n this._parameters.push({\n name,\n value,\n });\n }\n\n public override limit(limit: number): void {\n this._limit = limit;\n }\n\n public override join<P extends ExtractPathExpressions<T>>(value: string, statement: P): void {\n this._join = `${value} IN c.${statement}`;\n }\n\n public override whereFuzzy<P extends ExtractPathExpressions<T>>(value: string, fields: [P, ...P[]]): void {\n const parameterName = `@p${this._parameters.length}`;\n const lines: string[] = [];\n for (const field of fields) {\n const clause = `Contains(c.${field}, ${parameterName}, true)`;\n lines.push(clause);\n }\n const queryLine = `(${lines.join(' OR ')})`;\n this._queries.push(queryLine);\n this._parameters.push({ name: parameterName, value });\n }\n\n public override whereRaw(field: string, operator: Exclude<ExtendedOpCode, 'isNull' | 'contains' | 'in'>, value: JSONValue): void {\n const parameterName = `@p${this._parameters.length}`;\n const sqlOperator = operators[operator];\n this._queries.push(`${field} ${sqlOperator} ${parameterName}`);\n this._parameters.push({ name: parameterName, value });\n }\n\n public override whereOr(conditions: Array<{ field: string; operator: ExtendedOpCode; value: JSONValue }>): void {\n const orClauses: string[] = [];\n for (const condition of conditions) {\n const { field, operator, value } = condition;\n const parameterName = `@p${this._parameters.length}`;\n\n if (operator === 'isNull') {\n orClauses.push(`(c.${field} ?? null) = null`);\n } else if (operator === 'contains') {\n orClauses.push(`ARRAY_CONTAINS(c.${field}, ${parameterName})`);\n } else if (operator === 'in') {\n orClauses.push(`ARRAY_CONTAINS(${parameterName}, c.${field})`);\n } else {\n const sqlOperator = operators[operator];\n if (sqlOperator != null && value !== undefined) {\n orClauses.push(`c.${field} ${sqlOperator} ${parameterName}`);\n this._parameters.push({ name: parameterName, value });\n }\n }\n }\n\n if (orClauses.length > 0) {\n this._queries.push(`(${orClauses.join(' OR ')})`);\n }\n }\n\n public override where<P extends ExtractPathExpressions<T>>(field: P, operator: 'isNull'): void;\n public override where<P extends ExtractPathExpressions<T>>(field: P, operator: 'in', value: readonly PathValue<T, P>[]): void;\n public override where<P extends ExtractPathExpressions<T>>(field: P, operator: 'contains', value: PathValue<T, P>[number]): void;\n public override where<P extends ExtractPathExpressions<T>, V extends PathValue<T, P>>(field: P, operator: BasicOpCode, value: V): void;\n public override where<P extends ExtractPathExpressions<T>, V extends PathValue<T, P>>(field: P, operator: ExtendedOpCode, value?: V | readonly V[]): void {\n const parameterName = `@p${this._parameters.length}`;\n\n if (operator === 'isNull') {\n const clause = `(c.${field} ?? null) = null`;\n this._queries.push(clause);\n } else if (operator === 'contains') {\n if (value !== undefined) {\n const clause = `ARRAY_CONTAINS(c.${field}, ${parameterName})`;\n this._queries.push(clause);\n this._parameters.push({ name: parameterName, value });\n }\n } else if (operator === 'in') {\n // Handle 'IN' operator\n if (value !== undefined) {\n const clause = `ARRAY_CONTAINS(${parameterName}, c.${field})`;\n this._queries.push(clause);\n this._parameters.push({ name: parameterName, value });\n }\n } else {\n const sqlOperator = operators[operator];\n if (sqlOperator != null && value !== undefined) {\n this._queries.push(`c.${field} ${sqlOperator} ${parameterName}`);\n this._parameters.push({ name: parameterName, value });\n }\n }\n }\n\n public filter(x: { clause: string; parameter?: JSONValue }): void {\n const paramName = `@p${this._parameters.length}`;\n this._queries.push(x.clause.replace('@', paramName));\n if (x.parameter != null) {\n this._parameters.push({\n name: paramName,\n value: x.parameter,\n });\n }\n }\n\n public override query(): SqlQuerySpec {\n const lines: string[] = [];\n lines.push(`SELECT\\n ${this._select}`);\n lines.push(`FROM\\n ${this._from}`);\n if (this._join !== '') {\n lines.push(`JOIN\\n ${this._join}`);\n }\n\n if (this._queries.length > 0) {\n lines.push('WHERE');\n const where = this._queries.join('\\n AND ');\n lines.push(where);\n }\n\n if (this._orderBy != null) {\n lines.push(this._orderBy);\n }\n if (this._groupBy != null) {\n lines.push(this._groupBy);\n }\n if (this._limit != null) {\n lines.push('OFFSET 0');\n lines.push(`LIMIT ${this._limit}`);\n }\n\n const queryText = lines.join('\\n');\n const result = {\n query: queryText,\n parameters: this.parameters,\n };\n this._logger.verbose('Cosmos Query', result);\n return result;\n }\n\n public override async getOne<TSelect = T>(container: Container): Promise<TSelect | null> {\n const itemsQuery = this.query();\n const itemsIterator = container.items.query<TSelect>(itemsQuery);\n const items = await itemsIterator.fetchNext();\n this._logger.verbose('Cosmos Result', { result: items });\n return items.resources?.[0] ?? null;\n }\n\n public override async getAll<TSelect>(container: Container, limit?: number | null | undefined, cursor?: string | null | undefined): Promise<FetchResult<TSelect>> {\n const itemsQuery = this.query();\n const itemsIterator = container.items.query<TSelect>(itemsQuery, {\n continuationToken: cursor ?? undefined,\n maxItemCount: limit ?? undefined,\n });\n let items: FeedResponse<TSelect>;\n try {\n items = await itemsIterator.fetchAll();\n } catch (err) {\n this._logger.error('Cosmos Query Error', err);\n throw err;\n }\n this._logger.verbose('Cosmos Result', { result: items });\n\n this.select('VALUE COUNT(1)');\n this.orderBy();\n\n const countQuery = this.query();\n const countIterator = container.items.query<number>(countQuery);\n\n let count: FeedResponse<number>;\n try {\n count = await countIterator.fetchAll();\n } catch (err) {\n this._logger.error('Cosmos Count Query Error', err);\n throw err;\n }\n\n const totalCount = count.resources?.[0] ?? 0;\n\n const result: FetchResult<TSelect> = {\n continuationToken: items.continuationToken,\n count: items.resources?.length ?? 0,\n items: items.resources ?? [],\n hasMoreResults: items.hasMoreResults,\n totalCount,\n };\n return result;\n }\n\n public override patch<P extends ExtractPatchPathExpressions<T>>(...operations: Array<{ path: P; op: 'set' | 'add' | 'replace'; value: PatchPathValue<T, P> } | { path: P; op: 'remove' }>): PatchRequestBody {\n const patchOperations = operations.map((opDef) => {\n if (opDef.op === 'remove') {\n return { op: opDef.op, path: opDef.path };\n }\n\n if (opDef.value !== undefined) {\n return { op: opDef.op, path: opDef.path, value: opDef.value };\n }\n\n throw new Error(`Value is required for operation: ${opDef.op}`);\n });\n\n return { operations: patchOperations };\n }\n}\n","import { CosmosQueryBuilder } from '../private/CosmosQueryBuilder';\nimport type { ICosmosQueryBuilder } from './interfaces';\nimport type { CosmosQueryBuilderOptions } from './types';\n\nexport function createCosmosQueryBuilder<T extends Record<string, any>>(options?: CosmosQueryBuilderOptions): ICosmosQueryBuilder<T> {\n return new CosmosQueryBuilder<T>(options);\n}\n","export enum SortDirection {\n Asc = 'ASC',\n Desc = 'DESC',\n}\n"]}
1
+ {"version":3,"sources":["../../src/public/interfaces.ts","../../src/private/consts.ts","../../src/private/DefaultLogger.ts","../../src/private/CosmosQueryBuilder.ts","../../src/public/createCosmosQueryBuilder.ts","../../src/public/enums.ts"],"names":["SortDirection"],"mappings":"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","file":"index.js","sourcesContent":["import type { JSONValue, PatchRequestBody, SqlQuerySpec } from '@azure/cosmos';\nimport type { ExtractPatchPathExpressions, ExtractPathExpressions, PatchPathValue, PathValue } from '../private/types';\nimport type { SortDirection } from './enums';\nimport type { BasicOpCode, Container, ExtendedOpCode, FetchResult, InstantFilter, StringFilter, UUIDFilter } from './types';\n\nexport abstract class ILogger {\n public abstract debug(message?: any, ...optionalParams: any[]): void;\n public abstract info(message?: any, ...optionalParams: any[]): void;\n public abstract error(message?: any, ...optionalParams: any[]): void;\n public abstract warn(message?: any, ...optionalParams: any[]): void;\n public abstract verbose(message?: any, ...optionalParams: any[]): void;\n}\n\nexport abstract class ICosmosQueryBuilder<T extends Record<string, any>> {\n /**\n * Sets the maximum number of items to return\n * @param limit Maximum number of items\n * @example\n * ```typescript\n * builder.limit(100);\n * ```\n */\n public abstract limit(limit: number): ICosmosQueryBuilder<T>;\n\n /**\n * Adds a JOIN clause to the query\n * @param value JOIN alias\n * @param statement Field path to join on\n * @example\n * ```typescript\n * builder.join('b', 'bones');\n * ```\n */\n public abstract join<P extends ExtractPathExpressions<T>>(value: string, statement: P): ICosmosQueryBuilder<T>;\n\n /**\n * Sets the SELECT clause for the query\n * @param value SELECT clause string\n * @example\n * ```typescript\n * builder.select('COUNT(1) as count, UPPER(c.name.givenName) as name');\n * ```\n */\n public abstract select(value: string): ICosmosQueryBuilder<T>;\n\n /**\n * Sets the GROUP BY clause for the query\n * @param value GROUP BY expression\n * @example\n * ```typescript\n * builder.groupBy('UPPER(c.sex)');\n * ```\n */\n public abstract groupBy(value: string): ICosmosQueryBuilder<T>;\n\n /**\n * Performs fuzzy search across multiple fields\n * @param value Search term\n * @param fields Array of field paths to search in\n * @example\n * ```typescript\n * builder.whereFuzzy('steve', ['name.givenName', 'name.familyName', 'email']);\n * ```\n */\n public abstract whereFuzzy<P extends ExtractPathExpressions<T>>(value: string, fields: [P, ...P[]]): ICosmosQueryBuilder<T>;\n\n /**\n * Adds a raw WHERE clause with field, operator, and value\n * @param field Field name as string\n * @param operator SQL operator (excluding isNull, contains, in)\n * @param value Value to compare against\n * @example\n * ```typescript\n * builder.whereRaw('p.id', 'eq', 'some-id');\n * ```\n */\n public abstract whereRaw(field: string, operator: Exclude<ExtendedOpCode, 'isNull' | 'contains' | 'in'>, value: JSONValue): ICosmosQueryBuilder<T>;\n\n /**\n * Adds an OR clause to match items satisfying any of the given conditions\n * @param conditions Array of field/operator/value conditions\n * @example\n * ```typescript\n * builder.whereOr([\n * { field: 'name.givenName', operator: 'eq', value: 'John' },\n * { field: 'name.familyName', operator: 'eq', value: 'Smith' }\n * ]);\n * ```\n */\n public abstract whereOr(conditions: Array<{ field: string; operator: ExtendedOpCode; value: JSONValue }>): ICosmosQueryBuilder<T>;\n\n /**\n * Creates a JSON patch document for Cosmos DB patch operations\n * @param operations Array of patch operations (set, add, replace, remove)\n * @returns Patch request body for Cosmos DB\n * @example\n * ```typescript\n * const operations = builder.patch({\n * op: 'replace',\n * path: '/name/givenName',\n * value: 'Smith',\n * });\n * const item = container.item('id', 'partitionKey');\n * await item.patch<Person>(operations);\n * ```\n */\n public abstract patch<P extends ExtractPatchPathExpressions<T>>(...operations: Array<{ path: P; op: 'set' | 'add' | 'replace'; value: PatchPathValue<T, P> } | { path: P; op: 'remove' }>): PatchRequestBody;\n\n /**\n * Add a custom un-typed where clause\n * @param filter\n */\n public abstract filter(filter: { clause: string; parameter?: JSONValue }): ICosmosQueryBuilder<T>;\n\n /**\n * Builds query conditions from a structured object with type filters\n * Supports {@link StringFilter}, {@link UUIDFilter}, and {@link InstantFilter} types\n * @param query Query object with nested field filters containing __typeInfo\n * @param prefix Path prefix for nested queries (defaults to 'c')\n * @example\n * ```typescript\n * type PersonFilter = {\n * name?: {\n * givenName?: StringFilter;\n * };\n * };\n * const filter = {\n * name: {\n * givenName: { __typeInfo: 'StringFilter', eq: 'John' }\n * },\n * } satisfies PersonFilter;\n * builder.buildQuery(filter);\n * ```\n */\n public abstract buildQuery(query: Record<string, any> | undefined | null, prefix?: string): void;\n\n /**\n * Adds a WHERE clause with type-safe field access and operators\n * @param field Type-safe field path\n * @param operator SQL operator\n * @example\n * ```typescript\n * builder.where('name.givenName', 'eq', 'John');\n * builder.where('age', 'gt', 18);\n * builder.where('bones', 'contains', 'arm');\n * builder.where('name.givenName', 'in', ['John', 'Jane']);\n * builder.where('deletedAt', 'isNull');\n * ```\n */\n public abstract where<P extends ExtractPathExpressions<T>>(field: P, operator: 'isNull'): ICosmosQueryBuilder<T>;\n public abstract where<P extends ExtractPathExpressions<T>>(field: P, operator: 'in', value: readonly PathValue<T, P>[]): ICosmosQueryBuilder<T>;\n public abstract where<P extends ExtractPathExpressions<T>>(field: P, operator: 'contains', value: PathValue<T, P>[number]): ICosmosQueryBuilder<T>;\n public abstract where<P extends ExtractPathExpressions<T>, V extends PathValue<T, P>>(field: P, operator: BasicOpCode, value: V): ICosmosQueryBuilder<T>;\n\n /**\n * Clears any existing ordering\n */\n public abstract orderBy(): ICosmosQueryBuilder<T>;\n\n /**\n * Sets ordering by field and direction\n * @param field Field path to order by\n * @param direction Sort direction (ASC/DESC)\n */\n public abstract orderBy<P extends ExtractPathExpressions<T>>(field: P, direction: SortDirection): ICosmosQueryBuilder<T>;\n\n /**\n * Builds and returns the final SQL query specification\n * @returns SQL query specification with parameters\n */\n public abstract query(): SqlQuerySpec;\n\n /**\n * Executes the query and returns the first result\n * @param container Cosmos DB container to query\n * @returns First matching item or null\n */\n public abstract getOne<TSelect = T>(container: Container): Promise<TSelect | null>;\n\n /**\n * Executes the query and returns paginated results with total count\n * @param container Cosmos DB container to query\n * @param limit Maximum number of items per page\n * @param cursor Continuation token for pagination\n * @returns Paginated results with metadata\n */\n public abstract getAll<TSelect = T>(container: Container, limit?: number | null | undefined, cursor?: string | null | undefined): Promise<FetchResult<TSelect>>;\n}\n","export const operators: Record<string, string | undefined> = {\n eq: '=',\n ne: '!=',\n ge: '>=',\n gt: '>',\n le: '<=',\n lt: '<',\n} as const;\n","import { ILogger } from '../public/interfaces';\n\nexport class DefaultLogger extends ILogger {\n public debug(_message?: any, ..._optionalParams: any[]): void {}\n public info(_message?: any, ..._optionalParams: any[]): void {}\n public error(_message?: any, ..._optionalParams: any[]): void {}\n public warn(_message?: any, ..._optionalParams: any[]): void {}\n public verbose(_message?: any, ..._optionalParams: any[]): void {}\n}\n","import type { JSONValue, PatchRequestBody, SqlParameter, SqlQuerySpec } from '@azure/cosmos';\nimport type { SortDirection } from '../public/enums';\nimport { ICosmosQueryBuilder, type ILogger } from '../public/interfaces';\nimport type { BasicOpCode, Container, CosmosQueryBuilderOptions, ExtendedOpCode, FeedResponse, FetchResult, InstantFilter, StringFilter, UUIDFilter } from '../public/types';\nimport { operators } from './consts';\nimport { DefaultLogger } from './DefaultLogger';\nimport type { ExtractPatchPathExpressions, ExtractPathExpressions, PatchPathValue, PathValue, StringFilterData } from './types';\n\nexport class CosmosQueryBuilder<T extends Record<string, any>> extends ICosmosQueryBuilder<T> {\n // TODO: Allow setting\n private _indent = ' ';\n private _orderBy: string[] = [];\n private _select = '*';\n private _groupBy: string[] = [];\n private _join = '';\n private _from = 'c';\n private _queries: string[] = [];\n private _parameters: SqlParameter[] = [];\n private _limit: number | undefined;\n private _logger: ILogger;\n\n public constructor(options?: CosmosQueryBuilderOptions) {\n super();\n this._logger = options?.logger ?? new DefaultLogger();\n }\n\n public get queries(): string[] {\n return this._queries;\n }\n\n public set queries(value: string[]) {\n this._queries = value;\n }\n\n public get parameters(): SqlParameter[] {\n return this._parameters;\n }\n\n public set parameters(value: SqlParameter[]) {\n this._parameters = value;\n }\n\n private handleStringFilter(prefix: string, value: StringFilter) {\n return this.handleFilterObject(prefix, value);\n }\n\n private handleUuidFilter(prefix: string, value: UUIDFilter) {\n return this.handleFilterObject(prefix, value);\n }\n\n private handleInstantFilter(prefix: string, value: InstantFilter) {\n return this.handleFilterObject(prefix, value);\n }\n\n private handleFilterObject(prefix: string, value: StringFilterData & { __typeInfo: string }) {\n const { __typeInfo, ...rest } = value;\n for (const [key, value2] of Object.entries(rest).filter((x) => x[1] !== undefined)) {\n const path = prefix;\n const parameterName = `@p${this._parameters.length}`;\n const operator = operators[key];\n\n // Default to null to allow null comparison when parent object is not defined\n const queryKey = `(${path} ?? null)`;\n if (operator != null) {\n this._queries.push(`${queryKey} ${operator} ${parameterName}`);\n } else {\n if (key === 'ieq') {\n this._queries.push(`StringEquals(${queryKey}, ${parameterName}, true)`);\n } else if (key === 'ine') {\n this._queries.push(`Not(StringEquals(${queryKey}, ${parameterName}, true))`);\n } else if (key === 'like') {\n this._queries.push(`Contains(${queryKey}, ${parameterName}, true)`);\n } else if (key === 'in') {\n this._queries.push(`ARRAY_CONTAINS(${parameterName}, ${queryKey})`);\n } else {\n throw new Error(`Unknown operator ${key}`);\n }\n }\n this._parameters.push({ name: parameterName, value: value2 });\n }\n }\n\n private _buildQuery(query: Record<string, any> | null | undefined, prefix = 'c'): void {\n if (query != null) {\n const { __typeInfo, ...rest } = query;\n const queryKeys = Object.keys(rest);\n\n for (const key of queryKeys) {\n const value = query[key];\n const type: string | null = value.__typeInfo ?? null;\n const subPath = `${prefix}.${key}`;\n\n if (typeof value === 'object' && value != null) {\n if (type === 'StringFilter') {\n this.handleStringFilter(subPath, value);\n } else if (type === 'InstantFilter') {\n this.handleInstantFilter(subPath, value);\n } else if (type === 'UUIDFilter') {\n this.handleUuidFilter(subPath, value);\n } else {\n this._buildQuery(value, subPath);\n }\n } else {\n throw new Error(`Unhandled type ${type}`);\n }\n }\n }\n }\n\n public override buildQuery(query: Record<string, any> | undefined | null, prefix = 'c'): void {\n this._buildQuery(query, prefix);\n }\n\n public override orderBy(): ICosmosQueryBuilder<T>;\n public override orderBy<P extends ExtractPathExpressions<T>>(field: P, direction: SortDirection): ICosmosQueryBuilder<T>;\n public override orderBy<P extends ExtractPathExpressions<T>>(field?: P, direction?: SortDirection): ICosmosQueryBuilder<T> {\n if (field == null || direction == null) {\n this._orderBy = [];\n } else {\n this._orderBy = ['ORDER BY', `${this._indent}c.${field} ${direction}`];\n }\n return this;\n }\n\n public override groupBy(value: string): ICosmosQueryBuilder<T> {\n this._groupBy = ['GROUP BY', `${this._indent}${value}`];\n return this;\n }\n\n public override select(value: string): ICosmosQueryBuilder<T> {\n this._select = value;\n return this;\n }\n\n private parameter(name: string, value: JSONValue): void {\n this._parameters.push({\n name,\n value,\n });\n }\n\n public override limit(limit: number): ICosmosQueryBuilder<T> {\n this._limit = limit;\n return this;\n }\n\n public override join<P extends ExtractPathExpressions<T>>(value: string, statement: P): ICosmosQueryBuilder<T> {\n this._join = `${value} IN c.${statement}`;\n return this;\n }\n\n public override whereFuzzy<P extends ExtractPathExpressions<T>>(value: string, fields: [P, ...P[]]): ICosmosQueryBuilder<T> {\n const parameterName = `@p${this._parameters.length}`;\n const lines: string[] = [];\n for (const field of fields) {\n const clause = `Contains(c.${field}, ${parameterName}, true)`;\n lines.push(clause);\n }\n const queryLine = `(${lines.join(' OR ')})`;\n this._queries.push(queryLine);\n this._parameters.push({ name: parameterName, value });\n return this;\n }\n\n public override whereRaw(field: string, operator: Exclude<ExtendedOpCode, 'isNull' | 'contains' | 'in'>, value: JSONValue): ICosmosQueryBuilder<T> {\n const parameterName = `@p${this._parameters.length}`;\n const sqlOperator = operators[operator];\n this._queries.push(`${field} ${sqlOperator} ${parameterName}`);\n this._parameters.push({ name: parameterName, value });\n return this;\n }\n\n public override whereOr(conditions: Array<{ field: string; operator: ExtendedOpCode; value: JSONValue }>): ICosmosQueryBuilder<T> {\n const orClauses: string[] = [];\n for (const condition of conditions) {\n const { field, operator, value } = condition;\n const parameterName = `@p${this._parameters.length}`;\n\n if (operator === 'isNull') {\n orClauses.push(`(c.${field} ?? null) = null`);\n } else if (operator === 'contains') {\n orClauses.push(`ARRAY_CONTAINS(c.${field}, ${parameterName})`);\n } else if (operator === 'in') {\n orClauses.push(`ARRAY_CONTAINS(${parameterName}, c.${field})`);\n } else {\n const sqlOperator = operators[operator];\n if (sqlOperator != null && value !== undefined) {\n orClauses.push(`c.${field} ${sqlOperator} ${parameterName}`);\n this._parameters.push({ name: parameterName, value });\n }\n }\n }\n\n if (orClauses.length > 0) {\n this._queries.push(`(${orClauses.join(' OR ')})`);\n }\n return this;\n }\n\n public override where<P extends ExtractPathExpressions<T>>(field: P, operator: 'isNull'): ICosmosQueryBuilder<T>;\n public override where<P extends ExtractPathExpressions<T>>(field: P, operator: 'in', value: readonly PathValue<T, P>[]): ICosmosQueryBuilder<T>;\n public override where<P extends ExtractPathExpressions<T>>(field: P, operator: 'contains', value: PathValue<T, P>[number]): ICosmosQueryBuilder<T>;\n public override where<P extends ExtractPathExpressions<T>, V extends PathValue<T, P>>(field: P, operator: BasicOpCode, value: V): ICosmosQueryBuilder<T>;\n public override where<P extends ExtractPathExpressions<T>, V extends PathValue<T, P>>(field: P, operator: ExtendedOpCode, value?: V | readonly V[]): ICosmosQueryBuilder<T> {\n const parameterName = `@p${this._parameters.length}`;\n\n if (operator === 'isNull') {\n const clause = `(c.${field} ?? null) = null`;\n this._queries.push(clause);\n } else if (operator === 'contains') {\n if (value !== undefined) {\n const clause = `ARRAY_CONTAINS(c.${field}, ${parameterName})`;\n this._queries.push(clause);\n this._parameters.push({ name: parameterName, value });\n }\n } else if (operator === 'in') {\n // Handle 'IN' operator\n if (value !== undefined) {\n const clause = `ARRAY_CONTAINS(${parameterName}, c.${field})`;\n this._queries.push(clause);\n this._parameters.push({ name: parameterName, value });\n }\n } else if (operator === 'ieq') {\n // Handle case-insensitive equality for strings\n if (value !== undefined) {\n const clause = `StringEquals(c.${field}, ${parameterName}, true)`;\n this._queries.push(clause);\n this._parameters.push({ name: parameterName, value });\n }\n } else if (operator === 'ine') {\n // Handle case-insensitive equality for strings\n if (value !== undefined) {\n const clause = `Not(StringEquals(c.${field}, ${parameterName}, true))`;\n this._queries.push(clause);\n this._parameters.push({ name: parameterName, value });\n }\n } else {\n const sqlOperator = operators[operator];\n if (sqlOperator != null && value !== undefined) {\n this._queries.push(`c.${field} ${sqlOperator} ${parameterName}`);\n this._parameters.push({ name: parameterName, value });\n }\n }\n return this;\n }\n\n public override filter(x: { clause: string; parameter?: JSONValue }): ICosmosQueryBuilder<T> {\n const paramName = `@p${this._parameters.length}`;\n this._queries.push(x.clause.replace('@', paramName));\n if (x.parameter != null) {\n this._parameters.push({\n name: paramName,\n value: x.parameter,\n });\n }\n return this;\n }\n\n public override query(): SqlQuerySpec {\n const lines: string[] = [];\n lines.push(`SELECT\\n${this._indent}${this._select}`);\n lines.push(`FROM\\n${this._indent}${this._from}`);\n if (this._join !== '') {\n lines.push(`JOIN\\n${this._indent}${this._join}`);\n }\n\n if (this._queries.length > 0) {\n lines.push('WHERE');\n const where = this._queries.join(` AND\\n${this._indent}`);\n lines.push(`${this._indent}${where}`);\n }\n\n lines.push(...this._orderBy);\n lines.push(...this._groupBy);\n if (this._limit != null) {\n lines.push('OFFSET 0');\n lines.push(`LIMIT ${this._limit}`);\n }\n\n const queryText = lines.join('\\n');\n const result = {\n query: queryText,\n parameters: this.parameters,\n };\n this._logger.verbose('Cosmos Query', result);\n return result;\n }\n\n public override async getOne<TSelect = T>(container: Container): Promise<TSelect | null> {\n const itemsQuery = this.query();\n const itemsIterator = container.items.query<TSelect>(itemsQuery);\n const items = await itemsIterator.fetchNext();\n this._logger.verbose('Cosmos Result', { result: items });\n return items.resources?.[0] ?? null;\n }\n\n public override async getAll<TSelect>(container: Container, limit?: number | null | undefined, cursor?: string | null | undefined): Promise<FetchResult<TSelect>> {\n const itemsQuery = this.query();\n const itemsIterator = container.items.query<TSelect>(itemsQuery, {\n continuationToken: cursor ?? undefined,\n maxItemCount: limit ?? undefined,\n });\n let items: FeedResponse<TSelect>;\n try {\n items = await itemsIterator.fetchAll();\n } catch (err) {\n this._logger.error('Cosmos Query Error', err);\n throw err;\n }\n this._logger.verbose('Cosmos Result', { result: items });\n\n this.select('VALUE COUNT(1)');\n this.orderBy();\n\n const countQuery = this.query();\n const countIterator = container.items.query<number>(countQuery);\n\n let count: FeedResponse<number>;\n try {\n count = await countIterator.fetchAll();\n } catch (err) {\n this._logger.error('Cosmos Count Query Error', err);\n throw err;\n }\n\n const totalCount = count.resources?.[0] ?? 0;\n\n const result: FetchResult<TSelect> = {\n continuationToken: items.continuationToken,\n count: items.resources?.length ?? 0,\n items: items.resources ?? [],\n hasMoreResults: items.hasMoreResults,\n totalCount,\n };\n return result;\n }\n\n public override patch<P extends ExtractPatchPathExpressions<T>>(...operations: Array<{ path: P; op: 'set' | 'add' | 'replace'; value: PatchPathValue<T, P> } | { path: P; op: 'remove' }>): PatchRequestBody {\n const patchOperations = operations.map((opDef) => {\n if (opDef.op === 'remove') {\n return { op: opDef.op, path: opDef.path };\n }\n\n if (opDef.value !== undefined) {\n return { op: opDef.op, path: opDef.path, value: opDef.value };\n }\n\n throw new Error(`Value is required for operation: ${opDef.op}`);\n });\n\n return { operations: patchOperations };\n }\n}\n","import { CosmosQueryBuilder } from '../private/CosmosQueryBuilder';\nimport type { ICosmosQueryBuilder } from './interfaces';\nimport type { CosmosQueryBuilderOptions } from './types';\n\nexport function createCosmosQueryBuilder<T extends Record<string, any>>(options?: CosmosQueryBuilderOptions): ICosmosQueryBuilder<T> {\n return new CosmosQueryBuilder<T>(options);\n}\n","export enum SortDirection {\n Asc = 'ASC',\n Desc = 'DESC',\n}\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@shellicar/cosmos-query-builder",
3
3
  "private": false,
4
- "version": "1.0.0",
4
+ "version": "1.1.0",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "author": "Stephen Hellicar",
@@ -50,11 +50,11 @@
50
50
  "@shellicar/build-clean": "^1.1.2",
51
51
  "@tsconfig/node20": "^20.1.8",
52
52
  "@tsconfig/node22": "^22.0.5",
53
- "@types/node": "^25.0.3",
54
- "terser": "^5.44.1",
53
+ "@types/node": "^25.0.9",
54
+ "terser": "^5.46.0",
55
55
  "tsup": "^8.5.1",
56
56
  "typescript": "^5.9.3",
57
- "vitest": "^4.0.16"
57
+ "vitest": "^4.0.17"
58
58
  },
59
59
  "peerDependencies": {
60
60
  "@azure/cosmos": ">=4.0.0 <5.0.0"
@@ -62,6 +62,7 @@
62
62
  "scripts": {
63
63
  "build": "tsup-node",
64
64
  "dev": "tsup-node --watch",
65
- "type-check": "tsc -p tsconfig.check.json"
65
+ "type-check": "tsc -p tsconfig.check.json",
66
+ "test": "vitest run"
66
67
  }
67
68
  }