Skip to content

Commit

Permalink
fix(resolve): use only root package.json as exports source (vitejs#11259
Browse files Browse the repository at this point in the history
)

Co-authored-by: bluwy <bjornlu.dev@gmail.com>
  • Loading branch information
2 people authored and futurGH committed Feb 26, 2023
1 parent ea3ca9a commit cffb818
Show file tree
Hide file tree
Showing 14 changed files with 88 additions and 11 deletions.
25 changes: 14 additions & 11 deletions packages/vite/src/node/plugins/resolve.ts
Original file line number Diff line number Diff line change
Expand Up @@ -665,12 +665,21 @@ export function tryNodeResolve(
basedir = nestedResolveFrom(nestedRoot, basedir, preserveSymlinks)
}

let pkg: PackageData | undefined
let pkgId: string | undefined
// nearest package.json
let nearestPkg: PackageData | undefined
// nearest package.json that may have the `exports` field
let pkg: PackageData | undefined

let pkgId = possiblePkgIds.reverse().find((pkgId) => {
const rootPkgId = possiblePkgIds[0]

const rootPkg = resolvePackageData(
rootPkgId,
basedir,
preserveSymlinks,
packageCache,
)!

const nearestPkgId = [...possiblePkgIds].reverse().find((pkgId) => {
nearestPkg = resolvePackageData(
pkgId,
basedir,
Expand All @@ -680,17 +689,11 @@ export function tryNodeResolve(
return nearestPkg
})!

const rootPkgId = possiblePkgIds[0]
const rootPkg = resolvePackageData(
rootPkgId,
basedir,
preserveSymlinks,
packageCache,
)!
if (rootPkg?.data?.exports) {
pkg = rootPkg
pkgId = rootPkgId
pkg = rootPkg
} else {
pkgId = nearestPkgId
pkg = nearestPkg
}

Expand Down
10 changes: 10 additions & 0 deletions playground/resolve/__tests__/resolve.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,12 @@ test('deep import', async () => {
expect(await page.textContent('.deep-import')).toMatch('[2,4]')
})

test('exports and a nested package scope with a different type', async () => {
expect(await page.textContent('.exports-and-nested-scope')).toMatch(
'[success]',
)
})

test('entry with exports field', async () => {
expect(await page.textContent('.exports-entry')).toMatch('[success]')
})
Expand Down Expand Up @@ -36,6 +42,10 @@ test('deep import with exports field + mapped dir', async () => {
)
})

test('exports read from the root package.json', async () => {
expect(await page.textContent('.exports-from-root')).toMatch('[success]')
})

// this is how Svelte 3 is packaged
test('deep import with exports and legacy fallback', async () => {
expect(await page.textContent('.exports-legacy-fallback')).toMatch(
Expand Down
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
'use strict'

// intentionally use the default export here since default import from CJS has different semantics in node
export default '[success] ES .js file within root that has type: commonjs (thanks to a package scope)'
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"private": true,
"type": "module"
}
10 changes: 10 additions & 0 deletions playground/resolve/exports-and-nested-scope/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"name": "@vitejs/test-resolve-exports-and-nested-scope",
"private": true,
"version": "1.0.0",
"type": "commonjs",
"exports": {
".": "./index.js",
"./nested": "./nested-scope/file.js"
}
}
1 change: 1 addition & 0 deletions playground/resolve/exports-from-root/file.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export const msg = '[success] exports from root (./file.js)'
Empty file.
1 change: 1 addition & 0 deletions playground/resolve/exports-from-root/nested/file.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export const msg = 'fail exports from root (./nested/file.js)'
5 changes: 5 additions & 0 deletions playground/resolve/exports-from-root/nested/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"exports": {
".": "./file.js"
}
}
9 changes: 9 additions & 0 deletions playground/resolve/exports-from-root/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"name": "@vitejs/test-resolve-exports-from-root",
"private": true,
"version": "1.0.0",
"exports": {
".": "./index.js",
"./nested": "./file.js"
}
}
12 changes: 12 additions & 0 deletions playground/resolve/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ <h2>Utf8-bom import</h2>
<h2>Deep import</h2>
<p>Should show [2,4]:<span class="pre deep-import">fail</span></p>

<h2>Exports and a nested package scope with a different type</h2>
<p class="exports-and-nested-scope">fail</p>

<h2>Entry resolving with exports field</h2>
<p class="exports-entry">fail</p>

Expand All @@ -24,6 +27,9 @@ <h2>Deep import with exports field + mapped directory</h2>
<h2>Exports field env priority</h2>
<p class="exports-env">fail</p>

<h2>Exports field read only from the root package.json</h2>
<p class="exports-from-root">fail</p>

<h2>Exports with legacy fallback</h2>
<p class="exports-legacy-fallback">fail</p>

Expand Down Expand Up @@ -143,6 +149,9 @@ <h2>resolve package that contains # in path</h2>

text('.deep-import', JSON.stringify(slicedToArray(iterable, 2)))

import exportsAndNestedScopeMsg from '@vitejs/test-resolve-exports-and-nested-scope/nested'
text('.exports-and-nested-scope', exportsAndNestedScopeMsg)

// exports field
import { msg } from '@vitejs/test-resolve-exports-path'
text('.exports-entry', msg)
Expand All @@ -166,6 +175,9 @@ <h2>resolve package that contains # in path</h2>
import { msg as exportsEnvMsg } from '@vitejs/test-resolve-exports-env'
text('.exports-env', exportsEnvMsg)

import { msg as exportsFromRootMsg } from '@vitejs/test-resolve-exports-from-root/nested'
text('.exports-from-root', exportsFromRootMsg)

import { msg as exportsLegacyFallbackMsg } from '@vitejs/test-resolve-exports-legacy-fallback/dir'
text('.exports-legacy-fallback', exportsLegacyFallbackMsg)

Expand Down
2 changes: 2 additions & 0 deletions playground/resolve/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,9 @@
"@vitejs/test-resolve-browser-module-field3": "link:./browser-module-field3",
"@vitejs/test-resolve-custom-condition": "link:./custom-condition",
"@vitejs/test-resolve-custom-main-field": "link:./custom-main-field",
"@vitejs/test-resolve-exports-and-nested-scope": "link:./exports-and-nested-scope",
"@vitejs/test-resolve-exports-env": "link:./exports-env",
"@vitejs/test-resolve-exports-from-root": "link:./exports-from-root",
"@vitejs/test-resolve-exports-legacy-fallback": "link:./exports-legacy-fallback",
"@vitejs/test-resolve-exports-path": "link:./exports-path",
"@vitejs/test-resolve-linked": "workspace:*"
Expand Down
16 changes: 16 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit cffb818

Please sign in to comment.