From 653ddf6f45a2553ff7676251afd12b7221115ef9 Mon Sep 17 00:00:00 2001 From: Simon Ihmig Date: Wed, 16 Oct 2024 23:01:39 +0200 Subject: [PATCH] Introduce config/addons.js for addon macro-config --- packages/macros/src/macros-config.ts | 20 +++++ .../macros/tests/babel/addon-config.test.ts | 75 +++++++++++++++++++ tests/fixtures/macro-test/config/addons.js | 7 ++ .../components/cross-package-config-test.js | 4 + 4 files changed, 106 insertions(+) create mode 100644 packages/macros/tests/babel/addon-config.test.ts create mode 100644 tests/fixtures/macro-test/config/addons.js diff --git a/packages/macros/src/macros-config.ts b/packages/macros/src/macros-config.ts index 641b2eb6ca..2ced687dd3 100644 --- a/packages/macros/src/macros-config.ts +++ b/packages/macros/src/macros-config.ts @@ -177,6 +177,26 @@ export default class MacrosConfig { // true to distinguish the two. isTesting: false, }; + + this.loadAddonConfigFile(); + } + + private loadAddonConfigFile() { + let addonConfig: Record; + + try { + // eslint-disable-next-line @typescript-eslint/no-require-imports + addonConfig = require(join(this.appRoot, 'config', 'addons')); + } catch (e) { + if (e.code !== 'MODULE_NOT_FOUND') { + throw e; + } + addonConfig = {}; + } + + for (const [packageName, config] of Object.entries(addonConfig)) { + this.setConfig(this.appRoot, packageName, config); + } } private get packageCache() { diff --git a/packages/macros/tests/babel/addon-config.test.ts b/packages/macros/tests/babel/addon-config.test.ts new file mode 100644 index 0000000000..c622a4f2e5 --- /dev/null +++ b/packages/macros/tests/babel/addon-config.test.ts @@ -0,0 +1,75 @@ +import { allBabelVersions } from '@embroider/test-support'; +import { MacrosConfig } from '../../src/node'; +import { Project } from 'scenario-tester'; +import { allModes, makeBabelConfig, makeRunner } from './helpers'; +import { dirname, join } from 'path'; + +describe(`addon-config`, function () { + let project: Project; + let addon: Project; + let config: MacrosConfig; + let filename: string; + let run: ReturnType; + + allBabelVersions({ + babelConfig(version: number) { + let c = makeBabelConfig(version, config); + c.filename = filename; + return c; + }, + createTests: function (transform) { + beforeEach(function () { + project = new Project('app', '1.0.0', { + files: { + config: { + 'addons.js': `'use strict'; + + module.exports = { + 'v2-addon': { + enabled: true + }, + };`, + }, + }, + }); + + addon = Project.fromDir(dirname(require.resolve('../../../../tests/v2-addon-template/package.json')), { + linkDeps: true, + }); + addon.pkg.name = 'v2-addon'; + addon.addDependency('@embroider/macros'); + + project.addDependency(addon); + project.write(); + + config = MacrosConfig.for({}, project.baseDir); + filename = join(addon.baseDir, 'sample.js'); + + run = makeRunner(transform); + }); + + test('reads config from config/addon.js', () => { + config.finalize(); + let code = transform(` + import { getOwnConfig } from '@embroider/macros'; + export default function() { + return getOwnConfig(); + } + `); + expect(run(code, { filename })).toEqual({ enabled: true }); + }); + + test('overriddes config from addon', () => { + config.setOwnConfig(filename, { enabled: false, other: true }); + config.finalize(); + let code = transform(` + import { getOwnConfig } from '@embroider/macros'; + export default function() { + return getOwnConfig(); + } + `); + expect(run(code, { filename })).toEqual({ enabled: true, other: true }); + }); + }, + }); +}); diff --git a/tests/fixtures/macro-test/config/addons.js b/tests/fixtures/macro-test/config/addons.js new file mode 100644 index 0000000000..3cdd486bf3 --- /dev/null +++ b/tests/fixtures/macro-test/config/addons.js @@ -0,0 +1,7 @@ +'use strict'; + +module.exports = { + 'macro-sample-addon': { + configFromConfigFile: 'got it' + } +} diff --git a/tests/fixtures/macro-test/tests/integration/components/cross-package-config-test.js b/tests/fixtures/macro-test/tests/integration/components/cross-package-config-test.js index 7fad9f6b5a..d79a3b46b7 100644 --- a/tests/fixtures/macro-test/tests/integration/components/cross-package-config-test.js +++ b/tests/fixtures/macro-test/tests/integration/components/cross-package-config-test.js @@ -17,6 +17,7 @@ module('Integration | cross-package-config', function (hooks) { shouldBeOverwritten: 'overwritten', configFromAddonItself: 'this is the addon', configFromMacrosTests: 'exists', + configFromConfigFile: 'got it', }); }) ); @@ -28,6 +29,7 @@ module('Integration | cross-package-config', function (hooks) { shouldBeOverwritten: 'overwritten', configFromAddonItself: 'this is the addon', configFromMacrosTests: 'exists', + configFromConfigFile: 'got it', }); }); @@ -40,6 +42,7 @@ module('Integration | cross-package-config', function (hooks) { shouldBeOverwritten: 'overwritten', configFromAddonItself: 'this is the addon', configFromMacrosTests: 'exists', + configFromConfigFile: 'got it', }); }) ); @@ -55,6 +58,7 @@ module('Integration | cross-package-config', function (hooks) { shouldBeOverwritten: 'overwritten', configFromAddonItself: 'this is the addon', configFromMacrosTests: 'exists', + configFromConfigFile: 'got it', }); }) );