loopback-datasource-juggler/lib/date-string.js

107 lines
2.4 KiB
JavaScript

// Copyright IBM Corp. 2013,2016. All Rights Reserved.
// Node module: loopback-datasource-juggler
// This file is licensed under the MIT License.
// License text available at https://opensource.org/licenses/MIT
'use strict';
const inspect = require('util').inspect;
module.exports = DateString;
/**
* A String whose value is a valid representation of a Date.
* Use this type if you need to preserve the format of the value and still
* check if it's valid.
* Example:
* ```js
* var loopback = require('loopback');
* var dt = new loopback.DateString('2001-01-01');
*
* dt.toString();
* // '2001-01-01'
* dt._date.toISOString();
* // '2001-01-01T00:00:00.000Z'
* ```
*
* You can use this definition on your models as well:
* ```json
* {
* "name": "Person",
* "base": "PersistedModel",
* "properties": {
* "name": {
* "type": "string"
* },
* "dob": {
* "type": "DateString",
* "required": true
* },
* },
* "validations": [],
* "relations": {},
* "acls": [],
* "methods": {}
* }
* ```
* @class DateString
* @param {String} value
* @constructor
*/
function DateString(value) {
if (!(this instanceof DateString)) {
return new DateString(value);
}
if (typeof(value) !== 'string') {
throw new Error('Input must be a string');
}
Object.defineProperty(this, 'when', {
get: () => { return this._when; },
set: (val) => {
const d = new Date(val);
if (isNaN(d.getTime())) {
throw new Error('Invalid date');
} else {
this._when = val;
this._date = d;
}
},
});
this.when = value;
}
/**
* Returns the value of DateString in its original form.
* @returns {String} The Date as a String.
*/
DateString.prototype.toString = function() {
return this.when;
};
/**
* Returns the JSON representation of the DateString object.
* @returns {String} A JSON string.
*/
DateString.prototype.toJSON = function() {
return JSON.stringify({
when: this.when,
});
};
DateString.prototype.inspect = function(depth, options) {
return 'DateString ' + inspect({
when: this.when,
_date: this._date,
});
};
if (inspect.custom) {
// Node.js 12+ no longer recognizes "inspect" method,
// it uses "inspect.custom" symbol as the key instead
// TODO(semver-major) always use the symbol key only (requires Node.js 8+).
DateString.prototype[inspect.custom] = DateString.prototype.inspect;
}