-
Notifications
You must be signed in to change notification settings - Fork 29.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
module: unify package exports test for CJS and ESM
Refs: nodejs/modules#358 PR-URL: #28831 Reviewed-By: Guy Bedford <[email protected]> Reviewed-By: Rich Trott <[email protected]>
- Loading branch information
Showing
6 changed files
with
102 additions
and
90 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,29 +1,88 @@ | ||
// Flags: --experimental-modules | ||
|
||
import { mustCall } from '../common/index.mjs'; | ||
import { ok, strictEqual } from 'assert'; | ||
|
||
import { asdf, asdf2, space } from '../fixtures/pkgexports.mjs'; | ||
import { | ||
loadMissing, | ||
loadFromNumber, | ||
loadDot, | ||
} from '../fixtures/pkgexports-missing.mjs'; | ||
|
||
strictEqual(asdf, 'asdf'); | ||
strictEqual(asdf2, 'asdf'); | ||
strictEqual(space, 'encoded path'); | ||
|
||
loadMissing().catch(mustCall((err) => { | ||
ok(err.message.toString().startsWith('Package exports')); | ||
ok(err.message.toString().indexOf('do not define a \'./missing\' subpath')); | ||
})); | ||
|
||
loadFromNumber().catch(mustCall((err) => { | ||
ok(err.message.toString().startsWith('Package exports')); | ||
ok(err.message.toString().indexOf('do not define a \'./missing\' subpath')); | ||
})); | ||
|
||
loadDot().catch(mustCall((err) => { | ||
ok(err.message.toString().startsWith('Cannot find main entry point')); | ||
})); | ||
import { ok, deepStrictEqual, strictEqual } from 'assert'; | ||
|
||
import { requireFixture, importFixture } from '../fixtures/pkgexports.mjs'; | ||
|
||
[requireFixture, importFixture].forEach((loadFixture) => { | ||
const isRequire = loadFixture === requireFixture; | ||
|
||
const validSpecifiers = new Map([ | ||
// A simple mapping of a path. | ||
['pkgexports/valid-cjs', { default: 'asdf' }], | ||
// A directory mapping, pointing to the package root. | ||
['pkgexports/sub/asdf.js', { default: 'asdf' }], | ||
// A mapping pointing to a file that needs special encoding (%20) in URLs. | ||
['pkgexports/space', { default: 'encoded path' }], | ||
// Verifying that normal packages still work with exports turned on. | ||
isRequire ? ['baz/index', { default: 'eye catcher' }] : [null], | ||
]); | ||
for (const [validSpecifier, expected] of validSpecifiers) { | ||
if (validSpecifier === null) continue; | ||
|
||
loadFixture(validSpecifier) | ||
.then(mustCall((actual) => { | ||
deepStrictEqual({ ...actual }, expected); | ||
})); | ||
} | ||
|
||
// There's no such export - so there's nothing to do. | ||
loadFixture('pkgexports/missing').catch(mustCall((err) => { | ||
strictEqual(err.code, 'ERR_PATH_NOT_EXPORTED'); | ||
assertStartsWith(err.message, 'Package exports'); | ||
assertIncludes(err.message, 'do not define a \'./missing\' subpath'); | ||
})); | ||
|
||
// The file exists but isn't exported. The exports is a number which counts | ||
// as a non-null value without any properties, just like `{}`. | ||
loadFixture('pkgexports-number/hidden.js').catch(mustCall((err) => { | ||
strictEqual(err.code, 'ERR_PATH_NOT_EXPORTED'); | ||
assertStartsWith(err.message, 'Package exports'); | ||
assertIncludes(err.message, 'do not define a \'./hidden.js\' subpath'); | ||
})); | ||
|
||
// There's no main field so we won't find anything when importing the name. | ||
// The fact that "." is mapped is ignored, it's not a valid main config. | ||
loadFixture('pkgexports').catch(mustCall((err) => { | ||
if (isRequire) { | ||
strictEqual(err.code, 'MODULE_NOT_FOUND'); | ||
assertStartsWith(err.message, 'Cannot find module \'pkgexports\''); | ||
} else { | ||
strictEqual(err.code, 'ERR_MODULE_NOT_FOUND'); | ||
assertStartsWith(err.message, 'Cannot find main entry point'); | ||
} | ||
})); | ||
|
||
// Even though 'pkgexports/sub/asdf.js' works, alternate "path-like" variants | ||
// do not to prevent confusion and accidental loopholes. | ||
loadFixture('pkgexports/sub/./../asdf.js').catch(mustCall((err) => { | ||
strictEqual(err.code, 'ERR_PATH_NOT_EXPORTED'); | ||
assertStartsWith(err.message, 'Package exports'); | ||
assertIncludes(err.message, | ||
'do not define a \'./sub/./../asdf.js\' subpath'); | ||
})); | ||
|
||
// Covering out bases - not a file is still not a file after dir mapping. | ||
loadFixture('pkgexports/sub/not-a-file.js').catch(mustCall((err) => { | ||
if (isRequire) { | ||
strictEqual(err.code, 'MODULE_NOT_FOUND'); | ||
assertStartsWith(err.message, | ||
'Cannot find module \'pkgexports/sub/not-a-file.js\''); | ||
} else { | ||
strictEqual(err.code, 'ERR_MODULE_NOT_FOUND'); | ||
// ESM currently returns a full file path | ||
assertStartsWith(err.message, 'Cannot find module'); | ||
} | ||
})); | ||
}); | ||
|
||
function assertStartsWith(actual, expected) { | ||
const start = actual.toString().substr(0, expected.length); | ||
strictEqual(start, expected); | ||
} | ||
|
||
function assertIncludes(actual, expected) { | ||
ok(actual.toString().indexOf(expected), | ||
`${JSON.stringify(actual)} includes ${JSON.stringify(expected)}`); | ||
} |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,12 @@ | ||
export { default as asdf } from 'pkgexports/asdf'; | ||
export { default as asdf2 } from 'pkgexports/sub/asdf.js'; | ||
export { default as space } from 'pkgexports/space'; | ||
import { fileURLToPath } from 'url'; | ||
import { createRequire } from 'module'; | ||
|
||
const rawRequire = createRequire(fileURLToPath(import.meta.url)); | ||
|
||
export async function requireFixture(specifier) { | ||
return { default: rawRequire(specifier ) }; | ||
} | ||
|
||
export function importFixture(specifier) { | ||
return import(specifier); | ||
} |
This file was deleted.
Oops, something went wrong.