sim 1.0.18 → 2.0.0-dev.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +312 -73
- package/THIRD_PARTY_LICENSES +30 -0
- package/dist/index.js +10622 -0
- package/package.json +53 -66
- package/.npmignore +0 -1
- package/app.js +0 -4
- package/cli/cli +0 -8
- package/cli/config.yaml +0 -43
- package/cli/manager.js +0 -173
- package/cli/templates.js +0 -117
- package/client/slots.js +0 -35
- package/lib/auth/auth.js +0 -157
- package/lib/auth/index.js +0 -6
- package/lib/auth/models/sessions.js +0 -0
- package/lib/auth/models/users.js +0 -40
- package/lib/cookies.js +0 -32
- package/lib/db/database.js +0 -166
- package/lib/db/index.js +0 -7
- package/lib/db/item.js +0 -30
- package/lib/db/list.js +0 -285
- package/lib/handler.js +0 -173
- package/lib/index.js +0 -15
- package/lib/middleware.js +0 -151
- package/lib/project/_project.js +0 -242
- package/lib/project/config.yaml +0 -105
- package/lib/project/file.js +0 -24
- package/lib/project/index.js +0 -8
- package/lib/project/page.js +0 -250
- package/lib/project/project.js +0 -261
- package/simple/index.js +0 -96
package/lib/auth/models/users.js
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const _ = require('lodash');
|
|
4
|
-
const sha1 = require('sha1');
|
|
5
|
-
|
|
6
|
-
exports.list = {
|
|
7
|
-
|
|
8
|
-
addUser (user, callback) {
|
|
9
|
-
var self = this;
|
|
10
|
-
|
|
11
|
-
_.extend(user, {
|
|
12
|
-
isAuth: user.isAuth,
|
|
13
|
-
isAdmin: user.isAdmin || false,
|
|
14
|
-
isStaff: user.isStaff || false,
|
|
15
|
-
username: user.username || null,
|
|
16
|
-
ip: user.ip || null,
|
|
17
|
-
password: user.password ? sha1(user.password || '') : null,
|
|
18
|
-
registerDate: new Date(),
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
self.add(user, user => callback(user));
|
|
22
|
-
},
|
|
23
|
-
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
exports.item = {
|
|
27
|
-
|
|
28
|
-
checkPassword (password) {
|
|
29
|
-
var self = this;
|
|
30
|
-
if (sha1(password) === self.password)
|
|
31
|
-
return true;
|
|
32
|
-
return false;
|
|
33
|
-
},
|
|
34
|
-
|
|
35
|
-
setPassword (password) {
|
|
36
|
-
var self = this;
|
|
37
|
-
self.password = sha1(password);
|
|
38
|
-
},
|
|
39
|
-
|
|
40
|
-
};
|
package/lib/cookies.js
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
class Cookies {
|
|
4
|
-
|
|
5
|
-
set (res, key, value, isLong) {
|
|
6
|
-
var date = new Date((new Date()).getTime() + 9592000000),
|
|
7
|
-
expires = date.toGMTString(),
|
|
8
|
-
content = key + '=' + value + '; path=/;';
|
|
9
|
-
if (isLong) {
|
|
10
|
-
content += ' expires=' + expires + ';';
|
|
11
|
-
}
|
|
12
|
-
res.setHeader('Set-Cookie', content);
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
get (req, key) {
|
|
16
|
-
var cookies = {};
|
|
17
|
-
req.headers.cookie && req.headers.cookie
|
|
18
|
-
.split(';')
|
|
19
|
-
.forEach(cookie => {
|
|
20
|
-
var parts = cookie.split('=');
|
|
21
|
-
cookies[parts[0].trim()] = (parts[1] || '').trim();
|
|
22
|
-
});
|
|
23
|
-
return cookies[key];
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
remove (res, key) {
|
|
27
|
-
var self = this;
|
|
28
|
-
self.set(res, key, 'jdfjd6j81df86j4dfj86d4j86fd4j6df1', true);
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
module.exports = new Cookies();
|
package/lib/db/database.js
DELETED
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const _ = require('lodash');
|
|
4
|
-
const mongodb = require('mongodb');
|
|
5
|
-
const fs = require('fs');
|
|
6
|
-
const path = require('path');
|
|
7
|
-
const List = require('./list');
|
|
8
|
-
const MongoClient = mongodb.MongoClient;
|
|
9
|
-
|
|
10
|
-
class Database {
|
|
11
|
-
|
|
12
|
-
constructor (url) {
|
|
13
|
-
var self = this;
|
|
14
|
-
|
|
15
|
-
_.extend(self, {
|
|
16
|
-
url: url || 'mongodb://localhost/test',
|
|
17
|
-
db: null,
|
|
18
|
-
handlers: {},
|
|
19
|
-
lists: {},
|
|
20
|
-
waiting: [],
|
|
21
|
-
connecting: false,
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
getLists () {
|
|
26
|
-
var self = this;
|
|
27
|
-
return self.lists;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
list (name) {
|
|
31
|
-
var self = this;
|
|
32
|
-
return self.lists[name] || null;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
setURL (url) {
|
|
36
|
-
var self = this;
|
|
37
|
-
self.url = url;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
getURL () {
|
|
41
|
-
var self = this;
|
|
42
|
-
return self.url;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/*
|
|
46
|
-
* Add list to the module.
|
|
47
|
-
* - options: An object containing following properties:
|
|
48
|
-
* - collectionName: Collection's name in database.
|
|
49
|
-
* - name: List's name in module.
|
|
50
|
-
* - list: Object with list's methods.
|
|
51
|
-
* - item: Object with item's methods.
|
|
52
|
-
*/
|
|
53
|
-
addList (opts) {
|
|
54
|
-
var self = this,
|
|
55
|
-
listName = opts.name || 'test',
|
|
56
|
-
collectionName = opts.collectionName || listName,
|
|
57
|
-
listMethods = opts.list || {},
|
|
58
|
-
itemMethods = opts.item || {},
|
|
59
|
-
list = new List(
|
|
60
|
-
self,
|
|
61
|
-
collectionName,
|
|
62
|
-
listMethods,
|
|
63
|
-
itemMethods,
|
|
64
|
-
opts.ai || []
|
|
65
|
-
);
|
|
66
|
-
self.lists[listName] = list;
|
|
67
|
-
return self;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
loadFromDir (dir) {
|
|
71
|
-
var self = this;
|
|
72
|
-
fs
|
|
73
|
-
.readdirSync(dir)
|
|
74
|
-
.filter(filename => path.extname(filename) === '.js')
|
|
75
|
-
.forEach(filename => {
|
|
76
|
-
var data = require(dir + '/' + filename);
|
|
77
|
-
data.name = data.name || path.basename(filename, path.extname(filename));
|
|
78
|
-
self.addList(data);
|
|
79
|
-
});
|
|
80
|
-
return self;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
removeList (listName) {
|
|
84
|
-
var self = this;
|
|
85
|
-
if (!self.lists || !self.lists.hasOwnProperty(listName)) return;
|
|
86
|
-
delete self.lists[listName];
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
removeAllLists () {
|
|
90
|
-
var self = this;
|
|
91
|
-
_.each(self.lists, (list, name) => {
|
|
92
|
-
if (!self.lists || !self.lists.hasOwnProperty(name)) return;
|
|
93
|
-
delete self.lists[name];
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
/*
|
|
98
|
-
* Add handler to the database events.
|
|
99
|
-
* - name: Event name. May contain following names:
|
|
100
|
-
* - 'error': Handler receives error object.
|
|
101
|
-
* - 'info': Handler received string message.
|
|
102
|
-
*/
|
|
103
|
-
on (name, handler) {
|
|
104
|
-
var self = this;
|
|
105
|
-
self.handlers[name] = self.handlers[name] || [];
|
|
106
|
-
self.handlers[name].push(handler);
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
emit (name, ...args) {
|
|
110
|
-
var self = this;
|
|
111
|
-
if (!self.handlers[name]) return;
|
|
112
|
-
_.each(self.handlers[name], handler => handler(...args));
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
removeEventListener (eventName, handler) {
|
|
116
|
-
var self = this;
|
|
117
|
-
_.each(self.handlers[eventName], (h, i) => {
|
|
118
|
-
if (h === handler) {
|
|
119
|
-
self.handlers[eventName].splice(i, 1);
|
|
120
|
-
}
|
|
121
|
-
});
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
removeAllListeners (name) {
|
|
125
|
-
var self = this;
|
|
126
|
-
self.handlers[name] = [];
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
getCollection (name, cb) {
|
|
130
|
-
var self = this;
|
|
131
|
-
self.getDatabase(db => cb(db.collection(name)));
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
reconnect (url) {
|
|
135
|
-
var self = this;
|
|
136
|
-
self.url = url || self.url;
|
|
137
|
-
self.getDatabase(() => {});
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
// Implementation ==========================================================
|
|
141
|
-
|
|
142
|
-
getDatabase (cb) {
|
|
143
|
-
var self = this;
|
|
144
|
-
if (self.db) return cb(self.db);
|
|
145
|
-
if (self.connecting) return self.waiting.push(cb);
|
|
146
|
-
self.connecting = true;
|
|
147
|
-
self.waiting.push(cb);
|
|
148
|
-
self.connect(db => {
|
|
149
|
-
self.connecting = false;
|
|
150
|
-
_.each(self.waiting, handler => handler(db));
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
connect (cb) {
|
|
155
|
-
var self = this;
|
|
156
|
-
MongoClient.connect(self.url, (err, db) => {
|
|
157
|
-
if (err) return self.emit('error', err);
|
|
158
|
-
self.emit('info', 'Database ' + self.url + ' connected.');
|
|
159
|
-
self.db = db;
|
|
160
|
-
cb(db);
|
|
161
|
-
});
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
}
|
|
165
|
-
|
|
166
|
-
module.exports = Database;
|
package/lib/db/index.js
DELETED
package/lib/db/item.js
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const _ = require('lodash');
|
|
4
|
-
|
|
5
|
-
class Item {
|
|
6
|
-
|
|
7
|
-
constructor (data, list) {
|
|
8
|
-
var self = this;
|
|
9
|
-
_.extend(self, data);
|
|
10
|
-
self.list = list;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
getList () {
|
|
14
|
-
var self = this;
|
|
15
|
-
return null;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
remove (callback) {
|
|
19
|
-
var self = this;
|
|
20
|
-
self.list.remove(self, callback);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
save (callback) {
|
|
24
|
-
var self = this;
|
|
25
|
-
self.list.save(self, callback);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
module.exports = Item;
|
package/lib/db/list.js
DELETED
|
@@ -1,285 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const _ = require('lodash');
|
|
4
|
-
const ObjectID = require('mongodb').ObjectID;
|
|
5
|
-
const async = require('async');
|
|
6
|
-
const sim = require('sim');
|
|
7
|
-
const Item = require('./item');
|
|
8
|
-
|
|
9
|
-
class List {
|
|
10
|
-
|
|
11
|
-
static wrapMethod (method) {
|
|
12
|
-
return function (...args) {
|
|
13
|
-
var self = this,
|
|
14
|
-
cb = args.pop();
|
|
15
|
-
args.push(res => {
|
|
16
|
-
cb(self.wrapResults(res));
|
|
17
|
-
});
|
|
18
|
-
if (self.coll) return method.apply(self, args);
|
|
19
|
-
self.db.getCollection(self.name, coll => {
|
|
20
|
-
self.coll = coll;
|
|
21
|
-
method.apply(self, args);
|
|
22
|
-
});
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
constructor (db, name, methods, itemMethods, ai) {
|
|
27
|
-
var self = this;
|
|
28
|
-
|
|
29
|
-
methods = methods || {};
|
|
30
|
-
|
|
31
|
-
_.extend(self, {
|
|
32
|
-
db: db,
|
|
33
|
-
name: name || 'test',
|
|
34
|
-
coll: null,
|
|
35
|
-
itemMethods: itemMethods || {},
|
|
36
|
-
ai: ai,
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
_.each(methods, (method, methodName) => {
|
|
40
|
-
self[methodName] = List.wrapMethod(method);
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
// Interface =================================================================
|
|
45
|
-
|
|
46
|
-
add (data, cb) {
|
|
47
|
-
var self = this;
|
|
48
|
-
if (Array.isArray(data)) {
|
|
49
|
-
return self.addArray(data, cb);
|
|
50
|
-
}
|
|
51
|
-
return self.addOne(data, cb);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
addOne (data, cb) {
|
|
55
|
-
var self = this;
|
|
56
|
-
_.each(self.ai, name => {
|
|
57
|
-
if (data[name] !== undefined) return;
|
|
58
|
-
data[name] = { $ai: true };
|
|
59
|
-
});
|
|
60
|
-
delete data._id;
|
|
61
|
-
self.setAutoIncrement(data, data => {
|
|
62
|
-
self.coll.insert(data, (err, data) => {
|
|
63
|
-
if (err) return console.log(err.stack);
|
|
64
|
-
cb(data.ops[0]);
|
|
65
|
-
});
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
addArray (items, cb) {
|
|
70
|
-
var self = this
|
|
71
|
-
result = [];
|
|
72
|
-
|
|
73
|
-
async.eachSeries(items, (data, cb) => {
|
|
74
|
-
self.addOne(data, res => {
|
|
75
|
-
result.push(res);
|
|
76
|
-
cb(res);
|
|
77
|
-
});
|
|
78
|
-
}, () => cb(result));
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
remove (data, cb) {
|
|
82
|
-
var self = this;
|
|
83
|
-
if (typeof data._id === 'string') {
|
|
84
|
-
data._id = new ObjectID(data._id);
|
|
85
|
-
}
|
|
86
|
-
self.coll.remove(data, (err, result) => {
|
|
87
|
-
if (err) return console.log(err.stack);
|
|
88
|
-
cb(result);
|
|
89
|
-
});
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
all (cb) {
|
|
93
|
-
var self = this;
|
|
94
|
-
self.coll
|
|
95
|
-
.find()
|
|
96
|
-
.toArray((err, items) => {
|
|
97
|
-
if (err) return console.log(err.stack);
|
|
98
|
-
cb(items);
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
filter (data, cb) {
|
|
103
|
-
var self = this;
|
|
104
|
-
self.coll
|
|
105
|
-
.find(data)
|
|
106
|
-
.toArray((err, result) => {
|
|
107
|
-
if (err) return console.log(err.stack);
|
|
108
|
-
cb(result);
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
empty (cb) {
|
|
113
|
-
var self = this;
|
|
114
|
-
self.coll
|
|
115
|
-
.remove({}, err => {
|
|
116
|
-
if (err) return console.log(err.stack);
|
|
117
|
-
cb();
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
get (data, cb) {
|
|
122
|
-
var self = this;
|
|
123
|
-
if (typeof data._id === 'string') {
|
|
124
|
-
try { data._id = new ObjectID(data._id); }
|
|
125
|
-
catch (err) {}
|
|
126
|
-
}
|
|
127
|
-
self.coll.findOne(data, (err, res) => {
|
|
128
|
-
if (err) return console.log(err.stack);
|
|
129
|
-
cb(res);
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
save (data, cb) {
|
|
134
|
-
var self = this;
|
|
135
|
-
if (typeof data._id === 'string') {
|
|
136
|
-
data._id = new ObjectID(data._id);
|
|
137
|
-
}
|
|
138
|
-
self.coll.save(data, (err, res) => {
|
|
139
|
-
if (err) return console.log(err.stack);
|
|
140
|
-
if (res === 1) res = data;
|
|
141
|
-
cb(res);
|
|
142
|
-
});
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
page (opts, cb) {
|
|
146
|
-
var self = this,
|
|
147
|
-
isSearch = false,
|
|
148
|
-
isSort = false,
|
|
149
|
-
query = {};
|
|
150
|
-
_.each(opts.filter, (value, name) => query[name] = value);
|
|
151
|
-
opts.page = opts.page || 1;
|
|
152
|
-
if (opts.search && opts.searchBy) {
|
|
153
|
-
isSearch = true;
|
|
154
|
-
}
|
|
155
|
-
if (opts.sort) {
|
|
156
|
-
if (opts.sort.startsWith('-')) {
|
|
157
|
-
opts.sort = opts.sort.slice(1);
|
|
158
|
-
opts.sortReverse = true;
|
|
159
|
-
}
|
|
160
|
-
isSort = true;
|
|
161
|
-
}
|
|
162
|
-
if (isSearch) {
|
|
163
|
-
let words = opts.search.split(' ');
|
|
164
|
-
query.$and = [];
|
|
165
|
-
_.each(words, word => {
|
|
166
|
-
var item = {};
|
|
167
|
-
item[opts.searchBy] = {
|
|
168
|
-
$regex: new RegExp(word, 'i'),
|
|
169
|
-
};
|
|
170
|
-
query.$and.push(item);
|
|
171
|
-
});
|
|
172
|
-
}
|
|
173
|
-
// Get result
|
|
174
|
-
let cursor = self.coll.find(query);
|
|
175
|
-
if (isSort) {
|
|
176
|
-
let sortQuery = {};
|
|
177
|
-
sortQuery[opts.sort] = 1;
|
|
178
|
-
if (opts.sortReverse) {
|
|
179
|
-
sortQuery[opts.sort] = -1;
|
|
180
|
-
}
|
|
181
|
-
cursor = cursor.sort(sortQuery);
|
|
182
|
-
}
|
|
183
|
-
cursor.count((err, count) => {
|
|
184
|
-
if (err) return console.log(err.stack);
|
|
185
|
-
if (opts.limit) {
|
|
186
|
-
cursor = cursor
|
|
187
|
-
.skip((opts.page - 1) * opts.limit)
|
|
188
|
-
.limit(opts.limit);
|
|
189
|
-
}
|
|
190
|
-
cursor.toArray((err, items) => {
|
|
191
|
-
if (err) return console.log(err.stack);
|
|
192
|
-
items.page = opts.page;
|
|
193
|
-
items.pagesCount = Math.ceil(count / (opts.limit || count));
|
|
194
|
-
cb(items);
|
|
195
|
-
});
|
|
196
|
-
});
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
goa (...args) {
|
|
200
|
-
var self = this;
|
|
201
|
-
return self.getOrAdd(...args);
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
getOrAdd (item, cb) {
|
|
205
|
-
var self = this;
|
|
206
|
-
self.get(item, i => {
|
|
207
|
-
if (i) return cb(i);
|
|
208
|
-
self.add(item, item => {
|
|
209
|
-
cb(item);
|
|
210
|
-
});
|
|
211
|
-
});
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
// Implementation ============================================================
|
|
215
|
-
|
|
216
|
-
getMaxProperty (name, cb) {
|
|
217
|
-
var self = this;
|
|
218
|
-
self.page({
|
|
219
|
-
limit: 1,
|
|
220
|
-
sort: name,
|
|
221
|
-
sortReverse: true,
|
|
222
|
-
}, items => {
|
|
223
|
-
if (items.length === 0) return cb(0);
|
|
224
|
-
cb(items[0][name] || 0);
|
|
225
|
-
});
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
getNextId (name, cb) {
|
|
229
|
-
var self = this
|
|
230
|
-
lists = sim.db.getLists();
|
|
231
|
-
lists.__ids.goa({
|
|
232
|
-
collection: name,
|
|
233
|
-
}, id => {
|
|
234
|
-
var res = id[name] = id[name] || 1;
|
|
235
|
-
id[name]++;
|
|
236
|
-
id.save(() => cb(res));
|
|
237
|
-
});
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
setAutoIncrement (data, cb) {
|
|
241
|
-
var self = this,
|
|
242
|
-
aiProps = [];
|
|
243
|
-
|
|
244
|
-
_.each(data, (value, name) => {
|
|
245
|
-
if (!value || !value.$ai) return;
|
|
246
|
-
aiProps.push(name);
|
|
247
|
-
});
|
|
248
|
-
|
|
249
|
-
async.eachSeries(aiProps, (name, cb) => {
|
|
250
|
-
self.getNextId(name, next => {
|
|
251
|
-
data[name] = next;
|
|
252
|
-
cb();
|
|
253
|
-
});
|
|
254
|
-
}, () => cb(data));
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
wrap (data) {
|
|
258
|
-
var self = this,
|
|
259
|
-
item = new Item(data || {}, self);
|
|
260
|
-
_.each(self.itemMethods, (method, name) => item[name] = method);
|
|
261
|
-
return item;
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
wrapResults (data) {
|
|
265
|
-
var self = this;
|
|
266
|
-
if (Array.isArray(data)) {
|
|
267
|
-
return _.map(data, item => self.wrap(item));
|
|
268
|
-
}
|
|
269
|
-
return self.wrap(data);
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
const proto = List.prototype;
|
|
275
|
-
|
|
276
|
-
[
|
|
277
|
-
'addOne',
|
|
278
|
-
'remove', 'empty',
|
|
279
|
-
'get', 'all', 'filter', 'page',
|
|
280
|
-
'save',
|
|
281
|
-
].forEach(name => {
|
|
282
|
-
proto[name] = List.wrapMethod(proto[name]);
|
|
283
|
-
});
|
|
284
|
-
|
|
285
|
-
module.exports = List;
|