@decaf-ts/for-couchdb 0.14.0 → 0.14.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.
Files changed (69) hide show
  1. package/dist/for-couchdb.cjs +1 -1
  2. package/dist/for-couchdb.cjs.map +1 -1
  3. package/dist/for-couchdb.js +1 -1
  4. package/dist/for-couchdb.js.map +1 -1
  5. package/lib/cjs/adapter.cjs +6 -12
  6. package/lib/cjs/adapter.cjs.map +1 -1
  7. package/lib/cjs/{errors.cjs → errors/IndexError.cjs} +2 -2
  8. package/lib/cjs/errors/IndexError.cjs.map +1 -0
  9. package/lib/cjs/errors/IndexPlanningError.cjs +15 -0
  10. package/lib/cjs/errors/IndexPlanningError.cjs.map +1 -0
  11. package/lib/cjs/errors/index.cjs +20 -0
  12. package/lib/cjs/errors/index.cjs.map +1 -0
  13. package/lib/cjs/index.cjs +10 -6
  14. package/lib/cjs/index.cjs.map +1 -1
  15. package/lib/cjs/indexes/generator.cjs +13 -9
  16. package/lib/cjs/indexes/generator.cjs.map +1 -1
  17. package/lib/cjs/query/Paginator.cjs +32 -16
  18. package/lib/cjs/query/Paginator.cjs.map +1 -1
  19. package/lib/cjs/query/Statement.cjs +13 -8
  20. package/lib/cjs/query/Statement.cjs.map +1 -1
  21. package/lib/cjs/query/index.cjs +1 -0
  22. package/lib/cjs/query/index.cjs.map +1 -1
  23. package/lib/cjs/query/planner.cjs +448 -0
  24. package/lib/cjs/query/planner.cjs.map +1 -0
  25. package/lib/esm/adapter.js +1 -7
  26. package/lib/esm/adapter.js.map +1 -1
  27. package/lib/esm/{errors.js → errors/IndexError.js} +1 -1
  28. package/lib/esm/errors/IndexError.js.map +1 -0
  29. package/lib/esm/errors/IndexPlanningError.js +10 -0
  30. package/lib/esm/errors/IndexPlanningError.js.map +1 -0
  31. package/lib/esm/errors/index.js +3 -0
  32. package/lib/esm/errors/index.js.map +1 -0
  33. package/lib/esm/index.js +5 -5
  34. package/lib/esm/index.js.map +1 -1
  35. package/lib/esm/indexes/generator.js +12 -10
  36. package/lib/esm/indexes/generator.js.map +1 -1
  37. package/lib/esm/query/Paginator.js +32 -16
  38. package/lib/esm/query/Paginator.js.map +1 -1
  39. package/lib/esm/query/Statement.js +14 -9
  40. package/lib/esm/query/Statement.js.map +1 -1
  41. package/lib/esm/query/index.js +1 -0
  42. package/lib/esm/query/index.js.map +1 -1
  43. package/lib/esm/query/planner.js +430 -0
  44. package/lib/esm/query/planner.js.map +1 -0
  45. package/lib/types/adapter.d.cts +3 -3
  46. package/lib/types/adapter.d.mts +3 -3
  47. package/lib/types/errors/IndexPlanningError.d.cts +17 -0
  48. package/lib/types/errors/IndexPlanningError.d.mts +17 -0
  49. package/lib/types/errors/index.d.cts +2 -0
  50. package/lib/types/errors/index.d.mts +2 -0
  51. package/lib/types/index.d.cts +5 -5
  52. package/lib/types/index.d.mts +5 -5
  53. package/lib/types/indexes/generator.d.cts +13 -0
  54. package/lib/types/indexes/generator.d.mts +13 -0
  55. package/lib/types/query/Paginator.d.cts +3 -0
  56. package/lib/types/query/Paginator.d.mts +3 -0
  57. package/lib/types/query/Statement.d.cts +3 -2
  58. package/lib/types/query/Statement.d.mts +3 -2
  59. package/lib/types/query/index.d.cts +1 -0
  60. package/lib/types/query/index.d.mts +1 -0
  61. package/lib/types/query/planner.d.cts +64 -0
  62. package/lib/types/query/planner.d.mts +64 -0
  63. package/lib/types/types.d.cts +8 -0
  64. package/lib/types/types.d.mts +8 -0
  65. package/package.json +1 -1
  66. package/lib/cjs/errors.cjs.map +0 -1
  67. package/lib/esm/errors.js.map +0 -1
  68. /package/lib/types/{errors.d.cts → errors/IndexError.d.cts} +0 -0
  69. /package/lib/types/{errors.d.mts → errors/IndexError.d.mts} +0 -0
