diff --git a/.pnp.cjs b/.pnp.cjs index f8f93a743db7..1f603dfb9a67 100755 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -32162,11 +32162,13 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@yarnpkg/fslib", "workspace:packages/yarnpkg-fslib"],\ ["@yarnpkg/monorepo", "workspace:."],\ ["@yarnpkg/parsers", "workspace:packages/yarnpkg-parsers"],\ + ["@yarnpkg/pnp", "workspace:packages/yarnpkg-pnp"],\ ["fs-extra", "npm:7.0.1"],\ ["lodash", "npm:4.17.21"],\ ["pkg-tests-core", "workspace:packages/acceptance-tests/pkg-tests-core"],\ ["semver", "npm:7.3.5"],\ - ["tar", "npm:6.0.5"]\ + ["tar", "npm:6.0.5"],\ + ["tslib", "npm:1.13.0"]\ ],\ "linkType": "SOFT"\ }]\ diff --git a/.yarn/versions/736d10bb.yml b/.yarn/versions/736d10bb.yml new file mode 100644 index 000000000000..1ef7ecb1c936 --- /dev/null +++ b/.yarn/versions/736d10bb.yml @@ -0,0 +1,28 @@ +releases: + "@yarnpkg/cli": patch + "@yarnpkg/plugin-pnp": patch + "@yarnpkg/pnp": patch + +declined: + - "@yarnpkg/esbuild-plugin-pnp" + - "@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/CHANGELOG.md b/CHANGELOG.md index 2f09c68d7e7a..8653c81bc795 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ Yarn now accepts sponsorships! Please give a look at our [OpenCollective](https: ### Compatibility - Updates the PnP compatibility layer for TypeScript 4.8.1-rc +- The ESM loader now supports unflagged JSON modules. ## 3.2.2 diff --git a/packages/acceptance-tests/pkg-tests-specs/package.json b/packages/acceptance-tests/pkg-tests-specs/package.json index 723070cbe828..6c2ba12e5147 100644 --- a/packages/acceptance-tests/pkg-tests-specs/package.json +++ b/packages/acceptance-tests/pkg-tests-specs/package.json @@ -16,11 +16,13 @@ "@yarnpkg/fslib": "workspace:^", "@yarnpkg/monorepo": "workspace:^", "@yarnpkg/parsers": "workspace:^", + "@yarnpkg/pnp": "workspace:^", "fs-extra": "^7.0.1", "lodash": "^4.17.15", "pkg-tests-core": "workspace:^", "semver": "^7.1.2", - "tar": "^6.0.5" + "tar": "^6.0.5", + "tslib": "^1.13.0" }, "engines": { "node": ">=12 <14 || 14.2 - 14.9 || >14.10.0" 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 09ab3be2634d..ef1f16e8b739 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,4 +1,5 @@ import {Filename, ppath, xfs} from '@yarnpkg/fslib'; +import * as loaderFlags from '@yarnpkg/pnp/sources/esm-loader/loaderFlags'; describe(`Plug'n'Play - ESM`, () => { test( @@ -195,8 +196,8 @@ describe(`Plug'n'Play - ESM`, () => { ), ); - test( - `it should not resolve JSON files`, + (loaderFlags.HAS_UNFLAGGED_JSON_MODULES === false ? test : test.skip)( + `it should not resolve JSON modules without --experimental-json-modules`, makeTemporaryEnv( { type: `module`, @@ -218,6 +219,55 @@ describe(`Plug'n'Play - ESM`, () => { ), ); + (loaderFlags.HAS_UNFLAGGED_JSON_MODULES ? test : test.skip)( + `it should not resolve JSON modules without an import assertion`, + makeTemporaryEnv( + { + type: `module`, + }, + async ({path, run, source}) => { + await expect(run(`install`)).resolves.toMatchObject({code: 0}); + + await xfs.writeFilePromise( + ppath.join(path, `index.js` as Filename), + `import './foo.json';`, + ); + await xfs.writeFilePromise(ppath.join(path, `foo.json` as Filename), `{"name": "foo"}`); + + await expect(run(`node`, `./index.js`)).rejects.toMatchObject({ + code: 1, + stderr: expect.stringContaining(`ERR_IMPORT_ASSERTION_TYPE_MISSING`), + }); + }, + ), + ); + + (loaderFlags.HAS_UNFLAGGED_JSON_MODULES ? test : test.skip)( + `it should resolve JSON modules with an import assertion`, + makeTemporaryEnv( + { + type: `module`, + }, + async ({path, run, source}) => { + await expect(run(`install`)).resolves.toMatchObject({code: 0}); + + await xfs.writeFilePromise( + ppath.join(path, `index.js` as Filename), + ` + import foo from './foo.json' assert { type: 'json' }; + console.log(foo.name); + `, + ); + await xfs.writeFilePromise(ppath.join(path, `foo.json` as Filename), `{"name": "foo"}`); + + await expect(run(`node`, `./index.js`)).resolves.toMatchObject({ + code: 0, + stdout: `foo\n`, + }); + }, + ), + ); + test( `it should respect exports`, makeTemporaryEnv( diff --git a/packages/yarnpkg-pnp/sources/esm-loader/built-loader.js b/packages/yarnpkg-pnp/sources/esm-loader/built-loader.js index fa4e3c7d250c..fea9fe080a03 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 6af4bd1489a5..a817af672db2 100644 --- a/packages/yarnpkg-pnp/sources/esm-loader/hooks/load.ts +++ b/packages/yarnpkg-pnp/sources/esm-loader/hooks/load.ts @@ -1,12 +1,18 @@ -import fs from 'fs'; -import {fileURLToPath} from 'url'; +import fs from 'fs'; +import {fileURLToPath} from 'url'; -import * as loaderUtils from '../loaderUtils'; +import {HAS_JSON_IMPORT_ASSERTION_REQUIREMENT} from '../loaderFlags'; +import * as loaderUtils from '../loaderUtils'; // The default `load` doesn't support reading from zip files export async function load( urlString: string, - context: { format: string | null | undefined }, + context: { + format: string | null | undefined; + importAssertions?: { + type?: 'json'; + }; + }, nextLoad: typeof load, ): Promise<{ format: string, source: string, shortCircuit: boolean }> { const url = loaderUtils.tryParseURL(urlString); @@ -19,6 +25,12 @@ export async function load( if (!format) return nextLoad(urlString, context, nextLoad); + if (HAS_JSON_IMPORT_ASSERTION_REQUIREMENT && 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; + } + return { format, source: await fs.promises.readFile(filePath, `utf8`), diff --git a/packages/yarnpkg-pnp/sources/esm-loader/loader.ts b/packages/yarnpkg-pnp/sources/esm-loader/loader.ts index 5340dd33f7ba..fff5b5e00a3b 100644 --- a/packages/yarnpkg-pnp/sources/esm-loader/loader.ts +++ b/packages/yarnpkg-pnp/sources/esm-loader/loader.ts @@ -2,14 +2,10 @@ import {getFormat as getFormatHook} from './hooks/getFormat'; import {getSource as getSourceHook} from './hooks/getSource'; import {load as loadHook} from './hooks/load'; import {resolve as resolveHook} from './hooks/resolve'; +import {HAS_CONSOLIDATED_HOOKS} from './loaderFlags'; import './fspatch'; -const [major, minor] = process.versions.node.split(`.`).map(value => parseInt(value, 10)); - -// The hooks were consolidated in https://github.com/nodejs/node/pull/37468 -const hasConsolidatedHooks = major > 16 || (major === 16 && minor >= 12); - export const resolve = resolveHook; -export const getFormat = hasConsolidatedHooks ? undefined : getFormatHook; -export const getSource = hasConsolidatedHooks ? undefined : getSourceHook; -export const load = hasConsolidatedHooks ? loadHook : undefined; +export const getFormat = HAS_CONSOLIDATED_HOOKS ? undefined : getFormatHook; +export const getSource = HAS_CONSOLIDATED_HOOKS ? undefined : getSourceHook; +export const load = HAS_CONSOLIDATED_HOOKS ? loadHook : undefined; diff --git a/packages/yarnpkg-pnp/sources/esm-loader/loaderFlags.ts b/packages/yarnpkg-pnp/sources/esm-loader/loaderFlags.ts new file mode 100644 index 000000000000..6d9d40ab3d8a --- /dev/null +++ b/packages/yarnpkg-pnp/sources/esm-loader/loaderFlags.ts @@ -0,0 +1,10 @@ +const [major, minor] = process.versions.node.split(`.`).map(value => parseInt(value, 10)); + +// The hooks were consolidated in https://github.com/nodejs/node/pull/37468 +export const HAS_CONSOLIDATED_HOOKS = major > 16 || (major === 16 && minor >= 12); + +// JSON modules were unflagged in https://github.com/nodejs/node/pull/41736 +export const HAS_UNFLAGGED_JSON_MODULES = major > 17 || (major === 17 && minor >= 5) || (major === 16 && minor >= 15); + +// JSON modules requires import assertions after https://github.com/nodejs/node/pull/40250 +export const HAS_JSON_IMPORT_ASSERTION_REQUIREMENT = major > 17 || (major === 17 && minor >= 1) || (major === 16 && minor > 14); diff --git a/packages/yarnpkg-pnp/sources/esm-loader/loaderUtils.ts b/packages/yarnpkg-pnp/sources/esm-loader/loaderUtils.ts index 38e8cd6116d5..9f31b82542c9 100644 --- a/packages/yarnpkg-pnp/sources/esm-loader/loaderUtils.ts +++ b/packages/yarnpkg-pnp/sources/esm-loader/loaderUtils.ts @@ -1,9 +1,11 @@ -import {NativePath} from '@yarnpkg/fslib'; -import fs from 'fs'; -import path from 'path'; -import {URL} from 'url'; +import {NativePath} from '@yarnpkg/fslib'; +import fs from 'fs'; +import path from 'path'; +import {URL} from 'url'; -import * as nodeUtils from '../loader/nodeUtils'; +import * as nodeUtils from '../loader/nodeUtils'; + +import {HAS_UNFLAGGED_JSON_MODULES} from './loaderFlags'; export async function tryReadFile(path: NativePath): Promise { try { @@ -48,6 +50,9 @@ export function getFileFormat(filepath: string): string | null { ); } case `.json`: { + if (HAS_UNFLAGGED_JSON_MODULES) + return `json`; + // TODO: Enable if --experimental-json-modules is present // Waiting on https://github.com/nodejs/node/issues/36935 throw new Error( diff --git a/yarn.lock b/yarn.lock index 8f80752e6645..3cf93b77c24a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -20470,11 +20470,13 @@ __metadata: "@yarnpkg/fslib": "workspace:^" "@yarnpkg/monorepo": "workspace:^" "@yarnpkg/parsers": "workspace:^" + "@yarnpkg/pnp": "workspace:^" fs-extra: ^7.0.1 lodash: ^4.17.15 pkg-tests-core: "workspace:^" semver: ^7.1.2 tar: ^6.0.5 + tslib: ^1.13.0 languageName: unknown linkType: soft