UNPKG

@harishreddym/baqend

Version:

Baqend JavaScript SDK

169 lines (138 loc) 4.64 kB
'use strict'; const Type = require('./Type'); const GeoPoint = require('../GeoPoint'); const File = require('../binding/File'); /** * @alias metamodel.BasicType * @extends metamodel.Type */ class BasicType extends Type { /** * @inheritDoc */ get persistenceType() { return Type.PersistenceType.BASIC; } /** * Creates a new instance of a native db type * @param {string} ref The db ref of this type * @param {Class<*>} typeConstructor The javascript class of this type * @param {boolean=} noResolving Indicates if this type is not the main type of the constructor */ constructor(ref, typeConstructor, noResolving) { const id = ref.indexOf('/db/') === 0 ? ref : '/db/' + ref; super(id, typeConstructor); /** * Indicates if this type is not the main type of the constructor * @type {boolean} */ this.noResolving = noResolving; } /** * @inheritDoc */ toJsonValue(state, currentValue) { return currentValue === null || currentValue === undefined ? null : this.typeConstructor(currentValue); } /** * @inheritDoc */ fromJsonValue(state, jsonValue) { return jsonValue === null || jsonValue === undefined ? null : jsonValue; } toString() { return 'BasicType(' + this.ref + ')'; } } function dateToJson(value) { // remove trailing zeros return value instanceof Date ? value.toISOString().replace(/\.?0*Z/, 'Z') : null; } function jsonToDate(json, currentValue) { const date = typeof json === 'string' ? new Date(json) : null; if (currentValue && date) { // compare normalized date strings instead of plain strings return currentValue.toISOString() === date.toISOString() ? currentValue : date; } return date; } Object.assign(BasicType, /** @lends metamodel.BasicType */ { Boolean: new class BooleanType extends BasicType { fromJsonValue(state, json, currentValue) { return typeof json === 'string' ? json !== 'false' : super.fromJsonValue(state, json, currentValue); } }('Boolean', Boolean), Double: new class DoubleType extends BasicType { fromJsonValue(state, json, currentValue) { return typeof json === 'string' ? parseFloat(json) : super.fromJsonValue(state, json, currentValue); } }('Double', Number), Integer: new class IntegerType extends BasicType { fromJsonValue(state, json, currentValue) { return typeof json === 'string' ? parseInt(json, 10) : super.fromJsonValue(state, json, currentValue); } }('Integer', Number), String: new class StringType extends BasicType {}('String', String), DateTime: new class DateTimeType extends BasicType { toJsonValue(state, value) { return dateToJson(value); } fromJsonValue(state, json, currentValue) { return jsonToDate(json, currentValue); } }('DateTime', Date), Date: new class DateType extends BasicType { toJsonValue(state, value) { const json = dateToJson(value); return json ? json.substring(0, json.indexOf('T')) : null; } fromJsonValue(state, json, currentValue) { return jsonToDate(json, currentValue); } }('Date', Date), Time: new class TimeType extends BasicType { toJsonValue(state, value) { const json = dateToJson(value); return json ? json.substring(json.indexOf('T') + 1) : null; } fromJsonValue(state, json, currentValue) { return typeof json === 'string' ? jsonToDate('1970-01-01T' + json, currentValue) : json; } }('Time', Date), File: new class FileType extends BasicType { toJsonValue(state, value) { return value instanceof File ? value.id : null; } fromJsonValue(state, json, currentValue) { if (json) { return currentValue && currentValue.id === json ? currentValue : new state.db.File(json); } return null; } }('File', File), GeoPoint: new class GeoPointType extends BasicType { toJsonValue(state, value) { return value instanceof GeoPoint ? value : null; } fromJsonValue(state, json) { return json ? new GeoPoint(json) : null; } }('GeoPoint', GeoPoint), JsonArray: new class JsonArrayType extends BasicType { toJsonValue(state, value) { return Array.isArray(value) ? value : null; } fromJsonValue(state, json) { return Array.isArray(json) ? json : null; } }('JsonArray', Array), JsonObject: new class JsonObjectType extends BasicType { toJsonValue(state, value) { if (value && value.constructor === Object) { return value; } return null; } }('JsonObject', Object), }); module.exports = BasicType;