@@ -0,0 +1,430 @@
1
+ import { OrderDirection } from "@decaf-ts/core";
2
+ import { Model } from "@decaf-ts/decorator-validation";
3
+ import { CouchDBKeys } from "./../constants.js";
4
+ import { CouchDBGroupOperator, CouchDBOperator } from "./constants.js";
5
+ import { generateIndexName, generateModelIndexName, } from "./../indexes/generator.js";
6
+ import { IndexPlanningError } from "./../errors/IndexPlanningError.js";
7
+ const SCAN_PRONE_OPERATORS = new Set([
8
+ "$or",
9
+ "$in",
10
+ "$regex",
11
+ "$nin",
12
+ "$not",
13
+ "$ne",
14
+ "$nor",
15
+ ]);
16
+ function isPlainObject(value) {
17
+ return !!value && typeof value === "object" && !Array.isArray(value);
18
+ }
19
+ function selectorContainsOperator(node, operator) {
20
+ if (!node || typeof node !== "object")
21
+ return false;
22
+ if (Array.isArray(node)) {
23
+ return node.some((child) => selectorContainsOperator(child, operator));
24
+ }
25
+ return Object.entries(node).some(([key, value]) => key === operator || selectorContainsOperator(value, operator));
26
+ }
27
+ export function normalizeSortField(entry) {
28
+ if (typeof entry === "string") {
29
+ return { field: entry };
30
+ }
31
+ if (Array.isArray(entry)) {
32
+ return entry.length ? { field: String(entry[0]) } : undefined;
33
+ }
34
+ const [field, direction] = Object.entries(entry || {})[0] || [];
35
+ if (!field)
36
+ return undefined;
37
+ return {
38
+ field,
39
+ direction: String(direction || OrderDirection.ASC).toLowerCase(),
40
+ };
41
+ }
42
+ export function getSortFields(query) {
43
+ return (query.sort || [])
44
+ .map(normalizeSortField)
45
+ .filter(Boolean)
46
+ .map((entry) => entry.field);
47
+ }
48
+ export function getSortDirection(query) {
49
+ return (query.sort || [])
50
+ .map(normalizeSortField)
51
+ .find(Boolean)?.direction;
52
+ }
53
+ export function getEqualitySelectorFields(selector = {}) {
54
+ const fields = new Set();
55
+ const visit = (node) => {
56
+ if (!node || typeof node !== "object")
57
+ return;
58
+ if (Array.isArray(node)) {
59
+ node.forEach(visit);
60
+ return;
61
+ }
62
+ if (Array.isArray(node[CouchDBGroupOperator.AND])) {
63
+ node[CouchDBGroupOperator.AND].forEach(visit);
64
+ return;
65
+ }
66
+ for (const [key, value] of Object.entries(node)) {
67
+ if (key === CouchDBGroupOperator.OR || key === CouchDBGroupOperator.AND) {
68
+ visit(value);
69
+ continue;
70
+ }
71
+ if (!isPlainObject(value)) {
72
+ fields.add(key);
73
+ continue;
74
+ }
75
+ if (Object.prototype.hasOwnProperty.call(value, CouchDBOperator.EQUAL)) {
76
+ fields.add(key);
77
+ }
78
+ }
79
+ };
80
+ visit(selector);
81
+ return fields;
82
+ }
83
+ export function getRangeSelectorFields(selector = {}) {
84
+ const fields = new Set();
85
+ const visit = (node) => {
86
+ if (!node || typeof node !== "object")
87
+ return;
88
+ if (Array.isArray(node)) {
89
+ node.forEach(visit);
90
+ return;
91
+ }
92
+ if (Array.isArray(node[CouchDBGroupOperator.AND])) {
93
+ node[CouchDBGroupOperator.AND].forEach(visit);
94
+ return;
95
+ }
96
+ for (const [key, value] of Object.entries(node)) {
97
+ if (key === CouchDBGroupOperator.OR || key === CouchDBGroupOperator.AND) {
98
+ visit(value);
99
+ continue;
100
+ }
101
+ if (!isPlainObject(value))
102
+ continue;
103
+ if (Object.prototype.hasOwnProperty.call(value, CouchDBOperator.BIGGER) ||
104
+ Object.prototype.hasOwnProperty.call(value, CouchDBOperator.BIGGER_EQ) ||
105
+ Object.prototype.hasOwnProperty.call(value, CouchDBOperator.SMALLER) ||
106
+ Object.prototype.hasOwnProperty.call(value, CouchDBOperator.SMALLER_EQ)) {
107
+ fields.add(key);
108
+ }
109
+ }
110
+ };
111
+ visit(selector);
112
+ return fields;
113
+ }
114
+ function collectGeneratedIndexEntries(clazz) {
115
+ const tableName = Model.tableName(clazz);
116
+ const candidates = [];
117
+ const tableIndexName = generateIndexName([CouchDBKeys.TABLE]);
118
+ candidates.push({
119
+ name: tableIndexName,
120
+ ddoc: tableIndexName,
121
+ fields: [CouchDBKeys.TABLE],
122
+ source: "table",
123
+ });
124
+ let defaultQueryAttrs = [];
125
+ try {
126
+ defaultQueryAttrs = Model.defaultQueryAttributes(clazz);
127
+ }
128
+ catch {
129
+ defaultQueryAttrs = [];
130
+ }
131
+ for (const attr of defaultQueryAttrs) {
132
+ const baseName = generateIndexName([tableName, attr, "defaultQuery"]);
133
+ candidates.push({
134
+ name: baseName,
135
+ ddoc: baseName,
136
+ fields: [CouchDBKeys.TABLE, attr],
137
+ source: "defaultQuery",
138
+ });
139
+ for (const direction of [OrderDirection.ASC, OrderDirection.DSC]) {
140
+ const sortedName = generateIndexName([tableName, attr, "defaultQuery"], direction);
141
+ candidates.push({
142
+ name: sortedName,
143
+ ddoc: sortedName,
144
+ fields: [CouchDBKeys.TABLE, attr],
145
+ direction,
146
+ source: "defaultQuery",
147
+ });
148
+ }
149
+ }
150
+ const modelIndexes = Model.indexes(clazz);
151
+ Object.entries(modelIndexes || {}).forEach(([fieldKey, value]) => {
152
+ Object.values(value || {}).forEach((metadataValue) => {
153
+ if (!metadataValue || !isPlainObject(metadataValue))
154
+ return;
155
+ const meta = metadataValue;
156
+ const compositions = meta.compositions || [];
157
+ const directions = meta.directions || [OrderDirection.ASC];
158
+ const fields = [CouchDBKeys.TABLE, fieldKey, ...compositions];
159
+ const baseName = generateModelIndexName(tableName, fieldKey, compositions);
160
+ candidates.push({
161
+ name: baseName,
162
+ ddoc: baseName,
163
+ fields,
164
+ source: "index",
165
+ });
166
+ const validDirections = Array.from(new Set(directions.map((dir) => String(dir).toLowerCase()))).filter((dir) => dir === OrderDirection.ASC || dir === OrderDirection.DSC);
167
+ for (const direction of validDirections) {
168
+ const sortedName = generateModelIndexName(tableName, fieldKey, compositions, direction);
169
+ candidates.push({
170
+ name: sortedName,
171
+ ddoc: sortedName,
172
+ fields,
173
+ direction,
174
+ source: "index",
175
+ });
176
+ }
177
+ });
178
+ });
179
+ return candidates;
180
+ }
181
+ export function buildGeneratedIndexCandidates(clazz) {
182
+ return collectGeneratedIndexEntries(clazz);
183
+ }
184
+ export function findGeneratedIndexCandidateByName(clazz, expectedName) {
185
+ return collectGeneratedIndexEntries(clazz).find((candidate) => candidate.name === expectedName || candidate.ddoc === expectedName);
186
+ }
187
+ export function resolveGeneratedIndexForQuery(clazz, query, options = {}) {
188
+ if (query.use_index)
189
+ return undefined;
190
+ // A single named index cannot be proven valid for selectors combining
191
+ // branches via $or/$nor, since CouchDB only treats an index as usable when
192
+ // its leading fields constrain every branch of the selector. Forcing a
193
+ // use_index hint here causes CouchDB to reject it as "not a valid index for
194
+ // this query" - so let CouchDB pick (or fall back) on its own instead.
195
+ if (selectorContainsOperator(query.selector, CouchDBGroupOperator.OR) ||
196
+ selectorContainsOperator(query.selector, "$nor")) {
197
+ return undefined;
198
+ }
199
+ const preserveDefaultQuery = options.preserveDefaultQuery !== false;
200
+ const candidates = collectGeneratedIndexEntries(clazz);
201
+ const equalityFields = getEqualitySelectorFields(query.selector);
202
+ const rangeFields = getRangeSelectorFields(query.selector);
203
+ const sortFields = getSortFields(query);
204
+ const sortDirection = getSortDirection(query);
205
+ equalityFields.add(CouchDBKeys.TABLE);
206
+ const scored = candidates
207
+ .map((candidate) => {
208
+ if (candidate.direction &&
209
+ sortDirection &&
210
+ candidate.direction !== sortDirection) {
211
+ return undefined;
212
+ }
213
+ if (!candidate.fields.includes(CouchDBKeys.TABLE))
214
+ return undefined;
215
+ if (candidate.fields[0] !== CouchDBKeys.TABLE)
216
+ return undefined;
217
+ const candidateFields = candidate.fields.filter((field) => field !== CouchDBKeys.TABLE);
218
+ const coversAllSort = sortFields.length === 0 ||
219
+ sortFields.every((field) => candidateFields.includes(field));
220
+ const coversSomeSort = sortFields.some((field) => candidateFields.includes(field));
221
+ const coversAllRange = rangeFields.size === 0 ||
222
+ Array.from(rangeFields).every((field) => candidateFields.includes(field));
223
+ const coversSomeRange = Array.from(rangeFields).some((field) => candidateFields.includes(field));
224
+ if (options.requireSortCoverage && sortFields.length && !coversAllSort) {
225
+ return undefined;
226
+ }
227
+ const equalityCoverage = candidateFields.filter((field) => equalityFields.has(field)).length;
228
+ const rangeCoverage = candidateFields.filter((field) => rangeFields.has(field)).length;
229
+ const sortCoverage = candidateFields.filter((field) => sortFields.includes(field)).length;
230
+ if (!equalityCoverage && !rangeCoverage && !sortCoverage) {
231
+ return undefined;
232
+ }
233
+ let score = 0;
234
+ if (candidate.source === "defaultQuery" && preserveDefaultQuery) {
235
+ score += 100;
236
+ }
237
+ if (candidate.source === "index")
238
+ score += 50;
239
+ score += equalityCoverage * 30;
240
+ score += rangeCoverage * 25;
241
+ score += sortCoverage * 20;
242
+ if (coversAllSort && sortFields.length)
243
+ score += 20;
244
+ if (coversAllRange && rangeFields.size)
245
+ score += 20;
246
+ if (coversSomeSort)
247
+ score += 5;
248
+ if (coversSomeRange)
249
+ score += 5;
250
+ if (candidate.direction && sortDirection)
251
+ score += 10;
252
+ return { candidate, score };
253
+ })
254
+ .filter(Boolean);
255
+ if (!scored.length)
256
+ return undefined;
257
+ scored.sort((a, b) => {
258
+ if (b.score !== a.score)
259
+ return b.score - a.score;
260
+ return a.candidate.fields.length - b.candidate.fields.length;
261
+ });
262
+ const best = scored[0].candidate;
263
+ return {
264
+ candidate: best,
265
+ use_index: [best.ddoc, best.name],
266
+ };
267
+ }
268
+ export function getRequiredMangoIndexShape(clazz, query) {
269
+ const tableName = Model.tableName(clazz);
270
+ const modelName = clazz.name;
271
+ const equalityFields = Array.from(getEqualitySelectorFields(query.selector));
272
+ const rangeFields = Array.from(getRangeSelectorFields(query.selector));
273
+ const sortFields = getSortFields(query);
274
+ const sortDirection = getSortDirection(query);
275
+ const requiredFields = [CouchDBKeys.TABLE];
276
+ for (const field of equalityFields) {
277
+ if (field !== CouchDBKeys.TABLE && !requiredFields.includes(field)) {
278
+ requiredFields.push(field);
279
+ }
280
+ }
281
+ for (const field of rangeFields) {
282
+ if (field !== CouchDBKeys.TABLE && !requiredFields.includes(field)) {
283
+ requiredFields.push(field);
284
+ }
285
+ }
286
+ for (const field of sortFields) {
287
+ if (field !== CouchDBKeys.TABLE && !requiredFields.includes(field)) {
288
+ requiredFields.push(field);
289
+ }
290
+ }
291
+ return {
292
+ tableName,
293
+ modelName,
294
+ equalityFields,
295
+ rangeFields,
296
+ sortFields,
297
+ sortDirection,
298
+ requiredFields,
299
+ };
300
+ }
301
+ export function reverseRequiredShapeToIndexDeclaration(clazz, query) {
302
+ const shape = getRequiredMangoIndexShape(clazz, query);
303
+ const nonTableFields = shape.requiredFields.filter((field) => field !== CouchDBKeys.TABLE);
304
+ if (!nonTableFields.length) {
305
+ throw new IndexPlanningError("Cannot infer @index declaration for query with no model fields.", {
306
+ modelName: shape.modelName,
307
+ tableName: shape.tableName,
308
+ attribute: "",
309
+ compositions: [],
310
+ directions: [],
311
+ expectedName: "",
312
+ expectedDdoc: "",
313
+ expectedFields: [CouchDBKeys.TABLE],
314
+ decorator: "",
315
+ }, query);
316
+ }
317
+ const attribute = nonTableFields[0];
318
+ const compositions = nonTableFields.slice(1);
319
+ const direction = shape.sortDirection || OrderDirection.ASC;
320
+ const name = generateModelIndexName(shape.tableName, attribute, compositions, direction);
321
+ const fields = [
322
+ { [CouchDBKeys.TABLE]: direction },
323
+ { [attribute]: direction },
324
+ ...compositions.map((field) => ({ [field]: direction })),
325
+ ];
326
+ const decorator = [
327
+ "@index({",
328
+ compositions.length
329
+ ? ` compositions: ${JSON.stringify(compositions)},`
330
+ : undefined,
331
+ ` directions: ${JSON.stringify([direction])}`,
332
+ "})",
333
+ `${attribute}!: <type>;`,
334
+ ]
335
+ .filter(Boolean)
336
+ .join("\n");
337
+ return {
338
+ attribute,
339
+ compositions,
340
+ directions: [direction],
341
+ name,
342
+ ddoc: name,
343
+ fields,
344
+ decorator,
345
+ };
346
+ }
347
+ export function attachGeneratedUseIndex(clazz, query, log, options = {}) {
348
+ if (!clazz || query.use_index)
349
+ return;
350
+ if (options.forceNamedIndexes === false && !options.requireIndex) {
351
+ return;
352
+ }
353
+ const resolved = resolveGeneratedIndexForQuery(clazz, query, {
354
+ preserveDefaultQuery: options.preserveDefaultQuery ?? true,
355
+ requireSortCoverage: options.requireSortCoverage ?? false,
356
+ });
357
+ if (resolved) {
358
+ query.use_index = resolved.use_index;
359
+ log?.debug?.(`Attached Mango use_index=${JSON.stringify(resolved.use_index)} from ${resolved.candidate.source} metadata`);
360
+ return;
361
+ }
362
+ if (!options.requireIndex)
363
+ return;
364
+ const reversed = reverseRequiredShapeToIndexDeclaration(clazz, query);
365
+ throw new IndexPlanningError([
366
+ "No generated CouchDB index can satisfy this Mango query.",
367
+ "",
368
+ `Model: ${clazz.name}`,
369
+ `Table: ${shapeTableName(clazz)}`,
370
+ "",
371
+ "To allow this query, declare the following index on the model attribute:",
372
+ "",
373
+ reversed.decorator,
374
+ "",
375
+ "Then regenerate/deploy indexes.",
376
+ "",
377
+ "Expected generated index:",
378
+ ` ddoc: ${reversed.ddoc}`,
379
+ ` name: ${reversed.name}`,
380
+ ` fields: ${JSON.stringify(reversed.fields)}`,
381
+ ].join("\n"), {
382
+ modelName: clazz.name,
383
+ tableName: shapeTableName(clazz),
384
+ attribute: reversed.attribute,
385
+ compositions: reversed.compositions,
386
+ directions: reversed.directions,
387
+ expectedName: reversed.name,
388
+ expectedDdoc: reversed.ddoc,
389
+ expectedFields: reversed.fields,
390
+ decorator: reversed.decorator,
391
+ }, query);
392
+ }
393
+ function shapeTableName(clazz) {
394
+ return Model.tableName(clazz);
395
+ }
396
+ export function requireGeneratedUseIndex(clazz, query, log, options = {}) {
397
+ attachGeneratedUseIndex(clazz, query, log, {
398
+ preserveDefaultQuery: true,
399
+ requireSortCoverage: options.requireSortCoverage ?? true,
400
+ requireIndex: true,
401
+ forceNamedIndexes: true,
402
+ });
403
+ }
404
+ export function warnScanProneMangoOperators(selector, log, path = "selector") {
405
+ if (!selector || typeof selector !== "object")
406
+ return;
407
+ if (Array.isArray(selector)) {
408
+ selector.forEach((entry, index) => warnScanProneMangoOperators(entry, log, `${path}[${index}]`));
409
+ return;
410
+ }
411
+ for (const [key, value] of Object.entries(selector)) {
412
+ if (SCAN_PRONE_OPERATORS.has(key)) {
413
+ log?.warn?.(`Mango query contains scan-prone operator ${key} at ${path}. This may bypass or weaken index usage and can produce slow queries.`);
414
+ }
415
+ warnScanProneMangoOperators(value, log, `${path}.${key}`);
416
+ }
417
+ }
418
+ export function ensureDeterministicSort(query, tieBreaker, direction) {
419
+ if (!query.sort?.length)
420
+ return;
421
+ const sortFields = getSortFields(query);
422
+ if (sortFields.includes(tieBreaker))
423
+ return;
424
+ const effectiveDirection = direction || getSortDirection(query) || OrderDirection.ASC;
425
+ query.sort = [...query.sort, { [tieBreaker]: effectiveDirection }];
426
+ }
427
+ export function enableMangoExecutionStats(query) {
428
+ query.execution_stats = true;
429
+ }
430
+ //# sourceMappingURL=planner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planner.js","sourceRoot":"","sources":["../../../src/query/planner.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import { Adapter, AdapterFlags, Paginator, RawResult, ContextualArgs, PreparedModel } from "@decaf-ts/core";
1
+ import { Adapter, Paginator, RawResult, ContextualArgs, PreparedModel } from "@decaf-ts/core";
2
2
  import { BaseError, type PrimaryKeyType } from "@decaf-ts/db-decorators";
