Skip to content

Commit

Permalink
feat: support for self-referencing (#16068)
Browse files Browse the repository at this point in the history
  • Loading branch information
XiSenao authored Mar 12, 2024
1 parent 4559ac0 commit 03b9674
Show file tree
Hide file tree
Showing 8 changed files with 37 additions and 2 deletions.
14 changes: 13 additions & 1 deletion packages/vite/src/node/plugins/resolve.ts
Original file line number Diff line number Diff line change
Expand Up @@ -735,7 +735,19 @@ export function tryNodeResolve(
basedir = root
}

const pkg = resolvePackageData(pkgId, basedir, preserveSymlinks, packageCache)
let selfPkg = null
if (!isBuiltin(id) && !id.includes('\0') && bareImportRE.test(id)) {
// check if it's a self reference dep.
const selfPackageData = findNearestPackageData(basedir, packageCache)
selfPkg =
selfPackageData?.data.exports && selfPackageData?.data.name === pkgId
? selfPackageData
: null
}

const pkg =
selfPkg ||
resolvePackageData(pkgId, basedir, preserveSymlinks, packageCache)
if (!pkg) {
// if import can't be found, check if it's an optional peer dep.
// if so, we can resolve to a special id that errors only when imported.
Expand Down
1 change: 1 addition & 0 deletions playground/nested-deps/__tests__/nested-deps.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,5 @@ test('handle nested package', async () => {
// expect(await page.textContent('.nested-e')).toBe('1')

expect(await page.textContent('.absolute-f')).toBe('F@2.0.0')
expect(await page.textContent('.self-referencing')).toBe('true')
})
6 changes: 6 additions & 0 deletions playground/nested-deps/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ <h2>exclude dependency of pre-bundled dependency</h2>

<h2>absolute dependency path: <span class="absolute-f"></span></h2>

<h2>self referencing</h2>
<pre class="self-referencing"></pre>

<script type="module">
import A from '@vitejs/test-package-a'
import B, { A as nestedA } from '@vitejs/test-package-b'
Expand All @@ -32,6 +35,7 @@ <h2>absolute dependency path: <span class="absolute-f"></span></h2>
import D, { nestedD } from '@vitejs/test-package-d'
// import { testExcluded } from '@vitejs/test-package-e'
import F from '__F_ABSOLUTE_PACKAGE_PATH__'
import { isSelfReference } from '@vitejs/self-referencing/test'

text('.a', A)
text('.b', B)
Expand All @@ -47,6 +51,8 @@ <h2>absolute dependency path: <span class="absolute-f"></span></h2>

text('.absolute-f', F)

text('.self-referencing', isSelfReference)

function text(sel, text) {
document.querySelector(sel).textContent = text
}
Expand Down
3 changes: 2 additions & 1 deletion playground/nested-deps/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
"@vitejs/test-package-c": "link:./test-package-c",
"@vitejs/test-package-d": "link:./test-package-d",
"@vitejs/test-package-e": "link:./test-package-e",
"@vitejs/test-package-f": "link:./test-package-f"
"@vitejs/test-package-f": "link:./test-package-f",
"@vitejs/self-referencing": "link:../self-referencing"
}
}
1 change: 1 addition & 0 deletions playground/self-referencing/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export const isSelfReference = true
8 changes: 8 additions & 0 deletions playground/self-referencing/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"name": "@vitejs/self-referencing",
"type": "module",
"exports": {
".": "./index.js",
"./test": "./test/index.js"
}
}
1 change: 1 addition & 0 deletions playground/self-referencing/test/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { isSelfReference } from '@vitejs/self-referencing'
5 changes: 5 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 03b9674

Please sign in to comment.