couchset 0.5.1 → 0.5.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.
@@ -0,0 +1,8 @@
1
+ interface PathSegment {
2
+ name: string;
3
+ selectors: string[];
4
+ }
5
+ /** Parse data paths, not SQL expressions. Backticks delimit literal field names. */
6
+ export declare const parseFieldPath: (path: string) => PathSegment[];
7
+ export declare const renderFieldPath: (segments: readonly PathSegment[]) => string;
8
+ export {};
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderFieldPath = exports.parseFieldPath = void 0;
4
+ var keyspace_1 = require("./keyspace");
5
+ /** Parse data paths, not SQL expressions. Backticks delimit literal field names. */
6
+ var parseFieldPath = function (path) {
7
+ var invalid = function () {
8
+ throw new Error("Invalid field path: ".concat(JSON.stringify(path)));
9
+ };
10
+ if (typeof path !== 'string' || !path.length || /[\x00-\x1f\x7f]/.test(path))
11
+ invalid();
12
+ var segments = [];
13
+ var position = 0;
14
+ while (position < path.length) {
15
+ var name_1 = '';
16
+ if (path[position] === '`') {
17
+ position++;
18
+ var closed_1 = false;
19
+ while (position < path.length) {
20
+ var character = path[position++];
21
+ if (character !== '`')
22
+ name_1 += character;
23
+ else if (path[position] === '`') {
24
+ name_1 += '`';
25
+ position++;
26
+ }
27
+ else {
28
+ closed_1 = true;
29
+ break;
30
+ }
31
+ }
32
+ if (!closed_1)
33
+ invalid();
34
+ }
35
+ else {
36
+ while (position < path.length && !'.[]'.includes(path[position])) {
37
+ name_1 += path[position++];
38
+ }
39
+ }
40
+ if (!name_1)
41
+ invalid();
42
+ var selectors = [];
43
+ while (path[position] === '[') {
44
+ var end = path.indexOf(']', position + 1);
45
+ if (end < 0)
46
+ invalid();
47
+ var selector = path.slice(position + 1, end);
48
+ if (selector !== '*' &&
49
+ (!/^(0|[1-9]\d*)$/.test(selector) || !Number.isSafeInteger(Number(selector))))
50
+ invalid();
51
+ selectors.push("[".concat(selector, "]"));
52
+ position = end + 1;
53
+ }
54
+ segments.push({ name: name_1, selectors: selectors });
55
+ if (position === path.length)
56
+ break;
57
+ if (path[position++] !== '.' || position === path.length)
58
+ invalid();
59
+ }
60
+ return segments;
61
+ };
62
+ exports.parseFieldPath = parseFieldPath;
63
+ var renderFieldPath = function (segments) {
64
+ return segments.map(function (_a) {
65
+ var name = _a.name, selectors = _a.selectors;
66
+ return (0, keyspace_1.escapeIdentifier)(name) + selectors.join('');
67
+ }).join('.');
68
+ };
69
+ exports.renderFieldPath = renderFieldPath;
70
+ //# sourceMappingURL=field-path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-path.js","sourceRoot":"","sources":["../../src/model/field-path.ts"],"names":[],"mappings":";;;AAAA,uCAA4C;AAO5C,oFAAoF;AAC7E,IAAM,cAAc,GAAG,UAAC,IAAY;IACvC,IAAM,OAAO,GAAG;QACZ,MAAM,IAAI,KAAK,CAAC,8BAAuB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAE,CAAC,CAAC;IACnE,CAAC,CAAC;IACF,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACxF,IAAM,QAAQ,GAAkB,EAAE,CAAC;IACnC,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,OAAO,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC5B,IAAI,MAAI,GAAG,EAAE,CAAC;QACd,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,EAAE,CAAC;YACzB,QAAQ,EAAE,CAAC;YACX,IAAI,QAAM,GAAG,KAAK,CAAC;YACnB,OAAO,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC5B,IAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;gBACnC,IAAI,SAAS,KAAK,GAAG;oBAAE,MAAI,IAAI,SAAS,CAAC;qBACpC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,EAAE,CAAC;oBAC9B,MAAI,IAAI,GAAG,CAAC;oBACZ,QAAQ,EAAE,CAAC;gBACf,CAAC;qBAAM,CAAC;oBACJ,QAAM,GAAG,IAAI,CAAC;oBACd,MAAM;gBACV,CAAC;YACL,CAAC;YACD,IAAI,CAAC,QAAM;gBAAE,OAAO,EAAE,CAAC;QAC3B,CAAC;aAAM,CAAC;YACJ,OAAO,QAAQ,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;gBAC/D,MAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC7B,CAAC;QACL,CAAC;QACD,IAAI,CAAC,MAAI;YAAE,OAAO,EAAE,CAAC;QACrB,IAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,GAAG,EAAE,CAAC;YAC5B,IAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;YAC5C,IAAI,GAAG,GAAG,CAAC;gBAAE,OAAO,EAAE,CAAC;YACvB,IAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;YAC/C,IACI,QAAQ,KAAK,GAAG;gBAChB,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAE7E,OAAO,EAAE,CAAC;YACd,SAAS,CAAC,IAAI,CAAC,WAAI,QAAQ,MAAG,CAAC,CAAC;YAChC,QAAQ,GAAG,GAAG,GAAG,CAAC,CAAC;QACvB,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC,EAAC,IAAI,QAAA,EAAE,SAAS,WAAA,EAAC,CAAC,CAAC;QACjC,IAAI,QAAQ,KAAK,IAAI,CAAC,MAAM;YAAE,MAAM;QACpC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,KAAK,GAAG,IAAI,QAAQ,KAAK,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,CAAC;IACxE,CAAC;IACD,OAAO,QAAQ,CAAC;AACpB,CAAC,CAAC;AAhDW,QAAA,cAAc,kBAgDzB;AAEK,IAAM,eAAe,GAAG,UAAC,QAAgC;IAC5D,OAAA,QAAQ,CAAC,GAAG,CAAC,UAAC,EAAiB;YAAhB,IAAI,UAAA,EAAE,SAAS,eAAA;QAAM,OAAA,IAAA,2BAAgB,EAAC,IAAI,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;IAA3C,CAA2C,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;AAA1F,CAA0F,CAAC;AADlF,QAAA,eAAe,mBACmE","sourcesContent":["import {escapeIdentifier} from './keyspace';\n\ninterface PathSegment {\n name: string;\n selectors: string[];\n}\n\n/** Parse data paths, not SQL expressions. Backticks delimit literal field names. */\nexport const parseFieldPath = (path: string): PathSegment[] => {\n const invalid = (): never => {\n throw new Error(`Invalid field path: ${JSON.stringify(path)}`);\n };\n if (typeof path !== 'string' || !path.length || /[\\x00-\\x1f\\x7f]/.test(path)) invalid();\n const segments: PathSegment[] = [];\n let position = 0;\n while (position < path.length) {\n let name = '';\n if (path[position] === '`') {\n position++;\n let closed = false;\n while (position < path.length) {\n const character = path[position++];\n if (character !== '`') name += character;\n else if (path[position] === '`') {\n name += '`';\n position++;\n } else {\n closed = true;\n break;\n }\n }\n if (!closed) invalid();\n } else {\n while (position < path.length && !'.[]'.includes(path[position])) {\n name += path[position++];\n }\n }\n if (!name) invalid();\n const selectors: string[] = [];\n while (path[position] === '[') {\n const end = path.indexOf(']', position + 1);\n if (end < 0) invalid();\n const selector = path.slice(position + 1, end);\n if (\n selector !== '*' &&\n (!/^(0|[1-9]\\d*)$/.test(selector) || !Number.isSafeInteger(Number(selector)))\n )\n invalid();\n selectors.push(`[${selector}]`);\n position = end + 1;\n }\n segments.push({name, selectors});\n if (position === path.length) break;\n if (path[position++] !== '.' || position === path.length) invalid();\n }\n return segments;\n};\n\nexport const renderFieldPath = (segments: readonly PathSegment[]): string =>\n segments.map(({name, selectors}) => escapeIdentifier(name) + selectors.join('')).join('.');\n"]}
@@ -27,6 +27,7 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
27
27
  Object.defineProperty(exports, "__esModule", { value: true });
