-
Notifications
You must be signed in to change notification settings - Fork 31
/
field.js
81 lines (65 loc) · 2.25 KB
/
field.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/**
* XadillaX created at 2016-08-09 13:04:53 With ♥
*
* Copyright (c) 2016 Souche.com, all rights
* reserved.
*/
"use strict";
const debug = require("debug")("toshihiko:field");
const otrans = require("otrans");
const FieldType = require("./field_type");
class ToshihikoField {
constructor(options) {
if(!options.name) {
throw new Error("no field name specified.");
}
Object.defineProperty(this, "options", {
configurable: false,
writable: false,
enumerable: false,
value: otrans.toCamel(options)
});
options = this.options;
let type = options.type;
if(!type || typeof type.restore !== "function" || typeof type.parse !== "function") {
type = FieldType.String;
}
let validators = [];
if(typeof options.validators === "function") {
options.validators = [ options.validators ];
}
if(Array.isArray(options.validators)) {
validators = options.validators;
}
Object.defineProperties(this, {
name: { value: options.name, enumerable: true },
column: { value: options.column || options.name, enumerable: true },
type: { value: type, enumerable: true },
validators: { value: validators, enumerable: true },
allowNull: { value: !!options.allowNull, enumerable: true },
primaryKey: { value: !!options.primaryKey, enumerable: true },
autoIncrement: {
value: (options.autoIncrement !== undefined && !!options.autoIncrement),
enumerable: true
},
default: {
value: (options.defaultValue === undefined) ? type.defaultValue : options.defaultValue,
enumerable: true
},
equal: {
value: (typeof type.equal === "function") ? type.equal.bind(type) : FieldType.$equal
}
});
debug(`${options.name} created.`, this);
}
get defaultValue() {
return this.default;
}
restore(value) {
return this.type.restore(value);
}
parse(value) {
return this.type.parse(value);
}
}
module.exports = ToshihikoField;