3
3
  import { Model } from "@decaf-ts/decorator-validation";
4
- import { type MangoQuery, ViewResponse } from "./types.d.cts";
4
+ import { type CouchDBFlags, type MangoQuery, ViewResponse } from "./types.d.cts";
5
5
  import { CouchDBStatement } from "./query/index.d.cts";
6
6
  import { Context } from "@decaf-ts/core";
7
7
  import { type Constructor } from "@decaf-ts/decoration";
@@ -57,7 +57,7 @@ export declare abstract class CouchDBAdapter<CONF, CONN, C extends Context<any>>
57
57
  * @template M - The model type
58
58
  * @return {CouchDBStatement<M, any>} A new CouchDBStatement instance
59
59
  */
60
- Statement<M extends Model>(overrides?: Partial<AdapterFlags>): CouchDBStatement<M, Adapter<CONF, CONN, MangoQuery, C>, any>;
60
+ Statement<M extends Model>(overrides?: Partial<CouchDBFlags>): CouchDBStatement<M, Adapter<CONF, CONN, MangoQuery, C>, any>;
61
61
  Paginator<M extends Model>(query: MangoQuery, size: number, clazz: Constructor<M>): Paginator<M, any, MangoQuery>;
62
62
  /**
63
63
  * @description Initializes the adapter by creating indexes for all managed models
@@ -1,7 +1,7 @@
1
- import { Adapter, AdapterFlags, Paginator, RawResult, ContextualArgs, PreparedModel } from "@decaf-ts/core";
1
+ import { Adapter, Paginator, RawResult, ContextualArgs, PreparedModel } from "@decaf-ts/core";
2
2
  import { BaseError, type PrimaryKeyType } from "@decaf-ts/db-decorators";
3
3
  import { Model } from "@decaf-ts/decorator-validation";
4
- import { type MangoQuery, ViewResponse } from "./types.d.mts";
4
+ import { type CouchDBFlags, type MangoQuery, ViewResponse } from "./types.d.mts";
5
5
  import { CouchDBStatement } from "./query/index.d.mts";
6
6
  import { Context } from "@decaf-ts/core";
7
7
  import { type Constructor } from "@decaf-ts/decoration";
@@ -57,7 +57,7 @@ export declare abstract class CouchDBAdapter<CONF, CONN, C extends Context<any>>
57
57
  * @template M - The model type
58
58
  * @return {CouchDBStatement<M, any>} A new CouchDBStatement instance
59
59
  */
