-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
65 lines (54 loc) · 1.72 KB
/
index.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
export default function Model(args) {
const primitives = ['string', 'number', 'boolean'],
typeParams = {
type: 'function',
set: 'boolean',
get: 'boolean',
required: 'boolean'
},
defaultParams = {
set: true,
get: true,
required: false
};
for (let key in args) {
for (let param in args[key]) {
if (
args[key][param] !== undefined &&
typeof args[key][param] !== typeParams[param]
) throw new Error(`\`${param}\` must be \`${typeParams[param]}\` or \`undefined\` in \`${key}\``);
args[key] = Object.assign(defaultParams, args[key]);
}
}
class NewModel {
constructor(props) {
for (let key in args) {
if (
primitives.indexOf(args[key].type.name.toLowerCase()) === -1 &&
args[key].required === false
) throw new Error(`\`${key}\` cannot be required because \`${args[key].type.name}\` is non-primitive`);
if (
args[key].required === true &&
props[key] === undefined
) throw new Error(`\`${key}\` is required`);
this[props[key].set ? key : `#${key}`] = props[key];
}
}
};
const defineObject = {};
for (let key in args) {
defineObject[key] = {};
if (args[key].set) defineObject[key].set = function (value) {
if (
typeof value !== args[key].type.name.toLowerCase() &&
!(value instanceof args[key].type)
) throw new Error(`\`${key}\` must be \`${args[key].type.name.toLowerCase()}\``);
this[`#${key}`] = value;
};
if (args[key].get) defineObject[key].get = function () {
return this[`#${key}`];
};
}
Object.defineProperties(NewModel.prototype, defineObject);
return NewModel;
}