From 58a7866c5ec579cfe1283816d5193881104b5533 Mon Sep 17 00:00:00 2001 From: Zou Guangxian Date: Sun, 3 Dec 2023 11:04:09 +0800 Subject: [PATCH 1/9] fix: support both of `process` and `node:process` e.g. This plugin cannot access the package referenced via node:process which is neither a builtin, nor an exposed entry --- packages/yarnpkg-core/sources/Configuration.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/yarnpkg-core/sources/Configuration.ts b/packages/yarnpkg-core/sources/Configuration.ts index 930b3f8630ca..9e341506d95c 100644 --- a/packages/yarnpkg-core/sources/Configuration.ts +++ b/packages/yarnpkg-core/sources/Configuration.ts @@ -1261,8 +1261,10 @@ export class Configuration { const thirdPartyPlugins = new Map([]); if (pluginConfiguration !== null) { const requireEntries = new Map(); - for (const request of builtinModules) + for (const request of builtinModules) { requireEntries.set(request, () => miscUtils.dynamicRequire(request)); + requireEntries.set(`node:${request}`, () => miscUtils.dynamicRequire(`node:${request}`)); + } for (const [request, embedModule] of pluginConfiguration.modules) requireEntries.set(request, () => embedModule); From e711ccc23f1b5dd59a4b76953011cbd5f8cc29cf Mon Sep 17 00:00:00 2001 From: Zou Guangxian Date: Sun, 3 Dec 2023 11:47:01 +0800 Subject: [PATCH 2/9] build: update version configuration for the affected packages --- .yarn/versions/44a33643.yml | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 .yarn/versions/44a33643.yml diff --git a/.yarn/versions/44a33643.yml b/.yarn/versions/44a33643.yml new file mode 100644 index 000000000000..d305afe9eb67 --- /dev/null +++ b/.yarn/versions/44a33643.yml @@ -0,0 +1,34 @@ +releases: + "@yarnpkg/core": patch + +declined: + - "@yarnpkg/plugin-compat" + - "@yarnpkg/plugin-constraints" + - "@yarnpkg/plugin-dlx" + - "@yarnpkg/plugin-essentials" + - "@yarnpkg/plugin-exec" + - "@yarnpkg/plugin-file" + - "@yarnpkg/plugin-git" + - "@yarnpkg/plugin-github" + - "@yarnpkg/plugin-http" + - "@yarnpkg/plugin-init" + - "@yarnpkg/plugin-interactive-tools" + - "@yarnpkg/plugin-link" + - "@yarnpkg/plugin-nm" + - "@yarnpkg/plugin-npm" + - "@yarnpkg/plugin-npm-cli" + - "@yarnpkg/plugin-pack" + - "@yarnpkg/plugin-patch" + - "@yarnpkg/plugin-pnp" + - "@yarnpkg/plugin-pnpm" + - "@yarnpkg/plugin-stage" + - "@yarnpkg/plugin-typescript" + - "@yarnpkg/plugin-version" + - "@yarnpkg/plugin-workspace-tools" + - "@yarnpkg/builder" + - "@yarnpkg/cli" + - "@yarnpkg/doctor" + - "@yarnpkg/extensions" + - "@yarnpkg/nm" + - "@yarnpkg/pnpify" + - "@yarnpkg/sdks" From d354ab585642d32348d5c85e3593807e51ca62a2 Mon Sep 17 00:00:00 2001 From: Zou Guangxian Date: Thu, 8 Feb 2024 17:32:21 +0800 Subject: [PATCH 3/9] test: require core modules with node: --- .../pkg-tests-specs/sources/features/plugins.test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/acceptance-tests/pkg-tests-specs/sources/features/plugins.test.ts b/packages/acceptance-tests/pkg-tests-specs/sources/features/plugins.test.ts index 141995b65ef7..f6319baf4ee5 100644 --- a/packages/acceptance-tests/pkg-tests-specs/sources/features/plugins.test.ts +++ b/packages/acceptance-tests/pkg-tests-specs/sources/features/plugins.test.ts @@ -8,6 +8,7 @@ import {mockPluginServer} from './plugins.utility'; const COMMANDS_PLUGIN = (name: string, {async = false, printOnBoot = false, thirdParty = false} = {}) => ` const factory = ${async ? `async` : ``} r => { const {Command} = r('clipanion'); + const {path} = r('node:path'); if (${printOnBoot}) console.log('Booting ${name.toUpperCase()}'); From 7cd908b404f3ef521be4e9b8f5d9343cc8bcff3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Nison?= Date: Thu, 25 Apr 2024 17:12:08 +0200 Subject: [PATCH 4/9] Update Configuration.ts --- packages/yarnpkg-core/sources/Configuration.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/yarnpkg-core/sources/Configuration.ts b/packages/yarnpkg-core/sources/Configuration.ts index 9e341506d95c..072d4d300c7c 100644 --- a/packages/yarnpkg-core/sources/Configuration.ts +++ b/packages/yarnpkg-core/sources/Configuration.ts @@ -1261,10 +1261,12 @@ export class Configuration { const thirdPartyPlugins = new Map([]); if (pluginConfiguration !== null) { const requireEntries = new Map(); + for (const request of builtinModules) { requireEntries.set(request, () => miscUtils.dynamicRequire(request)); requireEntries.set(`node:${request}`, () => miscUtils.dynamicRequire(`node:${request}`)); } + for (const [request, embedModule] of pluginConfiguration.modules) requireEntries.set(request, () => embedModule); From 0186ad096f0600dfedb96cd6fe0eaab4e9af721e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Nison?= Date: Thu, 25 Apr 2024 17:14:40 +0200 Subject: [PATCH 5/9] Update Configuration.ts --- packages/yarnpkg-core/sources/Configuration.ts | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/packages/yarnpkg-core/sources/Configuration.ts b/packages/yarnpkg-core/sources/Configuration.ts index 072d4d300c7c..52363caecac7 100644 --- a/packages/yarnpkg-core/sources/Configuration.ts +++ b/packages/yarnpkg-core/sources/Configuration.ts @@ -5,7 +5,7 @@ import camelcase import {isCI, isPR, GITHUB_ACTIONS} from 'ci-info'; import {UsageError} from 'clipanion'; import {parse as parseDotEnv} from 'dotenv'; -import {builtinModules} from 'module'; +import {isBuiltin} from 'module'; import pLimit, {Limit} from 'p-limit'; import {PassThrough, Writable} from 'stream'; @@ -1262,11 +1262,6 @@ export class Configuration { if (pluginConfiguration !== null) { const requireEntries = new Map(); - for (const request of builtinModules) { - requireEntries.set(request, () => miscUtils.dynamicRequire(request)); - requireEntries.set(`node:${request}`, () => miscUtils.dynamicRequire(`node:${request}`)); - } - for (const [request, embedModule] of pluginConfiguration.modules) requireEntries.set(request, () => embedModule); @@ -1284,6 +1279,9 @@ export class Configuration { const pluginRequireEntries = new Map(requireEntries); const pluginRequire = (request: string) => { + if (isBuiltin(request)) + return miscUtils.dynamicRequire(request); + if (pluginRequireEntries.has(request)) { return pluginRequireEntries.get(request)(); } else { From ff344bd23dbc016fcae2f3faeccfacd28822bb3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ma=C3=ABl=20Nison?= Date: Thu, 25 Apr 2024 17:19:05 +0200 Subject: [PATCH 6/9] Update plugins.test.ts --- .../sources/features/plugins.test.ts | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/packages/acceptance-tests/pkg-tests-specs/sources/features/plugins.test.ts b/packages/acceptance-tests/pkg-tests-specs/sources/features/plugins.test.ts index f6319baf4ee5..5655a2f2e9e5 100644 --- a/packages/acceptance-tests/pkg-tests-specs/sources/features/plugins.test.ts +++ b/packages/acceptance-tests/pkg-tests-specs/sources/features/plugins.test.ts @@ -23,6 +23,14 @@ const factory = ${async ? `async` : ``} r => { this.context.stdout.write('Executing ${name.toUpperCase()}\\n'); } }, + + class MyCommandPath extends Command { + static paths = [['${name}', 'path']]; + + async execute() { + this.context.stdout.write('\${path.posix.join('a', 'b')}\\n'); + } + }, ], }, }; @@ -78,6 +86,19 @@ describe(`Features`, () => { }); })); + test(`it should support plugins using builtin modules`, makeTemporaryEnv({ + }, async ({path, run, source}) => { + await xfs.writeFilePromise(`${path}/plugin-a.js` as PortablePath, COMMANDS_PLUGIN(`a`)); + + await xfs.writeFilePromise(`${path}/.yarnrc.yml` as PortablePath, stringifySyml({ + plugins: [`./plugin-a.js`], + })); + + await expect(run(`a`, `path`)).resolves.toMatchObject({ + stdout: 'a/b\n', + }); + })); + test(`it should accept asynchronous plugins`, makeTemporaryEnv({ }, async ({path, run, source}) => { await xfs.writeFilePromise(`${path}/plugin-a.js` as PortablePath, COMMANDS_PLUGIN(`a`, {async: true})); From 4b098609ee975fe5036aaa299bb34ce5afc073b6 Mon Sep 17 00:00:00 2001 From: merceyz Date: Sun, 25 Aug 2024 15:00:30 +0200 Subject: [PATCH 7/9] chore: update versions --- .yarn/versions/44a33643.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.yarn/versions/44a33643.yml b/.yarn/versions/44a33643.yml index d305afe9eb67..2d6a48f178d8 100644 --- a/.yarn/versions/44a33643.yml +++ b/.yarn/versions/44a33643.yml @@ -1,4 +1,5 @@ releases: + "@yarnpkg/cli": patch "@yarnpkg/core": patch declined: @@ -26,7 +27,6 @@ declined: - "@yarnpkg/plugin-version" - "@yarnpkg/plugin-workspace-tools" - "@yarnpkg/builder" - - "@yarnpkg/cli" - "@yarnpkg/doctor" - "@yarnpkg/extensions" - "@yarnpkg/nm" From 5db128a14b46197a69a7e75e65ee7aaa54a4a178 Mon Sep 17 00:00:00 2001 From: merceyz Date: Sun, 25 Aug 2024 15:01:58 +0200 Subject: [PATCH 8/9] chore: lint --- .../pkg-tests-specs/sources/features/plugins.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/acceptance-tests/pkg-tests-specs/sources/features/plugins.test.ts b/packages/acceptance-tests/pkg-tests-specs/sources/features/plugins.test.ts index 5655a2f2e9e5..9f28018021be 100644 --- a/packages/acceptance-tests/pkg-tests-specs/sources/features/plugins.test.ts +++ b/packages/acceptance-tests/pkg-tests-specs/sources/features/plugins.test.ts @@ -95,7 +95,7 @@ describe(`Features`, () => { })); await expect(run(`a`, `path`)).resolves.toMatchObject({ - stdout: 'a/b\n', + stdout: `a/b\n`, }); })); From 85b3e2f7127c5cc79bee801e177b745fd8cff7c9 Mon Sep 17 00:00:00 2001 From: merceyz Date: Sun, 25 Aug 2024 15:21:14 +0200 Subject: [PATCH 9/9] test: fix syntax error --- .../pkg-tests-specs/sources/features/plugins.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/acceptance-tests/pkg-tests-specs/sources/features/plugins.test.ts b/packages/acceptance-tests/pkg-tests-specs/sources/features/plugins.test.ts index 9f28018021be..5ca0d63478b0 100644 --- a/packages/acceptance-tests/pkg-tests-specs/sources/features/plugins.test.ts +++ b/packages/acceptance-tests/pkg-tests-specs/sources/features/plugins.test.ts @@ -8,7 +8,7 @@ import {mockPluginServer} from './plugins.utility'; const COMMANDS_PLUGIN = (name: string, {async = false, printOnBoot = false, thirdParty = false} = {}) => ` const factory = ${async ? `async` : ``} r => { const {Command} = r('clipanion'); - const {path} = r('node:path'); + const path = r('node:path'); if (${printOnBoot}) console.log('Booting ${name.toUpperCase()}'); @@ -28,7 +28,7 @@ const factory = ${async ? `async` : ``} r => { static paths = [['${name}', 'path']]; async execute() { - this.context.stdout.write('\${path.posix.join('a', 'b')}\\n'); + this.context.stdout.write(path.posix.join('a', 'b') + '\\n'); } }, ],