ember-cli
Version:
Command line tool for developing ambitious ember.js apps
75 lines (60 loc) • 2.45 kB
JavaScript
;
function unscope(name) {
if (name[0] !== '@') {
return name;
}
return name.slice(name.indexOf('/') + 1);
}
let HAS_FOUND_ADDON_BY_NAME = Object.create(null);
let HAS_FOUND_ADDON_BY_UNSCOPED_NAME = Object.create(null);
/*
Finds an addon given a specific name. Due to older versions of ember-cli
not properly supporting scoped packages it was (at one point) common practice
to have `package.json` include a scoped name but `index.js` having an unscoped
name.
Changes to the blueprints and addon model (in ~ 3.4+) have made it much clearer
that both `package.json` and `index.js` `name`'s should match. At some point
this will be "forced" and no longer optional.
This function is attempting to prioritize matching across all of the combinations
(in this priority order):
- package.json name matches requested name exactly
- index.js name matches requested name exactly
- unscoped (leaf portion) index.js name matches unscoped requested name
*/
module.exports = function findAddonByName(addons, name) {
let unscopedName = unscope(name);
let exactMatchFromPkg = addons.find(addon => addon.pkg && addon.pkg.name === name);
if (exactMatchFromPkg) {
return exactMatchFromPkg;
}
let exactMatchFromIndex = addons.find(addon => addon.name === name);
if (exactMatchFromIndex) {
let pkg = exactMatchFromIndex.pkg;
if (HAS_FOUND_ADDON_BY_NAME[name] !== true) {
HAS_FOUND_ADDON_BY_NAME[name] = true;
console.warn(
`The addon at \`${exactMatchFromIndex.root}\` has different values in its addon index.js ('${
exactMatchFromIndex.name
}') and its package.json ('${pkg && pkg.name}').`
);
}
return exactMatchFromIndex;
}
let unscopedMatchFromIndex = addons.find(addon => addon.name && unscope(addon.name) === unscopedName);
if (unscopedMatchFromIndex) {
if (HAS_FOUND_ADDON_BY_UNSCOPED_NAME[name] !== true) {
HAS_FOUND_ADDON_BY_UNSCOPED_NAME[name] = true;
console.trace(
`Finding a scoped addon via its unscoped name is deprecated. You searched for \`${name}\` which we found as \`${
unscopedMatchFromIndex.name
}\` in '${unscopedMatchFromIndex.root}'`
);
}
return unscopedMatchFromIndex;
}
return null;
};
module.exports._clearCaches = function() {
HAS_FOUND_ADDON_BY_NAME = Object.create(null);
HAS_FOUND_ADDON_BY_UNSCOPED_NAME = Object.create(null);
};