sequelize
Version:
Sequelize is a promise-based Node.js ORM tool for Postgres, MySQL, MariaDB, SQLite, Microsoft SQL Server, Amazon Redshift and Snowflake’s Data Cloud. It features solid transaction support, relations, eager and lazy loading, read replication and more.
124 lines (123 loc) • 3.72 kB
JavaScript
const wkx = require("wkx");
const _ = require("lodash");
const momentTz = require("moment-timezone");
const moment = require("moment");
module.exports = (BaseTypes) => {
BaseTypes.ABSTRACT.prototype.dialectTypes = "https://dev.mysql.com/doc/refman/5.7/en/data-types.html";
BaseTypes.DATE.types.mysql = ["DATETIME"];
BaseTypes.STRING.types.mysql = ["VAR_STRING"];
BaseTypes.CHAR.types.mysql = ["STRING"];
BaseTypes.TEXT.types.mysql = ["BLOB"];
BaseTypes.TINYINT.types.mysql = ["TINY"];
BaseTypes.SMALLINT.types.mysql = ["SHORT"];
BaseTypes.MEDIUMINT.types.mysql = ["INT24"];
BaseTypes.INTEGER.types.mysql = ["LONG"];
BaseTypes.BIGINT.types.mysql = ["LONGLONG"];
BaseTypes.FLOAT.types.mysql = ["FLOAT"];
BaseTypes.TIME.types.mysql = ["TIME"];
BaseTypes.DATEONLY.types.mysql = ["DATE"];
BaseTypes.BOOLEAN.types.mysql = ["TINY"];
BaseTypes.BLOB.types.mysql = ["TINYBLOB", "BLOB", "LONGBLOB"];
BaseTypes.DECIMAL.types.mysql = ["NEWDECIMAL"];
BaseTypes.UUID.types.mysql = false;
BaseTypes.ENUM.types.mysql = false;
BaseTypes.REAL.types.mysql = ["DOUBLE"];
BaseTypes.DOUBLE.types.mysql = ["DOUBLE"];
BaseTypes.GEOMETRY.types.mysql = ["GEOMETRY"];
BaseTypes.JSON.types.mysql = ["JSON"];
class DECIMAL extends BaseTypes.DECIMAL {
toSql() {
let definition = super.toSql();
if (this._unsigned) {
definition += " UNSIGNED";
}
if (this._zerofill) {
definition += " ZEROFILL";
}
return definition;
}
}
class DATE extends BaseTypes.DATE {
toSql() {
return this._length ? `DATETIME(${this._length})` : "DATETIME";
}
_stringify(date, options) {
if (!moment.isMoment(date)) {
date = this._applyTimezone(date, options);
}
if (this._length) {
return date.format("YYYY-MM-DD HH:mm:ss.SSS");
}
return date.format("YYYY-MM-DD HH:mm:ss");
}
static parse(value, options) {
value = value.string();
if (value === null) {
return value;
}
if (momentTz.tz.zone(options.timezone)) {
value = momentTz.tz(value, options.timezone).toDate();
} else {
value = new Date(`${value} ${options.timezone}`);
}
return value;
}
}
class DATEONLY extends BaseTypes.DATEONLY {
static parse(value) {
return value.string();
}
}
class UUID extends BaseTypes.UUID {
toSql() {
return "CHAR(36) BINARY";
}
}
const SUPPORTED_GEOMETRY_TYPES = ["POINT", "LINESTRING", "POLYGON"];
class GEOMETRY extends BaseTypes.GEOMETRY {
constructor(type, srid) {
super(type, srid);
if (_.isEmpty(this.type)) {
this.sqlType = this.key;
return;
}
if (SUPPORTED_GEOMETRY_TYPES.includes(this.type)) {
this.sqlType = this.type;
return;
}
throw new Error(`Supported geometry types are: ${SUPPORTED_GEOMETRY_TYPES.join(", ")}`);
}
static parse(value) {
value = value.buffer();
if (!value || value.length === 0) {
return null;
}
value = value.slice(4);
return wkx.Geometry.parse(value).toGeoJSON({ shortCrs: true });
}
toSql() {
return this.sqlType;
}
}
class ENUM extends BaseTypes.ENUM {
toSql(options) {
return `ENUM(${this.values.map((value) => options.escape(value)).join(", ")})`;
}
}
class JSONTYPE extends BaseTypes.JSON {
_stringify(value, options) {
return options.operation === "where" && typeof value === "string" ? value : JSON.stringify(value);
}
}
return {
ENUM,
DATE,
DATEONLY,
UUID,
GEOMETRY,
DECIMAL,
JSON: JSONTYPE
};
};
//# sourceMappingURL=data-types.js.map
;