@shellicar/cosmos-query-builder 1.1.1 → 1.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -2,8 +2,20 @@
2
2
 
3
3
  > A type-safe query builder for [Azure Cosmos DB for NoSQL](https://docs.microsoft.com/en-us/azure/cosmos-db/nosql/)
4
4
 
5
+ [![npm package](https://img.shields.io/npm/v/@shellicar/cosmos-query-builder.svg)](https://npmjs.com/package/@shellicar/cosmos-query-builder)
6
+ [![build status](https://github.com/shellicar/ecosystem/actions/workflows/node.js.yml/badge.svg)](https://github.com/shellicar/ecosystem/actions/workflows/node.js.yml)
7
+
5
8
  > **Note**: This library is for Azure Cosmos DB for NoSQL (formerly SQL API). For MongoDB API, see [Azure Cosmos DB for MongoDB](https://docs.microsoft.com/en-us/azure/cosmos-db/mongodb/).
6
9
 
10
+ ## Features
11
+
12
+ - 🎯 **Type-safe field access** - IntelliSense and compile-time validation instead of error-prone string queries
13
+ - ⚡ **Builder pattern** - Use methods instead of writing raw SQL strings
14
+ - 🔍 **Type-safe advanced operators** - Array operations like `ARRAY_CONTAINS` and Cosmos DB functions with full type safety
15
+ - � **Type-safe patch operations** - JSON patch document creation with compile-time path validation
16
+ - � **Automatic parameter generation** - Dynamic `@p0`, `@p1` parameter binding without manual parameter management
17
+ - 🚀 **Built-in execution** - Execute queries directly with pagination and total count support
18
+
7
19
  ## Installation & Quick Start
8
20
 
9
21
  ```sh
@@ -14,8 +26,6 @@ npm i --save @shellicar/cosmos-query-builder
14
26
  pnpm add @shellicar/cosmos-query-builder
15
27
  ```
16
28
 
17
- ## Quick Example
18
-
19
29
  ```ts
20
30
  import { createCosmosQueryBuilder, SortDirection } from '@shellicar/cosmos-query-builder';
21
31
 
@@ -29,8 +39,140 @@ builder.limit(50);
29
39
  const results = await builder.getAll(container);
30
40
  ```
31
41
 
32
- For a complete working example, see [examples/simple/src/main.ts](../../examples/simple/src/main.ts).
42
+ For a complete working example, see [examples/simple/src/main.ts](../../examples/cosmos-query-builder/simple/src/main.ts).
43
+
44
+ <!-- BEGIN_ECOSYSTEM -->
45
+
46
+ ## @shellicar TypeScript Ecosystem
47
+
48
+ ### Core Libraries
49
+
50
+ - [`@shellicar/core-config`](https://github.com/shellicar/ecosystem/tree/main/packages/core-config) - A library for securely handling sensitive configuration values like connection strings, URLs, and secrets.
51
+ - [`@shellicar/core-di`](https://github.com/shellicar/ecosystem/tree/main/packages/core-di) - A basic dependency injection library.
52
+
53
+ ### Reference Architectures
54
+
55
+ - [`@shellicar/reference-foundation`](https://github.com/shellicar/reference-foundation) - A comprehensive starter repository. Illustrates individual concepts.
56
+ - [`@shellicar/reference-enterprise`](https://github.com/shellicar/reference-enterprise) - A comprehensive starter repository. Can be used as the basis for creating a new Azure application workload.
57
+
58
+ ### Build Tools
59
+
60
+ - [`@shellicar/build-clean`](https://github.com/shellicar/ecosystem/tree/main/packages/build-clean) - Build plugin that automatically cleans unused files from output directories.
61
+ - [`@shellicar/build-version`](https://github.com/shellicar/ecosystem/tree/main/packages/build-version) - Build plugin that calculates and exposes version information through a virtual module import.
62
+ - [`@shellicar/build-graphql`](https://github.com/shellicar/ecosystem/tree/main/packages/build-graphql) - Build plugin that loads GraphQL files and makes them available through a virtual module import.
63
+
64
+ ### Framework Adapters
65
+
66
+ - [`@shellicar/svelte-adapter-azure-functions`](https://github.com/shellicar/ecosystem/tree/main/packages/svelte-adapter-azure-functions) - A [SvelteKit adapter](https://kit.svelte.dev/docs/adapters) that builds your app into an Azure Function.
67
+ - [`@shellicar/cosmos-query-builder`](https://github.com/shellicar/ecosystem/tree/main/packages/cosmos-query-builder) - Helper class for type safe advanced queries for Cosmos DB (Sql Core).
68
+
69
+ ### Logging & Monitoring
70
+
71
+ - [`@shellicar/winston-azure-application-insights`](https://github.com/shellicar/ecosystem/tree/main/packages/winston-azure-application-insights) - An [Azure Application Insights](https://azure.microsoft.com/en-us/services/application-insights/) transport for [Winston](https://github.com/winstonjs/winston) logging library.
72
+ - [`@shellicar/pino-applicationinsights-transport`](https://github.com/shellicar/pino-applicationinsights-transport) - [Azure Application Insights](https://azure.microsoft.com/en-us/services/application-insights) transport for [pino](https://github.com/pinojs/pino)
73
+
74
+ <!-- END_ECOSYSTEM -->
75
+
76
+ ## Motivation
77
+
78
+ I wanted a type-safe interface for Azure Cosmos DB for NoSQL and couldn't find any existing solutions for TypeScript.
79
+
80
+ Originally developed for the Circuit Breaker platform at Hope Ventures, this library was graciously allowed to be released as open source.
81
+
82
+ ## Feature Examples
83
+
84
+ Type-safe query builder for Azure Cosmos DB, supporting advanced operators and structured filtering.
85
+
86
+ See [readme examples](../../examples/cosmos-query-builder/readme/src) for example source code.
87
+
88
+ - **Builder pattern** - Use methods like `where()`, `orderBy()`, `limit()` instead of writing raw SQL.
89
+
90
+ ```ts
91
+ builder.where('type', 'eq', 'Person');
92
+ builder.where('age', 'gt', 18);
93
+ builder.orderBy('created', SortDirection.Desc);
94
+ builder.limit(50);
95
+ ```
96
+
97
+ - **Advanced operators** - Array operations like `contains`, `in`, and fuzzy search across multiple fields.
98
+
99
+ ```ts
100
+ builder.where('bones', 'contains', 'arm');
101
+ builder.where('name.givenName', 'in', ['John', 'Jane']);
102
+ builder.whereFuzzy('steve', ['name.givenName', 'name.familyName', 'email']);
103
+ ```
104
+
105
+ - **Type-safe field access** - IntelliSense and compile-time validation for field paths and values.
106
+
107
+ ```ts
108
+ // @ts-expect-error: Argument of type 'number' is not assignable to parameter of type 'string'.
109
+ builder.where('age', 'eq', 'invalid');
110
+ builder.where('age', 'eq', 25);
111
+ ```
112
+
113
+ - **Structured filtering** - Use filter objects with type information for complex queries.
114
+
115
+ ```ts
116
+ type PersonFilter = {
117
+ name?: {
118
+ givenName?: StringFilter;
119
+ };
120
+ };
121
+ const filter = {
122
+ name: {
123
+ givenName: { __typeInfo: 'StringFilter', eq: 'John' }
124
+ }
125
+ } satisfies PersonFilter;
126
+ builder.buildQuery(filter);
127
+ ```
128
+
129
+ - **Patch operations** - Create type-safe JSON patch documents for Cosmos DB.
130
+
131
+ ```ts
132
+ const operations = builder.patch({
133
+ op: 'replace',
134
+ path: '/name/givenName',
135
+ value: 'Smith'
136
+ });
137
+ await container.item('id', 'partitionKey').patch(operations);
138
+ ```
139
+
140
+ ## Usage
141
+
142
+ Check the test files for different usage scenarios.
143
+
144
+ ```ts
145
+ import { createCosmosQueryBuilder, SortDirection } from '@shellicar/cosmos-query-builder';
146
+ import type { Container } from '@azure/cosmos';
147
+
148
+ type Person = {
149
+ id: string;
150
+ type: 'Person';
151
+ age: number;
152
+ created: string;
153
+ name: {
154
+ givenName: string;
155
+ familyName: string;
156
+ };
157
+ };
158
+
159
+ const queryPeople = async (container: Container) => {
160
+ const builder = createCosmosQueryBuilder<Person>();
161
+
162
+ builder.where('type', 'eq', 'Person');
163
+ builder.where('age', 'gt', 18);
164
+ builder.orderBy('created', SortDirection.Desc);
165
+ builder.limit(50);
166
+
167
+ const results = await builder.getAll(container);
168
+ console.log(`Found ${results.count} people`);
169
+
170
+ return results.items;
171
+ };
172
+ ```
173
+
174
+ ## Credits & Inspiration
33
175
 
34
- ## Documentation
176
+ Originally developed for [Circuit Breaker](https://circuitbreaker.au) platform.
35
177
 
36
- For full documentation, visit the [GitHub repository](https://github.com/shellicar/cosmos-query-builder).
178
+ Special thanks to [Hope Ventures](https://www.hopeventures.org.au/) for graciously allowing this code to be open sourced.
@@ -1 +1,361 @@
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
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } var _class;var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+
4
+ // src/public/interfaces.ts
5
+ var ILogger = class {
6
+ static {
7
+ __name(this, "ILogger");
8
+ }
9
+ };
10
+ var ICosmosQueryBuilder = class {
11
+ static {
12
+ __name(this, "ICosmosQueryBuilder");
13
+ }
14
+ };
15
+
16
+ // src/private/consts.ts
17
+ var operators = {
18
+ eq: "=",
19
+ ne: "!=",
20
+ ge: ">=",
21
+ gt: ">",
22
+ le: "<=",
23
+ lt: "<"
24
+ };
25
+
26
+ // src/private/DefaultLogger.ts
27
+ var DefaultLogger = class extends ILogger {
28
+ static {
29
+ __name(this, "DefaultLogger");
30
+ }
31
+ debug(_message, ..._optionalParams) {
32
+ }
33
+ info(_message, ..._optionalParams) {
34
+ }
35
+ error(_message, ..._optionalParams) {
36
+ }
37
+ warn(_message, ..._optionalParams) {
38
+ }
39
+ verbose(_message, ..._optionalParams) {
40
+ }
41
+ };
42
+
43
+ // src/private/CosmosQueryBuilder.ts
44
+ var CosmosQueryBuilder = (_class = class extends ICosmosQueryBuilder {
45
+ static {
46
+ __name(this, "CosmosQueryBuilder");
47
+ }
48
+ // TODO: Allow setting
49
+ __init() {this._indent = " "}
50
+ __init2() {this._orderBy = []}
51
+ __init3() {this._select = "*"}
52
+ __init4() {this._groupBy = []}
53
+ __init5() {this._join = ""}
54
+ __init6() {this._from = "c"}
55
+ __init7() {this._queries = []}
56
+ __init8() {this._parameters = []}
57
+
58
+
59
+ constructor(options) {
60
+ super();_class.prototype.__init.call(this);_class.prototype.__init2.call(this);_class.prototype.__init3.call(this);_class.prototype.__init4.call(this);_class.prototype.__init5.call(this);_class.prototype.__init6.call(this);_class.prototype.__init7.call(this);_class.prototype.__init8.call(this);;
61
+ this._logger = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _ => _.logger]), () => ( new DefaultLogger()));
62
+ }
63
+ get queries() {
64
+ return this._queries;
65
+ }
66
+ set queries(value) {
67
+ this._queries = value;
68
+ }
69
+ get parameters() {
70
+ return this._parameters;
71
+ }
72
+ set parameters(value) {
73
+ this._parameters = value;
74
+ }
75
+ handleStringFilter(prefix, value) {
76
+ return this.handleFilterObject(prefix, value);
77
+ }
78
+ handleUuidFilter(prefix, value) {
79
+ return this.handleFilterObject(prefix, value);
80
+ }
81
+ handleInstantFilter(prefix, value) {
82
+ return this.handleFilterObject(prefix, value);
83
+ }
84
+ handleFilterObject(prefix, value) {
85
+ const { __typeInfo, ...rest } = value;
86
+ for (const [key, value2] of Object.entries(rest).filter((x) => x[1] !== void 0)) {
87
+ const path = prefix;
88
+ const parameterName = `@p${this._parameters.length}`;
89
+ const operator = operators[key];
90
+ const queryKey = `(${path} ?? null)`;
91
+ if (operator != null) {
92
+ this._queries.push(`${queryKey} ${operator} ${parameterName}`);
93
+ } else {
94
+ if (key === "ieq") {
95
+ this._queries.push(`StringEquals(${queryKey}, ${parameterName}, true)`);
96
+ } else if (key === "ine") {
97
+ this._queries.push(`Not(StringEquals(${queryKey}, ${parameterName}, true))`);
98
+ } else if (key === "like") {
99
+ this._queries.push(`Contains(${queryKey}, ${parameterName}, true)`);
100
+ } else if (key === "in") {
101
+ this._queries.push(`ARRAY_CONTAINS(${parameterName}, ${queryKey})`);
102
+ } else {
103
+ throw new Error(`Unknown operator ${key}`);
104
+ }
105
+ }
106
+ this._parameters.push({ name: parameterName, value: value2 });
107
+ }
108
+ }
109
+ _buildQuery(query, prefix = "c") {
110
+ if (query != null) {
111
+ const { __typeInfo, ...rest } = query;
112
+ const queryKeys = Object.keys(rest);
113
+ for (const key of queryKeys) {
114
+ const value = query[key];
115
+ const type = _nullishCoalesce(value.__typeInfo, () => ( null));
116
+ const subPath = `${prefix}.${key}`;
117
+ if (typeof value === "object" && value != null) {
118
+ if (type === "StringFilter") {
119
+ this.handleStringFilter(subPath, value);
120
+ } else if (type === "InstantFilter") {
121
+ this.handleInstantFilter(subPath, value);
122
+ } else if (type === "UUIDFilter") {
123
+ this.handleUuidFilter(subPath, value);
124
+ } else {
125
+ this._buildQuery(value, subPath);
126
+ }
127
+ } else {
128
+ throw new Error(`Unhandled type ${type}`);
129
+ }
130
+ }
131
+ }
132
+ }
133
+ buildQuery(query, prefix = "c") {
134
+ this._buildQuery(query, prefix);
135
+ }
136
+ orderBy(field, direction) {
137
+ if (field == null || direction == null) {
138
+ this._orderBy = [];
139
+ } else {
140
+ this._orderBy = ["ORDER BY", `${this._indent}c.${field} ${direction}`];
141
+ }
142
+ return this;
143
+ }
144
+ groupBy(value) {
145
+ this._groupBy = ["GROUP BY", `${this._indent}${value}`];
146
+ return this;
147
+ }
148
+ select(value) {
149
+ this._select = value;
150
+ return this;
151
+ }
152
+ parameter(name, value) {
153
+ this._parameters.push({
154
+ name,
155
+ value
156
+ });
157
+ }
158
+ limit(limit) {
159
+ this._limit = limit;
160
+ return this;
161
+ }
162
+ join(value, statement) {
163
+ this._join = `${value} IN c.${statement}`;
164
+ return this;
165
+ }
166
+ whereFuzzy(value, fields) {
167
+ const parameterName = `@p${this._parameters.length}`;
168
+ const lines = [];
169
+ for (const field of fields) {
170
+ const clause = `Contains(c.${field}, ${parameterName}, true)`;
171
+ lines.push(clause);
172
+ }
173
+ const queryLine = `(${lines.join(" OR ")})`;
174
+ this._queries.push(queryLine);
175
+ this._parameters.push({ name: parameterName, value });
176
+ return this;
177
+ }
178
+ whereRaw(field, operator, value) {
179
+ const parameterName = `@p${this._parameters.length}`;
180
+ const sqlOperator = operators[operator];
181
+ this._queries.push(`${field} ${sqlOperator} ${parameterName}`);
182
+ this._parameters.push({ name: parameterName, value });
183
+ return this;
184
+ }
185
+ whereOr(conditions) {
186
+ const orClauses = [];
187
+ for (const condition of conditions) {
188
+ const { field, operator, value } = condition;
189
+ const parameterName = `@p${this._parameters.length}`;
190
+ if (operator === "isNull") {
191
+ orClauses.push(`(c.${field} ?? null) = null`);
192
+ } else if (operator === "contains") {
193
+ orClauses.push(`ARRAY_CONTAINS(c.${field}, ${parameterName})`);
194
+ } else if (operator === "in") {
195
+ orClauses.push(`ARRAY_CONTAINS(${parameterName}, c.${field})`);
196
+ } else {
197
+ const sqlOperator = operators[operator];
198
+ if (sqlOperator != null && value !== void 0) {
199
+ orClauses.push(`c.${field} ${sqlOperator} ${parameterName}`);
200
+ this._parameters.push({ name: parameterName, value });
201
+ }
202
+ }
203
+ }
204
+ if (orClauses.length > 0) {
205
+ this._queries.push(`(${orClauses.join(" OR ")})`);
206
+ }
207
+ return this;
208
+ }
209
+ where(field, operator, value) {
210
+ const parameterName = `@p${this._parameters.length}`;
211
+ if (operator === "isNull") {
212
+ const clause = `(c.${field} ?? null) = null`;
213
+ this._queries.push(clause);
214
+ } else if (operator === "contains") {
215
+ if (value !== void 0) {
216
+ const clause = `ARRAY_CONTAINS(c.${field}, ${parameterName})`;
217
+ this._queries.push(clause);
218
+ this._parameters.push({ name: parameterName, value });
219
+ }
220
+ } else if (operator === "in") {
221
+ if (value !== void 0) {
222
+ const clause = `ARRAY_CONTAINS(${parameterName}, c.${field})`;
223
+ this._queries.push(clause);
224
+ this._parameters.push({ name: parameterName, value });
225
+ }
226
+ } else if (operator === "ieq") {
227
+ if (value !== void 0) {
228
+ const clause = `StringEquals(c.${field}, ${parameterName}, true)`;
229
+ this._queries.push(clause);
230
+ this._parameters.push({ name: parameterName, value });
231
+ }
232
+ } else if (operator === "ine") {
233
+ if (value !== void 0) {
234
+ const clause = `Not(StringEquals(c.${field}, ${parameterName}, true))`;
235
+ this._queries.push(clause);
236
+ this._parameters.push({ name: parameterName, value });
237
+ }
238
+ } else {
239
+ const sqlOperator = operators[operator];
240
+ if (sqlOperator != null && value !== void 0) {
241
+ this._queries.push(`c.${field} ${sqlOperator} ${parameterName}`);
242
+ this._parameters.push({ name: parameterName, value });
243
+ }
244
+ }
245
+ return this;
246
+ }
247
+ filter(x) {
248
+ const paramName = `@p${this._parameters.length}`;
249
+ this._queries.push(x.clause.replace("@", paramName));
250
+ if (x.parameter != null) {
251
+ this._parameters.push({
252
+ name: paramName,
253
+ value: x.parameter
254
+ });
255
+ }
256
+ return this;
257
+ }
258
+ query() {
259
+ const lines = [];
260
+ lines.push(`SELECT
261
+ ${this._indent}${this._select}`);
262
+ lines.push(`FROM
263
+ ${this._indent}${this._from}`);
264
+ if (this._join !== "") {
265
+ lines.push(`JOIN
266
+ ${this._indent}${this._join}`);
267
+ }
268
+ if (this._queries.length > 0) {
269
+ lines.push("WHERE");
270
+ const where = this._queries.join(` AND
271
+ ${this._indent}`);
272
+ lines.push(`${this._indent}${where}`);
273
+ }
274
+ lines.push(...this._orderBy);
275
+ lines.push(...this._groupBy);
276
+ if (this._limit != null) {
277
+ lines.push("OFFSET 0");
278
+ lines.push(`LIMIT ${this._limit}`);
279
+ }
280
+ const queryText = lines.join("\n");
281
+ const result = {
282
+ query: queryText,
283
+ parameters: this.parameters
284
+ };
285
+ this._logger.verbose("Cosmos Query", result);
286
+ return result;
287
+ }
288
+ async getOne(container) {
289
+ const itemsQuery = this.query();
290
+ const itemsIterator = container.items.query(itemsQuery);
291
+ const items = await itemsIterator.fetchNext();
292
+ this._logger.verbose("Cosmos Result", { result: items });
293
+ return _nullishCoalesce(_optionalChain([items, 'access', _2 => _2.resources, 'optionalAccess', _3 => _3[0]]), () => ( null));
294
+ }
295
+ async getAll(container, limit, cursor) {
296
+ const itemsQuery = this.query();
297
+ const itemsIterator = container.items.query(itemsQuery, {
298
+ continuationToken: _nullishCoalesce(cursor, () => ( void 0)),
299
+ maxItemCount: _nullishCoalesce(limit, () => ( void 0))
300
+ });
301
+ let items;
302
+ try {
303
+ items = await itemsIterator.fetchAll();
304
+ } catch (err) {
305
+ this._logger.error("Cosmos Query Error", err);
306
+ throw err;
307
+ }
308
+ this._logger.verbose("Cosmos Result", { result: items });
309
+ this.select("VALUE COUNT(1)");
310
+ this.orderBy();
311
+ const countQuery = this.query();
312
+ const countIterator = container.items.query(countQuery);
313
+ let count;
314
+ try {
315
+ count = await countIterator.fetchAll();
316
+ } catch (err) {
317
+ this._logger.error("Cosmos Count Query Error", err);
318
+ throw err;
319
+ }
320
+ const totalCount = _nullishCoalesce(_optionalChain([count, 'access', _4 => _4.resources, 'optionalAccess', _5 => _5[0]]), () => ( 0));
321
+ const result = {
322
+ continuationToken: items.continuationToken,
323
+ count: _nullishCoalesce(_optionalChain([items, 'access', _6 => _6.resources, 'optionalAccess', _7 => _7.length]), () => ( 0)),
324
+ items: _nullishCoalesce(items.resources, () => ( [])),
325
+ hasMoreResults: items.hasMoreResults,
326
+ totalCount
327
+ };
328
+ return result;
329
+ }
330
+ patch(...operations) {
331
+ const patchOperations = operations.map((opDef) => {
332
+ if (opDef.op === "remove") {
333
+ return { op: opDef.op, path: opDef.path };
334
+ }
335
+ if (opDef.value !== void 0) {
336
+ return { op: opDef.op, path: opDef.path, value: opDef.value };
337
+ }
338
+ throw new Error(`Value is required for operation: ${opDef.op}`);
339
+ });
340
+ return { operations: patchOperations };
341
+ }
342
+ }, _class);
343
+
344
+ // src/public/createCosmosQueryBuilder.ts
345
+ function createCosmosQueryBuilder(options) {
346
+ return new CosmosQueryBuilder(options);
347
+ }
348
+ __name(createCosmosQueryBuilder, "createCosmosQueryBuilder");
349
+
350
+ // src/public/enums.ts
351
+ var SortDirection = /* @__PURE__ */ ((SortDirection2) => {
352
+ SortDirection2["Asc"] = "ASC";
353
+ SortDirection2["Desc"] = "DESC";
354
+ return SortDirection2;
355
+ })(SortDirection || {});
356
+
357
+
358
+
359
+
360
+ exports.ILogger = ILogger; exports.SortDirection = SortDirection; exports.createCosmosQueryBuilder = createCosmosQueryBuilder;
361
+ //# 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): 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"]}
1
+ {"version":3,"sources":["/home/runner/work/ecosystem/ecosystem/packages/cosmos-query-builder/dist/cjs/index.cjs","../../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":"/home/runner/work/ecosystem/ecosystem/packages/cosmos-query-builder/dist/cjs/index.cjs","sourcesContent":[null,"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/dist/esm/index.js CHANGED
@@ -1 +1,361 @@
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
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+
4
+ // src/public/interfaces.ts
5
+ var ILogger = class {
6
+ static {
7
+ __name(this, "ILogger");
8
+ }
9
+ };
10
+ var ICosmosQueryBuilder = class {
11
+ static {
12
+ __name(this, "ICosmosQueryBuilder");
13
+ }
14
+ };
15
+
16
+ // src/private/consts.ts
17
+ var operators = {
18
+ eq: "=",
19
+ ne: "!=",
20
+ ge: ">=",
21
+ gt: ">",
22
+ le: "<=",
23
+ lt: "<"
24
+ };
25
+
26
+ // src/private/DefaultLogger.ts
27
+ var DefaultLogger = class extends ILogger {
28
+ static {
29
+ __name(this, "DefaultLogger");
30
+ }
31
+ debug(_message, ..._optionalParams) {
32
+ }
33
+ info(_message, ..._optionalParams) {
34
+ }
35
+ error(_message, ..._optionalParams) {
36
+ }
37
+ warn(_message, ..._optionalParams) {
38
+ }
39
+ verbose(_message, ..._optionalParams) {
40
+ }
41
+ };
42
+
43
+ // src/private/CosmosQueryBuilder.ts
44
+ var CosmosQueryBuilder = class extends ICosmosQueryBuilder {
45
+ static {
46
+ __name(this, "CosmosQueryBuilder");
47
+ }
48
+ // TODO: Allow setting
49
+ _indent = " ";
50
+ _orderBy = [];
51
+ _select = "*";
52
+ _groupBy = [];
53
+ _join = "";
54
+ _from = "c";
55
+ _queries = [];
56
+ _parameters = [];
57
+ _limit;
58
+ _logger;
59
+ constructor(options) {
60
+ super();
61
+ this._logger = options?.logger ?? new DefaultLogger();
62
+ }
63
+ get queries() {
64
+ return this._queries;
65
+ }
66
+ set queries(value) {
67
+ this._queries = value;
68
+ }
69
+ get parameters() {
70
+ return this._parameters;
71
+ }
72
+ set parameters(value) {
73
+ this._parameters = value;
74
+ }
75
+ handleStringFilter(prefix, value) {
76
+ return this.handleFilterObject(prefix, value);
77
+ }
78
+ handleUuidFilter(prefix, value) {
79
+ return this.handleFilterObject(prefix, value);
80
+ }
81
+ handleInstantFilter(prefix, value) {
82
+ return this.handleFilterObject(prefix, value);
83
+ }
84
+ handleFilterObject(prefix, value) {
85
+ const { __typeInfo, ...rest } = value;
86
+ for (const [key, value2] of Object.entries(rest).filter((x) => x[1] !== void 0)) {
87
+ const path = prefix;
88
+ const parameterName = `@p${this._parameters.length}`;
89
+ const operator = operators[key];
90
+ const queryKey = `(${path} ?? null)`;
91
+ if (operator != null) {
92
+ this._queries.push(`${queryKey} ${operator} ${parameterName}`);
93
+ } else {
94
+ if (key === "ieq") {
95
+ this._queries.push(`StringEquals(${queryKey}, ${parameterName}, true)`);
96
+ } else if (key === "ine") {
97
+ this._queries.push(`Not(StringEquals(${queryKey}, ${parameterName}, true))`);
98
+ } else if (key === "like") {
99
+ this._queries.push(`Contains(${queryKey}, ${parameterName}, true)`);
100
+ } else if (key === "in") {
101
+ this._queries.push(`ARRAY_CONTAINS(${parameterName}, ${queryKey})`);
102
+ } else {
103
+ throw new Error(`Unknown operator ${key}`);
104
+ }
105
+ }
106
+ this._parameters.push({ name: parameterName, value: value2 });
107
+ }
108
+ }
109
+ _buildQuery(query, prefix = "c") {
110
+ if (query != null) {
111
+ const { __typeInfo, ...rest } = query;
112
+ const queryKeys = Object.keys(rest);
113
+ for (const key of queryKeys) {
114
+ const value = query[key];
115
+ const type = value.__typeInfo ?? null;
116
+ const subPath = `${prefix}.${key}`;
117
+ if (typeof value === "object" && value != null) {
118
+ if (type === "StringFilter") {
119
+ this.handleStringFilter(subPath, value);
120
+ } else if (type === "InstantFilter") {
121
+ this.handleInstantFilter(subPath, value);
122
+ } else if (type === "UUIDFilter") {
123
+ this.handleUuidFilter(subPath, value);
124
+ } else {
125
+ this._buildQuery(value, subPath);
126
+ }
127
+ } else {
128
+ throw new Error(`Unhandled type ${type}`);
129
+ }
130
+ }
131
+ }
132
+ }
133
+ buildQuery(query, prefix = "c") {
134
+ this._buildQuery(query, prefix);
135
+ }
136
+ orderBy(field, direction) {
137
+ if (field == null || direction == null) {
138
+ this._orderBy = [];
139
+ } else {
140
+ this._orderBy = ["ORDER BY", `${this._indent}c.${field} ${direction}`];
141
+ }
142
+ return this;
143
+ }
144
+ groupBy(value) {
145
+ this._groupBy = ["GROUP BY", `${this._indent}${value}`];
146
+ return this;
147
+ }
148
+ select(value) {
149
+ this._select = value;
150
+ return this;
151
+ }
152
+ parameter(name, value) {
153
+ this._parameters.push({
154
+ name,
155
+ value
156
+ });
157
+ }
158
+ limit(limit) {
159
+ this._limit = limit;
160
+ return this;
161
+ }
162
+ join(value, statement) {
163
+ this._join = `${value} IN c.${statement}`;
164
+ return this;
165
+ }
166
+ whereFuzzy(value, fields) {
167
+ const parameterName = `@p${this._parameters.length}`;
168
+ const lines = [];
169
+ for (const field of fields) {
170
+ const clause = `Contains(c.${field}, ${parameterName}, true)`;
171
+ lines.push(clause);
172
+ }
173
+ const queryLine = `(${lines.join(" OR ")})`;
174
+ this._queries.push(queryLine);
175
+ this._parameters.push({ name: parameterName, value });
176
+ return this;
177
+ }
178
+ whereRaw(field, operator, value) {
179
+ const parameterName = `@p${this._parameters.length}`;
180
+ const sqlOperator = operators[operator];
181
+ this._queries.push(`${field} ${sqlOperator} ${parameterName}`);
182
+ this._parameters.push({ name: parameterName, value });
183
+ return this;
184
+ }
185
+ whereOr(conditions) {
186
+ const orClauses = [];
187
+ for (const condition of conditions) {
188
+ const { field, operator, value } = condition;
189
+ const parameterName = `@p${this._parameters.length}`;
190
+ if (operator === "isNull") {
191
+ orClauses.push(`(c.${field} ?? null) = null`);
192
+ } else if (operator === "contains") {
193
+ orClauses.push(`ARRAY_CONTAINS(c.${field}, ${parameterName})`);
194
+ } else if (operator === "in") {
195
+ orClauses.push(`ARRAY_CONTAINS(${parameterName}, c.${field})`);
196
+ } else {
197
+ const sqlOperator = operators[operator];
198
+ if (sqlOperator != null && value !== void 0) {
199
+ orClauses.push(`c.${field} ${sqlOperator} ${parameterName}`);
200
+ this._parameters.push({ name: parameterName, value });
201
+ }
202
+ }
203
+ }
204
+ if (orClauses.length > 0) {
205
+ this._queries.push(`(${orClauses.join(" OR ")})`);
206
+ }
207
+ return this;
208
+ }
209
+ where(field, operator, value) {
210
+ const parameterName = `@p${this._parameters.length}`;
211
+ if (operator === "isNull") {
212
+ const clause = `(c.${field} ?? null) = null`;
213
+ this._queries.push(clause);
214
+ } else if (operator === "contains") {
215
+ if (value !== void 0) {
216
+ const clause = `ARRAY_CONTAINS(c.${field}, ${parameterName})`;
217
+ this._queries.push(clause);
218
+ this._parameters.push({ name: parameterName, value });
219
+ }
220
+ } else if (operator === "in") {
221
+ if (value !== void 0) {
222
+ const clause = `ARRAY_CONTAINS(${parameterName}, c.${field})`;
223
+ this._queries.push(clause);
224
+ this._parameters.push({ name: parameterName, value });
225
+ }
226
+ } else if (operator === "ieq") {
227
+ if (value !== void 0) {
228
+ const clause = `StringEquals(c.${field}, ${parameterName}, true)`;
229
+ this._queries.push(clause);
230
+ this._parameters.push({ name: parameterName, value });
231
+ }
232
+ } else if (operator === "ine") {
233
+ if (value !== void 0) {
234
+ const clause = `Not(StringEquals(c.${field}, ${parameterName}, true))`;
235
+ this._queries.push(clause);
236
+ this._parameters.push({ name: parameterName, value });
237
+ }
238
+ } else {
239
+ const sqlOperator = operators[operator];
240
+ if (sqlOperator != null && value !== void 0) {
241
+ this._queries.push(`c.${field} ${sqlOperator} ${parameterName}`);
242
+ this._parameters.push({ name: parameterName, value });
243
+ }
244
+ }
245
+ return this;
246
+ }
247
+ filter(x) {
248
+ const paramName = `@p${this._parameters.length}`;
249
+ this._queries.push(x.clause.replace("@", paramName));
250
+ if (x.parameter != null) {
251
+ this._parameters.push({
252
+ name: paramName,
253
+ value: x.parameter
254
+ });
255
+ }
256
+ return this;
257
+ }
258
+ query() {
259
+ const lines = [];
260
+ lines.push(`SELECT
261
+ ${this._indent}${this._select}`);
262
+ lines.push(`FROM
263
+ ${this._indent}${this._from}`);
264
+ if (this._join !== "") {
265
+ lines.push(`JOIN
266
+ ${this._indent}${this._join}`);
267
+ }
268
+ if (this._queries.length > 0) {
269
+ lines.push("WHERE");
270
+ const where = this._queries.join(` AND
271
+ ${this._indent}`);
272
+ lines.push(`${this._indent}${where}`);
273
+ }
274
+ lines.push(...this._orderBy);
275
+ lines.push(...this._groupBy);
276
+ if (this._limit != null) {
277
+ lines.push("OFFSET 0");
278
+ lines.push(`LIMIT ${this._limit}`);
279
+ }
280
+ const queryText = lines.join("\n");
281
+ const result = {
282
+ query: queryText,
283
+ parameters: this.parameters
284
+ };
285
+ this._logger.verbose("Cosmos Query", result);
286
+ return result;
287
+ }
288
+ async getOne(container) {
289
+ const itemsQuery = this.query();
290
+ const itemsIterator = container.items.query(itemsQuery);
291
+ const items = await itemsIterator.fetchNext();
292
+ this._logger.verbose("Cosmos Result", { result: items });
293
+ return items.resources?.[0] ?? null;
294
+ }
295
+ async getAll(container, limit, cursor) {
296
+ const itemsQuery = this.query();
297
+ const itemsIterator = container.items.query(itemsQuery, {
298
+ continuationToken: cursor ?? void 0,
299
+ maxItemCount: limit ?? void 0
300
+ });
301
+ let items;
302
+ try {
303
+ items = await itemsIterator.fetchAll();
304
+ } catch (err) {
305
+ this._logger.error("Cosmos Query Error", err);
306
+ throw err;
307
+ }
308
+ this._logger.verbose("Cosmos Result", { result: items });
309
+ this.select("VALUE COUNT(1)");
310
+ this.orderBy();
311
+ const countQuery = this.query();
312
+ const countIterator = container.items.query(countQuery);
313
+ let count;
314
+ try {
315
+ count = await countIterator.fetchAll();
316
+ } catch (err) {
317
+ this._logger.error("Cosmos Count Query Error", err);
318
+ throw err;
319
+ }
320
+ const totalCount = count.resources?.[0] ?? 0;
321
+ const result = {
322
+ continuationToken: items.continuationToken,
323
+ count: items.resources?.length ?? 0,
324
+ items: items.resources ?? [],
325
+ hasMoreResults: items.hasMoreResults,
326
+ totalCount
327
+ };
328
+ return result;
329
+ }
330
+ patch(...operations) {
331
+ const patchOperations = operations.map((opDef) => {
332
+ if (opDef.op === "remove") {
333
+ return { op: opDef.op, path: opDef.path };
334
+ }
335
+ if (opDef.value !== void 0) {
336
+ return { op: opDef.op, path: opDef.path, value: opDef.value };
337
+ }
338
+ throw new Error(`Value is required for operation: ${opDef.op}`);
339
+ });
340
+ return { operations: patchOperations };
341
+ }
342
+ };
343
+
344
+ // src/public/createCosmosQueryBuilder.ts
345
+ function createCosmosQueryBuilder(options) {
346
+ return new CosmosQueryBuilder(options);
347
+ }
348
+ __name(createCosmosQueryBuilder, "createCosmosQueryBuilder");
349
+
350
+ // src/public/enums.ts
351
+ var SortDirection = /* @__PURE__ */ ((SortDirection2) => {
352
+ SortDirection2["Asc"] = "ASC";
353
+ SortDirection2["Desc"] = "DESC";
354
+ return SortDirection2;
355
+ })(SortDirection || {});
356
+ export {
357
+ ILogger,
358
+ SortDirection,
359
+ createCosmosQueryBuilder
360
+ };
361
+ //# 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): 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"]}
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"],"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"],"mappings":"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","names":["SortDirection"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@shellicar/cosmos-query-builder",
3
3
  "private": false,
4
- "version": "1.1.1",
4
+ "version": "1.1.2",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "author": "Stephen Hellicar",
@@ -18,12 +18,13 @@
18
18
  ],
19
19
  "repository": {
20
20
  "type": "git",
21
- "url": "git+https://github.com/shellicar/cosmos-query-builder.git"
21
+ "url": "git+https://github.com/shellicar/ecosystem.git",
22
+ "directory": "packages/cosmos-query-builder"
22
23
  },
23
24
  "bugs": {
24
- "url": "https://github.com/shellicar/cosmos-query-builder/issues"
25
+ "url": "https://github.com/shellicar/ecosystem/issues?q=is%3Aissue%20state%3Aopen%20label%3A%22pkg%3A%20cosmos-query-builder%22"
25
26
  },
26
- "homepage": "https://github.com/shellicar/cosmos-query-builder#readme",
27
+ "homepage": "https://github.com/shellicar/ecosystem/tree/main/packages/cosmos-query-builder#readme",
27
28
  "publishConfig": {
28
29
  "access": "public"
29
30
  },
@@ -46,23 +47,20 @@
46
47
  "dist"
47
48
  ],
48
49
  "devDependencies": {
49
- "@azure/cosmos": "^4.9.1",
50
- "@shellicar/build-clean": "^1.2.3",
51
- "@tsconfig/node20": "^20.1.9",
52
- "@tsconfig/node22": "^22.0.5",
53
- "@types/node": "^25.3.2",
54
- "terser": "^5.46.0",
50
+ "@azure/cosmos": "^4.9.2",
51
+ "@types/node": "^25.6.0",
55
52
  "tsup": "^8.5.1",
56
53
  "typescript": "^5.9.3",
57
- "vitest": "^4.0.18"
54
+ "vitest": "^4.1.4",
55
+ "@shellicar/typescript-config": "^1.0.0"
58
56
  },
59
57
  "peerDependencies": {
60
58
  "@azure/cosmos": ">=4.0.0 <5.0.0"
61
59
  },
62
60
  "scripts": {
63
61
  "build": "tsup-node",
64
- "dev": "tsup-node --watch",
65
62
  "type-check": "tsc -p tsconfig.check.json",
66
- "test": "vitest run"
63
+ "test": "vitest run",
64
+ "watch": "tsup-node --watch"
67
65
  }
68
66
  }