@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.
- package/LICENSE +21 -0
- package/package.json +11 -12
- package/src/app-files.d.ts +1 -1
- package/src/app-files.js +1 -1
- package/src/app-files.js.map +1 -1
- package/src/module-resolver.d.ts +3 -5
- package/src/module-resolver.js +137 -142
- package/src/module-resolver.js.map +1 -1
- package/src/virtual-content.d.ts +2 -6
- package/src/virtual-content.js +38 -80
- package/src/virtual-content.js.map +1 -1
- package/src/node-resolve.d.ts +0 -26
- package/src/node-resolve.js +0 -105
- package/src/node-resolve.js.map +0 -1
package/src/module-resolver.js
CHANGED
@@ -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
|
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(`
|
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(`
|
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(`
|
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(`
|
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(`
|
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
|
136
|
-
// virtual
|
137
|
-
//
|
138
|
-
//
|
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
|
-
|
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].
|
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 =
|
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
|
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 =
|
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
|
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
|
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, '
|
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, '
|
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
|
-
|
424
|
-
|
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
|
-
|
438
|
-
|
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
|
-
|
463
|
-
|
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
|
-
|
477
|
-
|
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
|
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
|
-
|
534
|
-
|
535
|
-
|
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
|
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
|
-
|
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
|
-
|
608
|
-
|
609
|
-
|
624
|
+
return newRequest.withMeta({
|
625
|
+
resolvedWithinPackage: pkg.root,
|
626
|
+
});
|
610
627
|
}
|
611
628
|
preHandleExternal(request) {
|
612
|
-
if (request.isVirtual
|
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
|
-
|
669
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
//
|
781
|
-
//
|
782
|
-
//
|
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
|
-
|
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
|
-
|
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)(
|
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)(
|
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
|
-
|
818
|
-
if (
|
819
|
-
|
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,
|
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,
|
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,
|
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,
|
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
|
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
|
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'].
|
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
|
}
|