From ebf9a0d6d1bb2d90da7eef5701e670f7a88cb323 Mon Sep 17 00:00:00 2001 From: Kristoffer K Date: Mon, 6 May 2024 10:32:21 +0200 Subject: [PATCH] fix(pnp): esm - support import attributes (#6268) **What's the problem this PR addresses?** In Node.js v22 import assertions were replaced with import attributes so we need to add support for those as well. Fixes https://github.com/yarnpkg/berry/issues/6267 **How did you fix it?** Added support for the `importAttributes` property. **Checklist** - [x] I have read the [Contributing Guide](https://yarnpkg.com/advanced/contributing). - [x] I have set the packages that need to be released for my changes to be effective. - [x] I will check that all automated PR checks pass before the PR gets reviewed. --- .github/workflows/integration-workflow.yml | 14 ++++---- .pnp.loader.mjs | 21 +++++++++--- .yarn/versions/a5b83769.yml | 27 ++++++++++++++++ .../pkg-tests-specs/sources/pnp-esm.test.ts | 14 ++++---- .../sources/esm-loader/built-loader.js | 2 +- .../sources/esm-loader/hooks/load.ts | 32 +++++++++++++------ .../sources/esm-loader/loaderFlags.ts | 6 ++++ 7 files changed, 88 insertions(+), 28 deletions(-) create mode 100644 .yarn/versions/a5b83769.yml diff --git a/.github/workflows/integration-workflow.yml b/.github/workflows/integration-workflow.yml index da5e143ff8e4..ba3d27b3c23a 100644 --- a/.github/workflows/integration-workflow.yml +++ b/.github/workflows/integration-workflow.yml @@ -206,7 +206,7 @@ jobs: fail-fast: false matrix: # We run the ubuntu tests on multiple Node versions with 2 shards since they're the fastest. - node: [18, 19, 20, 21] + node: [18, 19, 20, 21, 22] platform: [[ubuntu, 20.04]] shard: ['1/2', '2/2'] include: @@ -221,13 +221,13 @@ jobs: - {node: 18, platform: [macos, latest], shard: 3/3} # We also run them on the maximum Node version we support, to catch potential regressions in Node.js. # Windows tests - - {node: 21, platform: [windows, latest], shard: 1/3} - - {node: 21, platform: [windows, latest], shard: 2/3} - - {node: 21, platform: [windows, latest], shard: 3/3} + - {node: 22, platform: [windows, latest], shard: 1/3} + - {node: 22, platform: [windows, latest], shard: 2/3} + - {node: 22, platform: [windows, latest], shard: 3/3} # macOS tests - - {node: 21, platform: [macos, latest], shard: 1/3} - - {node: 21, platform: [macos, latest], shard: 2/3} - - {node: 21, platform: [macos, latest], shard: 3/3} + - {node: 22, platform: [macos, latest], shard: 1/3} + - {node: 22, platform: [macos, latest], shard: 2/3} + - {node: 22, platform: [macos, latest], shard: 3/3} name: '${{matrix.platform[0]}}-latest w/ Node.js ${{matrix.node}}.x (${{matrix.shard}})' runs-on: ${{matrix.platform[0]}}-${{matrix.platform[1]}} diff --git a/.pnp.loader.mjs b/.pnp.loader.mjs index 165cbefb6a11..0c711ef49380 100644 --- a/.pnp.loader.mjs +++ b/.pnp.loader.mjs @@ -1406,6 +1406,8 @@ const URL = Number(process.versions.node.split('.', 1)[0]) < 20 ? URL$1 : global const [major, minor] = process.versions.node.split(`.`).map((value) => parseInt(value, 10)); const WATCH_MODE_MESSAGE_USES_ARRAYS = major > 19 || major === 19 && minor >= 2 || major === 18 && minor >= 13; const HAS_LAZY_LOADED_TRANSLATORS = major === 20 && minor < 6 || major === 19 && minor >= 3; +const SUPPORTS_IMPORT_ATTRIBUTES = major >= 21 || major === 20 && minor >= 10 || major === 18 && minor >= 20; +const SUPPORTS_IMPORT_ATTRIBUTES_ONLY = major >= 22; function readPackageScope(checkPath) { const rootSeparatorIndex = checkPath.indexOf(npath.sep); @@ -1496,10 +1498,21 @@ async function load$1(urlString, context, nextLoad) { const format = getFileFormat(filePath); if (!format) return nextLoad(urlString, context, nextLoad); - if (format === `json` && context.importAssertions?.type !== `json`) { - const err = new TypeError(`[ERR_IMPORT_ASSERTION_TYPE_MISSING]: Module "${urlString}" needs an import assertion of type "json"`); - err.code = `ERR_IMPORT_ASSERTION_TYPE_MISSING`; - throw err; + if (format === `json`) { + if (SUPPORTS_IMPORT_ATTRIBUTES_ONLY) { + if (context.importAttributes?.type !== `json`) { + const err = new TypeError(`[ERR_IMPORT_ATTRIBUTE_MISSING]: Module "${urlString}" needs an import attribute of "type: json"`); + err.code = `ERR_IMPORT_ATTRIBUTE_MISSING`; + throw err; + } + } else { + const type = `importAttributes` in context ? context.importAttributes?.type : context.importAssertions?.type; + if (type !== `json`) { + const err = new TypeError(`[ERR_IMPORT_ASSERTION_TYPE_MISSING]: Module "${urlString}" needs an import ${SUPPORTS_IMPORT_ATTRIBUTES ? `attribute` : `assertion`} of type "json"`); + err.code = `ERR_IMPORT_ASSERTION_TYPE_MISSING`; + throw err; + } + } } if (process.env.WATCH_REPORT_DEPENDENCIES && process.send) { const pathToSend = pathToFileURL( diff --git a/.yarn/versions/a5b83769.yml b/.yarn/versions/a5b83769.yml new file mode 100644 index 000000000000..22e76f05f959 --- /dev/null +++ b/.yarn/versions/a5b83769.yml @@ -0,0 +1,27 @@ +releases: + "@yarnpkg/cli": patch + "@yarnpkg/plugin-pnp": patch + "@yarnpkg/pnp": patch + +declined: + - "@yarnpkg/plugin-compat" + - "@yarnpkg/plugin-constraints" + - "@yarnpkg/plugin-dlx" + - "@yarnpkg/plugin-essentials" + - "@yarnpkg/plugin-init" + - "@yarnpkg/plugin-interactive-tools" + - "@yarnpkg/plugin-nm" + - "@yarnpkg/plugin-npm-cli" + - "@yarnpkg/plugin-pack" + - "@yarnpkg/plugin-patch" + - "@yarnpkg/plugin-pnpm" + - "@yarnpkg/plugin-stage" + - "@yarnpkg/plugin-typescript" + - "@yarnpkg/plugin-version" + - "@yarnpkg/plugin-workspace-tools" + - "@yarnpkg/builder" + - "@yarnpkg/core" + - "@yarnpkg/doctor" + - "@yarnpkg/nm" + - "@yarnpkg/pnpify" + - "@yarnpkg/sdks" diff --git a/packages/acceptance-tests/pkg-tests-specs/sources/pnp-esm.test.ts b/packages/acceptance-tests/pkg-tests-specs/sources/pnp-esm.test.ts index 041366b90a5e..8b067d6b1582 100644 --- a/packages/acceptance-tests/pkg-tests-specs/sources/pnp-esm.test.ts +++ b/packages/acceptance-tests/pkg-tests-specs/sources/pnp-esm.test.ts @@ -1,6 +1,6 @@ -import {Filename, npath, ppath, xfs} from '@yarnpkg/fslib'; -import {ALLOWS_EXTENSIONLESS_FILES, HAS_LOADERS_AFFECTING_LOADERS} from '@yarnpkg/pnp/sources/esm-loader/loaderFlags'; -import {pathToFileURL} from 'url'; +import {Filename, npath, ppath, xfs} from '@yarnpkg/fslib'; +import {ALLOWS_EXTENSIONLESS_FILES, HAS_LOADERS_AFFECTING_LOADERS, SUPPORTS_IMPORT_ATTRIBUTES, SUPPORTS_IMPORT_ATTRIBUTES_ONLY} from '@yarnpkg/pnp/sources/esm-loader/loaderFlags'; +import {pathToFileURL} from 'url'; describe(`Plug'n'Play - ESM`, () => { test( @@ -220,7 +220,7 @@ describe(`Plug'n'Play - ESM`, () => { ); test( - `it should not resolve JSON modules without an import assertion`, + `it should not resolve JSON modules without an import assertion/attribute`, makeTemporaryEnv( { type: `module`, @@ -236,14 +236,14 @@ describe(`Plug'n'Play - ESM`, () => { await expect(run(`node`, `./index.js`)).rejects.toMatchObject({ code: 1, - stderr: expect.stringContaining(`ERR_IMPORT_ASSERTION_TYPE_MISSING`), + stderr: expect.stringContaining(SUPPORTS_IMPORT_ATTRIBUTES_ONLY ? `ERR_IMPORT_ATTRIBUTE_MISSING` : `ERR_IMPORT_ASSERTION_TYPE_MISSING`), }); }, ), ); test( - `it should resolve JSON modules with an import assertion`, + `it should resolve JSON modules with an import assertion/attribute`, makeTemporaryEnv( { type: `module`, @@ -254,7 +254,7 @@ describe(`Plug'n'Play - ESM`, () => { await xfs.writeFilePromise( ppath.join(path, `index.js`), ` - import foo from './foo.json' assert { type: 'json' }; + import foo from './foo.json' ${SUPPORTS_IMPORT_ATTRIBUTES ? `with` : `assert`} { type: 'json' }; console.log(foo.name); `, ); diff --git a/packages/yarnpkg-pnp/sources/esm-loader/built-loader.js b/packages/yarnpkg-pnp/sources/esm-loader/built-loader.js index 20e89d19f5b5..cbf271e10262 100644 --- a/packages/yarnpkg-pnp/sources/esm-loader/built-loader.js +++ b/packages/yarnpkg-pnp/sources/esm-loader/built-loader.js @@ -2,7 +2,7 @@ let hook; module.exports = () => { if (typeof hook === `undefined`) - hook = require('zlib').brotliDecompressSync(Buffer.from('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', 'base64')).toString(); + hook = require('zlib').brotliDecompressSync(Buffer.from('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', 'base64')).toString(); return hook; }; diff --git a/packages/yarnpkg-pnp/sources/esm-loader/hooks/load.ts b/packages/yarnpkg-pnp/sources/esm-loader/hooks/load.ts index 7d62fc280400..1fabaa297910 100644 --- a/packages/yarnpkg-pnp/sources/esm-loader/hooks/load.ts +++ b/packages/yarnpkg-pnp/sources/esm-loader/hooks/load.ts @@ -1,9 +1,9 @@ -import {VirtualFS, npath} from '@yarnpkg/fslib'; -import fs from 'fs'; -import {fileURLToPath, pathToFileURL} from 'url'; +import {VirtualFS, npath} from '@yarnpkg/fslib'; +import fs from 'fs'; +import {fileURLToPath, pathToFileURL} from 'url'; -import {WATCH_MODE_MESSAGE_USES_ARRAYS} from '../loaderFlags'; -import * as loaderUtils from '../loaderUtils'; +import {SUPPORTS_IMPORT_ATTRIBUTES, SUPPORTS_IMPORT_ATTRIBUTES_ONLY, WATCH_MODE_MESSAGE_USES_ARRAYS} from '../loaderFlags'; +import * as loaderUtils from '../loaderUtils'; // The default `load` doesn't support reading from zip files export async function load( @@ -13,6 +13,9 @@ export async function load( importAssertions?: { type?: 'json'; }; + importAttributes?: { + type?: 'json'; + }; }, nextLoad: typeof load, ): Promise<{ format: string, source?: string, shortCircuit: boolean }> { @@ -26,10 +29,21 @@ export async function load( if (!format) return nextLoad(urlString, context, nextLoad); - if (format === `json` && context.importAssertions?.type !== `json`) { - const err = new TypeError(`[ERR_IMPORT_ASSERTION_TYPE_MISSING]: Module "${urlString}" needs an import assertion of type "json"`) as TypeError & { code: string }; - err.code = `ERR_IMPORT_ASSERTION_TYPE_MISSING`; - throw err; + if (format === `json`) { + if (SUPPORTS_IMPORT_ATTRIBUTES_ONLY) { + if (context.importAttributes?.type !== `json`) { + const err = new TypeError(`[ERR_IMPORT_ATTRIBUTE_MISSING]: Module "${urlString}" needs an import attribute of "type: json"`) as TypeError & { code: string }; + err.code = `ERR_IMPORT_ATTRIBUTE_MISSING`; + throw err; + } + } else { + const type = `importAttributes` in context ? context.importAttributes?.type : context.importAssertions?.type; + if (type !== `json`) { + const err = new TypeError(`[ERR_IMPORT_ASSERTION_TYPE_MISSING]: Module "${urlString}" needs an import ${SUPPORTS_IMPORT_ATTRIBUTES ? `attribute` : `assertion`} of type "json"`) as TypeError & { code: string }; + err.code = `ERR_IMPORT_ASSERTION_TYPE_MISSING`; + throw err; + } + } } // https://github.com/nodejs/node/pull/44366/files#diff-f6796082f599554ec3a29c47cf026cb24fc5104884f2632e472c05fe622d778bR477-R479 diff --git a/packages/yarnpkg-pnp/sources/esm-loader/loaderFlags.ts b/packages/yarnpkg-pnp/sources/esm-loader/loaderFlags.ts index 1d8c7b1bf459..1ea69f7c845f 100644 --- a/packages/yarnpkg-pnp/sources/esm-loader/loaderFlags.ts +++ b/packages/yarnpkg-pnp/sources/esm-loader/loaderFlags.ts @@ -14,3 +14,9 @@ export const HAS_LOADERS_AFFECTING_LOADERS = major > 19 || (major === 19 && mino // https://github.com/nodejs/node/pull/49869 export const ALLOWS_EXTENSIONLESS_FILES = major >= 21 || (major === 20 && minor >= 10) || (major === 18 && minor >= 19); + +// https://github.com/nodejs/node/pull/50140 +export const SUPPORTS_IMPORT_ATTRIBUTES = major >= 21 || (major === 20 && minor >= 10) || (major === 18 && minor >= 20); + +// https://github.com/nodejs/node/pull/52104 +export const SUPPORTS_IMPORT_ATTRIBUTES_ONLY = major >= 22;