diff --git a/src/prefixer/RopmModule.spec.ts b/src/prefixer/RopmModule.spec.ts index c5ac1d7..f65dbe3 100644 --- a/src/prefixer/RopmModule.spec.ts +++ b/src/prefixer/RopmModule.spec.ts @@ -68,6 +68,46 @@ describe('RopmModule', () => { await module.init(); expect(module.isValid).to.be.false; }); + + it('uses preferredPrefix when no alias is given', async () => { + const [promises] = createProjects(hostDir, hostDir, { + name: 'host', + dependencies: [{ + name: '@rokucommunity/promises', + ropm: { + preferredPrefix: 'promises' + } + }] + }); + await promises.init(); + expect(promises.ropmModuleName).to.equal('promises'); + }); + + it('ignores preferredPrefix when a user alias is given', async () => { + const [promises] = createProjects(hostDir, hostDir, { + name: 'host', + dependencies: [{ + name: '@rokucommunity/promises', + alias: 'mypkg', + ropm: { + preferredPrefix: 'promises' + } + }] + }); + await promises.init(); + expect(promises.ropmModuleName).to.equal('mypkg'); + }); + + it('uses default derived prefix when preferredPrefix is absent', async () => { + const [promises] = createProjects(hostDir, hostDir, { + name: 'host', + dependencies: [{ + name: '@rokucommunity/promises' + }] + }); + await promises.init(); + expect(promises.ropmModuleName).to.equal('rokucommunity_promises'); + }); }); describe('createPrefixMap', () => { diff --git a/src/prefixer/RopmModule.ts b/src/prefixer/RopmModule.ts index 8833138..cebdca6 100644 --- a/src/prefixer/RopmModule.ts +++ b/src/prefixer/RopmModule.ts @@ -147,6 +147,16 @@ export class RopmModule { this.npmModuleName = this.packageJson.name; + //detect if the user supplied an explicit alias at install time by comparing the local name vs the resolved package name + const hasUserAlias = this.npmAliasName.toLowerCase() !== this.npmModuleName.toLowerCase(); + + //apply preferredPrefix only when the user did not provide an explicit alias + if (!hasUserAlias && this.packageJson.ropm?.preferredPrefix) { + const defaultPrefix = this.ropmModuleName; + this.ropmModuleName = this.packageJson.ropm.preferredPrefix; + this.logger.info(`Using preferredPrefix "${this.ropmModuleName}" for "${this.npmModuleName}" (overrides default prefix "${defaultPrefix}")`); + } + //disallow using `noprefix` within dependencies if (this.packageJson.ropm?.noprefix) { this.logger.error(`Using "ropm.noprefix" in a ropm module is forbidden: "${path.join(this.moduleDir, 'package.json')}`); diff --git a/src/util.ts b/src/util.ts index 6af2527..fc60d8e 100644 --- a/src/util.ts +++ b/src/util.ts @@ -348,6 +348,12 @@ export interface RopmOptions { */ noprefix?: string[]; + /** + * A preferred prefix for this module to suggest to consumers. When a consumer installs this module + * without an explicit alias, this prefix will be used instead of the auto-derived one. + */ + preferredPrefix?: string; + /** * What level of ropm's internal logging should be performed */