Skip to content

Commit d378fb3

Browse files
authored
Merge pull request #2648 from embroider-build/fix-macros-in-dummy
Fix dependency-aware macros in dummy apps
2 parents c5ac27d + f58efd9 commit d378fb3

File tree

5 files changed

+52
-13
lines changed

5 files changed

+52
-13
lines changed

packages/shared-internals/src/package.ts

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import { Memoize } from 'typescript-memoize';
22
import { readFileSync, existsSync } from 'fs-extra';
3-
import { join, extname } from 'path';
3+
import { join, extname, resolve } from 'path';
44
import get from 'lodash/get';
55
import type { AddonMeta, PackageInfo } from './metadata';
66
import type PackageCache from './package-cache';
77
import flatMap from 'lodash/flatMap';
8+
import cloneDeep from 'lodash/cloneDeep';
89

910
// This is controllable via env var because there are many different contexts
1011
// (babel/rollup/vite/webpack/handlebars plugins) that can all depend on
@@ -54,9 +55,28 @@ export default class Package {
5455
return this.packageJSON.version;
5556
}
5657

58+
private dummyAppOwnedByAddon: Package | undefined;
59+
5760
@Memoize()
5861
protected get internalPackageJSON() {
59-
return JSON.parse(readFileSync(join(this.root, 'package.json'), 'utf8'));
62+
try {
63+
return JSON.parse(readFileSync(join(this.root, 'package.json'), 'utf8'));
64+
} catch (err) {
65+
if (err.code === 'ENOENT' && this.root === this.packageCache.appRoot) {
66+
// if the app is missing it's package.json, we could be looking at a
67+
// dummy app of a v1 addon.
68+
let upPkg = this.packageCache.ownerOfFile(resolve(this.root, '..'));
69+
if (upPkg?.isEmberAddon()) {
70+
// found containing addon. Synthesize the dummy's app's virtual
71+
// package.json
72+
this.dummyAppOwnedByAddon = upPkg;
73+
let pkg = cloneDeep(upPkg.packageJSON);
74+
pkg.name = 'dummy';
75+
return pkg;
76+
}
77+
}
78+
throw err;
79+
}
6080
}
6181

6282
@Memoize()
@@ -162,9 +182,10 @@ export default class Package {
162182

163183
@Memoize()
164184
get nonResolvableDeps(): Map<string, Package> | undefined {
185+
let result: Map<string, Package> | undefined;
165186
let meta = this.internalPackageJSON['ember-addon'];
166187
if (meta && meta.paths) {
167-
return new Map(
188+
result = new Map(
168189
meta.paths
169190
.map((path: string) => {
170191
// ember-cli gives a warning if the path specifies an invalid, malformed or missing addon. the logic for invalidating an addon is:
@@ -199,6 +220,14 @@ export default class Package {
199220
.filter(Boolean)
200221
);
201222
}
223+
if (this.dummyAppOwnedByAddon) {
224+
if (!result) {
225+
result = new Map();
226+
}
227+
// dummy apps magically depend on the containing addon.
228+
result.set(this.dummyAppOwnedByAddon.name, this.dummyAppOwnedByAddon);
229+
}
230+
return result;
202231
}
203232

204233
get dependencyNames(): string[] {
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { appEmberSatisfies } from '@embroider/macros';
2+
3+
export default function() {
4+
return {
5+
aboveTwo: appEmberSatisfies('> 2.0.0'),
6+
belowTwo: appEmberSatisfies('< 2.0.0')
7+
};
8+
}

tests/fixtures/macro-sample-addon/ember-cli-build.js

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,5 @@ module.exports = function(defaults) {
1515
behave. You most likely want to be modifying `./index.js` or app's build file
1616
*/
1717

18-
return maybeEmbroider(app, {
19-
useAddonAppBoot: false,
20-
useAddonConfigModule: false,
21-
});
18+
return app.toTree();
2219
};
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { module, test } from 'qunit';
2+
import appEmberSat from 'macro-sample-addon/app-ember-satisfies';
3+
4+
module('Unit | appEmberSatisfies', function() {
5+
test('addon code can use appEmberSatisfies', function(assert) {
6+
assert.strictEqual(appEmberSat().aboveTwo, true);
7+
assert.strictEqual(appEmberSat().belowTwo, false);
8+
})
9+
});

tests/scenarios/macro-test.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -201,9 +201,6 @@ function dummyAppScenarioSetup(project: Project) {
201201
let addonFiles = loadFromFixtureData('macro-sample-addon');
202202
project.name = 'macro-sample-addon';
203203
project.linkDependency('@embroider/macros', { baseDir: __dirname });
204-
project.linkDependency('@embroider/webpack', { baseDir: __dirname });
205-
project.linkDependency('@embroider/compat', { baseDir: __dirname });
206-
project.linkDependency('@embroider/core', { baseDir: __dirname });
207204

208205
addonFiles['index.js'] = `
209206
module.exports = {
@@ -275,7 +272,6 @@ dummyAppScenarios
275272
});
276273

277274
dummyAppScenarios
278-
.skip()
279275
.map('macro-sample-addon-classic', project => {
280276
dummyAppScenarioSetup(project);
281277
project.linkDependency('ember-cli-babel', { baseDir: __dirname, resolveName: 'ember-cli-babel-latest' });
@@ -289,8 +285,8 @@ dummyAppScenarios
289285
addon = await scenario.prepare();
290286
});
291287

292-
test(`pnpm test EMBROIDER_TEST_SETUP_FORCE=classic`, async function (assert) {
293-
let result = await addon.execute('cross-env EMBROIDER_TEST_SETUP_FORCE=classic pnpm ember test');
288+
test(`pnpm test`, async function (assert) {
289+
let result = await addon.execute('pnpm ember test');
294290
assert.equal(result.exitCode, 0, result.output);
295291
});
296292
});

0 commit comments

Comments
 (0)