Skip to content

Commit

Permalink
Refactor bundle loading to do so recursively, fix and add relevant tests
Browse files Browse the repository at this point in the history
  • Loading branch information
duizendnegen committed Jan 26, 2016
1 parent 6b189c4 commit 1ba1152
Show file tree
Hide file tree
Showing 5 changed files with 90 additions and 26 deletions.
56 changes: 38 additions & 18 deletions addon/services/bundle-loader.js
Original file line number Diff line number Diff line change
Expand Up @@ -59,33 +59,53 @@ export default Ember.Service.extend({
* @private
*/
requireBundle: function (name) {
if (!this._promises[name]) {
this._promises[name] = this.getScript(config.bundles[name].url);
} else {
return this._promises[name];
}
},

if (!this._promises[name]) {
/* jshint ignore:start */
loadBundle: function(bundleName) {
if(!bundleName) {
return new Promise((resolve)=>resolve());
}

this._promises[name] = this.getScript(config.bundles[name].url);
var dependencies = this.findDependencies(config.bundles[bundleName]);
if(dependencies.indexOf(bundleName) === -1) {
dependencies.push(bundleName);
}

} else {
return this._promises[name];
}
var requests = dependencies.map((dependencyName) => this.requireBundle(dependencyName));

return Ember.$.when(requests);
},
/* jshint ignore:start */
loadBundle:function(bundleName){
/* jshint ignore:end */

if(!bundleName){
return new Promise((resolve)=>resolve());
}
findDependencies: function(bundle) {
var allDependencies = [];

if(!bundle) {
return allDependencies;
}

//find dependencies
var dependencies = !!config.bundles[bundleName].dependencies ? config.bundles[bundleName].dependencies: [];
// find dependencies
var directDependencies = (!!bundle.dependencies) ? bundle.dependencies : [];
directDependencies.forEach((dependency) => {
var nestedDependencies = this.findDependencies(config.bundles[dependency]);

//Load all dependencies bundles and the actual bundle
dependencies.push(bundleName);
nestedDependencies.forEach((nestedDependency) => {
if(allDependencies.indexOf(nestedDependency) === -1) {
allDependencies.push(nestedDependency);
}
});

var requests = dependencies.map((depName)=>this.requireBundle(depName));
if(allDependencies.indexOf(dependency) === -1) {
allDependencies.push(dependency);
}
});

return Ember.$.when(requests);
return allDependencies;
}
/* jshint ignore:end */

});
6 changes: 6 additions & 0 deletions tests/dummy/app/controllers/how.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import Ember from 'ember';

export default Ember.Controller.extend({

});

1 change: 1 addition & 0 deletions tests/dummy/app/templates/how.hbs
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
How could this happen?!
12 changes: 10 additions & 2 deletions tests/dummy/config/bundles.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ module.exports = function(environment) {
"**/components/my-item/**.js"
],

routes: ["index", "..."]
routes: ["index"]
},
about: {
files: [
Expand All @@ -23,7 +23,15 @@ module.exports = function(environment) {
"**/components/my-cat/**.js"
],
dependencies: ["index"],
routes: ["about", "more routes for this bundle "]
routes: ["about"]
},
how: {
files: [
"**/templates/how.js",
"**/controllers/how.js"
],
dependencies: ["about"],
routes: ["how"]
}
}

Expand Down
41 changes: 35 additions & 6 deletions tests/unit/services/bundle-loader-test.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/* jshint expr:true */
import { assert, expect } from 'chai';
import { expect } from 'chai';
import Ember from "ember";
import {
describeModule,
Expand All @@ -14,6 +14,11 @@ describeModule(
needs: ['service:bundle-loader']
},
function() {
beforeEach(function() {
let service = this.subject();
service.set("_promises", {});
});

// Replace this with your real tests.
it('exists', function() {
let service = this.subject();
Expand All @@ -29,21 +34,45 @@ describeModule(
let service = this.subject();

service.getScript = function(url){
return new Ember.RSVP.Promise((resolve /*,reject*/)=>{
setTimeout(()=>resolve(url),1000);
});
return new Ember.RSVP.Promise((resolve) => {
setTimeout(() => resolve(url), 200);
});
};
service.loadBundle("index").then((url)=>{
expect(url[0]).equals["index"];
expect(service._promises["index"]).to.be.ok;
});
});

it('lazily loads dependencies', function() {
assert.fail();
let service = this.subject();

service.getScript = function(url){
return new Ember.RSVP.Promise((resolve) => {
setTimeout(() => resolve(url), 200);
});
};
service.loadBundle("about").then((url)=>{
expect(url[0]).equals["about"];
expect(service._promises["index"]).to.be.ok;
expect(service._promises["about"]).to.be.ok;
});
});

it('lazily loads nested dependencies', function() {
assert.fail();
let service = this.subject();

service.getScript = function(url){
return new Ember.RSVP.Promise((resolve) => {
setTimeout(() => resolve(url), 200);
});
};
service.loadBundle("how").then((url)=>{
expect(url[0]).equals["how"];
expect(service._promises["index"]).to.be.ok;
expect(service._promises["about"]).to.be.ok;
expect(service._promises["how"]).to.be.ok;
});
});
}
);

0 comments on commit 1ba1152

Please sign in to comment.