diff --git a/packages/addon-dev/src/rollup-app-reexports.ts b/packages/addon-dev/src/rollup-app-reexports.ts index 036852367..4f5750141 100644 --- a/packages/addon-dev/src/rollup-app-reexports.ts +++ b/packages/addon-dev/src/rollup-app-reexports.ts @@ -8,6 +8,7 @@ export default function appReexports(opts: { to: string; include: string[]; mapFilename?: (filename: string) => string; + exports?: (filename: string) => string[] | string | undefined; }): Plugin { return { name: 'app-reexports', @@ -16,6 +17,12 @@ export default function appReexports(opts: { let appJS: Record = {}; for (let addonFilename of Object.keys(bundle)) { let appFilename = opts.mapFilename?.(addonFilename) ?? addonFilename; + let appExports = opts.exports?.(addonFilename) || ['default']; + + let computedExports = + typeof appExports === 'string' + ? appExports + : `{ ${appExports.join(', ')} }`; if ( opts.include.some((glob) => minimatch(addonFilename, glob)) && @@ -25,10 +32,9 @@ export default function appReexports(opts: { this.emitFile({ type: 'asset', fileName: `_app_/${appFilename}`, - source: `export { default } from "${pkg.name}/${addonFilename.slice( - 0, - -extname(addonFilename).length - )}";\n`, + source: `export ${computedExports} from "${ + pkg.name + }/${addonFilename.slice(0, -extname(addonFilename).length)}";\n`, }); } } diff --git a/packages/addon-dev/src/rollup.ts b/packages/addon-dev/src/rollup.ts index d9c2de344..a24b5e40f 100644 --- a/packages/addon-dev/src/rollup.ts +++ b/packages/addon-dev/src/rollup.ts @@ -23,13 +23,17 @@ export class Addon { // package.json metadata to list them all. appReexports( patterns: string[], - opts: { mapFilename?: (fileName: string) => string } = {} + opts: { + mapFilename?: (fileName: string) => string; + exports?: (filename: string) => string[] | string | undefined; + } = {} ): Plugin { return appReexports({ from: this.#srcDir, to: this.#destDir, include: patterns, mapFilename: opts.mapFilename, + exports: opts.exports, }); } diff --git a/tests/scenarios/v2-addon-dev-typescript-test.ts b/tests/scenarios/v2-addon-dev-typescript-test.ts index f0c65fc2a..07c1f9cc3 100644 --- a/tests/scenarios/v2-addon-dev-typescript-test.ts +++ b/tests/scenarios/v2-addon-dev-typescript-test.ts @@ -21,6 +21,9 @@ appScenarios addon.pkg.scripts = { build: 'node ./node_modules/rollup/dist/bin/rollup -c ./rollup.config.mjs', }; + addon.pkg['ember-addon']['app-js'] = { + './components/previously-added.js': './dist/_app_/components/previously-added.js', + }; merge(addon.files, { 'babel.config.json': ` @@ -91,14 +94,25 @@ appScenarios plugins: [ addon.publicEntrypoints([ 'components/**/*.js', + 'initializers/**/*.js', + 'utils/**/*.js', ]), addon.appReexports([ 'components/demo/index.js', 'components/demo/out.js', 'components/demo/namespace-me.js', + 'initializers/**/*.js', + 'utils/**/*.js', ], { mapFilename: (name) => reexportMappings[name] || name, + exports: (name) => { + if (name.startsWith('initializers/')) { + return ['default', 'initialize']; + } else if (name.startsWith('utils/')) { + return '*'; + } + } }), addon.dependencies(), @@ -167,6 +181,25 @@ appScenarios `, }, }, + initializers: { + 'demo.js': ` + export function initialize() { + // Wow, we're doing the init in the app + } + + export default { + name: 'demo', + initialize, + }; + `, + }, + utils: { + 'demo-util.js': ` + export function demoUtil() { + return 42; + } + `, + }, }, }); @@ -250,6 +283,8 @@ appScenarios './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', + './initializers/demo.js': './dist/_app_/initializers/demo.js', + './utils/demo-util.js': './dist/_app_/utils/demo-util.js', }); }); @@ -260,6 +295,8 @@ appScenarios './dist/_app_/components/demo/out.js': 'export { default } from "v2-addon/components/demo/out";\n', './dist/_app_/components/demo/namespace/namespace-me.js': 'export { default } from "v2-addon/components/demo/namespace-me";\n', + './dist/_app_/initializers/demo.js': 'export { default, initialize } from "v2-addon/initializers/demo";\n', + './dist/_app_/utils/demo-util.js': 'export * from "v2-addon/utils/demo-util";\n', }; assert.strictEqual(