From ab6f158276d7ff87bb01a468fd7779d46e827936 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pablo=20S=C3=A1ez?= Date: Wed, 28 Jul 2021 12:50:46 -0400 Subject: [PATCH 1/2] add exports field to support Node.js ESM --- package.json | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/package.json b/package.json index ea26da39c3..7a124613c6 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,45 @@ }, "sideEffects": false, "homepage": "https://github.com/graphql/graphql-js", + "exports": { + ".": { + "require": "./index.js", + "import": "./index.mjs" + }, + "./package.json": "./package.json", + "./error": { + "require": "./error/index.js", + "import": "./error/index.mjs" + }, + "./execution": { + "require": "./execution/index.js", + "import": "./execution/index.mjs" + }, + "./language": { + "require": "./language/index.js", + "import": "./language/index.mjs" + }, + "./subscription": { + "require": "./subscription/index.js", + "import": "./subscription/index.mjs" + }, + "./type": { + "require": "./type/index.js", + "import": "./type/index.mjs" + }, + "./utilities": { + "require": "./utilities/index.js", + "import": "./utilities/index.mjs" + }, + "./validation": { + "require": "./validation/index.js", + "import": "./validation/index.mjs" + }, + "./*": { + "require": "./*.js", + "import": "./*.mjs" + } + }, "bugs": { "url": "https://github.com/graphql/graphql-js/issues" }, From f3d202a953869482e9fb26177e1096fc232b36ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pablo=20S=C3=A1ez?= Date: Sun, 1 Aug 2021 14:02:22 -0400 Subject: [PATCH 2/2] compatibility with explicit extensions imports --- resources/build-npm.js | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/resources/build-npm.js b/resources/build-npm.js index 5ea2505852..d44be7a5ba 100644 --- a/resources/build-npm.js +++ b/resources/build-npm.js @@ -18,9 +18,10 @@ if (require.main === module) { fs.rmSync('./npmDist', { recursive: true, force: true }); fs.mkdirSync('./npmDist'); - const packageJSON = buildPackageJSON(); - const srcFiles = readdirRecursive('./src', { ignoreDir: /^__.*__$/ }); + + const packageJSON = buildPackageJSON(srcFiles); + for (const filepath of srcFiles) { const srcPath = path.join('./src', filepath); const destPath = path.join('./npmDist', filepath); @@ -91,7 +92,7 @@ function babelBuild(srcPath, options) { return code + '\n'; } -function buildPackageJSON() { +function buildPackageJSON(srcFiles) { const packageJSON = JSON.parse( fs.readFileSync(require.resolve('../package.json'), 'utf-8'), ); @@ -122,5 +123,19 @@ function buildPackageJSON() { packageJSON.publishConfig = { tag: publishTag }; } + /** + * This prevents breaking previous versions of imports with explicit extensions + * Like `require("graphql/language/parser.js")` + */ + for (const srcFile of srcFiles) { + if (srcFile.endsWith('.ts')) { + const srcFilePath = srcFile.slice(0, srcFile.length - 3); + packageJSON.exports[`./${srcFilePath}.js`] = { + require: `./${srcFilePath}.js`, + import: `./${srcFilePath}.mjs`, + }; + } + } + return packageJSON; }