@embroider/core 3.4.20-unstable.947c6d2 → 3.4.20-unstable.b470496

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/package.json +7 -7
  2. package/src/index.d.ts +3 -3
  3. package/src/index.js +3 -3
  4. package/src/index.js.map +1 -1
  5. package/src/module-request.d.ts +43 -0
  6. package/src/module-request.js +91 -0
  7. package/src/module-request.js.map +1 -0
  8. package/src/module-resolver.d.ts +1 -28
  9. package/src/module-resolver.js +123 -124
  10. package/src/module-resolver.js.map +1 -1
  11. package/src/node-resolve.d.ts +13 -16
  12. package/src/node-resolve.js +38 -57
  13. package/src/node-resolve.js.map +1 -1
  14. package/src/virtual-content.d.ts +24 -10
  15. package/src/virtual-content.js +35 -114
  16. package/src/virtual-content.js.map +1 -1
  17. package/src/virtual-entrypoint.d.ts +4 -2
  18. package/src/virtual-entrypoint.js +2 -18
  19. package/src/virtual-entrypoint.js.map +1 -1
  20. package/src/virtual-route-entrypoint.d.ts +4 -9
  21. package/src/virtual-route-entrypoint.js +1 -33
  22. package/src/virtual-route-entrypoint.js.map +1 -1
  23. package/src/virtual-test-support-styles.d.ts +5 -2
  24. package/src/virtual-test-support-styles.js +2 -5
  25. package/src/virtual-test-support-styles.js.map +1 -1
  26. package/src/virtual-test-support.d.ts +5 -2
  27. package/src/virtual-test-support.js +2 -5
  28. package/src/virtual-test-support.js.map +1 -1
  29. package/src/virtual-vendor-styles.d.ts +5 -1
  30. package/src/virtual-vendor-styles.js +2 -1
  31. package/src/virtual-vendor-styles.js.map +1 -1
  32. package/src/virtual-vendor.d.ts +5 -2
  33. package/src/virtual-vendor.js +4 -8
  34. package/src/virtual-vendor.js.map +1 -1
  35. package/src/to-broccoli-plugin.d.ts +0 -8
  36. package/src/to-broccoli-plugin.js +0 -30
  37. package/src/to-broccoli-plugin.js.map +0 -1
@@ -17,12 +17,10 @@ const debug_1 = __importDefault(require("debug"));
17
17
  const assert_never_1 = __importDefault(require("assert-never"));
18
18
  const reverse_exports_1 = require("@embroider/reverse-exports");
19
19
  const resolve_exports_1 = require("resolve.exports");
20
- const virtual_content_1 = require("./virtual-content");
21
20
  const typescript_memoize_1 = require("typescript-memoize");
22
21
  const describe_exports_1 = require("./describe-exports");
23
22
  const fs_1 = require("fs");
24
23
  const node_resolve_1 = require("./node-resolve");
25
- const virtual_route_entrypoint_1 = require("./virtual-route-entrypoint");
26
24
  const semver_1 = require("semver");
27
25
  const debug = (0, debug_1.default)('embroider:resolver');
28
26
  // Using a formatter makes this work lazy so nothing happens when we aren't
@@ -36,10 +34,7 @@ debug_1.default.formatters.p = (s) => {
36
34
  return s;
37
35
  };
