From 532ef05d4a6c7238b139eeb93b4624fbe5d9681f Mon Sep 17 00:00:00 2001 From: Pepe Cano <825430+ppcano@users.noreply.github.com> Date: Fri, 8 Mar 2019 12:29:37 +0100 Subject: [PATCH 1/5] Addons can provide their resolver module configuration via `addon.resolverConfig()` --- index.js | 63 +++++++++++++++- mu-trees/addon/merge-addons-config.js | 67 +++++++++++++++++ .../tests/unit/merge-addons-config-test.js | 74 +++++++++++++++++++ package.json | 1 + yarn.lock | 11 ++- 5 files changed, 214 insertions(+), 2 deletions(-) create mode 100644 mu-trees/addon/merge-addons-config.js create mode 100644 mu-trees/tests/unit/merge-addons-config-test.js diff --git a/index.js b/index.js index f59eac6c..4d5daef4 100644 --- a/index.js +++ b/index.js @@ -1,5 +1,6 @@ 'use strict'; +var writeFile = require('broccoli-file-creator'); var VersionChecker = require('ember-cli-version-checker'); var path = require('path'); var isModuleUnification; @@ -57,7 +58,61 @@ module.exports = { return new MergeTrees(addonTrees); }, - _moduleUnificationTrees() { + // Trigger exception if the result of `addon.resolverConfig` method has an unexpected format + // Show a warning if there are collisions between addon types or addon collections + validateAddonsConfig: function(addonsConfig) { + + let types = {}; + let collections = {}; + + Object.keys(addonsConfig).forEach(addonName => { + + let addonConfig = addonsConfig[addonName]; + if (addonConfig) { + if (typeof(addonConfig) !== 'object') { + throw new Error(`"addon.resolverConfig" returns an unexpected value. Addon: ${addonName}.`); + } + + let addonTypes = addonConfig.types || {}; + if (typeof(addonTypes) !== 'object') { + throw new Error(`"addon.resolverConfig" returns an unexpected "types" value. Addon: ${addonName}.`); + } + + let addonCollections = addonConfig.collections || {}; + if (typeof(addonCollections) !== 'object') { + throw new Error(`"addon.resolverConfig" returns an unexpected "collections" value. Addon: ${addonName}.`); + } + + Object.keys(addonTypes).forEach(key => { + if (!types.hasOwnProperty(key)) { + types[key] = key; + } else { + this.ui.writeLine(`Addon '${types[key]}' configured the type '${key}' on the resolver, but addon '${addonName}' has overwritten the type '${key}'.`); + } + }); + Object.keys(addonCollections).forEach(key => { + if (!collections.hasOwnProperty(key)) { + collections[key] = key; + } else { + this.ui.writeLine(`Addon '${types[key]}' configured the collection '${key}' on the resolver, but addon '${addonName}' has overwritten the collection '${key}'.`); + } + }); + } + }); + }, + + _moduleUnificationTrees: function() { + + let addonConfigs = {}; + this.project.addons.forEach(addon => { + if (addon.resolverConfig) { + addonConfigs[addon.name] = addon.resolverConfig() || {}; + } + }); + this.validateAddonsConfig(addonConfigs); + + let addonConfigsFileContent = `export default ${JSON.stringify(addonConfigs)};`; + var resolve = require('resolve'); var Funnel = require('broccoli-funnel'); @@ -66,6 +121,11 @@ module.exports = { destDir: 'ember-resolver' }); + var addonsConfigTree = writeFile( + 'ember-resolver/addons-config.js', + addonConfigsFileContent + ); + var glimmerResolverSrc = require.resolve('@glimmer/resolver/package'); var glimmerResolverPath = path.dirname(glimmerResolverSrc); var glimmerResolverTree = new Funnel(glimmerResolverPath, { @@ -80,6 +140,7 @@ module.exports = { }); return [ + this.preprocessJs(addonsConfigTree, { registry: this.registry }), this.preprocessJs(featureTree, { registry: this.registry }), this.preprocessJs(glimmerResolverTree, { registry: this.registry }), this.preprocessJs(glimmerDITree, { registry: this.registry }), diff --git a/mu-trees/addon/merge-addons-config.js b/mu-trees/addon/merge-addons-config.js new file mode 100644 index 00000000..5eed4726 --- /dev/null +++ b/mu-trees/addon/merge-addons-config.js @@ -0,0 +1,67 @@ +/** + This function merges the types and collections from addons `addonsConfig` + into the `config` parameter. + + It will throw an exception if an addon tries to override + an existing type or collection on the resolver config object or + if two addons provide the same type or collection. + + - `config`: is the resolver config generated with `ember-resolver/ember-config` + + - `addonsConfig`: is a hash object containing the result of the call of + `addon.resolverConfig` method on all the project addons. + + ```js + { + my-addon1: { types: { ... } }, + my-addon2: { collections: { ... } }, + hola-addon: { types: { ... }, collections: { ... } } + } + ``` + + The value of `addonsConfig` can be imported from 'ember-resolver/addons-config'. + + Usage: + + ```resolver.js + import Resolver from 'ember-resolver/resolvers/fallback'; + import buildResolverConfig from 'ember-resolver/ember-config'; + import config from '../config/environment'; + import addonsConfig from 'ember-resolver/addons-config'; + import mergeAddonsConfig from 'ember-resolver/merge-addons-config'; + + let moduleConfig = buildResolverConfig(config.modulePrefix); + mergeAddonsConfig(moduleConfig, addonsConfig); + + export default Resolver.extend({ + config: moduleConfig + }); + ``` + */ +export default function mergeAddonsConfig(config, addonsConfig) { + + // This implementation does not allow an addon to overwrite the default MU module resolution. + // Is this the expected behaviour? + Object.keys(addonsConfig).forEach(function (addonName) { + let addonConfig = addonsConfig[addonName]; + let addonTypes = addonConfig.types || {}; + let addonCollections = addonConfig.collections || {}; + + Object.keys(addonTypes).forEach(function (key) { + if (!config.types.hasOwnProperty(key)) { + config.types[key] = addonTypes[key]; + } else { + // A similar validation is done during the build phase on `index.validateAddonsConfig` + throw new Error(`Addon '${addonName}' attempts to configure the type '${key}' on the resolver but '${key}' has already been configured.`); + } + }); + Object.keys(addonCollections).forEach(function (key) { + if (!config.collections.hasOwnProperty(key)) { + config.collections[key] = addonCollections[key]; + } else { + // A similar validation is done during the build phase on `index.validateAddonsConfig` + throw new Error(`Addon '${addonName}' attempts to configure the collection '${key}' on the resolver but '${key}' has already been configured.`); + } + }); + }); +} diff --git a/mu-trees/tests/unit/merge-addons-config-test.js b/mu-trees/tests/unit/merge-addons-config-test.js new file mode 100644 index 00000000..992fe748 --- /dev/null +++ b/mu-trees/tests/unit/merge-addons-config-test.js @@ -0,0 +1,74 @@ +import { module, test } from "qunit"; +import mergeAddonsConfig from "ember-resolver/merge-addons-config"; + +module("ember-resolver/merge-addons-config"); + +const emptyConfig = function() { + return { types: {}, collections: {} }; +}; + +test("Trigger error if two addons configure the same type", function(assert) { + let addonsConfig = { + "my-addon1": { types: { hola: "hola" } }, + "my-addon2": { types: { hola: "adios" } } + }; + + assert.throws(function() { + mergeAddonsConfig(emptyConfig(), addonsConfig); + }); +}); + +test("Trigger error if two addons configure the same collection", function(assert) { + let addonsConfig = { + "my-addon1": { collections: { hola: "hola" } }, + "my-addon2": { collections: { hola: "adios" } } + }; + + assert.throws(function() { + mergeAddonsConfig(emptyConfig(), addonsConfig); + }); +}); + +test("Trigger error if addon overwrite an existing type", function(assert) { + let addonsConfig = { + "my-addon1": { types: { hola: "new-hola" } } + }; + + let config = { types: { hola: "hola" } }; + assert.throws(function() { + mergeAddonsConfig(config, addonsConfig); + }); +}); + +test("Trigger error if addon overwrite an existing collection", function(assert) { + let addonsConfig = { + "my-addon1": { collections: { hola: "new-hola" } } + }; + + let config = { collections: { hola: "hola" } }; + assert.throws(function() { + mergeAddonsConfig(config, addonsConfig); + }); +}); + +test("Can merge collections", function(assert) { + let addonsConfig = { + "my-addon1": { collections: { col1: "foo" } }, + "my-addon2": { collections: { col2: "baz" } } + }; + + let result = emptyConfig(); + mergeAddonsConfig(result, addonsConfig); + assert.deepEqual(result.collections, { col1: "foo", col2: "baz" }); +}); + +test("Can merge types", function(assert) { + let addonsConfig = { + "my-addon1": { types: { col1: "foo" } }, + "my-addon2": { types: { col2: "baz" } } + }; + + let result = emptyConfig(); + mergeAddonsConfig(result, addonsConfig); + assert.deepEqual(result.types, { col1: "foo", col2: "baz" }); +}); diff --git a/package.json b/package.json index 03f7f3c2..a3e20f5e 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "dependencies": { "@glimmer/resolver": "^0.4.1", "babel-plugin-debug-macros": "^0.1.10", + "broccoli-file-creator": "^2.1.1", "broccoli-funnel": "^2.0.2", "broccoli-merge-trees": "^3.0.0", "ember-cli-babel": "^6.16.0", diff --git a/yarn.lock b/yarn.lock index f86322b1..06e2fa93 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1542,6 +1542,14 @@ broccoli-debug@^0.6.4, broccoli-debug@^0.6.5: symlink-or-copy "^1.1.8" tree-sync "^1.2.2" +broccoli-file-creator@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/broccoli-file-creator/-/broccoli-file-creator-2.1.1.tgz#7351dd2496c762cfce7736ce9b49e3fce0c7b7db" + integrity sha512-YpjOExWr92C5vhnK0kmD81kM7U09kdIRZk9w4ZDCDHuHXW+VE/x6AGEOQQW3loBQQ6Jk+k+TSm8dESy4uZsnjw== + dependencies: + broccoli-plugin "^1.1.0" + mkdirp "^0.5.1" + broccoli-filter@^1.0.1: version "1.3.0" resolved "https://registry.yarnpkg.com/broccoli-filter/-/broccoli-filter-1.3.0.tgz#71e3a8e32a17f309e12261919c5b1006d6766de6" @@ -1695,9 +1703,10 @@ broccoli-persistent-filter@^2.1.1: symlink-or-copy "^1.0.1" walk-sync "^0.3.1" -broccoli-plugin@^1.0.0, broccoli-plugin@^1.2.0, broccoli-plugin@^1.2.1, broccoli-plugin@^1.3.0, broccoli-plugin@^1.3.1: +broccoli-plugin@^1.0.0, broccoli-plugin@^1.1.0, broccoli-plugin@^1.2.0, broccoli-plugin@^1.2.1, broccoli-plugin@^1.3.0, broccoli-plugin@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-1.3.1.tgz#a26315732fb99ed2d9fb58f12a1e14e986b4fabd" + integrity sha512-DW8XASZkmorp+q7J4EeDEZz+LoyKLAd2XZULXyD9l4m9/hAKV3vjHmB1kiUshcWAYMgTP1m2i4NnqCE/23h6AQ== dependencies: promise-map-series "^0.2.1" quick-temp "^0.1.3" From 3762945acc00e4cb0279bee3ea937ebd020fad90 Mon Sep 17 00:00:00 2001 From: Pepe Cano <825430+ppcano@users.noreply.github.com> Date: Fri, 8 Mar 2019 19:49:46 +0100 Subject: [PATCH 2/5] Include `resolverConfig` on nested addons --- index.js | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/index.js b/index.js index 4d5daef4..a161559a 100644 --- a/index.js +++ b/index.js @@ -5,6 +5,21 @@ var VersionChecker = require('ember-cli-version-checker'); var path = require('path'); var isModuleUnification; +function mergeRecursivelyAddonResolverConfig(config, addon) { + + if (!config.hasOwnProperty(addon.name)) { + + if (addon.resolverConfig) { + config[addon.name] = addon.resolverConfig() || {}; + } + + addon.addons.forEach(nestedAddon => { + mergeRecursivelyAddonResolverConfig(config, nestedAddon); + }); + } + +} + module.exports = { name: 'ember-resolver', @@ -104,10 +119,9 @@ module.exports = { _moduleUnificationTrees: function() { let addonConfigs = {}; + this.project.addons.forEach(addon => { - if (addon.resolverConfig) { - addonConfigs[addon.name] = addon.resolverConfig() || {}; - } + mergeRecursivelyAddonResolverConfig(addonConfigs, addon); }); this.validateAddonsConfig(addonConfigs); From 4d2995021f4512e42a30b083d5f62a947f598453 Mon Sep 17 00:00:00 2001 From: Pepe Cano <825430+ppcano@users.noreply.github.com> Date: Fri, 8 Mar 2019 20:11:42 +0100 Subject: [PATCH 3/5] `mergeAddonsConfig` is executed within `ember-resolver/ember-config` This change removes the need to call `mergeAddonsConfig` on the `src/resolver.js` app module --- mu-trees/addon/ember-config.js | 118 ++---------------- mu-trees/addon/module-config.js | 109 ++++++++++++++++ .../addon/{ => utils}/merge-addons-config.js | 22 +--- .../{ => utils}/merge-addons-config-test.js | 4 +- 4 files changed, 123 insertions(+), 130 deletions(-) create mode 100644 mu-trees/addon/module-config.js rename mu-trees/addon/{ => utils}/merge-addons-config.js (71%) rename mu-trees/tests/unit/{ => utils}/merge-addons-config-test.js (93%) diff --git a/mu-trees/addon/ember-config.js b/mu-trees/addon/ember-config.js index 624ab7ee..9b4c8948 100644 --- a/mu-trees/addon/ember-config.js +++ b/mu-trees/addon/ember-config.js @@ -1,115 +1,17 @@ -/* - * This config describes canonical Ember, as described in the - * module unification spec: - * - * https://github.com/emberjs/rfcs/blob/master/text/0143-module-unification.md - * - */ +import addonsConfig from 'ember-resolver/addons-config'; +import moduleConfig from 'ember-resolver/module-config'; +import mergeAddonsConfig from 'ember-resolver/utils/merge-addons-config'; + export default function generateConfig(name) { - return { + + let result = { app: { name, rootName: name }, - types: { - adapter: { definitiveCollection: 'models' }, - application: { definitiveCollection: 'main' }, - config: { definitiveCollection: 'config' }, - controller: { definitiveCollection: 'routes' }, - component: { definitiveCollection: 'components' }, - 'component-lookup': { definitiveCollection: 'main' }, - 'component-manager': { definitiveCollection: 'component-managers' }, - event_dispatcher: { definitiveCollection: 'main' }, - helper: { definitiveCollection: 'components' }, - initializer: { definitiveCollection: 'initializers' }, - 'instance-initializers': { definitiveCollection: 'instance-initializer' }, - location: { definitiveCollection: 'main' }, - model: { definitiveCollection: 'models' }, - modifier: { definitiveCollection: 'components' }, - 'modifier-manager': { definitiveCollection: 'modifier-managers' }, - partial: { definitiveCollection: 'partials' }, - renderer: { definitiveCollection: 'main' }, - route: { definitiveCollection: 'routes' }, - router: { definitiveCollection: 'main' }, - 'route-map': { definitiveCollection: 'main' }, - serializer: { definitiveCollection: 'models' }, - service: { definitiveCollection: 'services' }, - template: { definitiveCollection: 'components' }, - 'template-compiler': { definitiveCollection: 'main' }, - transform: { definitiveCollection: 'transforms' }, - view: { definitiveCollection: 'views' }, - '-view-registry': { definitiveCollection: 'main' }, - '-bucket-cache': { definitiveCollection: 'main' }, - '-environment': { definitiveCollection: 'main' }, - '-application-instance': { definitiveCollection: 'main' } - }, - collections: { - 'main': { - types: ['router', '-bucket-cache', 'component-lookup', '-view-registry', 'event_dispatcher', 'application', 'location', 'renderer', '-environment', '-application-instance', 'route-map'] - }, - components: { - group: 'ui', - privateCollections: ['utils'], - types: ['component', 'helper', 'template', 'modifier'] - }, - 'component-managers': { - types: ['component-manager'] - }, - config: { - unresolvable: true - }, - initializers: { - group: 'init', - defaultType: 'initializer', - privateCollections: ['utils'], - types: ['initializer'] - }, - 'instance-initializers': { - group: 'init', - defaultType: 'instance-initializer', - privateCollections: ['utils'], - types: ['instance-initializers'] - }, - models: { - group: 'data', - defaultType: 'model', - privateCollections: ['utils'], - types: ['model', 'adapter', 'serializer'] - }, - 'modifier-managers': { - types: ['modifier-manager'] - }, - partials: { - group: 'ui', - defaultType: 'partial', - privateCollections: ['utils'], - types: ['partial'] - }, - routes: { - group: 'ui', - defaultType: 'route', - privateCollections: ['components', 'utils'], - types: ['route', 'controller', 'template'] - }, - services: { - defaultType: 'service', - privateCollections: ['utils'], - types: ['service'] - }, - utils: { - unresolvable: true - }, - views: { - defaultType: 'view', - privateCollections: ['utils'], - types: ['view'] - }, - transforms: { - group: 'data', - defaultType: 'transform', - privateCollections: ['utils'], - types: ['transform'] - } - } }; + + mergeAddonsConfig(moduleConfig, addonsConfig); + + return Object.assign(result, moduleConfig); } diff --git a/mu-trees/addon/module-config.js b/mu-trees/addon/module-config.js new file mode 100644 index 00000000..f6cae730 --- /dev/null +++ b/mu-trees/addon/module-config.js @@ -0,0 +1,109 @@ +/* + * This config describes canonical Ember, as described in the + * module unification spec: + * + * https://github.com/emberjs/rfcs/blob/master/text/0143-module-unification.md + * + */ +export default { + types: { + adapter: { definitiveCollection: 'models' }, + application: { definitiveCollection: 'main' }, + config: { definitiveCollection: 'config' }, + controller: { definitiveCollection: 'routes' }, + component: { definitiveCollection: 'components' }, + 'component-lookup': { definitiveCollection: 'main' }, + 'component-manager': { definitiveCollection: 'component-managers' }, + event_dispatcher: { definitiveCollection: 'main' }, + helper: { definitiveCollection: 'components' }, + initializer: { definitiveCollection: 'initializers' }, + 'instance-initializers': { definitiveCollection: 'instance-initializer' }, + location: { definitiveCollection: 'main' }, + model: { definitiveCollection: 'models' }, + modifier: { definitiveCollection: 'components' }, + 'modifier-manager': { definitiveCollection: 'modifier-managers' }, + partial: { definitiveCollection: 'partials' }, + renderer: { definitiveCollection: 'main' }, + route: { definitiveCollection: 'routes' }, + router: { definitiveCollection: 'main' }, + 'route-map': { definitiveCollection: 'main' }, + serializer: { definitiveCollection: 'models' }, + service: { definitiveCollection: 'services' }, + template: { definitiveCollection: 'components' }, + 'template-compiler': { definitiveCollection: 'main' }, + transform: { definitiveCollection: 'transforms' }, + view: { definitiveCollection: 'views' }, + '-view-registry': { definitiveCollection: 'main' }, + '-bucket-cache': { definitiveCollection: 'main' }, + '-environment': { definitiveCollection: 'main' }, + '-application-instance': { definitiveCollection: 'main' } + }, + collections: { + 'main': { + types: ['router', '-bucket-cache', 'component-lookup', '-view-registry', 'event_dispatcher', 'application', 'location', 'renderer', '-environment', '-application-instance', 'route-map'] + }, + components: { + group: 'ui', + privateCollections: ['utils'], + types: ['component', 'helper', 'template', 'modifier'] + }, + 'component-managers': { + types: ['component-manager'] + }, + config: { + unresolvable: true + }, + initializers: { + group: 'init', + defaultType: 'initializer', + privateCollections: ['utils'], + types: ['initializer'] + }, + 'instance-initializers': { + group: 'init', + defaultType: 'instance-initializer', + privateCollections: ['utils'], + types: ['instance-initializers'] + }, + models: { + group: 'data', + defaultType: 'model', + privateCollections: ['utils'], + types: ['model', 'adapter', 'serializer'] + }, + 'modifier-managers': { + types: ['modifier-manager'] + }, + partials: { + group: 'ui', + defaultType: 'partial', + privateCollections: ['utils'], + types: ['partial'] + }, + routes: { + group: 'ui', + defaultType: 'route', + privateCollections: ['components', 'utils'], + types: ['route', 'controller', 'template'] + }, + services: { + defaultType: 'service', + privateCollections: ['utils'], + types: ['service'] + }, + utils: { + unresolvable: true + }, + views: { + defaultType: 'view', + privateCollections: ['utils'], + types: ['view'] + }, + transforms: { + group: 'data', + defaultType: 'transform', + privateCollections: ['utils'], + types: ['transform'] + } + } +}; diff --git a/mu-trees/addon/merge-addons-config.js b/mu-trees/addon/utils/merge-addons-config.js similarity index 71% rename from mu-trees/addon/merge-addons-config.js rename to mu-trees/addon/utils/merge-addons-config.js index 5eed4726..f23785b8 100644 --- a/mu-trees/addon/merge-addons-config.js +++ b/mu-trees/addon/utils/merge-addons-config.js @@ -1,6 +1,5 @@ /** - This function merges the types and collections from addons `addonsConfig` - into the `config` parameter. + This function provides the types and collections from addons `addonsConfig` to `ember-config`. It will throw an exception if an addon tries to override an existing type or collection on the resolver config object or @@ -19,24 +18,7 @@ } ``` - The value of `addonsConfig` can be imported from 'ember-resolver/addons-config'. - - Usage: - - ```resolver.js - import Resolver from 'ember-resolver/resolvers/fallback'; - import buildResolverConfig from 'ember-resolver/ember-config'; - import config from '../config/environment'; - import addonsConfig from 'ember-resolver/addons-config'; - import mergeAddonsConfig from 'ember-resolver/merge-addons-config'; - - let moduleConfig = buildResolverConfig(config.modulePrefix); - mergeAddonsConfig(moduleConfig, addonsConfig); - - export default Resolver.extend({ - config: moduleConfig - }); - ``` + The value of `addonsConfig` is be imported from 'ember-resolver/addons-config'. */ export default function mergeAddonsConfig(config, addonsConfig) { diff --git a/mu-trees/tests/unit/merge-addons-config-test.js b/mu-trees/tests/unit/utils/merge-addons-config-test.js similarity index 93% rename from mu-trees/tests/unit/merge-addons-config-test.js rename to mu-trees/tests/unit/utils/merge-addons-config-test.js index 992fe748..cdd3971f 100644 --- a/mu-trees/tests/unit/merge-addons-config-test.js +++ b/mu-trees/tests/unit/utils/merge-addons-config-test.js @@ -1,7 +1,7 @@ import { module, test } from "qunit"; -import mergeAddonsConfig from "ember-resolver/merge-addons-config"; +import mergeAddonsConfig from "ember-resolver/utils/merge-addons-config"; -module("ember-resolver/merge-addons-config"); +module("ember-resolver/utils/merge-addons-config"); const emptyConfig = function() { return { types: {}, collections: {} }; From 00ba6fca7d17c5847bad5d2fe463aa55dee5ac09 Mon Sep 17 00:00:00 2001 From: Pepe Cano <825430+ppcano@users.noreply.github.com> Date: Sun, 10 Mar 2019 06:35:36 +0100 Subject: [PATCH 4/5] Fix `mergeAddonsConfig` comments --- mu-trees/addon/utils/merge-addons-config.js | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/mu-trees/addon/utils/merge-addons-config.js b/mu-trees/addon/utils/merge-addons-config.js index f23785b8..e4e249cf 100644 --- a/mu-trees/addon/utils/merge-addons-config.js +++ b/mu-trees/addon/utils/merge-addons-config.js @@ -1,11 +1,11 @@ -/** - This function provides the types and collections from addons `addonsConfig` to `ember-config`. +/* + This function merges the types and collections from addons `addonsConfig` into `config`. It will throw an exception if an addon tries to override an existing type or collection on the resolver config object or if two addons provide the same type or collection. - - `config`: is the resolver config generated with `ember-resolver/ember-config` + - `config`: is a resolver config object. - `addonsConfig`: is a hash object containing the result of the call of `addon.resolverConfig` method on all the project addons. @@ -17,13 +17,9 @@ hola-addon: { types: { ... }, collections: { ... } } } ``` - - The value of `addonsConfig` is be imported from 'ember-resolver/addons-config'. */ export default function mergeAddonsConfig(config, addonsConfig) { - // This implementation does not allow an addon to overwrite the default MU module resolution. - // Is this the expected behaviour? Object.keys(addonsConfig).forEach(function (addonName) { let addonConfig = addonsConfig[addonName]; let addonTypes = addonConfig.types || {}; @@ -33,7 +29,6 @@ export default function mergeAddonsConfig(config, addonsConfig) { if (!config.types.hasOwnProperty(key)) { config.types[key] = addonTypes[key]; } else { - // A similar validation is done during the build phase on `index.validateAddonsConfig` throw new Error(`Addon '${addonName}' attempts to configure the type '${key}' on the resolver but '${key}' has already been configured.`); } }); @@ -41,7 +36,6 @@ export default function mergeAddonsConfig(config, addonsConfig) { if (!config.collections.hasOwnProperty(key)) { config.collections[key] = addonCollections[key]; } else { - // A similar validation is done during the build phase on `index.validateAddonsConfig` throw new Error(`Addon '${addonName}' attempts to configure the collection '${key}' on the resolver but '${key}' has already been configured.`); } }); From 0f519c8c3588b5911925145ee66583a074219326 Mon Sep 17 00:00:00 2001 From: Pepe Cano <825430+ppcano@users.noreply.github.com> Date: Sun, 10 Mar 2019 06:38:36 +0100 Subject: [PATCH 5/5] Refactor: rename `result` to `config` --- mu-trees/addon/ember-config.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mu-trees/addon/ember-config.js b/mu-trees/addon/ember-config.js index 9b4c8948..da0ae5b0 100644 --- a/mu-trees/addon/ember-config.js +++ b/mu-trees/addon/ember-config.js @@ -4,7 +4,7 @@ import mergeAddonsConfig from 'ember-resolver/utils/merge-addons-config'; export default function generateConfig(name) { - let result = { + let config = { app: { name, rootName: name @@ -13,5 +13,5 @@ export default function generateConfig(name) { mergeAddonsConfig(moduleConfig, addonsConfig); - return Object.assign(result, moduleConfig); + return Object.assign(config, moduleConfig); }