diff --git a/packages/addon-dev/src/rollup-app-reexports.ts b/packages/addon-dev/src/rollup-app-reexports.ts index 4f5750141..46e683041 100644 --- a/packages/addon-dev/src/rollup-app-reexports.ts +++ b/packages/addon-dev/src/rollup-app-reexports.ts @@ -7,6 +7,7 @@ export default function appReexports(opts: { from: string; to: string; include: string[]; + exclude?: string[]; mapFilename?: (filename: string) => string; exports?: (filename: string) => string[] | string | undefined; }): Plugin { @@ -26,7 +27,8 @@ export default function appReexports(opts: { if ( opts.include.some((glob) => minimatch(addonFilename, glob)) && - !minimatch(addonFilename, '**/*.d.ts') + !minimatch(addonFilename, '**/*.d.ts') && + opts.exclude?.some((glob) => minimatch(addonFilename, glob)) !== true ) { appJS[`./${appFilename}`] = `./dist/_app_/${appFilename}`; this.emitFile({ diff --git a/packages/addon-dev/src/rollup-public-entrypoints.ts b/packages/addon-dev/src/rollup-public-entrypoints.ts index 29cc2a560..e0839b13e 100644 --- a/packages/addon-dev/src/rollup-public-entrypoints.ts +++ b/packages/addon-dev/src/rollup-public-entrypoints.ts @@ -11,6 +11,7 @@ function normalizeFileExt(fileName: string) { export default function publicEntrypoints(args: { srcDir: string; include: string[]; + exclude?: string[]; }): Plugin { return { name: 'addon-modules', @@ -19,6 +20,7 @@ export default function publicEntrypoints(args: { let matches = walkSync(args.srcDir, { globs: [...args.include, '**/*.hbs', '**/*.ts', '**/*.gts', '**/*.gjs'], + ignore: args.exclude, }); for (let name of matches) { diff --git a/packages/addon-dev/src/rollup.ts b/packages/addon-dev/src/rollup.ts index a24b5e40f..ae0d077a7 100644 --- a/packages/addon-dev/src/rollup.ts +++ b/packages/addon-dev/src/rollup.ts @@ -26,6 +26,7 @@ export class Addon { opts: { mapFilename?: (fileName: string) => string; exports?: (filename: string) => string[] | string | undefined; + exclude?: string[]; } = {} ): Plugin { return appReexports({ @@ -34,14 +35,19 @@ export class Addon { include: patterns, mapFilename: opts.mapFilename, exports: opts.exports, + exclude: opts.exclude, }); } // This configures rollup to emit public entrypoints for each module in your // srcDir that matches one of the given globs. Typical addons will want to // match patterns like "components/**/*.js", "index.js", and "test-support.js". - publicEntrypoints(patterns: string[]) { - return publicEntrypoints({ srcDir: this.#srcDir, include: patterns }); + publicEntrypoints(patterns: string[], opts: { exclude?: string[] } = {}) { + return publicEntrypoints({ + srcDir: this.#srcDir, + include: patterns, + exclude: opts.exclude, + }); } // This wraps standalone .hbs files as Javascript files using inline diff --git a/tests/scenarios/v2-addon-dev-test.ts b/tests/scenarios/v2-addon-dev-test.ts index 6bb226ab6..c0ad046f8 100644 --- a/tests/scenarios/v2-addon-dev-test.ts +++ b/tests/scenarios/v2-addon-dev-test.ts @@ -62,10 +62,13 @@ appScenarios plugins: [ addon.publicEntrypoints([ 'components/**/*.js', - ]), + ], { + exclude: ['**/-excluded/**/*'], + }), addon.appReexports(['components/**/*.js'], { mapFilename: (name) => reexportMappings[name] || name, + exclude: ['**/-excluded/**/*'], }), addon.hbs(), @@ -141,6 +144,11 @@ appScenarios
{{transformMe}}
`, }, + '-excluded': { + 'never-import-this.js': ` + throw new Exception('This should never have been imported!'); + `, + }, }, }, }); @@ -241,11 +249,17 @@ appScenarios }); }); - test('the addon was built successfully', async function () { + test('the addon has expected public entrypoints', async function () { + expectFile('dist/components/demo/index.js').exists(); + expectFile('dist/components/demo/out.js').exists(); + expectFile('dist/components/demo/namespace-me.js').exists(); + expectFile('dist/components/-excluded/never-import-this.js').doesNotExist(); + }); + + test('the addon has expected app-reexports', async function () { expectFile('dist/_app_/components/demo/index.js').matches( 'export { default } from "v2-addon/components/demo/index"' ); - expectFile('dist/_app_/components/demo/out.js').matches( 'export { default } from "v2-addon/components/demo/out"' );