UNPKG

@opra/sqb

Version:

Opra SQB adapter package

89 lines (88 loc) 3.98 kB
import { classes, cloneObject, ComplexType, DocumentElement, OpraSchema, } from '@opra/common'; import { DataType as SqbDataType, EntityMetadata, isAssociationField, isColumnField, } from '@sqb/connect'; var DataTypeFactory = classes.DataTypeFactory; const _prepareComplexTypeArgs = DataTypeFactory ._prepareComplexTypeArgs; DataTypeFactory._prepareComplexTypeArgs = async function (context, owner, initArgs, metadata) { let sqbMeta; if (initArgs.ctor && metadata.fields && (sqbMeta = EntityMetadata.get(initArgs.ctor))) { metadata = cloneObject(metadata); for (const [fieldName, fieldSchema] of Object.entries(metadata.fields)) { const sqbField = sqbMeta && EntityMetadata.getField(sqbMeta, fieldName); if (!sqbField) continue; /* Copy type information from sqb metadata to opra */ if (!fieldSchema.type || fieldSchema.type === Object) { if (isAssociationField(sqbField)) { if (!fieldSchema.type) { const trg = await sqbField.association.resolveTarget(); if (trg?.ctor) fieldSchema.type = trg.ctor; } } else if (isColumnField(sqbField)) { fieldSchema.type = sqbField.enum || sqbField.type; } } if (isColumnField(sqbField)) { const hasNoType = !fieldSchema.type || fieldSchema.type === Object; switch (sqbField.dataType) { case SqbDataType.INTEGER: case SqbDataType.SMALLINT: if (hasNoType || fieldSchema.type === Number) fieldSchema.type = 'integer'; break; case SqbDataType.GUID: if (hasNoType || fieldSchema.type === String) fieldSchema.type = 'uuid'; break; case SqbDataType.DATE: if (hasNoType || fieldSchema.type === String || fieldSchema.type === Date) { fieldSchema.type = 'date'; } break; case SqbDataType.TIMESTAMP: if (hasNoType || fieldSchema.type === String || fieldSchema.type === Date) { fieldSchema.type = 'datetime'; } break; case SqbDataType.TIMESTAMPTZ: if (hasNoType || fieldSchema.type === String || fieldSchema.type === Date) { fieldSchema.type = 'datetimetz'; } break; case SqbDataType.TIME: if (hasNoType || fieldSchema.type === String) fieldSchema.type = 'time'; break; default: break; } } if (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, ]); };