You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
2.7 KiB
JavaScript
97 lines
2.7 KiB
JavaScript
11 months ago
|
"use strict";
|
||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||
|
exports.formatSort = void 0;
|
||
|
const error_1 = require("./error");
|
||
|
/** @internal */
|
||
|
function prepareDirection(direction = 1) {
|
||
|
const value = `${direction}`.toLowerCase();
|
||
|
if (isMeta(direction))
|
||
|
return direction;
|
||
|
switch (value) {
|
||
|
case 'ascending':
|
||
|
case 'asc':
|
||
|
case '1':
|
||
|
return 1;
|
||
|
case 'descending':
|
||
|
case 'desc':
|
||
|
case '-1':
|
||
|
return -1;
|
||
|
default:
|
||
|
throw new error_1.MongoInvalidArgumentError(`Invalid sort direction: ${JSON.stringify(direction)}`);
|
||
|
}
|
||
|
}
|
||
|
/** @internal */
|
||
|
function isMeta(t) {
|
||
|
return typeof t === 'object' && t != null && '$meta' in t && typeof t.$meta === 'string';
|
||
|
}
|
||
|
/** @internal */
|
||
|
function isPair(t) {
|
||
|
if (Array.isArray(t) && t.length === 2) {
|
||
|
try {
|
||
|
prepareDirection(t[1]);
|
||
|
return true;
|
||
|
}
|
||
|
catch (e) {
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
function isDeep(t) {
|
||
|
return Array.isArray(t) && Array.isArray(t[0]);
|
||
|
}
|
||
|
function isMap(t) {
|
||
|
return t instanceof Map && t.size > 0;
|
||
|
}
|
||
|
/** @internal */
|
||
|
function pairToMap(v) {
|
||
|
return new Map([[`${v[0]}`, prepareDirection([v[1]])]]);
|
||
|
}
|
||
|
/** @internal */
|
||
|
function deepToMap(t) {
|
||
|
const sortEntries = t.map(([k, v]) => [`${k}`, prepareDirection(v)]);
|
||
|
return new Map(sortEntries);
|
||
|
}
|
||
|
/** @internal */
|
||
|
function stringsToMap(t) {
|
||
|
const sortEntries = t.map(key => [`${key}`, 1]);
|
||
|
return new Map(sortEntries);
|
||
|
}
|
||
|
/** @internal */
|
||
|
function objectToMap(t) {
|
||
|
const sortEntries = Object.entries(t).map(([k, v]) => [
|
||
|
`${k}`,
|
||
|
prepareDirection(v)
|
||
|
]);
|
||
|
return new Map(sortEntries);
|
||
|
}
|
||
|
/** @internal */
|
||
|
function mapToMap(t) {
|
||
|
const sortEntries = Array.from(t).map(([k, v]) => [
|
||
|
`${k}`,
|
||
|
prepareDirection(v)
|
||
|
]);
|
||
|
return new Map(sortEntries);
|
||
|
}
|
||
|
/** converts a Sort type into a type that is valid for the server (SortForCmd) */
|
||
|
function formatSort(sort, direction) {
|
||
|
if (sort == null)
|
||
|
return undefined;
|
||
|
if (typeof sort === 'string')
|
||
|
return new Map([[sort, prepareDirection(direction)]]);
|
||
|
if (typeof sort !== 'object') {
|
||
|
throw new error_1.MongoInvalidArgumentError(`Invalid sort format: ${JSON.stringify(sort)} Sort must be a valid object`);
|
||
|
}
|
||
|
if (!Array.isArray(sort)) {
|
||
|
return isMap(sort) ? mapToMap(sort) : Object.keys(sort).length ? objectToMap(sort) : undefined;
|
||
|
}
|
||
|
if (!sort.length)
|
||
|
return undefined;
|
||
|
if (isDeep(sort))
|
||
|
return deepToMap(sort);
|
||
|
if (isPair(sort))
|
||
|
return pairToMap(sort);
|
||
|
return stringsToMap(sort);
|
||
|
}
|
||
|
exports.formatSort = formatSort;
|
||
|
//# sourceMappingURL=sort.js.map
|