Skip to content

Conversation

@logonoff
Copy link
Member

@logonoff logonoff commented Dec 11, 2025

Deduplication

In yarn classic, deduplication is not done automatically. See https://www.npmjs.com/package/yarn-deduplicate#why-is-this-necessary:

Yarn documentation seems to suggest this package shouldn't be necessary. For example, in https://classic.yarnpkg.com/en/docs/cli/dedupe/, it says

The dedupe command isn’t necessary. yarn install will already dedupe.

This is, however, not exactly true. There are cases where yarn will not deduplicate existing packages. For example, this scenario:

  • Install libA. It depends on libB ^1.1.0. At this point, the latest version of libB is 1.1.2, so it gets installed as a transitive dependency in your repo

  • After a few days, install libC. It also depends on libB ^1.1.0. But this time, the latest libB version is 1.1.3.

In the above scenario, you'll end up with libB@1.1.2 and libB@1.1.3 in your repo.

This PR introduces a step that runs yarn-deduplicate and fails if the yarn.lock file is not deduplicated.

After this PR, the vendor main chunk size is reduced by ~250kb due to the reduction of duplicated dependencies.

check-patternfly-modules speedup

Since the above change adds @yarnpkg/lockfile as a transitive dependency, we can rewrite check-patternfly-modules using that dependency with minimal size increase to our node modules. This PR changes the check-patternfly-modules script from bash-based yarn why based approach (which parses yarn.lock multiple times), to typescript-based @yarnpkg/lockfile approach (which only reads it once).

The script also now ensures that all PF installed packages are explicitly included in the check-patternfly-modules script.

