-
-
Notifications
You must be signed in to change notification settings - Fork 24
/
types.js
159 lines (137 loc) · 3.56 KB
/
types.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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
import * as util from './util'
import { columnDescriptor } from './enforcers'
import { KNEX_NO_ARGS, COLUMN_TYPES } from './constants'
export function toKnexSchema (model, options) {
return function (table) {
// every property of `model.schema` is a column
util.each(model.schema, (descriptor, name) => {
// each column's value is either its type or a descriptor
let type = getDataType(descriptor)
let partial = table[toKnexMethod(type)](name)
if (util.isFunction(descriptor) || !util.isObject(descriptor)) return
let columnProperties = columnDescriptor(descriptor)
util.each(columnProperties, (value, property) => {
if (util.isOneOf(['name', 'type'], property)) return
if (util.isOneOf(KNEX_NO_ARGS, property)) {
columnProperties[property] && partial[property]()
} else {
partial[property](value)
}
})
})
util.each(options, (value, key) => {
if (key === 'timestamps') {
options.timestamps && table.timestamps(true, true)
} else {
table[key](value)
}
})
}
}
// for insertions / updates
export function toDefinition (model, object) {
if (util.isArray(object)) {
return toColumnDefinition(model, object[0], object[2])
}
return util.map(object, (value, column) => {
return toColumnDefinition(model, column, value)
})
}
// for selects
export function fromDefinition (model, object) {
return util.map(object, (value, column) => {
return fromColumnDefinition(model, column, value)
})
}
// for insertions / updates
export function toColumnDefinition (model, column, value) {
let type = getDataType(model.schema[column])
return toInputType(type, value)
}
// for selects
export function fromColumnDefinition (model, column, value) {
let type = getDataType(model.schema[column])
return toReturnType(type, value)
}
export function castValue (value) {
let type = util.isType(value)
if (type === 'number' || type === 'string') {
return value
}
if (type === 'boolean') return Number(value)
if (type === 'array' || type === 'object') {
return JSON.stringify(value)
}
return value
}
function getDataType (property) {
let type = property
if (util.isFunction(property)) {
type = property.name
} else if (util.isObject(property)) {
type = util.isFunction(property.type)
? property.type.name
: property.type
}
if (util.isString(type)) {
type = type.toLowerCase()
}
if (!util.isOneOf(COLUMN_TYPES, type)) {
type = 'string'
}
return type
}
function toKnexMethod (type) {
switch (type) {
case 'string':
case 'array':
case 'object':
case 'json':
return 'text'
case 'number':
case 'boolean':
return 'integer'
case 'date':
return 'dateTime'
case 'increments':
default:
return type
}
}
function toInputType (type, value) {
switch (type) {
case 'string':
return String(value)
case 'array':
case 'object':
case 'json':
return JSON.stringify(value)
case 'number':
case 'boolean':
case 'increments':
return Number(value)
case 'date':
return new Date(value)
default:
return value
}
}
function toReturnType (type, value) {
switch (type) {
case 'string':
return String(value)
case 'array':
case 'object':
case 'json':
return JSON.parse(value)
case 'number':
case 'increments':
return Number(value)
case 'boolean':
return Boolean(value)
case 'date':
return new Date(value)
default:
return value
}
}