60
- Statement<M extends Model>(overrides?: Partial<AdapterFlags>): CouchDBStatement<M, Adapter<CONF, CONN, MangoQuery, C>, any>;
60
+ Statement<M extends Model>(overrides?: Partial<CouchDBFlags>): CouchDBStatement<M, Adapter<CONF, CONN, MangoQuery, C>, any>;
61
61
  Paginator<M extends Model>(query: MangoQuery, size: number, clazz: Constructor<M>): Paginator<M, any, MangoQuery>;
62
62
  /**
63
63
  * @description Initializes the adapter by creating indexes for all managed models
@@ -0,0 +1,17 @@
1
+ import { IndexError } from "./IndexError.d.cts";
2
+ export type IndexPlanningSuggestion = {
3
+ modelName: string;
4
+ tableName: string;
5
+ attribute: string;
6
+ compositions: string[];
7
+ directions: string[];
8
+ expectedName: string;
9
+ expectedDdoc: string;
10
+ expectedFields: Array<string | Record<string, string>>;
11
+ decorator: string;
12
+ };
13
+ export declare class IndexPlanningError extends IndexError {
14
+ readonly suggestion: IndexPlanningSuggestion;
15
+ readonly query: unknown;
16
+ constructor(message: string, suggestion: IndexPlanningSuggestion, query: unknown);
17
+ }
@@ -0,0 +1,17 @@
1
+ import { IndexError } from "./IndexError.d.mts";
2
+ export type IndexPlanningSuggestion = {
3
+ modelName: string;
4
+ tableName: string;
5
+ attribute: string;
6
+ compositions: string[];
7
+ directions: string[];
8
+ expectedName: string;
9
+ expectedDdoc: string;
10
+ expectedFields: Array<string | Record<string, string>>;
11
+ decorator: string;
12
+ };
13
+ export declare class IndexPlanningError extends IndexError {
14
+ readonly suggestion: IndexPlanningSuggestion;
15
+ readonly query: unknown;
16
+ constructor(message: string, suggestion: IndexPlanningSuggestion, query: unknown);
17
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./IndexError.d.cts";
2
+ export * from "./IndexPlanningError.d.cts";
@@ -0,0 +1,2 @@
1
+ export * from "./IndexError.d.mts";
2
+ export * from "./IndexPlanningError.d.mts";
@@ -2,11 +2,11 @@ export * from "./indexes/index.d.cts";
2
2
  export * from "./repository.d.cts";
3
3
  export * from "./adapter.d.cts";
4
4
  export * from "./constants.d.cts";
5
- export * from "./errors.d.cts";
5
+ export * from "./errors/index.d.cts";
6
6
  export * from "./metadata.d.cts";
7
7
  export * from "./decorators.d.cts";
8
8
  export * from "./types.d.cts";
9
- export * from "./utils.d.cts";
9
+ export { reAuth, wrapDocumentScope, testReservedAttributes, generateIndexDoc } from "./utils.d.cts";
10
10
  export * from "./query/index.d.cts";
11
11
  export * from "./views/index.d.cts";
12
12
  /**
@@ -19,21 +19,21 @@ export * from "./views/index.d.cts";
19
19
  * @summary The version string of the for-couchdb package
20
20
  * @const VERSION
21
21
  */
