diff --git a/packages/addon-dev/src/rollup-app-reexports.ts b/packages/addon-dev/src/rollup-app-reexports.ts index 7f9a3a15d..0e87da532 100644 --- a/packages/addon-dev/src/rollup-app-reexports.ts +++ b/packages/addon-dev/src/rollup-app-reexports.ts @@ -6,22 +6,25 @@ export default function appReexports(opts: { from: string; to: string; include: string[]; + mapFilename?: (filename: string) => string; }): Plugin { return { name: 'app-reexports', generateBundle(_, bundle) { let pkg = readJsonSync('package.json'); let appJS: Record = {}; - for (let filename of Object.keys(bundle)) { + for (let addonFilename of Object.keys(bundle)) { + let appFilename = opts.mapFilename?.(addonFilename) ?? addonFilename; + if ( - opts.include.some((glob) => minimatch(filename, glob)) && - !minimatch(filename, '**/*.d.ts') + opts.include.some((glob) => minimatch(addonFilename, glob)) && + !minimatch(addonFilename, '**/*.d.ts') ) { - appJS[`./${filename}`] = `./dist/_app_/${filename}`; + appJS[`./${appFilename}`] = `./dist/_app_/${appFilename}`; this.emitFile({ type: 'asset', - fileName: `_app_/${filename}`, - source: `export { default } from "${pkg.name}/${filename}";\n`, + fileName: `_app_/${appFilename}`, + source: `export { default } from "${pkg.name}/${addonFilename}";\n`, }); } } diff --git a/packages/addon-dev/src/rollup.ts b/packages/addon-dev/src/rollup.ts index 70661b3b7..6e8a39d3c 100644 --- a/packages/addon-dev/src/rollup.ts +++ b/packages/addon-dev/src/rollup.ts @@ -18,11 +18,15 @@ export class Addon { // Given a list of globs describing modules in your srcDir, this generates // corresponding appTree modules that contain reexports, and updates your // package.json metadata to list them all. - appReexports(patterns: string[]): Plugin { + appReexports( + patterns: string[], + opts: { mapFilename?: (fileName: string) => string } = {} + ): Plugin { return appReexports({ from: this.#srcDir, to: this.#destDir, include: patterns, + mapFilename: opts.mapFilename, }); } diff --git a/tests/scenarios/v2-addon-dev-test.ts b/tests/scenarios/v2-addon-dev-test.ts index 85a05ff30..bd819ad1e 100644 --- a/tests/scenarios/v2-addon-dev-test.ts +++ b/tests/scenarios/v2-addon-dev-test.ts @@ -51,6 +51,10 @@ appScenarios destDir: 'dist', }); + const reexportMappings = { + 'components/demo/namespace-me.js': 'components/demo/namespace/namespace-me.js', + }; + export default { output: addon.output(), @@ -62,7 +66,10 @@ appScenarios addon.appReexports([ 'components/demo/index.js', 'components/demo/out.js', - ]), + 'components/demo/namespace-me.js', + ], { + mapFilename: (name) => reexportMappings[name] || name, + }), addon.hbs(), addon.dependencies(), @@ -84,6 +91,9 @@ appScenarios 'out.hbs': ` {{yield}} `, + 'namespace-me.hbs': ` + namespaced component + `, 'index.js': ` import Component from '@glimmer/component'; import { tracked } from '@glimmer/tracking'; @@ -149,6 +159,12 @@ appScenarios assert.dom('out').containsText('hi'); }); + + test('', async function (assert) { + await render(hbs\`\`); + + assert.dom().containsText('namespaced component'); + }); }); `, }, @@ -180,6 +196,7 @@ appScenarios assert.deepEqual(reExports, { './components/demo/index.js': './dist/_app_/components/demo/index.js', './components/demo/out.js': './dist/_app_/components/demo/out.js', + './components/demo/namespace/namespace-me.js': './dist/_app_/components/demo/namespace/namespace-me.js', }); });