Skip to content

Commit a2c2773

Browse files
committed
fix exports matching
This fixes the usage of `esmock` with the latest version of `@modelcontextprotocol/sdk`, which introduced new exports entries. See: modelcontextprotocol/typescript-sdk#851
1 parent ef770ae commit a2c2773

File tree

10 files changed

+81
-11
lines changed

10 files changed

+81
-11
lines changed

resolvewithplus.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,11 +150,19 @@ const gettargetnameandspecifier = target =>
150150
// the right hand side target pattern as a ** glob against the list of files
151151
// within the package.
152152
//
153+
// Paths need to match exactly. Partial matches are only valid when using the
154+
// star glob pattern.
155+
//
153156
// './lib/*' './lib/index' -> true
157+
// './lib/feature', './lib/feature' -> true
154158
// './lib/feature', './lib/index' -> false
159+
// './lib/feature', './lib/feature/something' -> false
155160
const ispathesmmatch = (pathesm, pathlocal) => {
156161
const isesmkeymatchRe = new RegExp(
157-
pathesm.replace(esmStrPathCharRe, '\\$1').replace(esmStrGlobRe, '.*'))
162+
'^' +
163+
pathesm.replace(esmStrPathCharRe, '\\$1').replace(esmStrGlobRe, '.*') +
164+
'$'
165+
)
158166

159167
return isesmkeymatchRe.test(pathlocal)
160168
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export default 'feature-stuff'
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export default 'lib-stuff'
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
{
2+
"name": "nodejsexample_15_exports",
3+
"type": "module",
4+
"repository": {
5+
"type": "git",
6+
"url": "git+https://github.com/iambumblehead/resolvewithplus.git"
7+
},
8+
"exports": {
9+
".": {
10+
"import": "./src/index.js"
11+
},
12+
"./mystuff": {
13+
"import": "./src/mystuff/index.js"
14+
},
15+
"./*": {
16+
"import": "./src/*"
17+
}
18+
}
19+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export default 'mystuff'

tests/tests-basic/nodejsexample_15_exports/src/mystuff/feature.js

Whitespace-only changes.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export default 'mystuff'

tests/tests-basic/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
"nodejsexample_12_exports": "file:nodejsexample_12_exports",
2121
"nodejsexample_13_exports": "file:nodejsexample_13_exports",
2222
"nodejsexample_14_exports": "file:nodejsexample_14_exports",
23+
"nodejsexample_15_exports": "file:nodejsexample_15_exports",
2324
"resolvewithplus": "file:.."
2425
},
2526
"workspaces": [

tests/tests-basic/tests-basic.test.js

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,17 +39,25 @@ test('should return matched export paths', () => {
3939
.getesmkeyvalmatch(key, o[key], path)
4040

4141
assert.strictEqual(
42-
getmatch(exports, '.', './lib/index.test.js'),
42+
getmatch(exports, '.', '.'),
4343
'./lib/index.test.js')
4444

4545
assert.strictEqual(
46-
getmatch(exports, './lib', './lib/index.test.js'),
46+
getmatch(exports, './lib', './lib'),
4747
'./lib/index.test.js')
4848

4949
assert.strictEqual(
5050
getmatch(exports, './lib/*', './lib/index.test.js'),
5151
'./lib/index.test.js')
5252

53+
assert.strictEqual(
54+
getmatch(exports, './lib/*', './lib/feature.js'),
55+
'./lib/feature.js')
56+
57+
assert.strictEqual(
58+
getmatch(exports, './lib/*', './lib/feature'),
59+
'./lib/feature.js')
60+
5361
assert.strictEqual(
5462
getmatch(exports, './submodule.js', './submodule.js'),
5563
'./src/submodule.js')

tests/tests-basic/tests-export-patterns.test.js

Lines changed: 38 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -81,8 +81,12 @@ test('should mock all exports from nodejsexample_01_exports', () => {
8181
test('should mock all exports from nodejsexample_02_exports', () => {
8282
const noderesolvedlibindex = toresolvefileurl(
8383
'./nodejsexample_02_exports/lib/index.test.js')
84+
const noderesolvedlibstuff = toresolvefileurl(
85+
'./nodejsexample_02_exports/lib/stuff.js')
8486
const noderesolvedfeatureindex = toresolvefileurl(
8587
'./nodejsexample_02_exports/feature/index.test.js')
88+
const noderesolvedfeaturestuff = toresolvefileurl(
89+
'./nodejsexample_02_exports/feature/stuff.js')
8690
const noderesolvedpackagejson = toresolvefileurl(
8791
'./nodejsexample_02_exports/package.json')
8892

@@ -95,24 +99,24 @@ test('should mock all exports from nodejsexample_02_exports', () => {
9599
noderesolvedlibindex)
96100

97101
assert.strictEqual(
98-
resolvewithplus('nodejsexample_02_exports/lib/index'),
99-
noderesolvedlibindex)
102+
resolvewithplus('nodejsexample_02_exports/lib/stuff'),
103+
noderesolvedlibstuff)
100104

101105
assert.strictEqual(
102-
resolvewithplus('nodejsexample_02_exports/lib/index.js'),
103-
noderesolvedlibindex)
106+
resolvewithplus('nodejsexample_02_exports/lib/stuff.js'),
107+
noderesolvedlibstuff)
104108

105109
assert.strictEqual(
106110
resolvewithplus('nodejsexample_02_exports/feature'),
107111
noderesolvedfeatureindex)
108112

109113
assert.strictEqual(
110-
resolvewithplus('nodejsexample_02_exports/feature/index'),
111-
noderesolvedfeatureindex)
114+
resolvewithplus('nodejsexample_02_exports/feature/stuff'),
115+
noderesolvedfeaturestuff)
112116

113117
assert.strictEqual(
114-
resolvewithplus('nodejsexample_02_exports/feature/index.js'),
115-
noderesolvedfeatureindex)
118+
resolvewithplus('nodejsexample_02_exports/feature/stuff.js'),
119+
noderesolvedfeaturestuff)
116120

117121
assert.strictEqual(
118122
resolvewithplus('nodejsexample_02_exports/package.json'),
@@ -313,6 +317,32 @@ test('should mock exports from nodejsexample_14_exports, asterisk dir', () => {
313317
noderesolvedindex)
314318
})
315319

320+
// "exports": {
321+
// ".": {
322+
// "import": "./src/index.js"
323+
// },
324+
// "./mystuff": {
325+
// "import": "./src/mystuff/index.js"
326+
// },
327+
// "./*": {
328+
// "import": "./src/*"
329+
// }
330+
// }
331+
test('should mock exports from nodejsexample_15_exports, partial match', () => {
332+
const noderesolvedmystuff = toresolvefileurl(
333+
'./nodejsexample_15_exports/src/mystuff/index.js')
334+
const noderesolvedmystufffeature = toresolvefileurl(
335+
'./nodejsexample_15_exports/src/mystuff/feature.js')
336+
337+
assert.strictEqual(
338+
resolvewithplus('nodejsexample_15_exports/mystuff'),
339+
noderesolvedmystuff)
340+
341+
assert.strictEqual(
342+
resolvewithplus('nodejsexample_15_exports/mystuff/feature.js'),
343+
noderesolvedmystufffeature)
344+
})
345+
316346
// "exports": './lib/index.js',
317347
// "exports": { "import": "./lib/index.js" },
318348
// "exports": { ".": "./lib/index.js" },

0 commit comments

Comments
 (0)