@zargu/couchdb-designer
Version:
Create and testing couchdb design document form directory structure.
141 lines (114 loc) • 2.79 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
const byArray = (a, b) => {
let index = 0;
let relation = 0; //joker(a[index],b[index]);
while (relation === 0 && a.length > index && b.length > index) {
relation = compareAny(a[index], b[index]);
index++;
}
if (relation === 0) {
return a.length - b.length;
} else {
return relation;
}
};
const byObject = (a, b) => {
let index = 0;
let aKeys = Object.keys(a);
let bKeys = Object.keys(b);
let keyRelation = 0;
let valueRelation = 0;
while (keyRelation === 0 && valueRelation === 0 && aKeys.length > index && bKeys.length > index) {
keyRelation = compareAny(aKeys[index], bKeys[index]);
valueRelation = compareAny(a[aKeys[index]], b[bKeys[index]]);
index++;
}
if (keyRelation === 0 && valueRelation === 0) {
return aKeys.length - bKeys.length;
} else {
if (keyRelation === 0) {
return valueRelation;
} else {
return keyRelation;
}
}
};
const compareAny = (a, b) => {
let aType = a === null ? 'null' : Array.isArray(a) ? 'array' : typeof a;
let bType = b === null ? 'null' : Array.isArray(b) ? 'array' : typeof b;
let sortType = aType + bType;
switch (sortType) {
case 'nullnull':
return 0;
case 'nullboolean':
case 'nullnumber':
case 'nullstring':
case 'nullarray':
case 'nullobject':
return -1;
case 'booleannull':
return 1;
case 'booleanboolean':
if (a === b) {
return 0;
} else if (a) {
return 1;
} else {
return -1;
}
case 'booleannumber':
case 'booleanstring':
case 'booleanarray':
case 'booleanobject':
return -1;
case 'numbernull':
case 'numberboolean':
return 1;
case 'numbernumber':
return a - b;
case 'numberstring':
case 'numberarray':
case 'numberobject':
return -1;
case 'stringnull':
case 'stringboolean':
case 'stringnumber':
return 1;
case 'stringstring':
if (a === b) {
return 0;
}
if (a > b) {
return 1;
} else {
return -1;
}
case 'stringarray':
case 'stringobject':
return -1;
case 'arraynull':
case 'arrayboolean':
case 'arraynumber':
case 'arraystring':
return 1;
case 'arrayarray':
return byArray(a, b);
case 'arrayobject':
return -1;
case 'objectnull':
case 'objectboolean':
case 'objectnumber':
case 'objectstring':
case 'objectarray':
return 1;
case 'objectobject':
return byObject(a, b);
}
};
const viewSort = (a, b) => compareAny(a.key, b.key);
var _default = compareAny;
exports.default = _default;