From 90473733a525862b4aba8260e7008cb081b82d2d Mon Sep 17 00:00:00 2001 From: Michael Jackson Date: Tue, 2 Jul 2019 21:16:28 -0700 Subject: [PATCH] Do not return non-ESM on ?module requests --- modules/middleware/fetchPackage.js | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/modules/middleware/fetchPackage.js b/modules/middleware/fetchPackage.js index baefecf..6878d72 100644 --- a/modules/middleware/fetchPackage.js +++ b/modules/middleware/fetchPackage.js @@ -47,10 +47,28 @@ function filenameRedirect(req, res) { let filename; if (req.query.module != null) { // See https://github.com/rollup/rollup/wiki/pkg.module - filename = - req.packageConfig.module || - req.packageConfig['jsnext:main'] || - '/index.js'; + filename = req.packageConfig.module || req.packageConfig['jsnext:main']; + + if (!filename) { + // https://nodejs.org/api/esm.html#esm_code_package_json_code_code_type_code_field + if (req.packageConfig.type === 'module') { + // Use whatever is in pkg.main or index.js + filename = req.packageConfig.main || '/index.js'; + } else if ( + req.packageConfig.main && + /\.mjs$/.test(req.packageConfig.main) + ) { + // Use .mjs file in pkg.main + filename = req.packageConfig.main; + } + } + + if (!filename) { + return res + .status(404) + .type('text') + .send(`Package ${req.packageSpec} does not contain an ES module`); + } } else if ( req.query.main && req.packageConfig[req.query.main] &&