22
- export declare const VERSION = "0.13.0";
22
+ export declare const VERSION = "0.14.1";
23
23
  /**
24
24
  * @description Represents the current commit hash of the module build.
25
25
  * @summary Stores the current git commit hash for the package. The build replaces
26
26
  * the placeholder with the actual commit hash at publish time.
27
27
  * @const COMMIT
28
28
  */
29
- export declare const COMMIT = "d216217";
29
+ export declare const COMMIT = "8d4d67a";
30
30
  /**
31
31
  * @description Represents the full version string of the module.
32
32
  * @summary Stores the semver version and commit hash for the package.
33
33
  * The build replaces the placeholder with the actual `<version>-<commit>` value at publish time.
34
34
  * @const FULL_VERSION
35
35
  */
36
- export declare const FULL_VERSION = "0.13.0-d216217";
36
+ export declare const FULL_VERSION = "0.14.1-8d4d67a";
37
37
  /**
38
38
  * @description Stores the current package name
39
39
  * @summary The version string of the for-couchdb package
@@ -2,11 +2,11 @@ export * from "./indexes/index.d.mts";
2
2
  export * from "./repository.d.mts";
3
3
  export * from "./adapter.d.mts";
4
4
  export * from "./constants.d.mts";
5
- export * from "./errors.d.mts";
5
+ export * from "./errors/index.d.mts";
6
6
  export * from "./metadata.d.mts";
7
7
  export * from "./decorators.d.mts";
8
8
  export * from "./types.d.mts";
9
- export * from "./utils.d.mts";
9
+ export { reAuth, wrapDocumentScope, testReservedAttributes, generateIndexDoc } from "./utils.d.mts";
10
10
  export * from "./query/index.d.mts";
11
11
  export * from "./views/index.d.mts";
12
12
  /**
@@ -19,21 +19,21 @@ export * from "./views/index.d.mts";
19
19
  * @summary The version string of the for-couchdb package
20
20
  * @const VERSION
21
21
  */