28
28
  exports.buildIncludedSelectionQuery = exports.buildIncludeClauses = exports.includeOperator = exports.joinField = void 0;
29
29
  var keyspace_1 = require("./keyspace");
30
+ var field_path_1 = require("./field-path");
30
31
  var joinField = function (path) { return ({ $field: path }); };
31
32
  exports.joinField = joinField;
32
33
  var identifier = function (name) {
@@ -34,7 +35,6 @@ var identifier = function (name) {
34
35
  throw new Error('Empty or invalid identifier');
35
36
  return (0, keyspace_1.escapeIdentifier)(name);
36
37
  };
37
- var fieldPath = function (path) { return path.split('.').map(identifier).join('.'); };
38
38
  var comparisonOperators = {
39
39
  $eq: '=',
40
40
  $neq: '!=',
@@ -100,10 +100,11 @@ var keyspaceFromInclude = function (include, defaultKeyspace) {
100
100
  return safeKeyspace(target);
101
101
  };
102
102
  var sourceField = function (field, sourceAlias) {
103
- var prefix = "".concat(sourceAlias, ".");
104
- return field.indexOf(prefix) === 0
105
- ? fieldPath(field)
106
- : "".concat(identifier(sourceAlias), ".").concat(fieldPath(field));
103
+ var segments = (0, field_path_1.parseFieldPath)(field);
104
+ var qualified = segments.length > 1 && segments[0].name === sourceAlias && !segments[0].selectors.length;
105
+ return qualified
106
+ ? (0, field_path_1.renderFieldPath)(segments)
107
+ : "".concat(identifier(sourceAlias), ".").concat((0, field_path_1.renderFieldPath)(segments));
107
108
  };
108
109
  var includeOperator = function (include) {
109
110
  if (include.type === 'leftNest') {
@@ -146,10 +147,10 @@ var predicateExpr = function (predicate, store, aliases) {
146
147
  var reference = function (value) {
147
148
  if (!value || typeof value.$field !== 'string' || Object.keys(value).length !== 1)
148
149
  throw new Error('Expected explicit joinField reference');
149
- var parts = value.$field.split('.');
150
- if (parts.length < 2 || !aliases.has(parts[0]))
151
- throw new Error("Unknown ON alias: ".concat(parts[0]));
152
- return fieldPath(value.$field);
150
+ var segments = (0, field_path_1.parseFieldPath)(value.$field);
151
+ if (segments.length < 2 || segments[0].selectors.length || !aliases.has(segments[0].name))
152
+ throw new Error("Unknown ON alias: ".concat(segments[0].name));
153
+ return (0, field_path_1.renderFieldPath)(segments);
153
154
  };
154
155
  var right = comparison.right;
155
156
  return "".concat(reference(comparison.left), " ").concat(comparisonOperators[comparison.op], " ").concat(right && typeof right === 'object' && Object.prototype.hasOwnProperty.call(right, '$field')
@@ -1 +1 @@
1
- {"version":3,"file":"include.js","sourceRoot":"","sources":["../../src/model/include.ts"],"names":[],"mappings":"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","sourcesContent":["import {LogicalWhereExpr, SortType} from '../query/interface/query.types';\n\nimport {escapeIdentifier} from './keyspace';\n\nexport type IncludeType = 'join' | 'leftJoin' | 'nest' | 'leftNest';\n\nexport interface IncludeDefinition {\n as: string;\n /** ANSI predicate; mutually exclusive with key/keys. */\n on?: JoinPredicate;\n /** Explicit trusted SQL++ escape hatch. Values still use positional placeholders. */\n onRaw?: {sql: string; values?: readonly unknown[]};\n /** Top-level fields retained from the related document. */\n select?: readonly string[];\n key?: string;\n keys?: string;\n keyspace?: string;\n model?:\n | string\n | {keyspace: () => string; parse?: <T>(data: T) => T; parseProjection?: <T>(data: T) => T};\n type?: IncludeType;\n optional?: boolean;\n}\n\n/** A field operand is explicit; bare strings are always parameter values. */\nexport interface JoinField {\n readonly $field: string;\n}\nexport type JoinPredicate =\n | {$and: readonly JoinPredicate[]}\n | {$or: readonly JoinPredicate[]}\n | {left: JoinField; op: '$eq' | '$neq' | '$gt' | '$gte' | '$lt' | '$lte'; right: unknown};\nexport const joinField = (path: string): JoinField => ({$field: path});\n\nconst identifier = (name: string): string => {\n if (!name || name.indexOf('\\0') !== -1) throw new Error('Empty or invalid identifier');\n return escapeIdentifier(name);\n};\nconst fieldPath = (path: string): string => path.split('.').map(identifier).join('.');\n\nexport interface IncludedSelectionQueryArgs {\n keyspace: string;\n collectionName: string;\n select?: readonly any[] | string;\n where?: LogicalWhereExpr;\n orderBy?: Record<string, SortType>;\n include?: readonly IncludeDefinition[];\n limit?: number;\n page?: number;\n offset?: number;\n sourceAlias?: string;\n}\n\nexport interface IncludedSelectionQuery {\n query: string;\n parameters: Record<string, any>;\n selectAll: boolean;\n resultKey?: string;\n}\n\nconst comparisonOperators: Record<string, string> = {\n $eq: '=',\n $neq: '!=',\n $gt: '>',\n $gte: '>=',\n $lt: '<',\n $lte: '<=',\n};\n\nconst stringComparisonOperators: Record<string, string> = {\n $like: 'LIKE',\n $notLike: 'NOT LIKE',\n};\n\nconst emptyComparisonOperators: Record<string, string> = {\n $isNull: 'IS NULL',\n $isNotNull: 'IS NOT NULL',\n $isMissing: 'IS MISSING',\n $isNotMissing: 'IS NOT MISSING',\n $isValued: 'IS VALUED',\n $isNotValued: 'IS NOT VALUED',\n};\n\nconst multipleComparisonOperators: Record<string, string> = {\n $btw: 'BETWEEN',\n $notBtw: 'NOT BETWEEN',\n};\n\nconst logicalOperators: Record<string, string> = {\n $and: 'AND',\n $or: 'OR',\n};\n\nclass IncludeParameterStore {\n public parameters: Record<string, any> = {};\n private index = 0;\n\n public add(value: any): string {\n const key = `cs_param_${this.index}`;\n this.index += 1;\n this.parameters[key] = value;\n\n return `$${key}`;\n }\n\n public set(key: string, value: any): string {\n this.parameters[key] = value;\n\n return `$${key}`;\n }\n}\n\nconst safeAlias = identifier;\n\nconst safeKeyspace = (target: string): string => {\n // Accept existing model.keyspace() output and simple dotted identifiers, never expressions.\n const token = '(?:`(?:[^`]|``)+`|[A-Za-z_][A-Za-z0-9_-]*)';\n if (!new RegExp(`^(?:default:)?${token}(?:\\\\.${token}){0,2}$`).test(target))\n throw new Error('Invalid include keyspace; use a model or identifier path');\n return target.replace(/[A-Za-z_][A-Za-z0-9_-]*|`(?:[^`]|``)+`/g, (part, offset) =>\n target.slice(offset + part.length, offset + part.length + 1) === ':' || part.startsWith('`')\n ? part\n : identifier(part)\n );\n};\nconst keyspaceFromInclude = (include: IncludeDefinition, defaultKeyspace: string): string => {\n const target =\n include.keyspace ||\n (typeof include.model === 'string' ? include.model : include.model?.keyspace()) ||\n defaultKeyspace;\n return safeKeyspace(target);\n};\n\nconst sourceField = (field: string, sourceAlias: string): string => {\n const prefix = `${sourceAlias}.`;\n return field.indexOf(prefix) === 0\n ? fieldPath(field)\n : `${identifier(sourceAlias)}.${fieldPath(field)}`;\n};\n\nexport const includeOperator = (include: IncludeDefinition): string => {\n if (include.type === 'leftNest') {\n return 'LEFT NEST';\n }\n\n if (include.type === 'nest') {\n return include.optional ? 'LEFT NEST' : 'NEST';\n }\n\n if (include.type === 'leftJoin') {\n return 'LEFT JOIN';\n }\n\n if (include.type === 'join') {\n return include.optional ? 'LEFT JOIN' : 'JOIN';\n }\n\n if (include.keys) {\n return include.optional ? 'LEFT NEST' : 'NEST';\n }\n\n return include.optional ? 'LEFT JOIN' : 'JOIN';\n};\n\nconst predicateExpr = (\n predicate: JoinPredicate,\n store: IncludeParameterStore,\n aliases: Set<string>\n): string => {\n if (!predicate || typeof predicate !== 'object') throw new Error('Invalid ON predicate');\n const keys = Object.keys(predicate);\n if (keys.length === 1 && (keys[0] === '$and' || keys[0] === '$or')) {\n const children = (predicate as any)[keys[0]];\n if (!Array.isArray(children) || !children.length)\n throw new Error('ON logical groups must be nonempty');\n return `(${children\n .map((child) => predicateExpr(child, store, aliases))\n .join(keys[0] === '$and' ? ' AND ' : ' OR ')})`;\n }\n const comparison = predicate as any;\n if (\n keys.length !== 3 ||\n !keys.includes('left') ||\n !keys.includes('right') ||\n !keys.includes('op') ||\n !Object.prototype.hasOwnProperty.call(comparisonOperators, comparison.op)\n )\n throw new Error('Unsupported ON comparison');\n const reference = (value: any): string => {\n if (!value || typeof value.$field !== 'string' || Object.keys(value).length !== 1)\n throw new Error('Expected explicit joinField reference');\n const parts = value.$field.split('.');\n if (parts.length < 2 || !aliases.has(parts[0]))\n throw new Error(`Unknown ON alias: ${parts[0]}`);\n return fieldPath(value.$field);\n };\n const right = comparison.right;\n return `${reference(comparison.left)} ${comparisonOperators[comparison.op]} ${\n right && typeof right === 'object' && Object.prototype.hasOwnProperty.call(right, '$field')\n ? reference(right)\n : store.add(right)\n }`;\n};\n\nexport const buildIncludeClauses = (\n keyspace: string,\n include: readonly IncludeDefinition[] = [],\n sourceAlias = 'doc',\n store = new IncludeParameterStore()\n): string => {\n const aliases = new Set([sourceAlias]);\n const reservedAliases = new Set(['__cs_root', '__proto__', 'constructor', 'prototype']);\n const modes = new Set(include.map((item) => (item.on || item.onRaw ? 'ansi' : 'keys')));\n // Couchbase does not permit mixing lookup and ANSI joins in the same FROM clause.\n if (modes.size > 1) throw new Error('Cannot mix ANSI ON and ON KEYS includes');\n return include\n .map((item) => {\n if (aliases.has(item.as) || reservedAliases.has(item.as))\n throw new Error(`Duplicate or reserved include alias: ${item.as}`);\n aliases.add(item.as);\n if (item.type && !['join', 'leftJoin', 'nest', 'leftNest'].includes(item.type))\n throw new Error('Unsupported include type');\n if (\n [\n item.key !== undefined,\n item.keys !== undefined,\n item.on !== undefined,\n item.onRaw !== undefined,\n ].filter(Boolean).length !== 1\n ) {\n throw new Error(`include ${item.as} requires exactly one of key, keys, on, onRaw`);\n }\n let condition: string;\n if (item.on) condition = `ON ${predicateExpr(item.on, store, aliases)}`;\n else if (item.onRaw) {\n const values = item.onRaw.values || [];\n let index = 0;\n if (!item.onRaw.sql.trim()) throw new Error('onRaw requires SQL');\n const sql = item.onRaw.sql.replace(/\\?/g, () => {\n if (index >= values.length) throw new Error('onRaw placeholder/value mismatch');\n return store.add(values[index++]);\n });\n if (index !== values.length) throw new Error('onRaw placeholder/value mismatch');\n condition = `ON (${sql})`;\n } else\n condition = `ON KEYS ${sourceField(\n (item.key || item.keys) as string,\n sourceAlias\n )}`;\n return `${includeOperator(item)} ${keyspaceFromInclude(item, keyspace)} AS ${safeAlias(\n item.as\n )} ${condition}`;\n })\n .join(' ');\n};\n\nconst hasLogicalOperator = (clause: Record<string, any>): boolean => {\n return Object.keys(clause).some((key) => ['$and', '$or', '$not'].includes(key));\n};\n\nconst buildComparisonExpr = (\n fieldName: string,\n comparison: Record<string, any>,\n store: IncludeParameterStore,\n sourceAlias: string\n): string => {\n const field = sourceField(fieldName, sourceAlias);\n const expr = Object.keys(comparison)\n .map((operator) => {\n if (Object.prototype.hasOwnProperty.call(emptyComparisonOperators, operator)) {\n return `${field} ${emptyComparisonOperators[operator]}`;\n }\n\n if (Object.prototype.hasOwnProperty.call(comparisonOperators, operator)) {\n return `${field}${comparisonOperators[operator]}${store.add(comparison[operator])}`;\n }\n\n if (Object.prototype.hasOwnProperty.call(stringComparisonOperators, operator)) {\n return `${field} ${stringComparisonOperators[operator]} ${store.add(\n comparison[operator]\n )}`;\n }\n\n if (\n Object.prototype.hasOwnProperty.call(multipleComparisonOperators, operator) &&\n Array.isArray(comparison[operator])\n ) {\n const [from, to] = comparison[operator];\n\n return `${field} ${multipleComparisonOperators[operator]} ${store.add(\n from\n )} AND ${store.add(to)}`;\n }\n\n throw new Error(`Unsupported include where operator: ${operator}`);\n })\n .join(' AND ');\n\n return Object.keys(comparison).length > 1 ? `(${expr})` : expr;\n};\n\nconst buildFieldExpr = (\n field: Record<string, any>,\n store: IncludeParameterStore,\n sourceAlias: string\n): string => {\n return Object.keys(field)\n .map((fieldName) => {\n const value = field[fieldName];\n\n if (\n value &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n Object.keys(value).some((operator) => operator.indexOf('$') === 0)\n ) {\n return buildComparisonExpr(fieldName, value, store, sourceAlias);\n }\n\n if (fieldName.indexOf('$') === -1) {\n return `${sourceField(fieldName, sourceAlias)}=${store.add(value)}`;\n }\n\n throw new Error(`Unsupported include where field: ${fieldName}`);\n })\n .join(' AND ');\n};\n\nconst buildWhereClauseExpr = (\n clause: LogicalWhereExpr,\n store: IncludeParameterStore,\n sourceAlias: string\n): string => {\n if (!hasLogicalOperator(clause as Record<string, any>)) {\n return buildFieldExpr(clause as Record<string, any>, store, sourceAlias);\n }\n\n return Object.keys(clause)\n .map((key) => {\n const value = clause[key];\n\n if (\n Array.isArray(value) &&\n Object.prototype.hasOwnProperty.call(logicalOperators, key)\n ) {\n return `(${value\n .map((item) =>\n buildWhereClauseExpr(item as LogicalWhereExpr, store, sourceAlias)\n )\n .join(` ${logicalOperators[key]} `)})`;\n }\n\n if (key === '$not' && Array.isArray(value)) {\n return `NOT (${value\n .map((item) =>\n buildWhereClauseExpr(item as LogicalWhereExpr, store, sourceAlias)\n )\n .join(' AND ')})`;\n }\n\n return buildWhereClauseExpr({[key]: value} as LogicalWhereExpr, store, sourceAlias);\n })\n .join(' AND ');\n};\n\nconst buildWhereExpr = (\n expr: LogicalWhereExpr | undefined,\n store: IncludeParameterStore,\n sourceAlias: string\n): string => {\n return expr ? ` WHERE ${buildWhereClauseExpr(expr, store, sourceAlias)}` : '';\n};\n\nconst buildOrderByExpr = (\n orderBy: Record<string, SortType> | undefined,\n sourceAlias: string\n): string => {\n return orderBy\n ? ` ORDER BY ${Object.keys(orderBy)\n .map((field) => {\n if (!['ASC', 'DESC'].includes(orderBy[field]))\n throw new Error('Unsupported order direction');\n return `${sourceField(field, sourceAlias)} ${orderBy[field]}`;\n })\n .join(',')}`\n : '';\n};\n\nconst selectedObject = (alias: string, fields?: readonly string[]): string => {\n if (!fields) return identifier(alias);\n if (!fields.length || new Set(fields).size !== fields.length)\n throw new Error('Projection must contain distinct fields');\n return `{${fields\n .map((field) => {\n if (field.includes('.'))\n throw new Error('Include projections support top-level fields only');\n return `${JSON.stringify(field)}: ${identifier(alias)}.${identifier(field)}`;\n })\n .join(', ')}}`;\n};\n\nconst buildSelectExpr = (\n select: readonly any[] | string | undefined,\n include: readonly IncludeDefinition[],\n sourceAlias: string\n): {expr: string; selectAll: boolean; resultKey?: string} => {\n const all = !select || select === '*';\n const structured =\n Array.isArray(select) &&\n select.every((field) => typeof field === 'string' && !field.includes('.'));\n const root = all\n ? identifier(sourceAlias)\n : structured\n ? selectedObject(sourceAlias, select as string[])\n : undefined;\n const relations = include.map((item) => {\n const alias = identifier(item.as);\n if (!item.select) return `${alias} AS ${alias}`;\n const object = selectedObject('__cs_item', item.select);\n const expression = includeOperator(item).includes('NEST')\n ? `ARRAY ${object} FOR ${identifier('__cs_item')} IN ${alias} END`\n : `CASE WHEN ${alias} IS MISSING THEN MISSING WHEN ${alias} IS NULL THEN NULL ELSE ${selectedObject(\n item.as,\n item.select\n )} END`;\n return `${expression} AS ${alias}`;\n });\n if (\n structured &&\n (select as string[]).some((field) => include.some((item) => item.as === field))\n )\n throw new Error('Include alias conflicts with projected root field');\n if (root)\n return {\n expr: [`${root} AS __cs_root`, ...relations].join(', '),\n selectAll: all,\n resultKey: '__cs_root',\n };\n throw new Error(\n 'Includes support only * or top-level field-array projections; use queryRows for arbitrary SQL++ projections'\n );\n};\n\nexport const buildIncludedSelectionQuery = (\n args: IncludedSelectionQueryArgs\n): IncludedSelectionQuery => {\n const sourceAlias = args.sourceAlias || 'doc';\n if (sourceAlias === '__cs_root') throw new Error('Reserved source alias');\n const include = args.include || [];\n const store = new IncludeParameterStore();\n const limit = typeof args.limit === 'number' ? args.limit : 10;\n const page = typeof args.page === 'number' ? args.page : 0;\n const offset = typeof args.offset === 'number' ? args.offset : page * limit;\n const {expr, selectAll, resultKey} = buildSelectExpr(args.select, include, sourceAlias);\n const joins = buildIncludeClauses(args.keyspace, include, sourceAlias, store);\n const limitExpr = ` LIMIT ${store.set('cs_limit', limit)} OFFSET ${store.set(\n 'cs_offset',\n offset\n )}`;\n\n return {\n query: `SELECT ${expr} FROM ${args.keyspace} AS ${identifier(\n sourceAlias\n )} ${joins}${buildWhereExpr(args.where, store, sourceAlias)}${buildOrderByExpr(\n args.orderBy,\n sourceAlias\n )}${limitExpr}`,\n parameters: store.parameters,\n resultKey,\n selectAll,\n };\n};\n"]}
1
+ {"version":3,"file":"include.js","sourceRoot":"","sources":["../../src/model/include.ts"],"names":[],"mappings":"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","sourcesContent":["import {LogicalWhereExpr, SortType} from '../query/interface/query.types';\n\nimport {escapeIdentifier} from './keyspace';\nimport {parseFieldPath, renderFieldPath} from './field-path';\n\nexport type IncludeType = 'join' | 'leftJoin' | 'nest' | 'leftNest';\n\nexport interface IncludeDefinition {\n as: string;\n /** ANSI predicate; mutually exclusive with key/keys. */\n on?: JoinPredicate;\n /** Explicit trusted SQL++ escape hatch. Values still use positional placeholders. */\n onRaw?: {sql: string; values?: readonly unknown[]};\n /** Top-level fields retained from the related document. */\n select?: readonly string[];\n key?: string;\n keys?: string;\n keyspace?: string;\n model?:\n | string\n | {keyspace: () => string; parse?: <T>(data: T) => T; parseProjection?: <T>(data: T) => T};\n type?: IncludeType;\n optional?: boolean;\n}\n\n/** A field operand is explicit; bare strings are always parameter values. */\nexport interface JoinField {\n readonly $field: string;\n}\nexport type JoinPredicate =\n | {$and: readonly JoinPredicate[]}\n | {$or: readonly JoinPredicate[]}\n | {left: JoinField; op: '$eq' | '$neq' | '$gt' | '$gte' | '$lt' | '$lte'; right: unknown};\nexport const joinField = (path: string): JoinField => ({$field: path});\n\nconst identifier = (name: string): string => {\n if (!name || name.indexOf('\\0') !== -1) throw new Error('Empty or invalid identifier');\n return escapeIdentifier(name);\n};\n\nexport interface IncludedSelectionQueryArgs {\n keyspace: string;\n collectionName: string;\n select?: readonly any[] | string;\n where?: LogicalWhereExpr;\n orderBy?: Record<string, SortType>;\n include?: readonly IncludeDefinition[];\n limit?: number;\n page?: number;\n offset?: number;\n sourceAlias?: string;\n}\n\nexport interface IncludedSelectionQuery {\n query: string;\n parameters: Record<string, any>;\n selectAll: boolean;\n resultKey?: string;\n}\n\nconst comparisonOperators: Record<string, string> = {\n $eq: '=',\n $neq: '!=',\n $gt: '>',\n $gte: '>=',\n $lt: '<',\n $lte: '<=',\n};\n\nconst stringComparisonOperators: Record<string, string> = {\n $like: 'LIKE',\n $notLike: 'NOT LIKE',\n};\n\nconst emptyComparisonOperators: Record<string, string> = {\n $isNull: 'IS NULL',\n $isNotNull: 'IS NOT NULL',\n $isMissing: 'IS MISSING',\n $isNotMissing: 'IS NOT MISSING',\n $isValued: 'IS VALUED',\n $isNotValued: 'IS NOT VALUED',\n};\n\nconst multipleComparisonOperators: Record<string, string> = {\n $btw: 'BETWEEN',\n $notBtw: 'NOT BETWEEN',\n};\n\nconst logicalOperators: Record<string, string> = {\n $and: 'AND',\n $or: 'OR',\n};\n\nclass IncludeParameterStore {\n public parameters: Record<string, any> = {};\n private index = 0;\n\n public add(value: any): string {\n const key = `cs_param_${this.index}`;\n this.index += 1;\n this.parameters[key] = value;\n\n return `$${key}`;\n }\n\n public set(key: string, value: any): string {\n this.parameters[key] = value;\n\n return `$${key}`;\n }\n}\n\nconst safeAlias = identifier;\n\nconst safeKeyspace = (target: string): string => {\n // Accept existing model.keyspace() output and simple dotted identifiers, never expressions.\n const token = '(?:`(?:[^`]|``)+`|[A-Za-z_][A-Za-z0-9_-]*)';\n if (!new RegExp(`^(?:default:)?${token}(?:\\\\.${token}){0,2}$`).test(target))\n throw new Error('Invalid include keyspace; use a model or identifier path');\n return target.replace(/[A-Za-z_][A-Za-z0-9_-]*|`(?:[^`]|``)+`/g, (part, offset) =>\n target.slice(offset + part.length, offset + part.length + 1) === ':' || part.startsWith('`')\n ? part\n : identifier(part)\n );\n};\nconst keyspaceFromInclude = (include: IncludeDefinition, defaultKeyspace: string): string => {\n const target =\n include.keyspace ||\n (typeof include.model === 'string' ? include.model : include.model?.keyspace()) ||\n defaultKeyspace;\n return safeKeyspace(target);\n};\n\nconst sourceField = (field: string, sourceAlias: string): string => {\n const segments = parseFieldPath(field);\n const qualified =\n segments.length > 1 && segments[0].name === sourceAlias && !segments[0].selectors.length;\n return qualified\n ? renderFieldPath(segments)\n : `${identifier(sourceAlias)}.${renderFieldPath(segments)}`;\n};\n\nexport const includeOperator = (include: IncludeDefinition): string => {\n if (include.type === 'leftNest') {\n return 'LEFT NEST';\n }\n\n if (include.type === 'nest') {\n return include.optional ? 'LEFT NEST' : 'NEST';\n }\n\n if (include.type === 'leftJoin') {\n return 'LEFT JOIN';\n }\n\n if (include.type === 'join') {\n return include.optional ? 'LEFT JOIN' : 'JOIN';\n }\n\n if (include.keys) {\n return include.optional ? 'LEFT NEST' : 'NEST';\n }\n\n return include.optional ? 'LEFT JOIN' : 'JOIN';\n};\n\nconst predicateExpr = (\n predicate: JoinPredicate,\n store: IncludeParameterStore,\n aliases: Set<string>\n): string => {\n if (!predicate || typeof predicate !== 'object') throw new Error('Invalid ON predicate');\n const keys = Object.keys(predicate);\n if (keys.length === 1 && (keys[0] === '$and' || keys[0] === '$or')) {\n const children = (predicate as any)[keys[0]];\n if (!Array.isArray(children) || !children.length)\n throw new Error('ON logical groups must be nonempty');\n return `(${children\n .map((child) => predicateExpr(child, store, aliases))\n .join(keys[0] === '$and' ? ' AND ' : ' OR ')})`;\n }\n const comparison = predicate as any;\n if (\n keys.length !== 3 ||\n !keys.includes('left') ||\n !keys.includes('right') ||\n !keys.includes('op') ||\n !Object.prototype.hasOwnProperty.call(comparisonOperators, comparison.op)\n )\n throw new Error('Unsupported ON comparison');\n const reference = (value: any): string => {\n if (!value || typeof value.$field !== 'string' || Object.keys(value).length !== 1)\n throw new Error('Expected explicit joinField reference');\n const segments = parseFieldPath(value.$field);\n if (segments.length < 2 || segments[0].selectors.length || !aliases.has(segments[0].name))\n throw new Error(`Unknown ON alias: ${segments[0].name}`);\n return renderFieldPath(segments);\n };\n const right = comparison.right;\n return `${reference(comparison.left)} ${comparisonOperators[comparison.op]} ${\n right && typeof right === 'object' && Object.prototype.hasOwnProperty.call(right, '$field')\n ? reference(right)\n : store.add(right)\n }`;\n};\n\nexport const buildIncludeClauses = (\n keyspace: string,\n include: readonly IncludeDefinition[] = [],\n sourceAlias = 'doc',\n store = new IncludeParameterStore()\n): string => {\n const aliases = new Set([sourceAlias]);\n const reservedAliases = new Set(['__cs_root', '__proto__', 'constructor', 'prototype']);\n const modes = new Set(include.map((item) => (item.on || item.onRaw ? 'ansi' : 'keys')));\n // Couchbase does not permit mixing lookup and ANSI joins in the same FROM clause.\n if (modes.size > 1) throw new Error('Cannot mix ANSI ON and ON KEYS includes');\n return include\n .map((item) => {\n if (aliases.has(item.as) || reservedAliases.has(item.as))\n throw new Error(`Duplicate or reserved include alias: ${item.as}`);\n aliases.add(item.as);\n if (item.type && !['join', 'leftJoin', 'nest', 'leftNest'].includes(item.type))\n throw new Error('Unsupported include type');\n if (\n [\n item.key !== undefined,\n item.keys !== undefined,\n item.on !== undefined,\n item.onRaw !== undefined,\n ].filter(Boolean).length !== 1\n ) {\n throw new Error(`include ${item.as} requires exactly one of key, keys, on, onRaw`);\n }\n let condition: string;\n if (item.on) condition = `ON ${predicateExpr(item.on, store, aliases)}`;\n else if (item.onRaw) {\n const values = item.onRaw.values || [];\n let index = 0;\n if (!item.onRaw.sql.trim()) throw new Error('onRaw requires SQL');\n const sql = item.onRaw.sql.replace(/\\?/g, () => {\n if (index >= values.length) throw new Error('onRaw placeholder/value mismatch');\n return store.add(values[index++]);\n });\n if (index !== values.length) throw new Error('onRaw placeholder/value mismatch');\n condition = `ON (${sql})`;\n } else\n condition = `ON KEYS ${sourceField(\n (item.key || item.keys) as string,\n sourceAlias\n )}`;\n return `${includeOperator(item)} ${keyspaceFromInclude(item, keyspace)} AS ${safeAlias(\n item.as\n )} ${condition}`;\n })\n .join(' ');\n};\n\nconst hasLogicalOperator = (clause: Record<string, any>): boolean => {\n return Object.keys(clause).some((key) => ['$and', '$or', '$not'].includes(key));\n};\n\nconst buildComparisonExpr = (\n fieldName: string,\n comparison: Record<string, any>,\n store: IncludeParameterStore,\n sourceAlias: string\n): string => {\n const field = sourceField(fieldName, sourceAlias);\n const expr = Object.keys(comparison)\n .map((operator) => {\n if (Object.prototype.hasOwnProperty.call(emptyComparisonOperators, operator)) {\n return `${field} ${emptyComparisonOperators[operator]}`;\n }\n\n if (Object.prototype.hasOwnProperty.call(comparisonOperators, operator)) {\n return `${field}${comparisonOperators[operator]}${store.add(comparison[operator])}`;\n }\n\n if (Object.prototype.hasOwnProperty.call(stringComparisonOperators, operator)) {\n return `${field} ${stringComparisonOperators[operator]} ${store.add(\n comparison[operator]\n )}`;\n }\n\n if (\n Object.prototype.hasOwnProperty.call(multipleComparisonOperators, operator) &&\n Array.isArray(comparison[operator])\n ) {\n const [from, to] = comparison[operator];\n\n return `${field} ${multipleComparisonOperators[operator]} ${store.add(\n from\n )} AND ${store.add(to)}`;\n }\n\n throw new Error(`Unsupported include where operator: ${operator}`);\n })\n .join(' AND ');\n\n return Object.keys(comparison).length > 1 ? `(${expr})` : expr;\n};\n\nconst buildFieldExpr = (\n field: Record<string, any>,\n store: IncludeParameterStore,\n sourceAlias: string\n): string => {\n return Object.keys(field)\n .map((fieldName) => {\n const value = field[fieldName];\n\n if (\n value &&\n typeof value === 'object' &&\n !Array.isArray(value) &&\n Object.keys(value).some((operator) => operator.indexOf('$') === 0)\n ) {\n return buildComparisonExpr(fieldName, value, store, sourceAlias);\n }\n\n if (fieldName.indexOf('$') === -1) {\n return `${sourceField(fieldName, sourceAlias)}=${store.add(value)}`;\n }\n\n throw new Error(`Unsupported include where field: ${fieldName}`);\n })\n .join(' AND ');\n};\n\nconst buildWhereClauseExpr = (\n clause: LogicalWhereExpr,\n store: IncludeParameterStore,\n sourceAlias: string\n): string => {\n if (!hasLogicalOperator(clause as Record<string, any>)) {\n return buildFieldExpr(clause as Record<string, any>, store, sourceAlias);\n }\n\n return Object.keys(clause)\n .map((key) => {\n const value = clause[key];\n\n if (\n Array.isArray(value) &&\n Object.prototype.hasOwnProperty.call(logicalOperators, key)\n ) {\n return `(${value\n .map((item) =>\n buildWhereClauseExpr(item as LogicalWhereExpr, store, sourceAlias)\n )\n .join(` ${logicalOperators[key]} `)})`;\n }\n\n if (key === '$not' && Array.isArray(value)) {\n return `NOT (${value\n .map((item) =>\n buildWhereClauseExpr(item as LogicalWhereExpr, store, sourceAlias)\n )\n .join(' AND ')})`;\n }\n\n return buildWhereClauseExpr({[key]: value} as LogicalWhereExpr, store, sourceAlias);\n })\n .join(' AND ');\n};\n\nconst buildWhereExpr = (\n expr: LogicalWhereExpr | undefined,\n store: IncludeParameterStore,\n sourceAlias: string\n): string => {\n return expr ? ` WHERE ${buildWhereClauseExpr(expr, store, sourceAlias)}` : '';\n};\n\nconst buildOrderByExpr = (\n orderBy: Record<string, SortType> | undefined,\n sourceAlias: string\n): string => {\n return orderBy\n ? ` ORDER BY ${Object.keys(orderBy)\n .map((field) => {\n if (!['ASC', 'DESC'].includes(orderBy[field]))\n throw new Error('Unsupported order direction');\n return `${sourceField(field, sourceAlias)} ${orderBy[field]}`;\n })\n .join(',')}`\n : '';\n};\n\nconst selectedObject = (alias: string, fields?: readonly string[]): string => {\n if (!fields) return identifier(alias);\n if (!fields.length || new Set(fields).size !== fields.length)\n throw new Error('Projection must contain distinct fields');\n return `{${fields\n .map((field) => {\n if (field.includes('.'))\n throw new Error('Include projections support top-level fields only');\n return `${JSON.stringify(field)}: ${identifier(alias)}.${identifier(field)}`;\n })\n .join(', ')}}`;\n};\n\nconst buildSelectExpr = (\n select: readonly any[] | string | undefined,\n include: readonly IncludeDefinition[],\n sourceAlias: string\n): {expr: string; selectAll: boolean; resultKey?: string} => {\n const all = !select || select === '*';\n const structured =\n Array.isArray(select) &&\n select.every((field) => typeof field === 'string' && !field.includes('.'));\n const root = all\n ? identifier(sourceAlias)\n : structured\n ? selectedObject(sourceAlias, select as string[])\n : undefined;\n const relations = include.map((item) => {\n const alias = identifier(item.as);\n if (!item.select) return `${alias} AS ${alias}`;\n const object = selectedObject('__cs_item', item.select);\n const expression = includeOperator(item).includes('NEST')\n ? `ARRAY ${object} FOR ${identifier('__cs_item')} IN ${alias} END`\n : `CASE WHEN ${alias} IS MISSING THEN MISSING WHEN ${alias} IS NULL THEN NULL ELSE ${selectedObject(\n item.as,\n item.select\n )} END`;\n return `${expression} AS ${alias}`;\n });\n if (\n structured &&\n (select as string[]).some((field) => include.some((item) => item.as === field))\n )\n throw new Error('Include alias conflicts with projected root field');\n if (root)\n return {\n expr: [`${root} AS __cs_root`, ...relations].join(', '),\n selectAll: all,\n resultKey: '__cs_root',\n };\n throw new Error(\n 'Includes support only * or top-level field-array projections; use queryRows for arbitrary SQL++ projections'\n );\n};\n\nexport const buildIncludedSelectionQuery = (\n args: IncludedSelectionQueryArgs\n): IncludedSelectionQuery => {\n const sourceAlias = args.sourceAlias || 'doc';\n if (sourceAlias === '__cs_root') throw new Error('Reserved source alias');\n const include = args.include || [];\n const store = new IncludeParameterStore();\n const limit = typeof args.limit === 'number' ? args.limit : 10;\n const page = typeof args.page === 'number' ? args.page : 0;\n const offset = typeof args.offset === 'number' ? args.offset : page * limit;\n const {expr, selectAll, resultKey} = buildSelectExpr(args.select, include, sourceAlias);\n const joins = buildIncludeClauses(args.keyspace, include, sourceAlias, store);\n const limitExpr = ` LIMIT ${store.set('cs_limit', limit)} OFFSET ${store.set(\n 'cs_offset',\n offset\n )}`;\n\n return {\n query: `SELECT ${expr} FROM ${args.keyspace} AS ${identifier(\n sourceAlias\n )} ${joins}${buildWhereExpr(args.where, store, sourceAlias)}${buildOrderByExpr(\n args.orderBy,\n sourceAlias\n )}${limitExpr}`,\n parameters: store.parameters,\n resultKey,\n selectAll,\n };\n};\n"]}
@@ -46,9 +46,17 @@ result.items[0]?.creator?.birthday; // Date | undefined
46
46
  A `joinField('alias.path')` is a field reference; an ordinary string on the
47
47
  right is always a bound value, even when it contains a dot. Aliases must refer
48
48
  to the root (default `doc`), the current include, or an earlier include. Field
49
- paths use dots as separators and quote every identifier segment. Alias strings
50
- are quoted, including reserved words. A literal dot inside a field name is not
51
- supported by the structured field-reference syntax.
49
+ paths use dots as separators and quote every identifier segment. Nonnegative
50
+ integer indexes (`[0]`, `[1]`) and wildcard traversal (`[*]`) remain SQL++ array
51
+ operators. This parsing applies to `key`/`keys`, joined WHERE/orderBy fields,
52
+ and `joinField` references, including source-qualified paths. Alias strings
53
+ are quoted, including reserved words. Backtick-delimited segments represent
54
+ literal field names; double a backtick inside such a segment to escape it.
55
+ For example, the path string '`media[*]`' names a literal field, while
56
+ 'media[*].mediaId' traverses the media array. Empty segments, unmatched brackets,
57
+ negative/decimal indexes, slices, expression indexes, and unsafe-size indexes
58
+ are rejected. Top-level projection arrays remain literal field selections;
59
+ this change does not add array-expression projections or a fluent path builder.
52
60
 
53
61
  Comparisons support `$eq`, `$neq`, `$gt`, `$gte`, `$lt`, and `$lte`. Nest nonempty
54
62
  `$and` and `$or` arrays to combine predicates:
@@ -226,3 +234,33 @@ type fixture; the corrected live run passed all 20 probes. These observations
226
234
  validate this local server and synthetic workload; they do not establish a
227
235
  concurrent multi-document snapshot, a production index plan, or compatibility
228
236
  with every supported server version.
237
+
238
+
239
+ ### Array-path compatibility regression
240
+
241
+ The include identifier-quoting change initially quoted `media[*]` and
242
+ `participantIds[0]` as whole field names. The validated path parser restores
243
+ array traversal without interpolating SQL expressions or changing value binding:
244
+
245
+ ```ts
246
+ const results = await battles.findMany({
247
+ where: {'participantIds[0]': 'profile::demo'},
248
+ include: [{
249
+ as: 'mediaDocuments',
250
+ model: mediaModel,
251
+ keys: 'media[*].mediaId',
252
+ type: 'leftNest',
253
+ }],
254
+ });
255
+ // ON KEYS `doc`.`media`[*].`mediaId`
256
+ // Root _type filter plus `doc`.`participantIds`[0]=$cs_param_1
257
+ ```
258
+
259
+ For an opt-in regression probe, run `npm run build` then
260
+ `node scripts/live-array-path-probe.cjs`. It reads `.env`, requires a loopback
261
+ server, creates a uniquely named scope and indexes, and removes that scope in
262
+ `finally`. It writes a sanitized JSON report to the OS temporary directory.
263
+ Eight probes passed locally on Query 8.0.3 on 2026-09-05, verifying media
264
+ hydration/codecs, `[0]` and `[1]` filters, nested wildcard paths, aliases, sort
265
+ expressions, ANSI references, literal bracket-containing fields, and LEFT NEST
266
+ pagination. Nested result assertions compare membership, not source-key order.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "couchset",
3
- "version": "0.5.1",
3
+ "version": "0.5.2",
4
4
  "description": "Couchbase ORM",
5
5
  "private": false,
6
6
  "main": "dist/legacy/index.js",