This represents a ~12x speedup for the check-patternfly-modules step (from ~12 seconds to ~1 second) (on top of the 2x speedup in #14453), and this step no longer fries your CPU.

The script is now also a bit more informative:

image

@openshift-ci-robot openshift-ci-robot added the jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. label Dec 11, 2025
@openshift-ci-robot
Copy link
Contributor

openshift-ci-robot commented Dec 11, 2025

@logonoff: This pull request references CONSOLE-4979 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the story to target the "4.21.0" version, but no target version was set.

Details

In response to this:

Deduplication

In yarn classic, deduplication is not done automatically. See https://www.npmjs.com/package/yarn-deduplicate#why-is-this-necessary:

Yarn documentation seems to suggest this package shouldn't be necessary. For example, in https://classic.yarnpkg.com/en/docs/cli/dedupe/, it says

The dedupe command isn’t necessary. yarn install will already dedupe.

This is, however, not exactly true. There are cases where yarn will not deduplicate existing packages. For example, this scenario:

  • Install libA. It depends on libB ^1.1.0. At this point, the latest version of libB is 1.1.2, so it gets installed as a transitive dependency in your repo

  • After a few days, install libC. It also depends on libB ^1.1.0. But this time, the latest libB version is 1.1.3.

In the above scenario, you'll end up with libB@1.1.2 and libB@1.1.3 in your repo.

This PR introduces a step that runs yarn-deduplicate and fails if the yarn.lock file is not deduplicated.

After this PR, the main entrypoint size is reduced by ~200kb.

check-patternfly-modules speedup

Since the above change adds @yarnpkg/lockfile as a transitive dependency, we can rewrite check-patternfly-modules with minimal size increase to our node modules. This PR changes the check-patternfly-modules script from bash-based yarn why based approach (which parses yarn.lock multiple times), to typescript-based @yarnpkg/lockfile approach (which only reads it once).

This represents a ~12x speedup for the check-patternfly-modules step (from ~12 seconds to ~1 second) (on top of the 2x speedup in #14453), and this step no longer fries your CPU.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

@logonoff
Copy link
Member Author

/label px-approved
/label docs-approved

@openshift-ci openshift-ci bot added px-approved Signifies that Product Support has signed off on this PR docs-approved Signifies that Docs has signed off on this PR labels Dec 11, 2025
@coderabbitai
Copy link

coderabbitai bot commented Dec 11, 2025

Walkthrough

Replace a Bash PatternFly lockfile checker with a TypeScript implementation, add yarn-deduplicate and a dedupe script, update frontend dependencies/resolutions (PatternFly and typings), add a dedupe pre-check to the frontend test script, and update README dedupe instructions.

Changes

Cohort / File(s) Summary
Package configuration & dependencies
frontend/package.json
Updated postinstall to yarn ts-node ./scripts/check-patternfly-modules.ts && yarn prepare-husky; added script dedupe-deps (yarn-deduplicate --strategy highest); added yarn-deduplicate, @yarnpkg/lockfile, @types/yarnpkg__lockfile; bumped @patternfly/react-component-groups to ^6.3.0; removed @patternfly/react-console; bumped @types/lodash-es to ^4.17.12 in deps/devDeps; adjusted resolutions (@types/lodash: 4.14.106, @patternfly/react-component-groups: 6.3.0) and removed prior prerelease/react-data-view entries.
PatternFly validation script migration
frontend/scripts/check-patternfly-modules.sh, frontend/scripts/check-patternfly-modules.ts
Removed Bash checker frontend/scripts/check-patternfly-modules.sh; added TypeScript checker frontend/scripts/check-patternfly-modules.ts that parses yarn.lock via @yarnpkg/lockfile, maps lockfile keys to PatternFly package names/scopes, aggregates resolved versions, reports missing or multiple major-version resolutions, and exits nonzero on failures.
Test automation / CI pre-check
test-frontend.sh
Inserted a pre-check invoking yarn run dedupe-deps --fail; on failure prints guidance, shows git diff, and exits 1 before existing cycle checks.
Documentation
README.md
Replaced deduplication command npx yarn-deduplicate --scopes @patternfly with `yarn run dedupe-deps --scopes `@patternfly.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

  • Areas needing attention:
    • frontend/scripts/check-patternfly-modules.ts: correctness of yarn.lock parsing, mapping from lock keys to package names, version/major extraction logic, and exit behavior.
    • frontend/package.json: duplicate dependency/devDependency entries, script correctness, and effects of resolution changes on dependency graph.
    • test-frontend.sh: CI behavior of yarn run dedupe-deps --fail and failure messaging.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

📜 Recent review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Cache: Disabled due to data retention organization setting

Knowledge base: Disabled due to Reviews -> Disable Knowledge Base setting

📥 Commits

Reviewing files that changed from the base of the PR and between a4e1e1a and ee563d0.

⛔ Files ignored due to path filters (1)
  • frontend/yarn.lock is excluded by !**/yarn.lock, !**/*.lock
📒 Files selected for processing (5)
  • README.md (1 hunks)
  • frontend/package.json (5 hunks)
  • frontend/scripts/check-patternfly-modules.sh (0 hunks)
  • frontend/scripts/check-patternfly-modules.ts (1 hunks)
  • test-frontend.sh (1 hunks)
💤 Files with no reviewable changes (1)
  • frontend/scripts/check-patternfly-modules.sh
🚧 Files skipped from review as they are similar to previous changes (2)
  • README.md
  • frontend/scripts/check-patternfly-modules.ts
🧰 Additional context used
📓 Path-based instructions (1)
**

⚙️ CodeRabbit configuration file

-Focus on major issues impacting performance, readability, maintainability and security. Avoid nitpicks and avoid verbosity.

Files:

  • frontend/package.json
  • test-frontend.sh
🔇 Additional comments (7)
frontend/package.json (6)

14-14: LGTM: TypeScript-based PatternFly check improves performance.

The migration from bash to TypeScript aligns with the PR's goal of achieving ~12× speedup for check-patternfly-modules. The use of ts-node for direct execution is appropriate.


18-18: LGTM: Dedupe script supports PR objectives.

The dedupe-deps script with --strategy highest enables manual deduplication and aligns with the PR's goal of adding deduplication capabilities to CI.


140-140: LGTM: PatternFly package upgraded to stable release.

The upgrade from prerelease (6.2.0-prerelease.10) to stable (^6.3.0) is appropriate, with the resolution on line 315 ensuring version consistency across the workspace.


237-237: LGTM: Type definitions support TypeScript migration.

The additions of @types/yarnpkg__lockfile and @yarnpkg/lockfile support the new TypeScript check-patternfly-modules implementation, and the @types/lodash-es update aligns with the resolution strategy.

Also applies to: 248-249


309-309: LGTM: yarn-deduplicate added to support CI deduplication.

The addition of yarn-deduplicate enables the new dedupe-deps script and CI enforcement, aligning with PR objectives.


315-316: LGTM: Resolutions ensure version consistency.

The PatternFly component groups resolution aligns with the dependency update on line 140. The @types/lodash pinning is intentional to suppress type errors, as noted by the maintainer.

test-frontend.sh (1)

34-38: LGTM: CI enforcement of deduplicated yarn.lock.

The new pre-check enforces that yarn.lock remains deduplicated by failing the build if duplicates are detected. The error message is clear and actionable, and the placement before check-cycles is appropriate.


Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (2)
frontend/scripts/check-patternfly-modules.ts (1)

75-82: Consider guarding against semver.coerce returning null

semver.coerce(v) can theoretically return null for non‑semverish strings; passing that into semver.satisfies would throw. Yarn lock entries for these packages should all be normal semver versions, so this is low risk, but you can make the check more robust with a small guard:

-        .filter((v) => semver.satisfies(semver.coerce(v), pkg.semver)),
+        .filter((v) => {
+          const coerced = semver.coerce(v);
+          return coerced && semver.satisfies(coerced, pkg.semver);
+        }),
frontend/package.json (1)

14-20: Postinstall TS check assumes devDependencies are installed on every install

Hooking check-patternfly-modules.ts into postinstall via yarn ts-node ./scripts/check-patternfly-modules.ts gives you strong guarantees on PatternFly resolutions, but it also means:

  • Any yarn install (including yarn install --production or environments that omit devDependencies) now requires ts-node, @yarnpkg/lockfile, chalk, etc. to be present.
  • A failure in that check will abort installation entirely.

If your build and runtime flows never do production‑only installs for this package, that’s fine; otherwise you may want to gate this behind an env flag or move it into the CI/test path (similar to the new dedupe-deps enforcement) to avoid surprising failures outside developer/CI installs.

Also applies to: 238-251, 309-311, 316-316

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

Cache: Disabled due to data retention organization setting

Knowledge base: Disabled due to Reviews -> Disable Knowledge Base setting

📥 Commits

Reviewing files that changed from the base of the PR and between 335ed77 and d3518bd.

⛔ Files ignored due to path filters (1)
  • frontend/yarn.lock is excluded by !**/yarn.lock, !**/*.lock
📒 Files selected for processing (4)
  • frontend/package.json (4 hunks)
  • frontend/scripts/check-patternfly-modules.sh (0 hunks)
  • frontend/scripts/check-patternfly-modules.ts (1 hunks)
  • test-frontend.sh (1 hunks)
💤 Files with no reviewable changes (1)
  • frontend/scripts/check-patternfly-modules.sh
🧰 Additional context used
📓 Path-based instructions (1)
**

⚙️ CodeRabbit configuration file

-Focus on major issues impacting performance, readability, maintainability and security. Avoid nitpicks and avoid verbosity.

Files:

  • frontend/scripts/check-patternfly-modules.ts
  • test-frontend.sh
  • frontend/package.json
🔇 Additional comments (2)
test-frontend.sh (1)

34-38: Lockfile dedupe gate fits well into CI pre-checks

This block cleanly enforces a deduped yarn.lock before cycle checks, with consistent messaging and diff output in line with the other guards. Just ensure all CI jobs that invoke test-frontend.sh have the dedupe-deps script and its tooling available so this step can run everywhere it's expected.

frontend/scripts/check-patternfly-modules.ts (1)

40-72: New @patternfly / @patternfly‑5 packages will hard‑fail this check

Because SCOPES_TO_CHECK is the set {'@patternfly', '@patternfly-5'} and parsePackageName throws when a key in those scopes doesn’t start with one of the explicit PKGS_TO_CHECK names, any new or transitive @patternfly/* or @patternfly-5/* package will cause installs to fail until this list is updated.

If that strict “force explicit registration for every PatternFly package” behavior is intentional, this is a good guardrail. If you only wanted to enforce versions on the known subset, you may want to narrow the filter (e.g., match only keys that start with the known pkg.name prefixes and ignore unknown PatternFly packages).

@openshift-ci-robot
Copy link
Contributor

openshift-ci-robot commented Dec 11, 2025

@logonoff: This pull request references CONSOLE-4979 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the story to target the "4.21.0" version, but no target version was set.

Details

In response to this:

Deduplication

In yarn classic, deduplication is not done automatically. See https://www.npmjs.com/package/yarn-deduplicate#why-is-this-necessary:

Yarn documentation seems to suggest this package shouldn't be necessary. For example, in https://classic.yarnpkg.com/en/docs/cli/dedupe/, it says

The dedupe command isn’t necessary. yarn install will already dedupe.

This is, however, not exactly true. There are cases where yarn will not deduplicate existing packages. For example, this scenario:

  • Install libA. It depends on libB ^1.1.0. At this point, the latest version of libB is 1.1.2, so it gets installed as a transitive dependency in your repo

  • After a few days, install libC. It also depends on libB ^1.1.0. But this time, the latest libB version is 1.1.3.

In the above scenario, you'll end up with libB@1.1.2 and libB@1.1.3 in your repo.

This PR introduces a step that runs yarn-deduplicate and fails if the yarn.lock file is not deduplicated.

After this PR, the main entrypoint size is reduced by ~200kb.

check-patternfly-modules speedup

Since the above change adds @yarnpkg/lockfile as a transitive dependency, we can rewrite check-patternfly-modules with minimal size increase to our node modules. This PR changes the check-patternfly-modules script from bash-based yarn why based approach (which parses yarn.lock multiple times), to typescript-based @yarnpkg/lockfile approach (which only reads it once).

The script also now ensures that all PF installed packages are explicitly included in the check-patternfly-modules script.

This represents a ~12x speedup for the check-patternfly-modules step (from ~12 seconds to ~1 second) (on top of the 2x speedup in #14453), and this step no longer fries your CPU.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

"node": ">=22.x"
},
"resolutions": {
"@types/lodash": "4.14.106",
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

typedefs do not follow semver, this is needed to suppress a couple of lodash related type errors in new versions

@openshift-ci-robot
Copy link
Contributor

openshift-ci-robot commented Dec 11, 2025

@logonoff: This pull request references CONSOLE-4979 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the story to target the "4.21.0" version, but no target version was set.

Details

In response to this:

Deduplication

In yarn classic, deduplication is not done automatically. See https://www.npmjs.com/package/yarn-deduplicate#why-is-this-necessary:

Yarn documentation seems to suggest this package shouldn't be necessary. For example, in https://classic.yarnpkg.com/en/docs/cli/dedupe/, it says

The dedupe command isn’t necessary. yarn install will already dedupe.

This is, however, not exactly true. There are cases where yarn will not deduplicate existing packages. For example, this scenario:

  • Install libA. It depends on libB ^1.1.0. At this point, the latest version of libB is 1.1.2, so it gets installed as a transitive dependency in your repo

  • After a few days, install libC. It also depends on libB ^1.1.0. But this time, the latest libB version is 1.1.3.

In the above scenario, you'll end up with libB@1.1.2 and libB@1.1.3 in your repo.

This PR introduces a step that runs yarn-deduplicate and fails if the yarn.lock file is not deduplicated.

After this PR, the main entrypoint size is reduced by ~200kb.

check-patternfly-modules speedup

Since the above change adds @yarnpkg/lockfile as a transitive dependency, we can rewrite check-patternfly-modules with minimal size increase to our node modules. This PR changes the check-patternfly-modules script from bash-based yarn why based approach (which parses yarn.lock multiple times), to typescript-based @yarnpkg/lockfile approach (which only reads it once).

The script also now ensures that all PF installed packages are explicitly included in the check-patternfly-modules script.

This represents a ~12x speedup for the check-patternfly-modules step (from ~12 seconds to ~1 second) (on top of the 2x speedup in #14453), and this step no longer fries your CPU.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

@logonoff logonoff force-pushed the CONSOLE-4979-dedupe-yarn branch from d3518bd to c0182f6 Compare December 11, 2025 18:29
@openshift-ci-robot
Copy link
Contributor

openshift-ci-robot commented Dec 11, 2025

@logonoff: This pull request references CONSOLE-4979 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the story to target the "4.21.0" version, but no target version was set.

Details

In response to this:

Deduplication

In yarn classic, deduplication is not done automatically. See https://www.npmjs.com/package/yarn-deduplicate#why-is-this-necessary:

Yarn documentation seems to suggest this package shouldn't be necessary. For example, in https://classic.yarnpkg.com/en/docs/cli/dedupe/, it says

The dedupe command isn’t necessary. yarn install will already dedupe.

This is, however, not exactly true. There are cases where yarn will not deduplicate existing packages. For example, this scenario:

  • Install libA. It depends on libB ^1.1.0. At this point, the latest version of libB is 1.1.2, so it gets installed as a transitive dependency in your repo

  • After a few days, install libC. It also depends on libB ^1.1.0. But this time, the latest libB version is 1.1.3.

In the above scenario, you'll end up with libB@1.1.2 and libB@1.1.3 in your repo.

This PR introduces a step that runs yarn-deduplicate and fails if the yarn.lock file is not deduplicated.

After this PR, the main entrypoint size is reduced by ~200kb.

check-patternfly-modules speedup

Since the above change adds @yarnpkg/lockfile as a transitive dependency, we can rewrite check-patternfly-modules using that dependency minimal size increase to our node modules. This PR changes the check-patternfly-modules script from bash-based yarn why based approach (which parses yarn.lock multiple times), to typescript-based @yarnpkg/lockfile approach (which only reads it once).

The script also now ensures that all PF installed packages are explicitly included in the check-patternfly-modules script.

This represents a ~12x speedup for the check-patternfly-modules step (from ~12 seconds to ~1 second) (on top of the 2x speedup in #14453), and this step no longer fries your CPU.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

@openshift-ci-robot
Copy link
Contributor

openshift-ci-robot commented Dec 11, 2025

@logonoff: This pull request references CONSOLE-4979 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the story to target the "4.21.0" version, but no target version was set.

Details

In response to this:

Deduplication

In yarn classic, deduplication is not done automatically. See https://www.npmjs.com/package/yarn-deduplicate#why-is-this-necessary:

Yarn documentation seems to suggest this package shouldn't be necessary. For example, in https://classic.yarnpkg.com/en/docs/cli/dedupe/, it says

The dedupe command isn’t necessary. yarn install will already dedupe.

This is, however, not exactly true. There are cases where yarn will not deduplicate existing packages. For example, this scenario:

  • Install libA. It depends on libB ^1.1.0. At this point, the latest version of libB is 1.1.2, so it gets installed as a transitive dependency in your repo

  • After a few days, install libC. It also depends on libB ^1.1.0. But this time, the latest libB version is 1.1.3.

In the above scenario, you'll end up with libB@1.1.2 and libB@1.1.3 in your repo.

This PR introduces a step that runs yarn-deduplicate and fails if the yarn.lock file is not deduplicated.

After this PR, the main entrypoint size is reduced by ~200kb.

check-patternfly-modules speedup

Since the above change adds @yarnpkg/lockfile as a transitive dependency, we can rewrite check-patternfly-modules using that dependency with minimal size increase to our node modules. This PR changes the check-patternfly-modules script from bash-based yarn why based approach (which parses yarn.lock multiple times), to typescript-based @yarnpkg/lockfile approach (which only reads it once).

The script also now ensures that all PF installed packages are explicitly included in the check-patternfly-modules script.

This represents a ~12x speedup for the check-patternfly-modules step (from ~12 seconds to ~1 second) (on top of the 2x speedup in #14453), and this step no longer fries your CPU.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

@openshift-ci openshift-ci bot added the component/shared Related to console-shared label Dec 11, 2025
@logonoff logonoff force-pushed the CONSOLE-4979-dedupe-yarn branch from 8695653 to c00768f Compare December 11, 2025 18:40

This comment was marked as outdated.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

Cache: Disabled due to data retention organization setting

Knowledge base: Disabled due to Reviews -> Disable Knowledge Base setting

📥 Commits

Reviewing files that changed from the base of the PR and between c0182f6 and c00768f.

⛔ Files ignored due to path filters (1)
  • frontend/yarn.lock is excluded by !**/yarn.lock, !**/*.lock
📒 Files selected for processing (3)
  • frontend/package.json (5 hunks)
  • frontend/packages/console-shared/src/components/links/ExternalLinkButton.tsx (2 hunks)
  • frontend/scripts/check-patternfly-modules.ts (1 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
**

⚙️ CodeRabbit configuration file

-Focus on major issues impacting performance, readability, maintainability and security. Avoid nitpicks and avoid verbosity.

Files:

  • frontend/scripts/check-patternfly-modules.ts
  • frontend/packages/console-shared/src/components/links/ExternalLinkButton.tsx
  • frontend/package.json
🧬 Code graph analysis (1)
frontend/packages/console-shared/src/components/links/ExternalLinkButton.tsx (1)
frontend/__mocks__/i18next.ts (1)
  • t (8-14)
🔇 Additional comments (10)
frontend/packages/console-shared/src/components/links/ExternalLinkButton.tsx (2)

12-18: LGTM!

The implementation cleanly adopts the PatternFly component group's ExternalLinkButton, maintaining the public API while delegating rendering to the library component. The translation for the icon title improves accessibility.


1-7: Library version and API compatibility confirmed.

The imports from @patternfly/react-component-groups@6.2.0 are correct, the component properly exports ExternalLinkButtonProps for type consumers, and the translation key "(Opens in new tab)" is present in all locales. The wrapper implementation correctly merges the translated title into iconProps before passing through to the PatternFly component.

frontend/scripts/check-patternfly-modules.ts (6)

1-15: LGTM: Imports and yarn.lock parsing setup.

The imports are appropriate for the task, and the early error handling for yarn.lock parsing failures is good. The relative path to yarn.lock is correct since this script runs from the repository root via the postinstall hook.


17-37: LGTM: PatternFly package list is well-structured.

The package list is comprehensive and well-typed. Using '*' as the semver range is appropriate since the script's goal is to detect any version duplicates across these packages.


39-39: LGTM: Efficient scope filtering.

Using a Set for scope lookup provides O(1) performance when filtering yarn.lock entries.


41-57: LGTM: Robust package name parsing with helpful error messages.

The function correctly identifies PatternFly packages and provides clear error messages when an unrecognized PatternFly package is encountered. The use of basename(__filename) makes the error message maintenance-friendly.


59-70: LGTM: Efficient map construction.

The reduce operation efficiently builds the package resolution map in a single pass through the yarn.lock entries. The explicit typing provides compile-time safety.


102-107: LGTM: Appropriate error handling and user guidance.

The script correctly exits with code 1 on errors and provides helpful guidance for debugging resolution issues.

frontend/package.json (2)

14-14: LGTM: Postinstall script correctly migrated to TypeScript.

The updated postinstall script properly uses ts-node to execute the new TypeScript implementation, maintaining the chain with prepare-husky.


18-18: LGTM: Dedupe script configured appropriately.

The dedupe-deps script uses the highest strategy, which is a sensible default for ensuring the most recent compatible versions are used.

@logonoff logonoff force-pushed the CONSOLE-4979-dedupe-yarn branch 4 times, most recently from bc6d0a2 to a103520 Compare December 11, 2025 19:16
@openshift-ci-robot
Copy link
Contributor

openshift-ci-robot commented Dec 11, 2025

@logonoff: This pull request references CONSOLE-4979 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the story to target the "4.21.0" version, but no target version was set.

Details

In response to this:

Deduplication

In yarn classic, deduplication is not done automatically. See https://www.npmjs.com/package/yarn-deduplicate#why-is-this-necessary:

Yarn documentation seems to suggest this package shouldn't be necessary. For example, in https://classic.yarnpkg.com/en/docs/cli/dedupe/, it says

The dedupe command isn’t necessary. yarn install will already dedupe.

This is, however, not exactly true. There are cases where yarn will not deduplicate existing packages. For example, this scenario:

  • Install libA. It depends on libB ^1.1.0. At this point, the latest version of libB is 1.1.2, so it gets installed as a transitive dependency in your repo

  • After a few days, install libC. It also depends on libB ^1.1.0. But this time, the latest libB version is 1.1.3.

In the above scenario, you'll end up with libB@1.1.2 and libB@1.1.3 in your repo.

This PR introduces a step that runs yarn-deduplicate and fails if the yarn.lock file is not deduplicated.

After this PR, the vendor main chunk size is reduced by ~250kb due to the reduction of duplicated dependencies.

check-patternfly-modules speedup

Since the above change adds @yarnpkg/lockfile as a transitive dependency, we can rewrite check-patternfly-modules using that dependency with minimal size increase to our node modules. This PR changes the check-patternfly-modules script from bash-based yarn why based approach (which parses yarn.lock multiple times), to typescript-based @yarnpkg/lockfile approach (which only reads it once).

The script also now ensures that all PF installed packages are explicitly included in the check-patternfly-modules script.

This represents a ~12x speedup for the check-patternfly-modules step (from ~12 seconds to ~1 second) (on top of the 2x speedup in #14453), and this step no longer fries your CPU.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

const SCOPES_TO_CHECK = new Set(PKGS_TO_CHECK.map((pkg) => pkg.name.split('/')[0]));

/** Get the package name and version from a package key in yarn.lock */
const parsePackageName = (pkgKey: string): { pkgName: string } => {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit - we could just return a string instead of { pkgName: string } object.

Also, can you give an example on pkgKey difference vs pkgName ?

Copy link
Member Author

@logonoff logonoff Dec 11, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

pkgkey is @patternfly/patternfly@^6.2.3, pkgname is @patternfly/patternfly. previously this also parsed the version from pkgkey (hence the object return type), but it wasn't used so I removed that part

@logonoff logonoff force-pushed the CONSOLE-4979-dedupe-yarn branch from a103520 to 24250ba Compare December 11, 2025 19:29
@logonoff logonoff force-pushed the CONSOLE-4979-dedupe-yarn branch from 24250ba to d98bd6b Compare December 11, 2025 19:34
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

Cache: Disabled due to data retention organization setting

Knowledge base: Disabled due to Reviews -> Disable Knowledge Base setting

📥 Commits

Reviewing files that changed from the base of the PR and between 49d3735 and d98bd6b.

⛔ Files ignored due to path filters (1)
  • frontend/yarn.lock is excluded by !**/yarn.lock, !**/*.lock
📒 Files selected for processing (5)
  • README.md (1 hunks)
  • frontend/package.json (5 hunks)
  • frontend/scripts/check-patternfly-modules.sh (0 hunks)
  • frontend/scripts/check-patternfly-modules.ts (1 hunks)
  • test-frontend.sh (1 hunks)
💤 Files with no reviewable changes (1)
  • frontend/scripts/check-patternfly-modules.sh
🚧 Files skipped from review as they are similar to previous changes (1)
  • README.md
🧰 Additional context used
📓 Path-based instructions (1)
**

⚙️ CodeRabbit configuration file

-Focus on major issues impacting performance, readability, maintainability and security. Avoid nitpicks and avoid verbosity.

Files:

  • frontend/package.json
  • test-frontend.sh
  • frontend/scripts/check-patternfly-modules.ts
🔇 Additional comments (11)
test-frontend.sh (1)

34-38: LGTM!

The dedupe pre-check is correctly implemented and integrates well with the new dedupe-deps script. The error message is clear and actionable, guiding users to run the dedupe command and commit the updated lockfile.

frontend/scripts/check-patternfly-modules.ts (7)

1-9: LGTM!

The imports and initial setup are appropriate for a CLI validation script. The eslint-disable no-console directive is correctly applied for this use case.


10-15: LGTM!

The lockfile parsing and error handling are correctly implemented. Synchronous file operations are acceptable for build-time scripts.


17-39: LGTM!

The package list and scope derivation are well-structured. Using wildcard semver ranges (*) is appropriate since the goal is to detect duplicate resolutions rather than enforce specific versions.


41-55: LGTM!

The parsePackageName function correctly maps yarn.lock keys to package names and ensures all PatternFly packages are explicitly handled. The error message provides clear guidance if a new package is encountered.


57-68: LGTM!

The map-building logic correctly aggregates resolved versions for each PatternFly package from yarn.lock.


72-110: LGTM!

The validation logic is robust and correctly handles edge cases. The defensive null check for semver.coerce (lines 78-87) properly guards against invalid version strings, addressing the concern raised in the past review.


112-117: LGTM!

The error handling and exit logic are correct. The suggestion to run yarn why <pkg-name> provides a clear next step for debugging resolution issues.

frontend/package.json (3)

14-14: LGTM!

The postinstall script correctly references the new TypeScript implementation, leveraging the existing ts-node tooling.


18-18: LGTM!

The dedupe-deps script is correctly configured with the highest strategy, which is a sensible default for deduplication. This aligns with the pre-check added in test-frontend.sh.


315-316: LGTM!

The resolutions are appropriately configured. The @types/lodash pinning at 4.14.106 is a known workaround for type errors with lodash-es, as noted in the past review.

@logonoff logonoff force-pushed the CONSOLE-4979-dedupe-yarn branch from d98bd6b to 9a67a73 Compare December 11, 2025 19:39
@openshift-ci openshift-ci bot removed the do-not-merge/hold Indicates that a PR should not merge because someone has issued a /hold command. label Dec 12, 2025
@logonoff
Copy link
Member Author

/label acknowledge-critical-fixes-only
/assign @yapei

@openshift-ci openshift-ci bot added the acknowledge-critical-fixes-only Indicates if the issuer of the label is OK with the policy. label Dec 12, 2025
@logonoff logonoff force-pushed the CONSOLE-4979-dedupe-yarn branch 2 times, most recently from db02cc4 to a4e1e1a Compare December 12, 2025 15:50
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

♻️ Duplicate comments (1)
test-frontend.sh (1)

34-38: Limit diff output to yarn.lock to avoid noisy CI logs
Right now git --no-pager diff can include unrelated workspace changes (generated docs/i18n if this is reordered later, or future steps). Safer to show only the lockfile diff.

 if ! yarn run dedupe-deps --fail ; then
   echo "You have duplicate version resolutions of some packages in yarn.lock. Run 'yarn dedupe-deps' and commit the updated yarn.lock."
-  git --no-pager diff
+  git --no-pager diff -- yarn.lock
   exit 1
 fi
🧹 Nitpick comments (2)
frontend/scripts/check-patternfly-modules.ts (2)

39-66: Harden yarn.lock “key → package name” parsing (quotes / multi-selectors / prefix collisions)
resolutionKey.split('/')[0] and startsWith(pkg.name) are brittle for Yarn Classic keys like "@scope/name@^1", "@scope/name@^2" and can also mis-match on prefix-y names. Consider normalizing to the first selector and extracting the actual package name before scope filtering + mapping.

 const SCOPES_TO_CHECK = new Set(PKGS_TO_CHECK.map((pkg) => pkg.name.split('/')[0]));
 
+const firstSelector = (resolutionKey: string): string =>
+  resolutionKey.split(',')[0].trim().replace(/^"|"$/g, '');
+
+const packageNameFromSelector = (selector: string): string => {
+  // Handles scoped: @scope/name@range... and unscoped: name@range...
+  const m = selector.match(/^(@[^/]+\/[^@]+|[^@]+)@/);
+  return m ? m[1] : selector;
+};
+
 /** Get the package name and version from a package key in yarn.lock */
 const parsePackageName = (resolutionKey: string): string => {
-  const pkgName = PKGS_TO_CHECK.find((pkg) => resolutionKey.startsWith(pkg.name));
+  const selector = firstSelector(resolutionKey);
+  const name = packageNameFromSelector(selector);
+  const pkgName = PKGS_TO_CHECK.find((pkg) => pkg.name === name);
 
   // Ensure that all packages within SCOPES_TO_CHECK are checked
   if (!pkgName) {
     throw new Error(
@@
   return pkgName.name;
 };

42-55: Avoid uncaught throw (clean CI error instead of stacktrace)
parsePackageName throws; since this is a CI script, it’s better to catch and console.error(...) + process.exit(1) for predictable output.

Minimal pattern:

-const patternflyModules = Object.entries(lockFile.object).reduce(
+let patternflyModules: Map<string, Array<{ resolvedVersion: string }>>;
+try {
+  patternflyModules = Object.entries(lockFile.object).reduce(
     (acc, [resolutionKey, resolvedDependency]) => {
       ...
     },
     new Map<string, Array<{ resolvedVersion: string }>>(),
-);
+  );
+} catch (e) {
+  console.error(String(e));
+  process.exit(1);
+}

Also applies to: 116-119

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

Cache: Disabled due to data retention organization setting

Knowledge base: Disabled due to Reviews -> Disable Knowledge Base setting

📥 Commits

Reviewing files that changed from the base of the PR and between 75e1ce7 and db02cc4.

⛔ Files ignored due to path filters (1)
  • frontend/yarn.lock is excluded by !**/yarn.lock, !**/*.lock
📒 Files selected for processing (4)
  • README.md (1 hunks)
  • frontend/package.json (5 hunks)
  • frontend/scripts/check-patternfly-modules.ts (1 hunks)
  • test-frontend.sh (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
  • README.md
  • frontend/package.json
🧰 Additional context used
📓 Path-based instructions (1)
**

⚙️ CodeRabbit configuration file

-Focus on major issues impacting performance, readability, maintainability and security. Avoid nitpicks and avoid verbosity.

Files:

  • test-frontend.sh
  • frontend/scripts/check-patternfly-modules.ts

Comment on lines +58 to +73
const patternflyModules = Object.entries(lockFile.object).reduce(
(acc, [resolutionKey, resolvedDependency]) => {
if (SCOPES_TO_CHECK.has(resolutionKey.split('/')[0])) {
const pkgName = parsePackageName(resolutionKey);
if (!acc.has(pkgName)) {
acc.set(pkgName, []);
}
acc.get(pkgName).push({ resolvedVersion: resolvedDependency.version });
}

return acc;
},
new Map<string, Array<{ resolvedVersion: string }>>(),
);
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Scope filtering should use the parsed package name, not resolutionKey.split('/')
If keys are quoted / comma-delimited, resolutionKey.split('/')[0] may be "@patternfly (with a quote) and skip PatternFly entries entirely.

Suggested direction: compute const name = packageNameFromSelector(firstSelector(resolutionKey)), then check SCOPES_TO_CHECK.has(name.split('/')[0]) before aggregating.

🤖 Prompt for AI Agents
In frontend/scripts/check-patternfly-modules.ts around lines 58 to 71, the scope
check uses resolutionKey.split('/')[0] which can fail for quoted or
comma-delimited keys; instead derive the package selector first and compute the
parsed package name, e.g. const name =
packageNameFromSelector(firstSelector(resolutionKey)), then use
SCOPES_TO_CHECK.has(name.split('/')[0]) for the scope check before aggregating;
keep the existing parsePackageName(resolutionKey) usage for the map key and push
resolvedVersion as before, ensuring the scope check uses the parsed package name
rather than raw resolutionKey.split('/') output.

Comment on lines +75 to +116
for (const pkg of PKGS_TO_CHECK) {
const resolvedVersions = Array.from(
new Set((patternflyModules.get(pkg.name) || []).map((v) => v.resolvedVersion)),
);

if (resolvedVersions.length === 0) {
console.error(`${chalk.red(pkg.name)} has no ${chalk.yellow(pkg.semver)} resolutions`);
hasResolutionErrors = true;
} else if (resolvedVersions.length === 1) {
const resolvedVersion = semver.coerce(resolvedVersions[0]);

if (!resolvedVersion) {
console.error(
`${chalk.red(pkg.name)} has a non-semver coercible resolved version: ${chalk.yellow(
resolvedVersions[0],
)}`,
);
hasResolutionErrors = true;
continue;
}

if (!semver.satisfies(resolvedVersion, pkg.semver)) {
console.error(
`${chalk.red(pkg.name)} has one resolution ${chalk.yellow(
resolvedVersions[0],
)} which does not satisfy ${chalk.yellow(pkg.semver)}`,
);
hasResolutionErrors = true;
} else {
console.log(
`${chalk.green(pkg.name)} has one ${chalk.yellow(pkg.semver)} resolution: ${
resolvedVersions[0]
}`,
);
}
} else {
console.error(`${chalk.red(pkg.name)} has multiple resolutions: ${resolvedVersions}`);
hasResolutionErrors = true;
}
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Resolved dependency version may be missing; guard before semver logic
resolvedDependency.version is assumed present. If the lock entry is malformed/partial, you’ll end up with undefined in resolvedVersions and then hit the “non-semver coercible” path with a confusing message.

Consider filtering falsy versions at collection time (Line 65) or when building resolvedVersions.

🤖 Prompt for AI Agents
In frontend/scripts/check-patternfly-modules.ts around lines 75 to 114,
resolvedVersions may include undefined/null/empty values from malformed lock
entries which leads to confusing "non-semver coercible" errors; filter out
falsy/non-string versions when building resolvedVersions (e.g., remove
undefined/null/empty before creating the Set) and treat the case where filtering
leaves zero entries as "no resolutions" so semver.coerce is only called with
valid strings.

@yapei
Copy link
Contributor

yapei commented Dec 15, 2025

Local run

$ yarn run dedupe-deps --scopes @patternfly
yarn run v1.22.22
$ yarn-deduplicate --strategy highest --scopes @patternfly
✨  Done in 0.82s.

$ yarn run postinstall
yarn run v1.22.22
$ yarn ts-node ./scripts/check-patternfly-modules.ts && yarn prepare-husky
$ ts-node -O '{"module":"commonjs"}' ./scripts/check-patternfly-modules.ts
Checking yarn.lock for PatternFly module resolutions...
@patternfly-5/patternfly has one 5.x resolution: 5.4.2
@patternfly/patternfly has one 6.x resolution: 6.2.3
@patternfly/quickstarts has one 6.x resolution: 6.4.0
@patternfly/react-catalog-view-extension has one 6.x resolution: 6.1.0
@patternfly/react-charts has one 8.x resolution: 8.2.2
@patternfly/react-code-editor has one 6.x resolution: 6.2.2
@patternfly/react-component-groups has one 6.x resolution: 6.3.0
@patternfly/react-core has one 6.x resolution: 6.2.2
@patternfly/react-data-view has one 6.x resolution: 6.2.0
@patternfly/react-icons has one 6.x resolution: 6.2.2
@patternfly/react-log-viewer has one 6.x resolution: 6.3.0-prerelease.2
@patternfly/react-styles has one 6.x resolution: 6.2.2
@patternfly/react-table has one 6.x resolution: 6.2.2
@patternfly/react-templates has one 6.x resolution: 6.2.2
@patternfly/react-tokens has one 6.x resolution: 6.2.2
@patternfly/react-topology has one 6.x resolution: 6.2.0
@patternfly/react-user-feedback has one 6.x resolution: 6.1.0
@patternfly/react-virtualized-extension has one 6.x resolution: 6.0.0
No issues detected
$ cd .. && husky install frontend/.husky
husky - Git hooks installed
✨  Done in 2.00s.

$ yarn list @patternfly/react-core
yarn list v1.22.22
warning Resolution field "minimist@1.2.5" is incompatible with requested version "minimist@^1.2.8"
warning Resolution field "minimist@1.2.5" is incompatible with requested version "minimist@~0.0.1"
warning Resolution field "@types/lodash@4.14.106" is incompatible with requested version "@types/lodash@^4.14.175"
warning Filtering by arguments is deprecated. Please use the pattern option instead.
└─ @patternfly/react-core@6.2.2
✨  Done in 0.33s.

$ yarn list @patternfly/react-log-viewer
yarn list v1.22.22
warning Resolution field "minimist@1.2.5" is incompatible with requested version "minimist@^1.2.8"
warning Resolution field "minimist@1.2.5" is incompatible with requested version "minimist@~0.0.1"
warning Resolution field "@types/lodash@4.14.106" is incompatible with requested version "@types/lodash@^4.14.175"
warning Filtering by arguments is deprecated. Please use the pattern option instead.
└─ @patternfly/react-log-viewer@6.3.0-prerelease.2
✨  Done in 0.33s.

/verified by CI and @yapei

@openshift-ci-robot openshift-ci-robot added the verified Signifies that the PR passed pre-merge verification criteria label Dec 15, 2025
@openshift-ci-robot
Copy link
Contributor

@yapei: This PR has been marked as verified by CI and @yapei.

Details

In response to this:

$ yarn run dedupe-deps --scopes @patternfly
yarn run v1.22.22
$ yarn-deduplicate --strategy highest --scopes @patternfly
✨  Done in 0.82s.

$ yarn run postinstall
yarn run v1.22.22
$ yarn ts-node ./scripts/check-patternfly-modules.ts && yarn prepare-husky
$ ts-node -O '{"module":"commonjs"}' ./scripts/check-patternfly-modules.ts
Checking yarn.lock for PatternFly module resolutions...
@patternfly-5/patternfly has one 5.x resolution: 5.4.2
@patternfly/patternfly has one 6.x resolution: 6.2.3
@patternfly/quickstarts has one 6.x resolution: 6.4.0
@patternfly/react-catalog-view-extension has one 6.x resolution: 6.1.0
@patternfly/react-charts has one 8.x resolution: 8.2.2
@patternfly/react-code-editor has one 6.x resolution: 6.2.2
@patternfly/react-component-groups has one 6.x resolution: 6.3.0
@patternfly/react-core has one 6.x resolution: 6.2.2
@patternfly/react-data-view has one 6.x resolution: 6.2.0
@patternfly/react-icons has one 6.x resolution: 6.2.2
@patternfly/react-log-viewer has one 6.x resolution: 6.3.0-prerelease.2
@patternfly/react-styles has one 6.x resolution: 6.2.2
@patternfly/react-table has one 6.x resolution: 6.2.2
@patternfly/react-templates has one 6.x resolution: 6.2.2
@patternfly/react-tokens has one 6.x resolution: 6.2.2
@patternfly/react-topology has one 6.x resolution: 6.2.0
@patternfly/react-user-feedback has one 6.x resolution: 6.1.0
@patternfly/react-virtualized-extension has one 6.x resolution: 6.0.0
No issues detected
$ cd .. && husky install frontend/.husky
husky - Git hooks installed
✨  Done in 2.00s.

$ yarn list @patternfly/react-core
yarn list v1.22.22
warning Resolution field "minimist@1.2.5" is incompatible with requested version "minimist@^1.2.8"
warning Resolution field "minimist@1.2.5" is incompatible with requested version "minimist@~0.0.1"
warning Resolution field "@types/lodash@4.14.106" is incompatible with requested version "@types/lodash@^4.14.175"
warning Filtering by arguments is deprecated. Please use the pattern option instead.
└─ @patternfly/react-core@6.2.2
✨  Done in 0.33s.

$ yarn list @patternfly/react-log-viewer
yarn list v1.22.22
warning Resolution field "minimist@1.2.5" is incompatible with requested version "minimist@^1.2.8"
warning Resolution field "minimist@1.2.5" is incompatible with requested version "minimist@~0.0.1"
warning Resolution field "@types/lodash@4.14.106" is incompatible with requested version "@types/lodash@^4.14.175"
warning Filtering by arguments is deprecated. Please use the pattern option instead.
└─ @patternfly/react-log-viewer@6.3.0-prerelease.2
✨  Done in 0.33s.

/verified by CI and @yapei

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

@logonoff
Copy link
Member Author

/retest

Go from bash-based `yarn why` based approach (which parses yarn.lock multiple times) to typescript-based `@yarnpkg/lockfile` approach (which only reads it once). This represents a ~12x speedup for the check-patternfly-modules step (from ~12 seconds to ~1 second), and this step no longer fries your CPU.
In yarn classic, deduplication is not done automatically. See: https://www.npmjs.com/package/yarn-deduplicate#why-is-this-necessary

This commit introduces a step that runs `yarn-deduplicate` and fails if the `yarn.lock` file is not deduplicated.

After this commit, the main entrypoint size is reduced by ~250kb.
@logonoff logonoff force-pushed the CONSOLE-4979-dedupe-yarn branch from a4e1e1a to ee563d0 Compare December 16, 2025 21:58
@openshift-ci-robot openshift-ci-robot removed the verified Signifies that the PR passed pre-merge verification criteria label Dec 16, 2025
@logonoff
Copy link
Member Author

rebase w/ no changes

/verified by CI and @yapei

@openshift-ci-robot openshift-ci-robot added the verified Signifies that the PR passed pre-merge verification criteria label Dec 16, 2025
@openshift-ci-robot
Copy link
Contributor

@logonoff: This PR has been marked as verified by CI and @yapei.

Details

In response to this:

rebase w/ no changes

/verified by CI and @yapei

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

@jhadvig
Copy link
Member

jhadvig commented Dec 17, 2025

/override ci/prow/okd-scos-images

@openshift-ci
Copy link
Contributor

openshift-ci bot commented Dec 17, 2025

@jhadvig: Overrode contexts on behalf of jhadvig: ci/prow/okd-scos-images

Details

In response to this:

/override ci/prow/okd-scos-images

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

@openshift-ci
Copy link
Contributor

openshift-ci bot commented Dec 17, 2025

@logonoff: all tests passed!

Full PR test history. Your PR dashboard.

Details

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. I understand the commands that are listed here.

@jhadvig
Copy link
Member

jhadvig commented Dec 17, 2025

/lgtm
/label plugin-api-approved

@openshift-ci openshift-ci bot added the plugin-api-approved Indicates a PR with plugin API changes has been approved by an API reviewer label Dec 17, 2025
@openshift-ci openshift-ci bot added the lgtm Indicates that a PR is ready to be merged. label Dec 17, 2025
@openshift-ci
Copy link
Contributor

openshift-ci bot commented Dec 17, 2025

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: jhadvig, logonoff, spadgett

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@openshift-merge-bot openshift-merge-bot bot merged commit 9ac9e36 into openshift:main Dec 17, 2025
8 checks passed
@logonoff logonoff deleted the CONSOLE-4979-dedupe-yarn branch December 17, 2025 15:45
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

acknowledge-critical-fixes-only Indicates if the issuer of the label is OK with the policy. approved Indicates a PR has been approved by an approver from all required OWNERS files. component/shared Related to console-shared docs-approved Signifies that Docs has signed off on this PR jira/valid-reference Indicates that this PR references a valid Jira ticket of any type. lgtm Indicates that a PR is ready to be merged. plugin-api-approved Indicates a PR with plugin API changes has been approved by an API reviewer px-approved Signifies that Product Support has signed off on this PR verified Signifies that the PR passed pre-merge verification criteria

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants