You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
114 lines
3.7 KiB
114 lines
3.7 KiB
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
const adminjs_1 = require("adminjs");
|
|
const ID_PROPERTY = '_id';
|
|
const VERSION_KEY_PROPERTY = '__v';
|
|
class Property extends adminjs_1.BaseProperty {
|
|
/**
|
|
* Crates an object from mongoose schema path
|
|
*
|
|
* @param {SchemaString} path
|
|
* @param {String[]} path.enumValues
|
|
* @param {String} path.regExp
|
|
* @param {String} path.path
|
|
* @param {String} path.instance
|
|
* @param {Object[]} path.validators
|
|
* @param {Object[]} path.setters
|
|
* @param {Object[]} path.getters
|
|
* @param {Object} path.options
|
|
* @param {Object} path._index
|
|
* @param {number} position
|
|
*
|
|
* @private
|
|
*
|
|
* @example
|
|
*
|
|
* const schema = new mongoose.Schema({
|
|
* email: String,
|
|
* })
|
|
*
|
|
* property = new Property(schema.paths.email))
|
|
*/
|
|
constructor(path, position = 0) {
|
|
super({ path: path.path, position });
|
|
this.mongoosePath = path;
|
|
}
|
|
instanceToType(mongooseInstance) {
|
|
switch (mongooseInstance) {
|
|
case 'String':
|
|
return 'string';
|
|
case 'Boolean':
|
|
return 'boolean';
|
|
case 'Number':
|
|
return 'number';
|
|
case 'Date':
|
|
return 'datetime';
|
|
case 'Embedded':
|
|
return 'mixed';
|
|
case 'ObjectID':
|
|
if (this.reference()) {
|
|
return 'reference';
|
|
}
|
|
return 'id';
|
|
case 'Decimal128':
|
|
return 'float';
|
|
default:
|
|
return 'string';
|
|
}
|
|
}
|
|
name() {
|
|
return this.mongoosePath.path;
|
|
}
|
|
isEditable() {
|
|
return this.name() !== VERSION_KEY_PROPERTY && this.name() !== ID_PROPERTY;
|
|
}
|
|
reference() {
|
|
var _a, _b;
|
|
const ref = this.isArray()
|
|
? (_a = this.mongoosePath.caster.options) === null || _a === void 0 ? void 0 : _a.ref : (_b = this.mongoosePath.options) === null || _b === void 0 ? void 0 : _b.ref;
|
|
if (typeof ref === 'function')
|
|
return ref.modelName;
|
|
return ref;
|
|
}
|
|
isVisible() {
|
|
return this.name() !== VERSION_KEY_PROPERTY;
|
|
}
|
|
isId() {
|
|
return this.name() === ID_PROPERTY;
|
|
}
|
|
availableValues() {
|
|
var _a;
|
|
return ((_a = this.mongoosePath.enumValues) === null || _a === void 0 ? void 0 : _a.length) ? this.mongoosePath.enumValues : null;
|
|
}
|
|
isArray() {
|
|
return this.mongoosePath.instance === 'Array';
|
|
}
|
|
subProperties() {
|
|
if (this.type() === 'mixed') {
|
|
const subPaths = Object.values(this.mongoosePath.caster.schema.paths);
|
|
return subPaths.map(p => new Property(p));
|
|
}
|
|
return [];
|
|
}
|
|
type() {
|
|
if (this.isArray()) {
|
|
let { instance } = this.mongoosePath.caster;
|
|
// For array of embedded schemas mongoose returns null for caster.instance
|
|
// That is why we have to check if caster has a schema
|
|
if (!instance && this.mongoosePath.caster.schema) {
|
|
instance = 'Embedded';
|
|
}
|
|
return this.instanceToType(instance);
|
|
}
|
|
return this.instanceToType(this.mongoosePath.instance);
|
|
}
|
|
isSortable() {
|
|
return this.type() !== 'mixed' && !this.isArray();
|
|
}
|
|
isRequired() {
|
|
var _a, _b;
|
|
return !!((_b = (_a = this.mongoosePath.validators) === null || _a === void 0 ? void 0 : _a.find) === null || _b === void 0 ? void 0 : _b.call(_a, validator => validator.type === 'required'));
|
|
}
|
|
}
|
|
exports.default = Property;
|
|
//# sourceMappingURL=property.js.map
|