in packages/database/src/api/Reference_impl.ts [171:231]
function validateQueryEndpoints(params: QueryParams) {
let startNode = null;
let endNode = null;
if (params.hasStart()) {
startNode = params.getIndexStartValue();
}
if (params.hasEnd()) {
endNode = params.getIndexEndValue();
}
if (params.getIndex() === KEY_INDEX) {
const tooManyArgsError =
'Query: When ordering by key, you may only pass one argument to ' +
'startAt(), endAt(), or equalTo().';
const wrongArgTypeError =
'Query: When ordering by key, the argument passed to startAt(), startAfter(), ' +
'endAt(), endBefore(), or equalTo() must be a string.';
if (params.hasStart()) {
const startName = params.getIndexStartName();
if (startName !== MIN_NAME) {
throw new Error(tooManyArgsError);
} else if (typeof startNode !== 'string') {
throw new Error(wrongArgTypeError);
}
}
if (params.hasEnd()) {
const endName = params.getIndexEndName();
if (endName !== MAX_NAME) {
throw new Error(tooManyArgsError);
} else if (typeof endNode !== 'string') {
throw new Error(wrongArgTypeError);
}
}
} else if (params.getIndex() === PRIORITY_INDEX) {
if (
(startNode != null && !isValidPriority(startNode)) ||
(endNode != null && !isValidPriority(endNode))
) {
throw new Error(
'Query: When ordering by priority, the first argument passed to startAt(), ' +
'startAfter() endAt(), endBefore(), or equalTo() must be a valid priority value ' +
'(null, a number, or a string).'
);
}
} else {
assert(
params.getIndex() instanceof PathIndex ||
params.getIndex() === VALUE_INDEX,
'unknown index type.'
);
if (
(startNode != null && typeof startNode === 'object') ||
(endNode != null && typeof endNode === 'object')
) {
throw new Error(
'Query: First argument passed to startAt(), startAfter(), endAt(), endBefore(), or ' +
'equalTo() cannot be an object.'
);
}
}
}