Skip to content

Commit c55000d

Browse files
authoredSep 29, 2022
Fix subpath imports with Yarn PnP (#2547)
1 parent 1bce251 commit c55000d

File tree

7 files changed

+72
-47
lines changed

7 files changed

+72
-47
lines changed
 

‎CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@
1717

1818
With this release, esbuild now supports these types of patterns too.
1919

20+
* Fix subpath imports with Yarn PnP ([#2545](https://github.com/evanw/esbuild/issues/2545))
21+
22+
Node has a little-used feature called [subpath imports](https://nodejs.org/api/packages.html#subpath-imports) which are package-internal imports that start with `#` and that go through the `imports` map in `package.json`. Previously esbuild had a bug that caused esbuild to not handle these correctly in packages installed via Yarn's "Plug'n'Play" installation strategy. The problem was that subpath imports were being checked after Yarn PnP instead of before. This release reorders these checks, which should allow subpath imports to work in this case.
23+
2024
## 0.15.9
2125

2226
* Fix an obscure npm package installation issue with `--omit=optional` ([#2558](https://github.com/evanw/esbuild/issues/2558))

‎Makefile

+1-1
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ test-e2e-yarn-berry:
204204
# Clean up
205205
rm -fr e2e-yb
206206

207-
test-yarnpnp:
207+
test-yarnpnp: platform-wasm
208208
node scripts/test-yarnpnp.js
209209

210210
# Note: This used to only be rebuilt when "version.txt" was newer than

‎internal/resolver/resolver.go

+11-11
Original file line numberDiff line numberDiff line change
@@ -1999,6 +1999,17 @@ func (r resolverQuery) loadNodeModules(importPath string, dirInfo *dirInfo, forb
19991999
}
20002000
}
20012001

2002+
// Find the parent directory with the "package.json" file
2003+
dirInfoPackageJSON := dirInfo
2004+
for dirInfoPackageJSON != nil && dirInfoPackageJSON.packageJSON == nil {
2005+
dirInfoPackageJSON = dirInfoPackageJSON.parent
2006+
}
2007+
2008+
// Check for subpath imports: https://nodejs.org/api/packages.html#subpath-imports
2009+
if dirInfoPackageJSON != nil && strings.HasPrefix(importPath, "#") && !forbidImports && dirInfoPackageJSON.packageJSON.importsMap != nil {
2010+
return r.loadPackageImports(importPath, dirInfoPackageJSON)
2011+
}
2012+
20022013
// If Yarn PnP is active, use it to find the package
20032014
if r.pnpManifest != nil {
20042015
if result := r.resolveToUnqualified(importPath, dirInfo.absPath, r.pnpManifest); result.status == pnpError {
@@ -2042,17 +2053,6 @@ func (r resolverQuery) loadNodeModules(importPath string, dirInfo *dirInfo, forb
20422053
}
20432054
}
20442055

2045-
// Find the parent directory with the "package.json" file
2046-
dirInfoPackageJSON := dirInfo
2047-
for dirInfoPackageJSON != nil && dirInfoPackageJSON.packageJSON == nil {
2048-
dirInfoPackageJSON = dirInfoPackageJSON.parent
2049-
}
2050-
2051-
// Check for subpath imports: https://nodejs.org/api/packages.html#subpath-imports
2052-
if dirInfoPackageJSON != nil && strings.HasPrefix(importPath, "#") && !forbidImports && dirInfoPackageJSON.packageJSON.importsMap != nil {
2053-
return r.loadPackageImports(importPath, dirInfoPackageJSON)
2054-
}
2055-
20562056
// Try to parse the package name using node's ESM-specific rules
20572057
esmPackageName, esmPackageSubpath, esmOK := esmParsePackageName(importPath)
20582058
if r.debugLogs != nil && esmOK {

‎require/yarnpnp/in.mjs

+3
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ if (!d3.utcDay) throw '❌ d3-time'
1414
import * as mm from 'mime'
1515
if (mm.default.getType('txt') !== 'text/plain') throw '❌ mime'
1616

17+
import * as ajv from 'aws-jwt-verify'
18+
if (!ajv.CognitoJwtVerifier) throw '❌ aws-jwt-verify'
19+
1720
import * as foo from 'foo'
1821
if (foo.default !== 'foo') throw '❌ foo'
1922

‎require/yarnpnp/package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@
22
"workspaces": [
33
"./foo"
44
],
5-
"packageManager": "yarn@3.2.3",
5+
"packageManager": "yarn@4.0.0-rc.22",
66
"dependencies": {
77
"@vue/tsconfig": "0.1.3",
8+
"aws-jwt-verify": "3.1.0",
89
"d3-time": "3.0.0",
910
"foo": "workspace:*",
1011
"mime": "3.0.0",

‎require/yarnpnp/yarn.lock

+38-30
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22
# Manual changes might be lost - proceed with caution!
33

44
__metadata:
5-
version: 6
6-
cacheKey: 8
5+
version: 7
6+
cacheKey: 9
77

88
"@tokenizer/token@npm:^0.3.0":
99
version: 0.3.0
1010
resolution: "@tokenizer/token@npm:0.3.0"
11-
checksum: 1d575d02d2a9f0c5a4ca5180635ebd2ad59e0f18b42a65f3d04844148b49b3db35cf00b6012a1af2d59c2ab3caca59451c5689f747ba8667ee586ad717ee58e1
11+
checksum: 0154f4fecd335fc121f78d1a697d90833943c855be7f39f22012f1ac75f6241b37f07025ad4ce6ec2576730e2253d4ef2698364a20d93b749bcdb393dafed93e
1212
languageName: node
1313
linkType: hard
1414

@@ -20,25 +20,32 @@ __metadata:
2020
peerDependenciesMeta:
2121
"@types/node":
2222
optional: true
23-
checksum: 8150a24497a5348bc342c27afb38ad989de2ce8e94c349020628065d2a8df6837cb8bb3012f9161eea716487832612ac71b5f910d95bac41539ac6021d6bd88d
23+
checksum: d086593aea25e7872f28227dec3102d232d47099d16933d483b69ec746ac4dc254b6bd610deeab059d0b8b2d72a0738ee77e4c60f6e8244aedb2e99d633c38d4
24+
languageName: node
25+
linkType: hard
26+
27+
"aws-jwt-verify@npm:3.1.0":
28+
version: 3.1.0
29+
resolution: "aws-jwt-verify@npm:3.1.0"
30+
checksum: 7910e4fb3da606bfdb627908d6da02941a5adfc28324b8065e782ba9116eb4ed23bb83fe4d5edc3853897e93ebe1f26719812051459520b2c8187ebf31a2b552
2431
languageName: node
2532
linkType: hard
2633

2734
"d3-array@npm:2 - 3":
2835
version: 3.2.0
2936
resolution: "d3-array@npm:3.2.0"
3037
dependencies:
31-
internmap: 1 - 2
32-
checksum: e236f6670b60b64abb6c435da25b5cbbdc2c7c0decdbf9355bc4cf6803d6da4fa820b7b78b9cbd127edb493555934a9788d45084c2f39d7c2e1a2b7aa48264a4
38+
internmap: "npm:1 - 2"
39+
checksum: d5856c973d5ab72a57b68f3fa843d527683a9ac26af2684766e07df7f9e663ce3623bc8aed68057c54f7009393e6f15680718526cd05f65f811697e38d3da1a8
3340
languageName: node
3441
linkType: hard
3542

3643
"d3-time@npm:3.0.0":
3744
version: 3.0.0
3845
resolution: "d3-time@npm:3.0.0"
3946
dependencies:
40-
d3-array: 2 - 3
41-
checksum: 01646568ef01682550b7ee9f32394e4eb116a29515564861958871ed8de8fff02a25cd50dd8c4413921e6d9ecb8c8ce39be3266f655c8c18599fe58bcb253d60
47+
d3-array: "npm:2 - 3"
48+
checksum: 2e9a13ad045ab5691edbfff633c602673670aabb160c06aa220932cc2512d66cfbce746cbb035ebc5968fccf6072ae89f27026504d972538698870d026987d36
4249
languageName: node
4350
linkType: hard
4451

@@ -51,25 +58,25 @@ __metadata:
5158
"internmap@npm:1 - 2":
5259
version: 2.0.3
5360
resolution: "internmap@npm:2.0.3"
54-
checksum: 7ca41ec6aba8f0072fc32fa8a023450a9f44503e2d8e403583c55714b25efd6390c38a87161ec456bf42d7bc83aab62eb28f5aef34876b1ac4e60693d5e1d241
61+
checksum: 27c28dc08e432d4bb9fc70d74a59536e893d60fcb6b7078a70e8b0fbe1ed7fe8a01c4b4931ff50bbdab3d1411cb6050f5119d4c513dc663b7af2d2076efa56a6
5562
languageName: node
5663
linkType: hard
5764

5865
"js-tokens@npm:^3.0.0 || ^4.0.0":
5966
version: 4.0.0
6067
resolution: "js-tokens@npm:4.0.0"
61-
checksum: 8a95213a5a77deb6cbe94d86340e8d9ace2b93bc367790b260101d2f36a2eaf4e4e22d9fa9cf459b38af3a32fb4190e638024cf82ec95ef708680e405ea7cc78
68+
checksum: 47d1c18dc6b9eed4baf1db3d81b36feb95b463201c82ffce0d7a4d65ede596ba97d6ac2468974199705db9ef8a3433606af41fc7bbe7cb25c1dd601785413d9b
6269
languageName: node
6370
linkType: hard
6471

6572
"loose-envify@npm:^1.1.0":
6673
version: 1.4.0
6774
resolution: "loose-envify@npm:1.4.0"
6875
dependencies:
69-
js-tokens: ^3.0.0 || ^4.0.0
76+
js-tokens: "npm:^3.0.0 || ^4.0.0"
7077
bin:
7178
loose-envify: cli.js
72-
checksum: 6517e24e0cad87ec9888f500c5b5947032cdfe6ef65e1c1936a0c48a524b81e65542c9c3edc91c97d5bddc806ee2a985dbc79be89215d613b1de5db6d1cfe6f4
79+
checksum: 39c5fc44c6a8f7f8a92cccf174554fbb307477ef493760407920fdd4ed5f6cc1aec5b6a5ab3c3767ef79547b3e1aea09d8ca08d773232c662d910cfe473a0590
7380
languageName: node
7481
linkType: hard
7582

@@ -78,67 +85,68 @@ __metadata:
7885
resolution: "mime@npm:3.0.0"
7986
bin:
8087
mime: cli.js
81-
checksum: f43f9b7bfa64534e6b05bd6062961681aeb406a5b53673b53b683f27fcc4e739989941836a355eef831f4478923651ecc739f4a5f6e20a76487b432bfd4db928
88+
checksum: b00613ec79e1f14586c970b6651afca77947f972eca6086ccb614c2b7a1a899d0ec38c6f4418370ecb9d0cebeb4ad300999b6b7f2dcbeaf40f9e0d55874b6c81
8289
languageName: node
8390
linkType: hard
8491

8592
"peek-readable@npm:^5.0.0":
8693
version: 5.0.0
8794
resolution: "peek-readable@npm:5.0.0"
88-
checksum: bef5ceb50586eb42e14efba274ac57ffe97f0ed272df9239ce029f688f495d9bf74b2886fa27847c706a9db33acda4b7d23bbd09a2d21eb4c2a54da915117414
95+
checksum: 9350acc783b1b01c956e07f1e010d25b7e3f995719fe08d7deb5d2ac782550875ef57006304a566a0cac14e9c5d5ba95c1c09888a79ddf2d8e2682a51e833516
8996
languageName: node
9097
linkType: hard
9198

9299
"react-dom@npm:18.2.0":
93100
version: 18.2.0
94101
resolution: "react-dom@npm:18.2.0"
95102
dependencies:
96-
loose-envify: ^1.1.0
97-
scheduler: ^0.23.0
103+
loose-envify: "npm:^1.1.0"
104+
scheduler: "npm:^0.23.0"
98105
peerDependencies:
99106
react: ^18.2.0
100-
checksum: 7d323310bea3a91be2965f9468d552f201b1c27891e45ddc2d6b8f717680c95a75ae0bc1e3f5cf41472446a2589a75aed4483aee8169287909fcd59ad149e8cc
107+
checksum: 7c5b915fb793d63563cec1f721e059e6ff0e2855ac116ab5cb7450b6c59398f5e25f95c960ce5cb93504cc58ab724a75a78e99282354e702a0e667d0d787d028
101108
languageName: node
102109
linkType: hard
103110

104111
"react@npm:18.2.0":
105112
version: 18.2.0
106113
resolution: "react@npm:18.2.0"
107114
dependencies:
108-
loose-envify: ^1.1.0
109-
checksum: 88e38092da8839b830cda6feef2e8505dec8ace60579e46aa5490fc3dc9bba0bd50336507dc166f43e3afc1c42939c09fe33b25fae889d6f402721dcd78fca1b
115+
loose-envify: "npm:^1.1.0"
116+
checksum: 8434e5782c52b3bf18a80b666348977924ee3827895fa03ec3ffb9faca90c460049f14130428dd1546bab6cf3b2c277f2c243d3c2a856501331d2e69c24b2bb9
110117
languageName: node
111118
linkType: hard
112119

113120
"root-workspace-0b6124@workspace:.":
114121
version: 0.0.0-use.local
115122
resolution: "root-workspace-0b6124@workspace:."
116123
dependencies:
117-
"@vue/tsconfig": 0.1.3
118-
d3-time: 3.0.0
124+
"@vue/tsconfig": "npm:0.1.3"
125+
aws-jwt-verify: "npm:3.1.0"
126+
d3-time: "npm:3.0.0"
119127
foo: "workspace:*"
120-
mime: 3.0.0
121-
react: 18.2.0
122-
react-dom: 18.2.0
123-
strtok3: 7.0.0
128+
mime: "npm:3.0.0"
129+
react: "npm:18.2.0"
130+
react-dom: "npm:18.2.0"
131+
strtok3: "npm:7.0.0"
124132
languageName: unknown
125133
linkType: soft
126134

127135
"scheduler@npm:^0.23.0":
128136
version: 0.23.0
129137
resolution: "scheduler@npm:0.23.0"
130138
dependencies:
131-
loose-envify: ^1.1.0
132-
checksum: d79192eeaa12abef860c195ea45d37cbf2bbf5f66e3c4dcd16f54a7da53b17788a70d109ee3d3dde1a0fd50e6a8fc171f4300356c5aee4fc0171de526bf35f8a
139+
loose-envify: "npm:^1.1.0"
140+
checksum: f4022b95cdc282668643da4850f55fe70c899aa956d11819f196e2ca892271bdb253613e53997852094f9351f7c72d057eea8b28d9b4bcb93bcb1c6d09985c82
133141
languageName: node
134142
linkType: hard
135143

136144
"strtok3@npm:7.0.0":
137145
version: 7.0.0
138146
resolution: "strtok3@npm:7.0.0"
139147
dependencies:
140-
"@tokenizer/token": ^0.3.0
141-
peek-readable: ^5.0.0
142-
checksum: 2ebe7ad8f2aea611dec6742cf6a42e82764892a362907f7ce493faf334501bf981ce21c828dcc300457e6d460dc9c34d644ededb3b01dcb9e37559203cf1748c
148+
"@tokenizer/token": "npm:^0.3.0"
149+
peek-readable: "npm:^5.0.0"
150+
checksum: 0d3b800599678de1dae6eb103a850080564c31d48222c155aafa51dff05431fdb9f1863b48c094ec39c5b63245f03427a4ab1ad783c8903df44eae4c9c7badf0
143151
languageName: node
144152
linkType: hard

‎scripts/test-yarnpnp.js

+13-4
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ function modTime(file) {
1616
}
1717

1818
function reinstallYarnIfNeeded() {
19-
const yarnPath = path.join(rootDir, '.yarn', 'releases', 'yarn-3.2.3.cjs')
19+
const yarnPath = path.join(rootDir, '.yarn', 'releases', 'yarn-4.0.0-rc.22.cjs')
2020

2121
if (fs.existsSync(yarnPath) && modTime(yarnPath) > Math.max(
2222
modTime(path.join(rootDir, 'package.json')),
@@ -31,14 +31,23 @@ function reinstallYarnIfNeeded() {
3131
fs.rmSync(path.join(rootDir, '.yarnrc.yml'), { recursive: true, force: true })
3232

3333
try {
34-
run('yarn set version 3.2.3')
34+
run('yarn set version 4.0.0-rc.22')
3535
} catch {
3636
run('npm i -g yarn') // Install Yarn globally if it's not already installed
37-
run('yarn set version 3.2.3')
37+
run('yarn set version 4.0.0-rc.22')
3838
}
3939

4040
const rc = fs.readFileSync(path.join(rootDir, '.yarnrc.yml'), 'utf8')
41-
fs.writeFileSync(path.join(rootDir, '.yarnrc.yml'), `pnpIgnorePatterns: ["./bar/**"]\n` + rc)
41+
fs.writeFileSync(path.join(rootDir, '.yarnrc.yml'), `
42+
pnpEnableEsmLoader: true
43+
pnpIgnorePatterns: ["./bar/**"]
44+
45+
# Note: Yarn 4 defaults to "enableGlobalCache: true" which doesn't
46+
# work on Windows due to cross-drive issues with relative paths.
47+
# Explicitly set "enableGlobalCache: false" to avoid this issue.
48+
enableGlobalCache: false
49+
50+
` + rc)
4251

4352
run('yarn install')
4453
}

0 commit comments

Comments
 (0)
Please sign in to comment.