Skip to content

Commit

Permalink
rely on vite for self references with exports
Browse files Browse the repository at this point in the history
  • Loading branch information
mansona committed May 28, 2024
1 parent 9cf3b24 commit 90f4ff2
Show file tree
Hide file tree
Showing 4 changed files with 193 additions and 458 deletions.
26 changes: 4 additions & 22 deletions packages/core/src/module-resolver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import { explicitRelative, RewrittenPackageCache } from '@embroider/shared-inter
import makeDebug from 'debug';
import assertNever from 'assert-never';
import reversePackageExports from '@embroider/reverse-exports';
import { exports as resolveExports } from 'resolve.exports';

import {
virtualExternalESModule,
Expand Down Expand Up @@ -947,10 +946,13 @@ export class Resolver {
.withMeta({ originalFromFile: request.fromFile })
.rehome(resolve(originalRequestingPkg.root, 'package.json'))
);
} else {
}
// TODO is this the right check for this?
else if (packageName !== requestingPkg.name) {
// requesting package was moved and we failed to find its target. We
// can't let that accidentally succeed in the defaultResolve because we
// could escape the moved package system.
// and it's not a self reference
return logTransition('missing outbound request from moved package', request, request.notFound());
}
}
Expand Down Expand Up @@ -1016,26 +1018,6 @@ export class Resolver {
request,
request.alias(selfImportPath).rehome(resolve(pkg.root, 'package.json'))
);
} else {
// v2 packages are supposed to use package.json `exports` to enable
// self-imports, but not all build tools actually follow the spec. This
// is a workaround for badly behaved packagers.
//
// Known upstream bugs this works around:
// - https://github.com/vitejs/vite/issues/9731
if (pkg.packageJSON.exports) {
let found = resolveExports(pkg.packageJSON, request.specifier, {
browser: true,
conditions: ['default', 'imports'],
});
if (found?.[0]) {
return logTransition(
`v2 self-import with package.json exports`,
request,
request.alias(found?.[0]).rehome(resolve(pkg.root, 'package.json'))
);
}
}
}
}

Expand Down
30 changes: 22 additions & 8 deletions packages/core/src/node-resolve.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
import { virtualContent } from './virtual-content';
import { dirname, resolve, isAbsolute } from 'path';
import { explicitRelative } from '@embroider/shared-internals';
import { dirname, join } from 'path';
import { packageName as getPackageName } from '@embroider/shared-internals';
import assertNever from 'assert-never';
import { exports as resolveExports } from 'resolve.exports';

// these would be circular, but they're type-only so it's fine
import type { ModuleRequest, Resolution, Resolver } from './module-resolver';
import { existsSync } from 'fs-extra';

export class NodeModuleRequest implements ModuleRequest {
constructor(
Expand Down Expand Up @@ -102,12 +104,24 @@ export class NodeModuleRequest implements ModuleRequest {
// We can do the path adjustments before doing require.resolve.
let { specifier } = request;
let fromDir = dirname(request.fromFile);
if (!isAbsolute(specifier) && specifier.startsWith('.')) {
let targetPath = resolve(fromDir, specifier);
let newFromDir = dirname(targetPath);
if (fromDir !== newFromDir) {
specifier = explicitRelative(newFromDir, targetPath);
fromDir = newFromDir;

let packageName = getPackageName(request.specifier);

let pkg = this.resolver.packageCache.ownerOfFile(request.fromFile);

// check for self reference
if (packageName && pkg?.name === packageName && pkg.packageJSON.exports) {
let found = resolveExports(pkg.packageJSON, request.specifier, {
browser: true,
conditions: ['default', 'imports'],
});
if (found?.[0]) {
let filename = join(pkg.root, found?.[0]);

// only resolve to this file if it exists, otherwise fallback to other behaviour
if (existsSync(filename)) {
return { type: 'found', filename, result: { type: 'real' as 'real', filename }, isVirtual: false };
}
}
}

Expand Down
6 changes: 3 additions & 3 deletions packages/vite/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
"main": "index.mjs",
"peerDependencies": {
"@embroider/core": "workspace:^",
"vite": "^4.3.9 || ^5.0.0"
"vite": "^5.2.0"
},
"scripts": {
"test": "jest"
Expand All @@ -31,8 +31,8 @@
"@types/debug": "^4.1.5",
"@types/jsdom": "^16.2.11",
"@types/fs-extra": "^9.0.12",
"rollup": "^3.23.0",
"vite": "^4.3.9"
"rollup": "^4.0.0",
"vite": "^5.2.0"
},
"files": [
"index.mjs",
Expand Down
Loading

0 comments on commit 90f4ff2

Please sign in to comment.