22
- export declare const VERSION = "0.13.0";
22
+ export declare const VERSION = "0.14.1";
23
23
  /**
24
24
  * @description Represents the current commit hash of the module build.
25
25
  * @summary Stores the current git commit hash for the package. The build replaces
26
26
  * the placeholder with the actual commit hash at publish time.
27
27
  * @const COMMIT
28
28
  */
29
- export declare const COMMIT = "d216217";
29
+ export declare const COMMIT = "8d4d67a";
30
30
  /**
31
31
  * @description Represents the full version string of the module.
32
32
  * @summary Stores the semver version and commit hash for the package.
33
33
  * The build replaces the placeholder with the actual `<version>-<commit>` value at publish time.
34
34
  * @const FULL_VERSION
35
35
  */
36
- export declare const FULL_VERSION = "0.13.0-d216217";
36
+ export declare const FULL_VERSION = "0.14.1-8d4d67a";
37
37
  /**
38
38
  * @description Stores the current package name
39
39
  * @summary The version string of the for-couchdb package
@@ -1,6 +1,19 @@
1
+ import { OrderDirection } from "@decaf-ts/core";
1
2
  import { Model } from "@decaf-ts/decorator-validation";
2
3
  import { CreateIndexRequest } from "../types.d.cts";
3
4
  import { Constructor } from "@decaf-ts/decoration";
5
+ /**
6
+ * @description Generates a name for a CouchDB index
7
+ * @summary Creates a standardized name for a CouchDB index by combining name parts, compositions, and direction
8
+ * @param {string[]} name - Array of name parts for the index
9
+ * @param {OrderDirection} [direction] - Optional sort direction for the index
10
+ * @param {string[]} [compositions] - Optional additional attributes to include in the index name
11
+ * @param {string} [separator=DefaultSeparator] - The separator to use between parts of the index name
12
+ * @return {string} The generated index name
13
+ * @memberOf module:for-couchdb
14
+ */
15
+ export declare function generateIndexName(name: string[], direction?: OrderDirection, compositions?: string[], separator?: string): string;
16
+ export declare function generateModelIndexName(tableName: string, fieldKey: string, compositions?: string[], direction?: OrderDirection, separator?: string): string;
4
17
  /**
5
18
  * @description Generates CouchDB index configurations for models
6
19
  * @summary Creates a set of CouchDB index configurations based on the metadata of the provided models
@@ -1,6 +1,19 @@
1
+ import { OrderDirection } from "@decaf-ts/core";
1
2
  import { Model } from "@decaf-ts/decorator-validation";
2
3
  import { CreateIndexRequest } from "../types.d.mts";
3
4
  import { Constructor } from "@decaf-ts/decoration";
5
+ /**
6
+ * @description Generates a name for a CouchDB index
7
+ * @summary Creates a standardized name for a CouchDB index by combining name parts, compositions, and direction
8
+ * @param {string[]} name - Array of name parts for the index
9
+ * @param {OrderDirection} [direction] - Optional sort direction for the index
10
+ * @param {string[]} [compositions] - Optional additional attributes to include in the index name
11
+ * @param {string} [separator=DefaultSeparator] - The separator to use between parts of the index name
12
+ * @return {string} The generated index name
13
+ * @memberOf module:for-couchdb
14
+ */
15
+ export declare function generateIndexName(name: string[], direction?: OrderDirection, compositions?: string[], separator?: string): string;
16
+ export declare function generateModelIndexName(tableName: string, fieldKey: string, compositions?: string[], direction?: OrderDirection, separator?: string): string;
4
17
  /**
5
18
  * @description Generates CouchDB index configurations for models
6
19
  * @summary Creates a set of CouchDB index configurations based on the metadata of the provided models