diff --git a/app/mixins/app-builder.js b/app/mixins/app-builder.js index bba30c19..ac1a1020 100644 --- a/app/mixins/app-builder.js +++ b/app/mixins/app-builder.js @@ -33,5 +33,5 @@ export default Ember.Mixin.create({ yield timeout(500); yield this.get('buildApp').perform(); } - }).restartable(), + }).restartable() }); diff --git a/app/services/dependency-resolver.js b/app/services/dependency-resolver.js index 9083e638..d79ad3cd 100644 --- a/app/services/dependency-resolver.js +++ b/app/services/dependency-resolver.js @@ -1,5 +1,6 @@ import Ember from 'ember'; import config from '../config/environment'; +import { task, timeout } from 'ember-concurrency'; const EMBER_VERSIONS = ['2.5.0', '2.4.5', '2.3.2', '2.2.2', '2.1.2', '2.0.3', '1.13.13', '1.12.2']; const EMBER_DATA_VERSIONS = ['2.5.0', '2.4.3', '2.3.3', '2.2.1', '2.1.0', '2.0.1', '1.13.15']; @@ -43,34 +44,50 @@ export default Ember.Service.extend({ }, resolveAddons: function(addons, dependencies) { - let addonPromises = {}; - Object.keys(addons).forEach((name) => { - var value = addons[name]; - - addonPromises[name] = this.resolveAddon(name, value); + const taskInstance = this.get('resolveAddonsTask').perform(addons, dependencies); + return taskInstance.then(() => { + return RSVP.resolve(taskInstance.value); }); + }, - return RSVP.hash(addonPromises).then(hash => { - Object.keys(addons).forEach((name) => { - let addon = hash[name]; - if(addon.status === 'build_success') { + resolveAddonsTask: task(function *(addons, dependencies) { + let done = false; + while (!done) { + let addonPromises = {}; + let addonNames = Object.keys(addons); + for (let i = 0; i < addonNames.length; ++i) { + const name = addonNames[i]; + const value = addons[name]; + addonPromises[name] = this.resolveAddon(name, value); + } + let hash = yield RSVP.hash(addonPromises); + let allAddonsLoaded = true; + for (let j = 0; j < addonNames.length; ++j) { + const name = addonNames[j]; + const addon = hash[name]; + if (addon.status === 'build_success') { dependencies[name] = addon.addon_js; dependencies[name+'_css'] = addon.addon_css; console.log(`Addon ${name} is loaded...`); - } - else if (addon.status === 'building') { - console.log(`Addon ${name} is currently building...`); - console.log(`Joost will have to implement some sort of refresh logic here..`); - } - else if (addon.status === 'build_error') { + delete addons[name]; + } else if (addon.status === 'building') { + console.log(`Addon ${name} is still building...`); + allAddonsLoaded = false; + } else if (addon.status === 'build_error') { console.error(`Addon ${name} encountered a build error:`); console.error(addon.errors, addon.ember_errors); - console.log(`Joost will have to implement some sort of error logic here..`); + allAddonsLoaded = false; + throw addon; } - }); - return RSVP.resolve(dependencies); - }); - }, + } + if (allAddonsLoaded) { + done = true; + } else { + yield timeout(1000); + } + } + return dependencies; + }), resolveAddon(name, value) { return new RSVP.Promise(function(resolve) { diff --git a/mirage/config.js b/mirage/config.js index 62d5c186..a71ec344 100644 --- a/mirage/config.js +++ b/mirage/config.js @@ -1,4 +1,5 @@ import AddonFixture from "./fixtures/addon"; +import config from "../config/environment"; export default function() {} @@ -25,7 +26,7 @@ export function testConfig() { return schema.db.users.find(1); }); - this.get('https://nl1fctyzr7.execute-api.us-east-1.amazonaws.com/staging/addon', function() { + this.get(config.addonUrl, function() { return AddonFixture; }); } diff --git a/mirage/fixtures/addon.js b/mirage/fixtures/addon.js index af199838..222e2846 100644 --- a/mirage/fixtures/addon.js +++ b/mirage/fixtures/addon.js @@ -1,8 +1,8 @@ export default { "status": "build_success", "status_date": "2016-03-21T01:55:42.140Z", - "addon_js": "//s3.amazonaws.com/addons-test/ember-1.13.15/ember-truth-helpers/1.2.0/addon.js", - "addon_css": "//s3.amazonaws.com/addons-test/ember-1.13.15/ember-truth-helpers/1.2.0/addon.css", + "addon_js": "//s3.amazonaws.com/ember-twiddle-addons-beta/ember-1.13.15/ember-truth-helpers/1.2.0/addon.js", + "addon_css": "//s3.amazonaws.com/ember-twiddle-addons-beta/ember-1.13.15/ember-truth-helpers/1.2.0/addon.css", "errors": null, "ember_errors": null }; diff --git a/tests/acceptance/addons-test.js b/tests/acceptance/addons-test.js index 8a7757d0..abd06cc6 100644 --- a/tests/acceptance/addons-test.js +++ b/tests/acceptance/addons-test.js @@ -1,5 +1,5 @@ import Ember from 'ember'; -import { module, skip } from 'qunit'; +import { module, test } from 'qunit'; import startApp from 'ember-twiddle/tests/helpers/start-app'; module('Acceptance | addons', { @@ -15,7 +15,7 @@ module('Acceptance | addons', { } }); -skip('Addons work', function(assert) { +test('Addons work', function(assert) { const files = [ {