Merge pull request #1625 from strongloop/fix-list-of-class-instances
Allow List to take items as instances of a class
This commit is contained in:
commit
242fd1bb56
11
lib/list.js
11
lib/list.js
|
@ -63,9 +63,13 @@ function List(items, itemType, parent) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
List.prototype.toItem = function(item) {
|
||||||
|
return isClass(this.itemType) ? new this.itemType(item) : this.itemType(item);
|
||||||
|
};
|
||||||
|
|
||||||
items.forEach(function(item, i) {
|
items.forEach(function(item, i) {
|
||||||
if (itemType && !(item instanceof itemType)) {
|
if (itemType && !(item instanceof itemType)) {
|
||||||
arr[i] = itemType(item);
|
arr[i] = arr.toItem(item);
|
||||||
} else {
|
} else {
|
||||||
arr[i] = item;
|
arr[i] = item;
|
||||||
}
|
}
|
||||||
|
@ -79,7 +83,7 @@ util.inherits(List, Array);
|
||||||
var _push = List.prototype.push;
|
var _push = List.prototype.push;
|
||||||
|
|
||||||
List.prototype.push = function(obj) {
|
List.prototype.push = function(obj) {
|
||||||
var item = this.itemType && (obj instanceof this.itemType) ? obj : this.itemType(obj);
|
var item = this.itemType && (obj instanceof this.itemType) ? obj : this.toItem(obj);
|
||||||
_push.call(this, item);
|
_push.call(this, item);
|
||||||
return item;
|
return item;
|
||||||
};
|
};
|
||||||
|
@ -117,3 +121,6 @@ List.prototype.toString = function() {
|
||||||
return JSON.stringify(this.toJSON());
|
return JSON.stringify(this.toJSON());
|
||||||
};
|
};
|
||||||
|
|
||||||
|
function isClass(fn) {
|
||||||
|
return fn && fn.toString().indexOf('class ') === 0;
|
||||||
|
}
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
// 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';
|
'use strict';
|
||||||
var kvMemory = require('../lib/connectors/kv-memory');
|
var kvMemory = require('../lib/connectors/kv-memory');
|
||||||
var DataSource = require('..').DataSource;
|
var DataSource = require('..').DataSource;
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
// 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';
|
'use strict';
|
||||||
|
|
||||||
var debug = require('debug')('test');
|
var debug = require('debug')('test');
|
||||||
|
|
|
@ -0,0 +1,124 @@
|
||||||
|
// Copyright IBM Corp. 2018. 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';
|
||||||
|
|
||||||
|
var should = require('./init.js');
|
||||||
|
var List = require('../lib/list');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Phone as a class
|
||||||
|
*/
|
||||||
|
class Phone {
|
||||||
|
constructor(label, num) {
|
||||||
|
this.label = label;
|
||||||
|
this.num = num;
|
||||||
|
}
|
||||||
|
|
||||||
|
toJSON() {
|
||||||
|
return {
|
||||||
|
label: this.label,
|
||||||
|
num: this.num,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Phone as a constructor function
|
||||||
|
* @param {string} label
|
||||||
|
* @param {number} num
|
||||||
|
*/
|
||||||
|
function PhoneCtor(label, num) {
|
||||||
|
if (!(this instanceof PhoneCtor)) {
|
||||||
|
return new PhoneCtor(label, num);
|
||||||
|
}
|
||||||
|
this.label = label;
|
||||||
|
this.num = num;
|
||||||
|
}
|
||||||
|
|
||||||
|
describe('list of items typed by a class', function() {
|
||||||
|
it('allows itemType to be a class', function() {
|
||||||
|
var phones = givenPhones();
|
||||||
|
|
||||||
|
var list = new List(phones, Phone);
|
||||||
|
list.should.be.an.instanceOf(Array);
|
||||||
|
list.toJSON().should.be.eql(phones);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('converts items of plain json to the itemType', function() {
|
||||||
|
var phones = givenPhonesAsJSON();
|
||||||
|
|
||||||
|
var list = new List(phones, Phone);
|
||||||
|
list[0].should.be.an.instanceOf(Phone);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('converts stringified items to the itemType', function() {
|
||||||
|
var phones = givenPhonesAsJSON();
|
||||||
|
|
||||||
|
var list = new List(JSON.stringify(phones), Phone);
|
||||||
|
list[0].should.be.an.instanceOf(Phone);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('converts items of plain json to the itemType with push', function() {
|
||||||
|
var phones = givenPhonesAsJSON();
|
||||||
|
|
||||||
|
var list = new List([], Phone);
|
||||||
|
list.push(phones[0]);
|
||||||
|
list[0].should.be.an.instanceOf(Phone);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('list of items typed by a ctor', function() {
|
||||||
|
it('allows itemType to be a ctor', function() {
|
||||||
|
var phones = givenPhonesWithCtor();
|
||||||
|
|
||||||
|
var list = new List(phones, PhoneCtor);
|
||||||
|
list.should.be.an.instanceOf(Array);
|
||||||
|
list.toJSON().should.be.eql(phones);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('converts items of plain json to the itemType', function() {
|
||||||
|
var phones = givenPhonesAsJSON();
|
||||||
|
|
||||||
|
var list = new List(phones, PhoneCtor);
|
||||||
|
list[0].should.be.an.instanceOf(PhoneCtor);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('converts stringified items to the itemType', function() {
|
||||||
|
var phones = givenPhonesAsJSON();
|
||||||
|
|
||||||
|
var list = new List(JSON.stringify(phones), PhoneCtor);
|
||||||
|
list[0].should.be.an.instanceOf(PhoneCtor);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('converts items of plain json to the itemType with push', function() {
|
||||||
|
var phones = givenPhonesAsJSON();
|
||||||
|
|
||||||
|
var list = new List([], PhoneCtor);
|
||||||
|
list.push(phones[0]);
|
||||||
|
list[0].should.be.an.instanceOf(PhoneCtor);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
function givenPhones() {
|
||||||
|
return [
|
||||||
|
new Phone('home', '111-222-3333'),
|
||||||
|
new Phone('work', '111-222-5555'),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
function givenPhonesWithCtor() {
|
||||||
|
return [
|
||||||
|
new PhoneCtor('home', '111-222-3333'),
|
||||||
|
PhoneCtor('work', '111-222-5555'),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
function givenPhonesAsJSON() {
|
||||||
|
return [
|
||||||
|
{label: 'home', num: '111-222-3333'},
|
||||||
|
{label: 'work', num: '111-222-5555'},
|
||||||
|
];
|
||||||
|
}
|
Loading…
Reference in New Issue