@directus/api
Version:
Directus is a real-time API and App dashboard for managing SQL database content
129 lines (128 loc) • 3.6 kB
JavaScript
const localTypeMap = {
// Shared
boolean: 'boolean',
tinyint: 'integer',
smallint: 'integer',
mediumint: 'integer',
int: 'integer',
integer: 'integer',
serial: 'integer',
bigint: 'bigInteger',
bigserial: 'bigInteger',
clob: 'text',
tinytext: 'text',
mediumtext: 'text',
longtext: 'text',
text: 'text',
varchar: 'string',
longvarchar: 'string',
varchar2: 'string',
nvarchar: 'string',
image: 'binary',
ntext: 'text',
char: 'string',
date: 'date',
datetime: 'dateTime',
dateTime: 'dateTime',
timestamp: 'timestamp',
time: 'time',
float: 'float',
double: 'float',
'double precision': 'float',
real: 'float',
decimal: 'decimal',
numeric: 'integer',
// Geometries
geometry: 'geometry',
point: 'geometry.Point',
linestring: 'geometry.LineString',
polygon: 'geometry.Polygon',
multipoint: 'geometry.MultiPoint',
multilinestring: 'geometry.MultiLineString',
multipolygon: 'geometry.MultiPolygon',
// MySQL
string: 'text',
year: 'integer',
blob: 'binary',
mediumblob: 'binary',
'int unsigned': 'integer',
'tinyint unsigned': 'integer',
'smallint unsigned': 'integer',
'mediumint unsigned': 'integer',
'bigint unsigned': 'integer',
// MS SQL
bit: 'boolean',
smallmoney: 'float',
money: 'float',
datetimeoffset: 'timestamp',
datetime2: 'dateTime',
smalldatetime: 'dateTime',
nchar: 'text',
binary: 'binary',
varbinary: 'binary',
uniqueidentifier: 'uuid',
// Postgres
json: 'json',
jsonb: 'json',
uuid: 'uuid',
int2: 'integer',
serial4: 'integer',
int4: 'integer',
serial8: 'integer',
int8: 'integer',
bool: 'boolean',
'character varying': 'string',
character: 'string',
interval: 'string',
_varchar: 'string',
bpchar: 'string',
timestamptz: 'timestamp',
'timestamp with time zone': 'timestamp',
'timestamp with local time zone': 'timestamp',
'timestamp without time zone': 'dateTime',
'timestamp without local time zone': 'dateTime',
timetz: 'time',
'time with time zone': 'time',
'time without time zone': 'time',
float4: 'float',
float8: 'float',
citext: 'text',
// Oracle
number: 'integer',
sdo_geometry: 'geometry',
// SQLite
integerfirst: 'integer',
};
export default function getLocalType(column, field) {
if (!column)
return 'alias';
const dataType = column.data_type.toLowerCase();
const type = localTypeMap[dataType.split('(')[0]];
const special = field?.special;
if (special) {
if (special.includes('cast-json'))
return 'json';
if (special.includes('hash'))
return 'hash';
if (special.includes('cast-csv'))
return 'csv';
if (special.includes('uuid') || special.includes('file'))
return 'uuid';
if (special.includes('cast-timestamp'))
return 'timestamp';
if (special.includes('cast-datetime'))
return 'dateTime';
if (type?.startsWith('geometry')) {
return special[0] || 'geometry';
}
}
/** Handle Postgres numeric decimals */
if (dataType === 'numeric' && column.numeric_precision !== null && column.numeric_scale !== null) {
return 'decimal';
}
/** Handle MS SQL varchar(MAX) (eg TEXT) types */
if (column.data_type === 'nvarchar' && column.max_length === -1) {
return 'text';
}
return type ?? 'unknown';
}