38
36
  function logTransition(reason, before, after = before) {
39
- if (after.isVirtual) {
40
- debug(`[%s:virtualized] %s because %s\n in %p`, before.debugType, before.specifier, reason, before.fromFile);
41
- }
42
- else if (after.resolvedTo) {
37
+ if (after.resolvedTo) {
43
38
  debug(`[%s:resolvedTo] %s because %s\n in %p`, before.debugType, before.specifier, reason, before.fromFile);
44
39
  }
45
40
  else if (before.specifier !== after.specifier) {
@@ -53,17 +48,11 @@ function logTransition(reason, before, after = before) {
53
48
  else if (before.fromFile !== after.fromFile) {
54
49
  debug(`[%s:rehomed] %s, because %s\n from %p\n to %p`, before.debugType, before.specifier, reason, before.fromFile, after.fromFile);
55
50
  }
56
- else if (after.isNotFound) {
57
- debug(`[%s:not-found] %s because %s\n in %p`, before.debugType, before.specifier, reason, before.fromFile);
58
- }
59
51
  else {
60
52
  debug(`[%s:unchanged] %s because %s\n in %p`, before.debugType, before.specifier, reason, before.fromFile);
61
53
  }
62
54
  return after;
63
55
  }
64
- function isTerminal(request) {
65
- return request.isVirtual || request.isNotFound || Boolean(request.resolvedTo);
66
- }
67
56
  const compatPattern = /@embroider\/virtual\/(?<type>[^\/]+)\/(?<rest>.*)/;
68
57
  class Resolver {
69
58
  constructor(options) {
@@ -102,36 +91,43 @@ class Resolver {
102
91
  // rules.
103
92
  async resolve(request) {
104
93
  request = await this.beforeResolve(request);
94
+ let resolution;
105
95
  if (request.resolvedTo) {
106
- return request.resolvedTo;
96
+ if (typeof request.resolvedTo === 'function') {
97
+ resolution = await request.resolvedTo();
98
+ }
99
+ else {
100
+ resolution = request.resolvedTo;
101
+ }
102
+ }
103
+ else {
104
+ resolution = await request.defaultResolve();
107
105
  }
108
- let resolution = await request.defaultResolve();
109
106
  switch (resolution.type) {
110
107
  case 'found':
111
- case 'ignored':
112
108
  return resolution;
113
109
  case 'not_found':
114
110
  break;
115
111
  default:
116
112
  throw (0, assert_never_1.default)(resolution);
117
113
  }
114
+ request = request.clone();
118
115
  let nextRequest = await this.fallbackResolve(request);
119
116
  if (nextRequest === request) {
120
117
  // no additional fallback is available.
121
118
  return resolution;
122
119
  }
123
120
  if (nextRequest.resolvedTo) {
124
- return nextRequest.resolvedTo;
121
+ if (typeof nextRequest.resolvedTo === 'function') {
122
+ return await nextRequest.resolvedTo();
123
+ }
124
+ else {
125
+ return nextRequest.resolvedTo;
126
+ }
125
127
  }
126
128
  if (nextRequest.fromFile === request.fromFile && nextRequest.specifier === request.specifier) {
127
129
  throw new Error('Bug Discovered! New request is not === original request but has the same fromFile and specifier. This will likely create a loop.');
128
130
  }
129
- if (nextRequest.isVirtual || nextRequest.isNotFound) {
130
- // virtual and NotFound requests are terminal, there is no more
131
- // beforeResolve or fallbackResolve around them. The defaultResolve is
132
- // expected to know how to implement them.
133
- return nextRequest.defaultResolve();
134
- }
135
131
  return this.resolve(nextRequest);
136
132
  }
137
133
  // Use standard NodeJS resolving, with our required compatibility rules on
@@ -155,7 +151,7 @@ class Resolver {
155
151
  return owningPackage;
156
152
  }
157
153
  generateFastbootSwitch(request) {
158
- if (isTerminal(request)) {
154
+ if (request.resolvedTo) {
159
155
  return request;
160
156
  }
161
157
  let pkg = this.packageCache.ownerOfFile(request.fromFile);
@@ -178,8 +174,8 @@ class Resolver {
178
174
  let { names } = (0, describe_exports_1.describeExports)((0, fs_1.readFileSync)((0, path_1.resolve)(pkg.root, fastbootFile.shadowedFilename), 'utf8'), {
179
175
  configFile: false,
180
176
  });
181
- let switchFile = (0, virtual_content_1.fastbootSwitch)(candidate, (0, path_1.resolve)(pkg.root, 'package.json'), names);
182
- if (switchFile === request.fromFile) {
177
+ let switchFile = fastbootSwitch(candidate, (0, path_1.resolve)(pkg.root, 'package.json'), names);
178
+ if (switchFile.specifier === request.fromFile) {
183
179
  return logTransition('internal lookup from fastbootSwitch', request);
184
180
  }
185
181
  else {
@@ -196,10 +192,10 @@ class Resolver {
196
192
  }
197
193
  handleFastbootSwitch(request) {
198
194
  var _a;
199
- if (isTerminal(request)) {
195
+ if (request.resolvedTo) {
200
196
  return request;
201
197
  }
202
- let match = (0, virtual_content_1.decodeFastbootSwitch)(request.fromFile);
198
+ let match = decodeFastbootSwitch(request.fromFile);
203
199
  if (!match) {
204
200
  return request;
205
201
  }
@@ -243,71 +239,77 @@ class Resolver {
243
239
  return logTransition('failed to match in fastboot switch', request);
244
240
  }
245
241
  handleImplicitModules(request) {
246
- if (isTerminal(request)) {
247
- return request;
248
- }
249
- let im = (0, virtual_content_1.decodeImplicitModules)(request.specifier);
250
- if (!im) {
242
+ if (request.resolvedTo) {
251
243
  return request;
252
244
  }
253
- let pkg = this.packageCache.ownerOfFile(request.fromFile);
254
- if (!(pkg === null || pkg === void 0 ? void 0 : pkg.isV2Ember())) {
255
- throw new Error(`bug: found implicit modules import in non-ember package at ${request.fromFile}`);
256
- }
257
- let packageName = (0, shared_internals_1.packageName)(im.fromFile);
258
- if (packageName) {
259
- let dep = this.packageCache.resolve(packageName, pkg);
260
- return logTransition(`dep's implicit modules`, request, request.virtualize((0, path_1.resolve)(dep.root, `-embroider-${im.type}.js`)));
261
- }
262
- else {
263
- return logTransition(`own implicit modules`, request, request.virtualize((0, path_1.resolve)(pkg.root, `-embroider-${im.type}.js`)));
245
+ for (let variant of ['', 'test-']) {
246
+ let suffix = `-embroider-implicit-${variant}modules.js`;
247
+ if (!request.specifier.endsWith(suffix)) {
248
+ continue;
249
+ }
250
+ let filename = request.specifier.slice(0, -1 * suffix.length);
251
+ if (!filename.endsWith('/') && filename.endsWith('\\')) {
252
+ continue;
253
+ }
254
+ filename = filename.slice(0, -1);
255
+ let pkg = this.packageCache.ownerOfFile(request.fromFile);
256
+ if (!(pkg === null || pkg === void 0 ? void 0 : pkg.isV2Ember())) {
257
+ throw new Error(`bug: found implicit modules import in non-ember package at ${request.fromFile}`);
258
+ }
259
+ let type = `implicit-${variant}modules`;
260
+ let packageName = (0, shared_internals_1.packageName)(filename);
261
+ if (packageName) {
262
+ let dep = this.packageCache.resolve(packageName, pkg);
263
+ return logTransition(`dep's implicit modules`, request, request.virtualize({ type, specifier: (0, path_1.resolve)(dep.root, `-embroider-${type}.js`), fromFile: dep.root }));
264
+ }
265
+ else {
266
+ return logTransition(`own implicit modules`, request, request.virtualize({ type, specifier: (0, path_1.resolve)(pkg.root, `-embroider-${type}.js`), fromFile: pkg.root }));
267
+ }
264
268
  }
269
+ return request;
265
270
  }
266
271
  handleEntrypoint(request) {
267
272
  var _a;
268
- if (isTerminal(request)) {
273
+ if (request.resolvedTo) {
269
274
  return request;
270
275
  }
271
- //TODO move the extra forwardslash handling out into the vite plugin
272
- const candidates = [
273
- '@embroider/virtual/compat-modules',
274
- '/@embroider/virtual/compat-modules',
275
- './@embroider/virtual/compat-modules',
276
- ];
277
- if (!candidates.some(c => request.specifier.startsWith(c + '/') || request.specifier === c)) {
276
+ const compatModulesSpecifier = '@embroider/virtual/compat-modules';
277
+ let isCompatModules = request.specifier === compatModulesSpecifier || request.specifier.startsWith(compatModulesSpecifier + '/');
278
+ if (!isCompatModules) {
278
279
  return request;
279
280
  }
280
- const result = /\.?\/?@embroider\/virtual\/compat-modules(?:\/(?<packageName>.*))?/.exec(request.specifier);
281
- if (!result) {
282
- // TODO make a better error
283
- throw new Error('entrypoint does not match pattern' + request.specifier);
284
- }
285
- const { packageName } = result.groups;
286
281
  const requestingPkg = this.packageCache.ownerOfFile(request.fromFile);
287
282
  if (!(requestingPkg === null || requestingPkg === void 0 ? void 0 : requestingPkg.isV2Ember())) {
288
283
  throw new Error(`bug: found entrypoint import in non-ember package at ${request.fromFile}`);
289
284
  }
290
285
  let pkg;
291
- if (packageName) {
292
- pkg = this.packageCache.resolve(packageName, requestingPkg);
286
+ if (request.specifier === compatModulesSpecifier) {
287
+ pkg = requestingPkg;
293
288
  }
294
289
  else {
295
- pkg = requestingPkg;
290
+ let packageName = request.specifier.slice(compatModulesSpecifier.length + 1);
291
+ pkg = this.packageCache.resolve(packageName, requestingPkg);
296
292
  }
297
293
  let matched = (0, resolve_exports_1.exports)(pkg.packageJSON, '-embroider-entrypoint.js', {
298
294
  browser: true,
299
295
  conditions: ['default', 'imports'],
300
296
  });
301
- return logTransition('entrypoint', request, request.virtualize((0, path_1.resolve)(pkg.root, (_a = matched === null || matched === void 0 ? void 0 : matched[0]) !== null && _a !== void 0 ? _a : '-embroider-entrypoint.js')));
297
+ let specifier = (0, path_1.resolve)(pkg.root, (_a = matched === null || matched === void 0 ? void 0 : matched[0]) !== null && _a !== void 0 ? _a : '-embroider-entrypoint.js');
298
+ return logTransition('entrypoint', request, request.virtualize({
299
+ type: 'entrypoint',
300
+ specifier,
301
+ fromDir: (0, path_1.dirname)(specifier),
302
+ }));
302
303
  }
303
304
  handleRouteEntrypoint(request) {
304
- if (isTerminal(request)) {
305
+ if (request.resolvedTo) {
305
306
  return request;
306
307
  }
307
- let routeName = (0, virtual_route_entrypoint_1.decodePublicRouteEntrypoint)(request.specifier);
308
- if (!routeName) {
308
+ const publicPrefix = '@embroider/core/route/';
309
+ if (!request.specifier.startsWith(publicPrefix)) {
309
310
  return request;
310
311
  }
312
+ let routeName = request.specifier.slice(publicPrefix.length);
311
313
  let pkg = this.packageCache.ownerOfFile(request.fromFile);
312
314
  if (!(pkg === null || pkg === void 0 ? void 0 : pkg.isV2Ember())) {
313
315
  throw new Error(`bug: found entrypoint import in non-ember package at ${request.fromFile}`);
@@ -316,42 +318,35 @@ class Resolver {
316
318
  browser: true,
317
319
  conditions: ['default', 'imports'],
318
320
  });
319
- return logTransition('route entrypoint', request, request.virtualize((0, virtual_route_entrypoint_1.encodeRouteEntrypoint)(pkg.root, matched === null || matched === void 0 ? void 0 : matched[0], routeName)));
321
+ let target = matched ? `${matched}:route=${routeName}` : `-embroider-route-entrypoint.js:route=${routeName}`;
322
+ let specifier = (0, path_1.resolve)(pkg.root, target);
323
+ return logTransition('route entrypoint', request, request.virtualize({ type: 'route-entrypoint', specifier, route: routeName, fromDir: (0, path_1.dirname)(specifier) }));
320
324
  }
321
325
  handleImplicitTestScripts(request) {
322
- //TODO move the extra forwardslash handling out into the vite plugin
323
- const candidates = [
324
- '@embroider/virtual/test-support.js',
325
- '/@embroider/virtual/test-support.js',
326
- './@embroider/virtual/test-support.js',
327
- ];
328
- if (!candidates.includes(request.specifier)) {
326
+ if (request.specifier !== '@embroider/virtual/test-support.js') {
329
327
  return request;
330
328
  }
331
329
  let pkg = this.packageCache.ownerOfFile(request.fromFile);
332
330
  if ((pkg === null || pkg === void 0 ? void 0 : pkg.root) !== this.options.engines[0].root) {
333
331
  throw new Error(`bug: found an import of ${request.specifier} in ${request.fromFile}, but this is not the top-level Ember app. The top-level Ember app is the only one that has support for @embroider/virtual/test-support.js. If you think something should be fixed in Embroider, please open an issue on https://github.com/embroider-build/embroider/issues.`);
334
332
  }
335
- return logTransition('test-support', request, request.virtualize((0, path_1.resolve)(pkg.root, '-embroider-test-support.js')));
333
+ return logTransition('test-support', request, request.virtualize({ type: 'test-support-js', specifier: (0, path_1.resolve)(pkg.root, '-embroider-test-support.js') }));
336
334
  }
337
335
  handleTestSupportStyles(request) {
338
- //TODO move the extra forwardslash handling out into the vite plugin
339
- const candidates = [
340
- '@embroider/virtual/test-support.css',
341
- '/@embroider/virtual/test-support.css',
342
- './@embroider/virtual/test-support.css',
343
- ];
344
- if (!candidates.includes(request.specifier)) {
336
+ if (request.specifier !== '@embroider/virtual/test-support.css') {
345
337
  return request;
346
338
  }
347
339
  let pkg = this.packageCache.ownerOfFile(request.fromFile);
348
340
  if ((pkg === null || pkg === void 0 ? void 0 : pkg.root) !== this.options.engines[0].root) {
349
341
  throw new Error(`bug: found an import of ${request.specifier} in ${request.fromFile}, but this is not the top-level Ember app. The top-level Ember app is the only one that has support for @embroider/virtual/test-support.css. If you think something should be fixed in Embroider, please open an issue on https://github.com/embroider-build/embroider/issues.`);
350
342
  }
351
- return logTransition('test-support-styles', request, request.virtualize((0, path_1.resolve)(pkg.root, '-embroider-test-support-styles.css')));
343
+ return logTransition('test-support-styles', request, request.virtualize({
344
+ type: 'test-support-css',
345
+ specifier: (0, path_1.resolve)(pkg.root, '-embroider-test-support-styles.css'),
346
+ }));
352
347
  }
353
348
  async handleGlobalsCompat(request) {
354
- if (isTerminal(request)) {
349
+ if (request.resolvedTo) {
355
350
  return request;
356
351
  }
357
352
  let match = compatPattern.exec(request.specifier);
@@ -378,35 +373,28 @@ class Resolver {
378
373
  }
379
374
  }
380
375
  handleVendorStyles(request) {
381
- //TODO move the extra forwardslash handling out into the vite plugin
382
- const candidates = [
383
- '@embroider/virtual/vendor.css',
384
- '/@embroider/virtual/vendor.css',
385
- './@embroider/virtual/vendor.css',
386
- ];
387
- if (!candidates.includes(request.specifier)) {
376
+ if (request.specifier !== '@embroider/virtual/vendor.css') {
388
377
  return request;
389
378
  }
390
379
  let pkg = this.packageCache.ownerOfFile(request.fromFile);
391
380
  if (!pkg || !this.options.engines.some(e => e.root === (pkg === null || pkg === void 0 ? void 0 : pkg.root))) {
392
381
  throw new Error(`bug: found an import of ${request.specifier} in ${request.fromFile}, but this is not the top-level Ember app or Engine. The top-level Ember app is the only one that has support for @embroider/virtual/vendor.css. If you think something should be fixed in Embroider, please open an issue on https://github.com/embroider-build/embroider/issues.`);
393
382
  }
394
- return logTransition('vendor-styles', request, request.virtualize((0, path_1.resolve)(pkg.root, '-embroider-vendor-styles.css')));
383
+ return logTransition('vendor-styles', request, request.virtualize({ type: 'vendor-css', specifier: (0, path_1.resolve)(pkg.root, '-embroider-vendor-styles.css') }));
395
384
  }
396
385
  resolveHelper(path, inEngine, request) {
397
386
  let target = this.parseGlobalPath(path, inEngine);
398
387
  return logTransition('resolveHelper', request, request.alias(`${target.packageName}/helpers/${target.memberName}`).rehome((0, path_1.resolve)(inEngine.root, 'package.json')));
399
388
  }
400
389
  async resolveComponent(path, inEngine, request) {
390
+ var _a, _b;
401
391
  let target = this.parseGlobalPath(path, inEngine);
402
392
  let hbsModule = null;
403
393
  let jsModule = null;
404
394
  // first, the various places our template might be.
405
395
  for (let candidate of this.componentTemplateCandidates(target.packageName)) {
406
396
  let candidateSpecifier = `${target.packageName}${candidate.prefix}${target.memberName}${candidate.suffix}`;
407
- let resolution = await this.resolve(request.alias(candidateSpecifier).rehome(target.from).withMeta({
408
- runtimeFallback: false,
409
- }));
397
+ let resolution = await this.resolve(request.alias(candidateSpecifier).rehome(target.from));
410
398
  if (resolution.type === 'found') {
411
399
  hbsModule = resolution;
412
400
  break;
@@ -415,12 +403,7 @@ class Resolver {
415
403
  // then the various places our javascript might be.
416
404
  for (let candidate of this.componentJSCandidates(target.packageName)) {
417
405
  let candidateSpecifier = `${target.packageName}${candidate.prefix}${target.memberName}${candidate.suffix}`;
418
- let resolution = await this.resolve(request.alias(candidateSpecifier).rehome(target.from).withMeta({
419
- runtimeFallback: false,
420
- }));
421
- if (resolution.type === 'ignored') {
422
- return logTransition(`resolving to ignored component`, request, request.resolveTo(resolution));
423
- }
406
+ let resolution = await this.resolve(request.alias(candidateSpecifier).rehome(target.from));
424
407
  // .hbs is a resolvable extension for us, so we need to exclude it here.
425
408
  // It matches as a priority lower than .js, so finding an .hbs means
426
409
  // there's definitely not a .js.
@@ -433,7 +416,13 @@ class Resolver {
433
416
  if (!this.emberVersionSupportsSeparateTemplates) {
434
417
  throw new Error(`Components with separately resolved templates were removed at Ember 6.0. Migrate to either co-located js/ts + hbs files or to gjs/gts. https://deprecations.emberjs.com/id/component-template-resolving/. Bad template was: ${hbsModule.filename}.`);
435
418
  }
436
- return logTransition(`resolveComponent found legacy HBS`, request, request.virtualize((0, virtual_content_1.virtualPairComponent)(hbsModule.filename, jsModule === null || jsModule === void 0 ? void 0 : jsModule.filename)));
419
+ return logTransition(`resolveComponent found legacy HBS`, request, request.virtualize({
420
+ type: 'component-pair',
421
+ hbsModule: hbsModule.filename,
422
+ jsModule: (_a = jsModule === null || jsModule === void 0 ? void 0 : jsModule.filename) !== null && _a !== void 0 ? _a : null,
423
+ debugName: (0, path_1.basename)(hbsModule.filename).replace(/\.(js|hbs)$/, ''),
424
+ specifier: `${this.options.appRoot}/embroider-pair-component/${encodeURIComponent(hbsModule.filename)}/__vpc__/${encodeURIComponent((_b = jsModule === null || jsModule === void 0 ? void 0 : jsModule.filename) !== null && _b !== void 0 ? _b : '')}`,
425
+ }));
437
426
  }
438
427
  else if (jsModule) {
439
428
  return logTransition(`resolving to resolveComponent found only JS`, request, request.resolveTo(jsModule));
@@ -447,13 +436,8 @@ class Resolver {
447
436
  // component, so here to resolve the ambiguity we need to actually resolve
448
437
  // that candidate to see if it works.
449
438
  let helperCandidate = this.resolveHelper(path, inEngine, request);
450
- let helperMatch = await this.resolve(request.alias(helperCandidate.specifier).rehome(helperCandidate.fromFile).withMeta({
451
- runtimeFallback: false,
452
- }));
453
- // for the case of 'ignored' that means that esbuild found this helper in an external
454
- // package so it should be considered found in this case and we should not look for a
455
- // component with this name
456
- if (helperMatch.type === 'found' || helperMatch.type === 'ignored') {
439
+ let helperMatch = await this.resolve(request.alias(helperCandidate.specifier).rehome(helperCandidate.fromFile));
440
+ if (helperMatch.type === 'found') {
457
441
  return logTransition('resolve to ambiguous case matched a helper', request, request.resolveTo(helperMatch));
458
442
  }
459
443
  // unlike resolveHelper, resolveComponent already does pre-resolution in
@@ -631,7 +615,7 @@ class Resolver {
631
615
  });
632
616
  }
633
617
  handleRewrittenPackages(request) {
634
- if (isTerminal(request)) {
618
+ if (request.resolvedTo) {
635
619
  return request;
636
620
  }
637
621
  let requestingPkg = this.packageCache.ownerOfFile(request.fromFile);
@@ -684,7 +668,7 @@ class Resolver {
684
668
  return request;
685
669
  }
686
670
  handleRenaming(request) {
687
- if (isTerminal(request)) {
671
+ if (request.resolvedTo) {
688
672
  return request;
689
673
  }
690
674
  let packageName = (0, shared_internals_1.packageName)(request.specifier);
@@ -756,20 +740,14 @@ class Resolver {
756
740
  return request;
757
741
  }
758
742
  handleVendor(request) {
759
- //TODO move the extra forwardslash handling out into the vite plugin
760
- const candidates = [
761
- '@embroider/virtual/vendor.js',
762
- '/@embroider/virtual/vendor.js',
763
- './@embroider/virtual/vendor.js',
764
- ];
765
- if (!candidates.includes(request.specifier)) {
743
+ if (request.specifier !== '@embroider/virtual/vendor.js') {
766
744
  return request;
767
745
  }
768
746
  let pkg = this.packageCache.ownerOfFile(request.fromFile);
769
747
  if ((pkg === null || pkg === void 0 ? void 0 : pkg.root) !== this.options.engines[0].root) {
770
748
  throw new Error(`bug: found an import of ${request.specifier} in ${request.fromFile}, but this is not the top-level Ember app. The top-level Ember app is the only one that has support for @embroider/virtual/vendor.js. If you think something should be fixed in Embroider, please open an issue on https://github.com/embroider-build/embroider/issues.`);
771
749
  }
772
- return logTransition('vendor', request, request.virtualize((0, path_1.resolve)(pkg.root, '-embroider-vendor.js')));
750
+ return logTransition('vendor', request, request.virtualize({ type: 'vendor-js', specifier: (0, path_1.resolve)(pkg.root, '-embroider-vendor.js') }));
773
751
  }
774
752
  resolveWithinMovedPackage(request, pkg) {
775
753
  let levels = ['..'];
@@ -786,7 +764,7 @@ class Resolver {
786
764
  return newRequest.withMeta({ originalFromFile });
787
765
  }
788
766
  preHandleExternal(request) {
789
- if (isTerminal(request)) {
767
+ if (request.resolvedTo) {
790
768
  return request;
791
769
  }
792
770
  let { specifier, fromFile } = request;
@@ -866,8 +844,8 @@ class Resolver {
866
844
  }
867
845
  }
868
846
  async fallbackResolve(request) {
869
- if (request.isVirtual) {
870
- throw new Error('Build tool bug detected! Fallback resolve should never see a virtual request. It is expected that the defaultResolve for your bundler has already resolved this request');
847
+ if (request.resolvedTo) {
848
+ throw new Error('Build tool bug detected! Fallback resolve should never see an already-resolved request.');
871
849
  }
872
850
  if (request.specifier === '@embroider/macros') {
873
851
  // the macros package is always handled directly within babel (not
@@ -1025,14 +1003,12 @@ class Resolver {
1025
1003
  case 'fastboot-only':
1026
1004
  return request.alias(matched.entry['fastboot-js'].specifier).rehome(matched.entry['fastboot-js'].fromFile);
1027
1005
  case 'both':
1028
- let foundAppJS = await this.resolve(request.alias(matched.entry['app-js'].specifier).rehome(matched.entry['app-js'].fromFile).withMeta({
1029
- runtimeFallback: false,
1030
- }));
1006
+ let foundAppJS = await this.resolve(request.alias(matched.entry['app-js'].specifier).rehome(matched.entry['app-js'].fromFile));
1031
1007
  if (foundAppJS.type !== 'found') {
1032
1008
  throw new Error(`${matched.entry['app-js'].fromPackageName} declared ${inEngineSpecifier} in packageJSON.ember-addon.app-js, but that module does not exist`);
1033
1009
  }
1034
1010
  let { names } = (0, describe_exports_1.describeExports)((0, fs_1.readFileSync)(foundAppJS.filename, 'utf8'), { configFile: false });
1035
- return request.virtualize((0, virtual_content_1.fastbootSwitch)(matched.matched, (0, path_1.resolve)(engine.root, 'package.json'), names));
1011
+ return request.virtualize(fastbootSwitch(matched.matched, (0, path_1.resolve)(engine.root, 'package.json'), names));
1036
1012
  }
1037
1013
  }
1038
1014
  // check whether the given file with the given owningPackage is an addon's
@@ -1123,4 +1099,27 @@ function engineRelativeName(pkg, filename) {
1123
1099
  return '.' + outsideName.slice(pkg.name.length);
1124
1100
  }
1125
1101
  }
1102
+ const fastbootSwitchSuffix = '/embroider_fastboot_switch';
1103
+ function fastbootSwitch(specifier, fromFile, names) {
1104
+ let filename = `${(0, path_1.resolve)((0, path_1.dirname)(fromFile), specifier)}${fastbootSwitchSuffix}`;
1105
+ let virtualSpecifier;
1106
+ if (names.size > 0) {
1107
+ virtualSpecifier = `${filename}?names=${[...names].join(',')}`;
1108
+ }
1109
+ else {
1110
+ virtualSpecifier = filename;
1111
+ }
1112
+ return {
1113
+ type: 'fastboot-switch',
1114
+ specifier: virtualSpecifier,
1115
+ names,
1116
+ hasDefaultExport: 'x',
1117
+ };
1118
+ }
1119
+ function decodeFastbootSwitch(filename) {
1120
+ let index = filename.indexOf(fastbootSwitchSuffix);
1121
+ if (index >= 0) {
1122
+ return { filename: filename.slice(0, index) };
1123
+ }
1124
+ }
1126
1125
  //# sourceMappingURL=module-resolver.js.map