From 535733bb04705b0c37d13812d728b53c4e9a8b0e Mon Sep 17 00:00:00 2001 From: Ayush442842q Date: Thu, 13 Aug 2026 01:22:46 +0530 Subject: [PATCH 1/2] fix(plugin-interactive-tools): add --no-time-gate support to upgrade-interactive (#7207) --- .yarn/versions/fix-yarn-issue-7207.yml | 7 +++++++ .../pkg-tests-core/sources/utils/tests.ts | 8 +++++--- .../packages/no-time-deps-1.0.0/index.js | 7 +++++++ .../packages/no-time-deps-1.0.0/package.json | 4 ++++ .../sources/features/npmMinimalAgeGate.test.ts | 16 ++++++++++++++++ .../sources/commands/upgrade-interactive.tsx | 7 +++++++ packages/plugin-npm/sources/npmConfigUtils.ts | 4 ++-- 7 files changed, 48 insertions(+), 5 deletions(-) create mode 100644 .yarn/versions/fix-yarn-issue-7207.yml create mode 100644 packages/acceptance-tests/pkg-tests-fixtures/packages/no-time-deps-1.0.0/index.js create mode 100644 packages/acceptance-tests/pkg-tests-fixtures/packages/no-time-deps-1.0.0/package.json diff --git a/.yarn/versions/fix-yarn-issue-7207.yml b/.yarn/versions/fix-yarn-issue-7207.yml new file mode 100644 index 000000000000..dc8aad129c8e --- /dev/null +++ b/.yarn/versions/fix-yarn-issue-7207.yml @@ -0,0 +1,7 @@ +releases: + "@yarnpkg/cli": decline + "@yarnpkg/core": decline + "@yarnpkg/plugin-compat": decline + "@yarnpkg/plugin-interactive-tools": patch + "@yarnpkg/plugin-npm": patch + "@yarnpkg/plugin-npm-cli": decline diff --git a/packages/acceptance-tests/pkg-tests-core/sources/utils/tests.ts b/packages/acceptance-tests/pkg-tests-core/sources/utils/tests.ts index 04ba4229a9fa..6a19e565248a 100644 --- a/packages/acceptance-tests/pkg-tests-core/sources/utils/tests.ts +++ b/packages/acceptance-tests/pkg-tests-core/sources/utils/tests.ts @@ -486,9 +486,11 @@ export const startPackageServer = ({type}: {type: keyof typeof packageServerUrls }), )), ), - time: name in RELEASE_DATE_PACKAGES - ? RELEASE_DATE_PACKAGES[name] - : Object.fromEntries(versions.map(version => [version, OLD_RELEASE_DATE])), + ...(!name.startsWith(`no-time-`) ? { + time: name in RELEASE_DATE_PACKAGES + ? RELEASE_DATE_PACKAGES[name] + : Object.fromEntries(versions.map(version => [version, OLD_RELEASE_DATE])), + } : {}), [`dist-tags`]: { latest: semver.maxSatisfying(versions, `*`), ...distTags, diff --git a/packages/acceptance-tests/pkg-tests-fixtures/packages/no-time-deps-1.0.0/index.js b/packages/acceptance-tests/pkg-tests-fixtures/packages/no-time-deps-1.0.0/index.js new file mode 100644 index 000000000000..bb9c6f687615 --- /dev/null +++ b/packages/acceptance-tests/pkg-tests-fixtures/packages/no-time-deps-1.0.0/index.js @@ -0,0 +1,7 @@ +module.exports = require(`./package.json`); + +for (const key of [`dependencies`, `devDependencies`, `peerDependencies`]) { + for (const dep of Object.keys(module.exports[key] || {})) { + module.exports[key][dep] = require(dep); + } +} diff --git a/packages/acceptance-tests/pkg-tests-fixtures/packages/no-time-deps-1.0.0/package.json b/packages/acceptance-tests/pkg-tests-fixtures/packages/no-time-deps-1.0.0/package.json new file mode 100644 index 000000000000..2d847c3b39de --- /dev/null +++ b/packages/acceptance-tests/pkg-tests-fixtures/packages/no-time-deps-1.0.0/package.json @@ -0,0 +1,4 @@ +{ + "name": "no-time-deps", + "version": "1.0.0" +} diff --git a/packages/acceptance-tests/pkg-tests-specs/sources/features/npmMinimalAgeGate.test.ts b/packages/acceptance-tests/pkg-tests-specs/sources/features/npmMinimalAgeGate.test.ts index 4222f8b2e710..14b8233d4c27 100644 --- a/packages/acceptance-tests/pkg-tests-specs/sources/features/npmMinimalAgeGate.test.ts +++ b/packages/acceptance-tests/pkg-tests-specs/sources/features/npmMinimalAgeGate.test.ts @@ -573,5 +573,21 @@ describe(`Features`, () => { }), ); }); + + describe(`packages with no release time metadata (e.g. GitHub Packages)`, () => { + test( + `it should install a package with no release time even if npmMinimalAgeGate is set`, + makeTemporaryEnv({}, { + npmMinimalAgeGate: `1d`, + }, async ({run, source}) => { + await run(`add`, `no-time-deps`); + + await expect(source(`require('no-time-deps/package.json')`)).resolves.toMatchObject({ + name: `no-time-deps`, + version: `1.0.0`, + }); + }), + ); + }); }); }); diff --git a/packages/plugin-interactive-tools/sources/commands/upgrade-interactive.tsx b/packages/plugin-interactive-tools/sources/commands/upgrade-interactive.tsx index 78f830c17ab3..564d17dfc7a1 100644 --- a/packages/plugin-interactive-tools/sources/commands/upgrade-interactive.tsx +++ b/packages/plugin-interactive-tools/sources/commands/upgrade-interactive.tsx @@ -49,6 +49,10 @@ export default class UpgradeInteractiveCommand extends BaseCommand { validator: t.isEnum(InstallMode), }); + noTimeGate = Option.Boolean(`--no-time-gate`, false, { + description: `Disable the minimum release age check for this command`, + }); + async execute() { libuiUtils.checkRequirements(this.context); @@ -62,6 +66,9 @@ export default class UpgradeInteractiveCommand extends BaseCommand { const {default: React, useCallback, useEffect, useRef, useState} = await import(`react`); const configuration = await Configuration.find(this.context.cwd, this.context.plugins); + + if (this.noTimeGate) + suggestUtils.disableTimeGate(configuration); const {project, workspace} = await Project.find(configuration, this.context.cwd); const cache = await Cache.find(configuration); diff --git a/packages/plugin-npm/sources/npmConfigUtils.ts b/packages/plugin-npm/sources/npmConfigUtils.ts index 1b2b1eafe435..d5c067e22d42 100644 --- a/packages/plugin-npm/sources/npmConfigUtils.ts +++ b/packages/plugin-npm/sources/npmConfigUtils.ts @@ -111,8 +111,8 @@ export function getMinimalAgeGate(ident: Ident | null, {configuration}: {configu function shouldBeQuarantined({configuration, ident, version, publishTimes}: IsPackageApprovedOptions) { const minimalAgeGate = getMinimalAgeGate(ident, {configuration}); - if (minimalAgeGate) { - const versionTime = publishTimes?.[version]; + if (minimalAgeGate && publishTimes) { + const versionTime = publishTimes[version]; if (typeof versionTime === `undefined`) return true; From 18f97f41d0c844a26551322d3f030a9776a37993 Mon Sep 17 00:00:00 2001 From: Ayush442842q Date: Thu, 13 Aug 2026 03:02:30 +0530 Subject: [PATCH 2/2] ci: retrigger acceptance tests