@embroider/core 3.4.4-unstable.f361b71 → 3.4.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -15,47 +15,58 @@ const path_1 = require("path");
15
15
  const shared_internals_2 = require("@embroider/shared-internals");
16
16
  const debug_1 = __importDefault(require("debug"));
17
17
  const assert_never_1 = __importDefault(require("assert-never"));
18
- const reverse_exports_1 = __importDefault(require("@embroider/reverse-exports"));
18
+ const resolve_1 = __importDefault(require("resolve"));
19
19
  const virtual_content_1 = require("./virtual-content");
20
20
  const typescript_memoize_1 = require("typescript-memoize");
21
21
  const describe_exports_1 = require("./describe-exports");
22
22
  const fs_1 = require("fs");
23
- const node_resolve_1 = require("./node-resolve");
24
23
  const debug = (0, debug_1.default)('embroider:resolver');
25
- // Using a formatter makes this work lazy so nothing happens when we aren't
26
- // logging. It is unfortunate that formatters are a globally mutable config and
27
- // you can only use single character names, but oh well.
28
- debug_1.default.formatters.p = (s) => {
29
- let cwd = process.cwd();
30
- if (s.startsWith(cwd)) {
31
- return s.slice(cwd.length + 1);
32
- }
33
- return s;
34
- };
35
24
  function logTransition(reason, before, after = before) {
36
25
  if (after.isVirtual) {
37
- debug(`[%s:virtualized] %s because %s\n in %p`, before.debugType, before.specifier, reason, before.fromFile);
26
+ debug(`virtualized %s in %s because %s`, before.specifier, before.fromFile, reason);
38
27
  }
39
28
  else if (before.specifier !== after.specifier) {
40
29
  if (before.fromFile !== after.fromFile) {
41
- debug(`[%s:aliased and rehomed] %s to %s\n because %s\n from %p\n to %p`, before.debugType, before.specifier, after.specifier, reason, before.fromFile, after.fromFile);
30
+ debug(`aliased and rehomed: %s to %s, from %s to %s because %s`, before.specifier, after.specifier, before.fromFile, after.fromFile, reason);
42
31
  }
43
32
  else {
44
- debug(`[%s:aliased] %s to %s\n because %s`, before.debugType, before.specifier, after.specifier, reason);
33
+ debug(`aliased: %s to %s in %s because`, before.specifier, after.specifier, before.fromFile, reason);
45
34
  }
46
35
  }
47
36
  else if (before.fromFile !== after.fromFile) {
48
- debug(`[%s:rehomed] %s, because %s\n from %p\n to %p`, before.debugType, before.specifier, reason, before.fromFile, after.fromFile);
49
- }
50
- else if (after.isNotFound) {
51
- debug(`[%s:not-found] %s because %s\n in %p`, before.debugType, before.specifier, reason, before.fromFile);
37
+ debug(`rehomed: %s from %s to %s because`, before.specifier, before.fromFile, after.fromFile, reason);
52
38
  }
53
39
  else {
54
- debug(`[%s:unchanged] %s because %s\n in %p`, before.debugType, before.specifier, reason, before.fromFile);
40
+ debug(`unchanged: %s in %s because %s`, before.specifier, before.fromFile, reason);
55
41
  }
56
42
  return after;
57
43
  }
58
44
  const compatPattern = /#embroider_compat\/(?<type>[^\/]+)\/(?<rest>.*)/;
