@opra/sqb
Version:
Opra SQB adapter package
91 lines (90 loc) • 4.09 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const common_1 = require("@opra/common");
const connect_1 = require("@sqb/connect");
var DataTypeFactory = common_1.classes.DataTypeFactory;
const _prepareComplexTypeArgs = DataTypeFactory
._prepareComplexTypeArgs;
DataTypeFactory._prepareComplexTypeArgs = async function (context, owner, initArgs, metadata) {
let sqbMeta;
if (initArgs.ctor &&
metadata.fields &&
(sqbMeta = connect_1.EntityMetadata.get(initArgs.ctor))) {
metadata = (0, common_1.cloneObject)(metadata);
for (const [fieldName, fieldSchema] of Object.entries(metadata.fields)) {
const sqbField = sqbMeta && connect_1.EntityMetadata.getField(sqbMeta, fieldName);
if (!sqbField)
continue;
/** Copy type information from sqb metadata to opra */
if (!fieldSchema.type || fieldSchema.type === Object) {
if ((0, connect_1.isAssociationField)(sqbField)) {
if (!fieldSchema.type) {
const trg = await sqbField.association.resolveTarget();
if (trg?.ctor)
fieldSchema.type = trg.ctor;
}
}
else if ((0, connect_1.isColumnField)(sqbField)) {
fieldSchema.type = sqbField.enum || sqbField.type;
}
}
if ((0, connect_1.isColumnField)(sqbField)) {
const hasNoType = !fieldSchema.type || fieldSchema.type === Object;
switch (sqbField.dataType) {
case connect_1.DataType.INTEGER:
case connect_1.DataType.SMALLINT:
if (hasNoType || fieldSchema.type === Number)
fieldSchema.type = 'integer';
break;
case connect_1.DataType.GUID:
if (hasNoType || fieldSchema.type === String)
fieldSchema.type = 'uuid';
break;
case connect_1.DataType.DATE:
if (hasNoType ||
fieldSchema.type === String ||
fieldSchema.type === Date) {
fieldSchema.type = 'date';
}
break;
case connect_1.DataType.TIMESTAMP:
if (hasNoType ||
fieldSchema.type === String ||
fieldSchema.type === Date) {
fieldSchema.type = 'datetime';
}
break;
case connect_1.DataType.TIMESTAMPTZ:
if (hasNoType ||
fieldSchema.type === String ||
fieldSchema.type === Date) {
fieldSchema.type = 'datetimetz';
}
break;
case connect_1.DataType.TIME:
if (hasNoType || fieldSchema.type === String)
fieldSchema.type = 'time';
break;
default:
break;
}
}
if ((0, connect_1.isAssociationField)(sqbField)) {
if (sqbField.association.returnsMany())
fieldSchema.isArray = true;
if (!Object.prototype.hasOwnProperty.call(fieldSchema, 'exclusive'))
fieldSchema.exclusive = true;
}
if (!Object.prototype.hasOwnProperty.call(fieldSchema, 'exclusive') &&
Object.prototype.hasOwnProperty.call(sqbField, 'exclusive')) {
fieldSchema.exclusive = sqbField.exclusive;
}
}
}
return _prepareComplexTypeArgs.apply(DataTypeFactory, [
context,
owner,
initArgs,
metadata,
]);
};