45
+ class NodeModuleRequest {
46
+ constructor(specifier, fromFile, isVirtual, meta) {
47
+ this.specifier = specifier;
48
+ this.fromFile = fromFile;
49
+ this.isVirtual = isVirtual;
50
+ this.meta = meta;
51
+ }
52
+ alias(specifier) {
53
+ return new NodeModuleRequest(specifier, this.fromFile, false, this.meta);
54
+ }
55
+ rehome(fromFile) {
56
+ if (this.fromFile === fromFile) {
57
+ return this;
58
+ }
59
+ else {
60
+ return new NodeModuleRequest(this.specifier, fromFile, false, this.meta);
61
+ }
62
+ }
63
+ virtualize(filename) {
64
+ return new NodeModuleRequest(filename, this.fromFile, true, this.meta);
65
+ }
66
+ withMeta(meta) {
67
+ return new NodeModuleRequest(this.specifier, this.fromFile, this.isVirtual, meta);
68
+ }
69
+ }
59
70
  class Resolver {
60
71
  constructor(options) {
61
72
  this.options = options;
@@ -68,9 +79,6 @@ class Resolver {
68
79
  // why we need to know about it.
69
80
  return logTransition('early exit', request);
70
81
  }
71
- if (request.specifier === 'require') {
72
- return this.external('early require', request, request.specifier);
73
- }
74
82
  request = this.handleFastbootSwitch(request);
75
83
  request = this.handleGlobalsCompat(request);
76
84
  request = this.handleImplicitModules(request);
@@ -132,10 +140,10 @@ class Resolver {
132
140
  if (nextRequest.fromFile === request.fromFile && nextRequest.specifier === request.specifier) {
133
141
  throw new Error('Bug Discovered! New request is not === original request but has the same fromFile and specifier. This will likely create a loop.');
134
142
  }
135
- if (nextRequest.isVirtual || nextRequest.isNotFound) {
136
- // virtual and NotFound requests are terminal, there is no more
137
- // beforeResolve or fallbackResolve around them. The defaultResolve is
138
- // expected to know how to implement them.
143
+ if (nextRequest.isVirtual) {
144
+ // virtual requests are terminal, there is no more beforeResolve or
145
+ // fallbackResolve around them. The defaultResolve is expected to know how
146
+ // to implement them.
139
147
  return yield defaultResolve(nextRequest);
140
148
  }
141
149
  return yield* this.internalResolve(nextRequest, defaultResolve);
@@ -144,7 +152,39 @@ class Resolver {
144
152
  // top. This is a convenience method for calling resolveSync with the
145
153
  // defaultResolve already configured to be "do the normal node thing".
146
154
  nodeResolve(specifier, fromFile) {
147
- return (0, node_resolve_1.nodeResolve)(this, specifier, fromFile);
155
+ let resolution = this.resolveSync(new NodeModuleRequest(specifier, fromFile, false, undefined), request => {
156
+ if (request.isVirtual) {
157
+ return {
158
+ type: 'found',
159
+ result: {
160
+ type: 'virtual',
161
+ content: (0, virtual_content_1.virtualContent)(request.specifier, this),
162
+ filename: request.specifier,
163
+ },
164
+ };
165
+ }
166
+ try {
167
+ let filename = resolve_1.default.sync(request.specifier, {
168
+ basedir: (0, path_1.dirname)(request.fromFile),
169
+ extensions: this.options.resolvableExtensions,
170
+ });
171
+ return { type: 'found', result: { type: 'real', filename } };
172
+ }
173
+ catch (err) {
174
+ if (err.code !== 'MODULE_NOT_FOUND') {
175
+ throw err;
176
+ }
177
+ return { type: 'not_found', err };
178
+ }
179
+ });
180
+ switch (resolution.type) {
181
+ case 'not_found':
182
+ return resolution;
183
+ case 'found':
184
+ return resolution.result;
185
+ default:
186
+ throw (0, assert_never_1.default)(resolution);
187
+ }
148
188
  }
149
189
  get packageCache() {
150
190
  return shared_internals_2.RewrittenPackageCache.shared('embroider', this.options.appRoot);
@@ -235,7 +275,7 @@ class Resolver {
235
275
  }
236
276
  let entry = (_a = this.getEntryFromMergeMap(rel, pkg.root)) === null || _a === void 0 ? void 0 : _a.entry;
237
277
  if ((entry === null || entry === void 0 ? void 0 : entry.type) === 'both') {
238
- return logTransition('matched addon entry', request, request.alias(entry[section].specifier).rehome(entry[section].fromFile));
278
+ return logTransition('matched addon entry', request, request.alias(entry[section].localPath).rehome((0, path_1.resolve)(entry[section].packageRoot, 'package.json')));
239
279
  }
240
280
  }
241
281
  return logTransition('failed to match in fastboot switch', request);
@@ -292,30 +332,28 @@ class Resolver {
292
332
  let jsModule = null;
293
333
  // first, the various places our template might be.
294
334
  for (let candidate of this.componentTemplateCandidates(target.packageName)) {
295
- let candidateSpecifier = `${target.packageName}${candidate.prefix}${target.memberName}${candidate.suffix}.hbs`;
296
335
  let resolution = this.nodeResolve(`${target.packageName}${candidate.prefix}${target.memberName}${candidate.suffix}`, target.from);
297
336
  if (resolution.type === 'real') {
298
- hbsModule = { requested: candidateSpecifier, found: resolution.filename };
337
+ hbsModule = resolution.filename;
299
338
  break;
300
339
  }
301
340
  }
302
341
  // then the various places our javascript might be.
303
342
  for (let candidate of this.componentJSCandidates(target.packageName)) {
304
- let candidateSpecifier = `${target.packageName}${candidate.prefix}${target.memberName}${candidate.suffix}`;
305
- let resolution = this.nodeResolve(candidateSpecifier, target.from);
343
+ let resolution = this.nodeResolve(`${target.packageName}${candidate.prefix}${target.memberName}${candidate.suffix}`, target.from);
306
344
  // .hbs is a resolvable extension for us, so we need to exclude it here.
307
345
  // It matches as a priority lower than .js, so finding an .hbs means
308
346
  // there's definitely not a .js.
309
347
  if (resolution.type === 'real' && !resolution.filename.endsWith('.hbs')) {
310
- jsModule = { requested: candidateSpecifier, found: resolution.filename };
348
+ jsModule = resolution.filename;
311
349
  break;
312
350
  }
313
351
  }
314
352
  if (hbsModule) {
315
- return logTransition(`resolveComponent found legacy HBS`, request, request.virtualize((0, virtual_content_1.virtualPairComponent)(hbsModule.found, jsModule === null || jsModule === void 0 ? void 0 : jsModule.found)));
353
+ return logTransition(`resolveComponent found legacy HBS`, request, request.virtualize((0, virtual_content_1.virtualPairComponent)(hbsModule, jsModule)));
316
354
  }
317
355
  else if (jsModule) {
318
- return logTransition(`resolveComponent found only JS`, request, request.alias(jsModule.requested).rehome(target.from));
356
+ return logTransition(`resolveComponent found only JS`, request, request.alias(jsModule).rehome(target.from));
319
357
  }
320
358
  else {
321
359
  return logTransition(`resolveComponent failed`, request);
@@ -357,20 +395,11 @@ class Resolver {
357
395
  }
358
396
  }
359
397
  *componentJSCandidates(inPackageName) {
360
- const extensions = ['.ts', '.gjs', '.gts'];
361
398
  yield { prefix: '/components/', suffix: '' };
362
399
  yield { prefix: '/components/', suffix: '/component' };
363
- for (const ext of extensions) {
364
- yield { prefix: '/components/', suffix: ext };
365
- yield { prefix: '/components/', suffix: `/index${ext}` };
366
- yield { prefix: '/components/', suffix: `/component${ext}` };
367
- }
368
400
  let pods = this.podPrefix(inPackageName);
369
401
  if (pods) {
370
402
  yield { prefix: `${pods}/components/`, suffix: '/component' };
371
- for (const ext of extensions) {
372
- yield { prefix: `${pods}/components/`, suffix: `/component${ext}` };
373
- }
374
403
  }
375
404
  }
376
405
  podPrefix(targetPackageName) {
@@ -385,10 +414,10 @@ class Resolver {
385
414
  parseGlobalPath(path, inEngine) {
386
415
  let parts = path.split('@');
387
416
  if (parts.length > 1 && parts[0].length > 0) {
388
- return { packageName: parts[0], memberName: parts[1], from: (0, path_1.resolve)(inEngine.root, 'package.json') };
417
+ return { packageName: parts[0], memberName: parts[1], from: (0, path_1.resolve)(inEngine.root, 'pacakge.json') };
389
418
  }
390
419
  else {
391
- return { packageName: inEngine.packageName, memberName: path, from: (0, path_1.resolve)(inEngine.root, 'package.json') };
420
+ return { packageName: inEngine.packageName, memberName: path, from: (0, path_1.resolve)(inEngine.root, 'pacakge.json') };
392
421
  }
393
422
  }
394
423
  engineConfig(packageName) {
@@ -420,8 +449,8 @@ class Resolver {
420
449
  engineModules.set(inEngineName, {
421
450
  type: 'app-only',
422
451
  'app-js': {
423
- specifier: (0, reverse_exports_1.default)(addon.packageJSON, inAddonName),
424
- fromFile: addonConfig.canResolveFromFile,
452
+ localPath: inAddonName,
453
+ packageRoot: addon.root,
425
454
  fromPackageName: addon.name,
426
455
  },
427
456
  });
@@ -434,8 +463,8 @@ class Resolver {
434
463
  engineModules.set(inEngineName, {
435
464
  type: 'both',
436
465
  'app-js': {
437
- specifier: (0, reverse_exports_1.default)(addon.packageJSON, inAddonName),
438
- fromFile: addonConfig.canResolveFromFile,
466
+ localPath: inAddonName,
467
+ packageRoot: addon.root,
439
468
  fromPackageName: addon.name,
440
469
  },
441
470
  'fastboot-js': prevEntry['fastboot-js'],
@@ -459,8 +488,8 @@ class Resolver {
459
488
  engineModules.set(inEngineName, {
460
489
  type: 'fastboot-only',
461
490
  'fastboot-js': {
462
- specifier: (0, reverse_exports_1.default)(addon.packageJSON, inAddonName),
463
- fromFile: addonConfig.canResolveFromFile,
491
+ localPath: inAddonName,
492
+ packageRoot: addon.root,
464
493
  fromPackageName: addon.name,
465
494
  },
466
495
  });
@@ -473,8 +502,8 @@ class Resolver {
473
502
  engineModules.set(inEngineName, {
474
503
  type: 'both',
475
504
  'fastboot-js': {
476
- specifier: (0, reverse_exports_1.default)(addon.packageJSON, inAddonName),
477
- fromFile: addonConfig.canResolveFromFile,
505
+ localPath: inAddonName,
506
+ packageRoot: addon.root,
478
507
  fromPackageName: addon.name,
479
508
  },
480
509
  'app-js': prevEntry['app-js'],
@@ -496,7 +525,7 @@ class Resolver {
496
525
  return owningEngine;
497
526
  }
498
527
  handleRewrittenPackages(request) {
499
- if (request.isVirtual || request.isNotFound) {
528
+ if (request.isVirtual) {
500
529
  return request;
501
530
  }
502
531
  let requestingPkg = this.packageCache.ownerOfFile(request.fromFile);
@@ -515,6 +544,10 @@ class Resolver {
515
544
  targetPkg = this.packageCache.resolve(packageName, requestingPkg);
516
545
  }
517
546
  catch (err) {
547
+ // this is not the place to report resolution failures. If the thing
548
+ // doesn't resolve, we're just not interested in redirecting it for
549
+ // backward-compat, that's all. The rest of the system will take care of
550
+ // reporting a failure to resolve (or handling it a different way)
518
551
  if (err.code !== 'MODULE_NOT_FOUND') {
519
552
  throw err;
520
553
  }
@@ -530,26 +563,14 @@ class Resolver {
530
563
  return logTransition('request targets a moved package', request, this.resolveWithinMovedPackage(request, targetPkg));
531
564
  }
532
565
  else if (originalRequestingPkg !== requestingPkg) {
533
- if (targetPkg) {
534
- // in this case, the requesting package is moved but its destination is
535
- // not, so we need to rehome the request back to the original location.
536
- return logTransition('outbound request from moved package', request, request
537
- // setting meta here because if this fails, we want the fallback
538
- // logic to revert our rehome and continue from the *moved* package.
539
- .withMeta({ originalFromFile: request.fromFile })
540
- .rehome((0, path_1.resolve)(originalRequestingPkg.root, 'package.json')));
541
- }
542
- else {
543
- // requesting package was moved and we failed to find its target. We
544
- // can't let that accidentally succeed in the defaultResolve because we
545
- // could escape the moved package system.
546
- return logTransition('missing outbound request from moved package', request, request.notFound());
547
- }
566
+ // in this case, the requesting package is moved but its destination is
567
+ // not, so we need to rehome the request back to the original location.
568
+ return logTransition('outbound request from moved package', request, request.withMeta({ wasMovedTo: request.fromFile }).rehome((0, path_1.resolve)(originalRequestingPkg.root, 'package.json')));
548
569
  }
549
570
  return request;
550
571
  }
551
572
  handleRenaming(request) {
552
- if (request.isVirtual || request.isNotFound) {
573
+ if (request.isVirtual) {
553
574
  return request;
554
575
  }
555
576
  let packageName = (0, shared_internals_1.packageName)(request.specifier);
@@ -587,10 +608,7 @@ class Resolver {
587
608
  // packages get this help, v2 packages are natively supposed to make their
588
609
  // own modules resolvable, and we want to push them all to do that
589
610
  // correctly.
590
- // "my-package/foo" -> "./foo"
591
- // "my-package" -> "./" (this can't be just "." because node's require.resolve doesn't reliable support that)
592
- let selfImportPath = request.specifier === pkg.name ? './' : request.specifier.replace(pkg.name, '.');
593
- return logTransition(`v1 self-import`, request, request.alias(selfImportPath).rehome((0, path_1.resolve)(pkg.root, 'package.json')));
611
+ return logTransition(`v1 self-import`, request, request.alias(request.specifier.replace(pkg.name, '.')).rehome((0, path_1.resolve)(pkg.root, 'package.json')));
594
612
  }
595
613
  return request;
596
614
  }
@@ -599,17 +617,16 @@ class Resolver {
599
617
  if (pkg.name.startsWith('@')) {
600
618
  levels.push('..');
601
619
  }
602
- let originalFromFile = request.fromFile;
603
620
  let newRequest = request.rehome((0, path_1.resolve)(pkg.root, ...levels, 'moved-package-target.js'));
604
621
  if (newRequest === request) {
605
622
  return request;
606
623
  }
607
- // setting meta because if this fails, we want the fallback to pick up back
608
- // in the original requesting package.
609
- return newRequest.withMeta({ originalFromFile });
624
+ return newRequest.withMeta({
625
+ resolvedWithinPackage: pkg.root,
626
+ });
610
627
  }
611
628
  preHandleExternal(request) {
612
- if (request.isVirtual || request.isNotFound) {
629
+ if (request.isVirtual) {
613
630
  return request;
614
631
  }
615
632
  let { specifier, fromFile } = request;
@@ -642,15 +659,7 @@ class Resolver {
642
659
  // engine
643
660
  let logicalLocation = this.reverseSearchAppTree(pkg, request.fromFile);
644
661
  if (logicalLocation) {
645
- return logTransition('beforeResolve: relative import in app-js', request, request
646
- .alias('./' + path_1.posix.join((0, path_1.dirname)(logicalLocation.inAppName), request.specifier))
647
- // it's important that we're rehoming this to the root of the engine
648
- // (which we know really exists), and not to a subdir like
649
- // logicalLocation.inAppName (which might not physically exist),
650
- // because some environments (including node's require.resolve) will
651
- // refuse to do resolution from a notional path that doesn't
652
- // physically exist.
653
- .rehome((0, path_1.resolve)(logicalLocation.owningEngine.root, 'package.json')));
662
+ return logTransition('beforeResolve: relative import in app-js', request, request.rehome((0, path_1.resolve)(logicalLocation.owningEngine.root, logicalLocation.inAppName)));
654
663
  }
655
664
  return request;
656
665
  }
@@ -665,11 +674,11 @@ class Resolver {
665
674
  if (shared_internals_1.emberVirtualPeerDeps.has(packageName) && !pkg.hasDependency(packageName)) {
666
675
  // addons (whether auto-upgraded or not) may use the app's
667
676
  // emberVirtualPeerDeps, like "@glimmer/component" etc.
668
- let addon = this.locateActiveAddon(packageName);
669
- if (!addon) {
670
- throw new Error(`${pkg.name} is trying to import the emberVirtualPeerDep "${packageName}", but it seems to be missing`);
677
+ if (!this.options.activeAddons[packageName]) {
678
+ throw new Error(`${pkg.name} is trying to import the app's ${packageName} package, but it seems to be missing`);
671
679
  }
672
- return logTransition(`emberVirtualPeerDeps`, request, request.rehome(addon.canResolveFromFile));
680
+ let newHome = (0, path_1.resolve)(this.packageCache.maybeMoved(this.packageCache.get(this.options.appRoot)).root, 'package.json');
681
+ return logTransition(`emberVirtualPeerDeps in v2 addon`, request, request.rehome(newHome));
673
682
  }
674
683
  // if this file is part of an addon's app-js, it's really the logical
675
684
  // package to which it belongs (normally the app) that affects some policy
@@ -700,22 +709,6 @@ class Resolver {
700
709
  }
701
710
  return request;
702
711
  }
703
- locateActiveAddon(packageName) {
704
- if (packageName === this.options.modulePrefix) {
705
- // the app itself is something that addon's can classically resolve if they know it's name.
706
- return {
707
- root: this.options.appRoot,
708
- canResolveFromFile: (0, path_1.resolve)(this.packageCache.maybeMoved(this.packageCache.get(this.options.appRoot)).root, 'package.json'),
709
- };
710
- }
711
- for (let engine of this.options.engines) {
712
- for (let addon of engine.activeAddons) {
713
- if (addon.name === packageName) {
714
- return addon;
715
- }
716
- }
717
- }
718
- }
719
712
  external(label, request, specifier) {
720
713
  if (this.options.amdCompatibility === 'cjs') {
721
714
  let filename = (0, virtual_content_1.virtualExternalCJSModule)(specifier);
@@ -749,7 +742,7 @@ class Resolver {
749
742
  }
750
743
  }
751
744
  fallbackResolve(request) {
752
- var _a;
745
+ var _a, _b, _c;
753
746
  if (request.specifier === '@embroider/macros') {
754
747
  // the macros package is always handled directly within babel (not
755
748
  // necessarily as a real resolvable package), so we should not mess with it.
@@ -757,7 +750,8 @@ class Resolver {
757
750
  // why we need to know about it.
758
751
  return logTransition('fallback early exit', request);
759
752
  }
760
- if (compatPattern.test(request.specifier)) {
753
+ let { specifier, fromFile } = request;
754
+ if (compatPattern.test(specifier)) {
761
755
  // Some kinds of compat requests get rewritten into other things
762
756
  // deterministically. For example, "#embroider_compat/helpers/whatever"
763
757
  // means only "the-current-engine/helpers/whatever", and if that doesn't
@@ -773,33 +767,39 @@ class Resolver {
773
767
  // here.
774
768
  return request;
775
769
  }
776
- let pkg = this.packageCache.ownerOfFile(request.fromFile);
770
+ if (fromFile.endsWith('moved-package-target.js')) {
771
+ if (!((_a = request.meta) === null || _a === void 0 ? void 0 : _a.resolvedWithinPackage)) {
772
+ throw new Error(`bug: embroider resolver's meta is not propagating`);
773
+ }
774
+ fromFile = (0, path_1.resolve)((_b = request.meta) === null || _b === void 0 ? void 0 : _b.resolvedWithinPackage, 'package.json');
775
+ }
776
+ let pkg = this.packageCache.ownerOfFile(fromFile);
777
777
  if (!pkg) {
778
778
  return logTransition('no identifiable owningPackage', request);
779
779
  }
780
- // meta.originalFromFile gets set when we want to try to rehome a request
781
- // but then come back to the original location here in the fallback when the
782
- // rehomed request fails
780
+ // if we rehomed this request to its un-rewritten location in order to try
781
+ // to do the defaultResolve from there, now we refer back to the rewritten
782
+ // location because that's what we want to use when asking things like
783
+ // isV2Ember()
783
784
  let movedPkg = this.packageCache.maybeMoved(pkg);
784
785
  if (movedPkg !== pkg) {
785
- let originalFromFile = (_a = request.meta) === null || _a === void 0 ? void 0 : _a.originalFromFile;
786
- if (typeof originalFromFile !== 'string') {
786
+ if (!((_c = request.meta) === null || _c === void 0 ? void 0 : _c.wasMovedTo)) {
787
787
  throw new Error(`bug: embroider resolver's meta is not propagating`);
788
788
  }
789
- request = request.rehome(originalFromFile);
789
+ fromFile = request.meta.wasMovedTo;
790
790
  pkg = movedPkg;
791
791
  }
792
792
  if (!pkg.isV2Ember()) {
793
793
  return logTransition('fallbackResolve: not in an ember package', request);
794
794
  }
795
- let packageName = (0, shared_internals_1.packageName)(request.specifier);
795
+ let packageName = (0, shared_internals_1.packageName)(specifier);
796
796
  if (!packageName) {
797
797
  // this is a relative import
798
798
  let withinEngine = this.engineConfig(pkg.name);
799
799
  if (withinEngine) {
800
800
  // it's a relative import inside an engine (which also means app), which
801
801
  // means we may need to satisfy the request via app tree merging.
802
- let appJSMatch = this.searchAppTree(request, withinEngine, (0, shared_internals_2.explicitRelative)(pkg.root, (0, path_1.resolve)((0, path_1.dirname)(request.fromFile), request.specifier)));
802
+ let appJSMatch = this.searchAppTree(request, withinEngine, (0, shared_internals_2.explicitRelative)(pkg.root, (0, path_1.resolve)((0, path_1.dirname)(fromFile), specifier)));
803
803
  if (appJSMatch) {
804
804
  return logTransition('fallbackResolve: relative appJsMatch', request, appJSMatch);
805
805
  }
@@ -813,32 +813,23 @@ class Resolver {
813
813
  }
814
814
  }
815
815
  // auto-upgraded packages can fall back to the set of known active addons
816
- if (pkg.meta['auto-upgraded']) {
817
- let addon = this.locateActiveAddon(packageName);
818
- if (addon) {
819
- const rehomed = request.rehome(addon.canResolveFromFile);
820
- if (rehomed !== request) {
821
- return logTransition(`activeAddons`, request, rehomed);
822
- }
816
+ if (pkg.meta['auto-upgraded'] && this.options.activeAddons[packageName]) {
817
+ const rehomed = this.resolveWithinMovedPackage(request, this.packageCache.get(this.options.activeAddons[packageName]));
818
+ if (rehomed !== request) {
819
+ return logTransition(`activeAddons`, request, rehomed);
823
820
  }
824
821
  }
825
- let logicalLocation = this.reverseSearchAppTree(pkg, request.fromFile);
822
+ let logicalLocation = this.reverseSearchAppTree(pkg, fromFile);
826
823
  if (logicalLocation) {
827
824
  // the requesting file is in an addon's appTree. We didn't succeed in
828
825
  // resolving this (non-relative) request from inside the actual addon, so
829
826
  // next try to resolve it from the corresponding logical location in the
830
827
  // app.
831
- return logTransition('fallbackResolve: retry from logical home of app-js file', request,
832
- // it might look more precise to rehome into logicalLocation.inAppName
833
- // rather than package.json. But that logical location may not actually
834
- // exist, and some systems (including node's require.resolve) will be
835
- // mad about trying to resolve from notional paths that don't really
836
- // exist.
837
- request.rehome((0, path_1.resolve)(logicalLocation.owningEngine.root, 'package.json')));
828
+ return logTransition('fallbackResolve: retry from logical home of app-js file', request, request.rehome((0, path_1.resolve)(logicalLocation.owningEngine.root, logicalLocation.inAppName)));
838
829
  }
839
830
  let targetingEngine = this.engineConfig(packageName);
840
831
  if (targetingEngine) {
841
- let appJSMatch = this.searchAppTree(request, targetingEngine, request.specifier.replace(packageName, '.'));
832
+ let appJSMatch = this.searchAppTree(request, targetingEngine, specifier.replace(packageName, '.'));
842
833
  if (appJSMatch) {
843
834
  return logTransition('fallbackResolve: non-relative appJsMatch', request, appJSMatch);
844
835
  }
@@ -848,14 +839,14 @@ class Resolver {
848
839
  // runtime. Native v2 packages can only get this behavior in the
849
840
  // isExplicitlyExternal case above because they need to explicitly ask for
850
841
  // externals.
851
- return this.external('v1 catch-all fallback', request, request.specifier);
842
+ return this.external('v1 catch-all fallback', request, specifier);
852
843
  }
853
844
  else {
854
845
  // native v2 packages don't automatically externalize *everything* the way
855
846
  // auto-upgraded packages do, but they still externalize known and approved
856
847
  // ember virtual packages (like @ember/component)
857
848
  if (shared_internals_1.emberVirtualPackages.has(packageName)) {
858
- return this.external('emberVirtualPackages', request, request.specifier);
849
+ return this.external('emberVirtualPackages', request, specifier);
859
850
  }
860
851
  }
861
852
  // this is falling through with the original specifier which was
@@ -888,11 +879,15 @@ class Resolver {
888
879
  case undefined:
889
880
  return undefined;
890
881
  case 'app-only':
891
- return request.alias(matched.entry['app-js'].specifier).rehome(matched.entry['app-js'].fromFile);
882
+ return request
883
+ .alias(matched.entry['app-js'].localPath)
884
+ .rehome((0, path_1.resolve)(matched.entry['app-js'].packageRoot, 'package.json'));
892
885
  case 'fastboot-only':
893
- return request.alias(matched.entry['fastboot-js'].specifier).rehome(matched.entry['fastboot-js'].fromFile);
886
+ return request
887
+ .alias(matched.entry['fastboot-js'].localPath)
888
+ .rehome((0, path_1.resolve)(matched.entry['fastboot-js'].packageRoot, 'package.json'));
894
889
  case 'both':
895
- let foundAppJS = this.nodeResolve(matched.entry['app-js'].specifier, matched.entry['app-js'].fromFile);
890
+ let foundAppJS = this.nodeResolve(matched.entry['app-js'].localPath, (0, path_1.resolve)(matched.entry['app-js'].packageRoot, 'package.json'));
896
891
  if (foundAppJS.type !== 'real') {
897
892
  throw new Error(`${matched.entry['app-js'].fromPackageName} declared ${inEngineSpecifier} in packageJSON.ember-addon.app-js, but that module does not exist`);
898
893
  }