Skip to content

XRAY-144147 Support Yarn v4 for curation audit#778

Merged
attiasas merged 10 commits into
jfrog:devfrom
gauriy-tech:feature/XRAY-144147-onboard-yarn-v4
Jun 29, 2026
Merged

XRAY-144147 Support Yarn v4 for curation audit#778
attiasas merged 10 commits into
jfrog:devfrom
gauriy-tech:feature/XRAY-144147-onboard-yarn-v4

Conversation

@gauriy-tech

@gauriy-tech gauriy-tech commented Jun 16, 2026

Copy link
Copy Markdown
Contributor
  • The pull request is targeting the dev branch.
  • The code has been validated to compile successfully by running go vet ./....
  • The code has been formatted properly using go fmt ./....
  • All static analysis checks passed.
  • All tests have passed. If this feature is not already covered by the tests, new tests have been added.
  • Updated the Contributing page / ReadMe page / CI Workflow files if needed.
  • All changes are detailed at the description. if not already covered at JFrog Documentation, new documentation have been added.

What

Onboards Yarn V4 (Berry, native .yarnrc.yml mode) to jf curation-audit (jf ca),
and unifies Yarn V3 + V4 curation on a metadata-only lockfile resolution path.

Why / Design

jf ca must build a complete yarn.lock to enumerate the dependency graph, without
downloading tarballs (curation blocks blocked tarballs with a 403, which aborts a normal
install before the lockfile is written).
Approaches considered:

  • yarn install --mode=update-lockfile (previous V3 behavior): rejected — it still
    fetches uncached tarballs to compute checksums, so a curation 403 on a blocked uncached
    package aborts before yarn.lock is written.
  • Hosted plugin via yarn plugin import <url>: rejected — adds a runtime network
    dependency, breaks air-gapped CI.
  • .yarnrc.yml flags (enableNetwork: false, etc.): rejected — doesn't produce a
    complete lockfile for uncached packages.
  • Chosen: embedded resolution-only plugin (jfrog-yarn-resolve-lockfile.cjs, //go:embed).
    It calls project.resolveEverything() + project.persistLockfile() — resolving the full
    graph from registry metadata only (no tarball fetch), so blocked packages never abort
    the lockfile. The plugin is written into the per-run temp dir, never the customer's project.
    V3 behavior change (intentional): V3 curation previously used --mode=update-lockfile;
    it now uses the same embedded plugin as V4. V3 had the identical tarball-fetch abort problem,
    so this gives V3 strictly better behavior and keeps V3/V4 on one code path.

Highlights

  • Yarn V4 native mode: registry + auth read from .yarnrc.yml (no jf yarn-config step).
  • Non-invasive: all resolution happens in a temp copy; the only touch to the original project
    is bumping yarn.lock mtime so the next run can skip re-resolution.
  • Full workspace coverage: attachWorkspaceMembersToRoot audits every workspace member's
    dependencies from the root, matching npm/pnpm.
  • --run-native is a no-op for Yarn V4 (always native) with a deferred warning.
  • V1 is rejected up front with an actionable message; V2 falls back to direct-dependency probing.

Tests

  • TestRegisterYarnPluginInYarnrc, TestAttachWorkspaceMembersToRoot (yarn package)
  • TestPromoteYarnWorkspaceMember incl. the $HOME-stop case (curation package)


V4 operates in native mode: registry URL and auth token come from
.yarnrc.yml (local or ~/.yarnrc.yml written by yarn config set --home)
instead of requiring jf yarn-config / yarn.yaml.

Key changes:

yarn.go
- Remove V4 rejection from verifyYarnVersionSupportedForCuration and
  configureYarnResolutionServerAndRunInstall (only V1 is now rejected).
- resolveCurationLockfileDir: copy project to temp dir before running
  install (mirrors pnpm), so the customer's checkout is never modified.
- For V4 curation: yarnCurationRegistry() rewrites api/npm/ →
  api/curation/audit/, then runYarnConfigSet sets a global npmAuthToken
  in the temp .yarnrc.yml so the rewritten URL authenticates correctly
  (the original token is scoped to api/npm/ and does not match the
  curation endpoint).
- GetNativeYarnV4RegistryConfig: reads npmRegistryServer via
  yarn config get; reads npmAuthToken via direct YAML parsing of
  .yarnrc.yml and ~/.yarnrc.yml (yarn config get is unreliable for
  nested keys).
- runYarnCommandQuiet: capture stdout+stderr on failure and emit as
  Debug log so failed-install diagnosis is visible.

curationaudit.go
- setRepoFromYarnrcForYarnV4: calls SetDepsRepo(repoName) in addition
  to setPackageManagerConfig. Both are required — PackageManagerConfig
  drives auth; SetDepsRepo populates params.DependenciesRepository so
  the curation endpoint URL is constructed in
  configureYarnResolutionServerAndRunInstall (was always "" before,
  causing the V4 branch to be skipped and the install to hit api/npm/
  instead of api/curation/audit/).
- resolveNpmYarnTech: detect V4 projects that have .yarnrc.yml (created
  by yarn set version 4) without a pre-existing yarn.lock, and projects
  using a global ~/.yarnrc.yml (--home setup); guard with
  package-lock.json absence to avoid npm misidentification.
- validateRunNativeForTech: accept --run-native for Yarn as a no-op
  (V4 is always native; flag has no effect but should not error).
- SetRepo: detect V4 via version check and route to
  setRepoFromYarnrcForYarnV4; make version-detection failures explicit
  errors instead of silent fallbacks.

Co-authored-by: Cursor <cursoragent@cursor.com>
@gauriy-tech gauriy-tech force-pushed the feature/XRAY-144147-onboard-yarn-v4 branch from ef1823e to e29283f Compare June 18, 2026 10:49
@gauriy-tech gauriy-tech force-pushed the feature/XRAY-144147-onboard-yarn-v4 branch from ab03730 to d07e8b3 Compare June 19, 2026 06:13
@gauriy-tech gauriy-tech force-pushed the feature/XRAY-144147-onboard-yarn-v4 branch from d07e8b3 to d615404 Compare June 19, 2026 07:07
@gauriy-tech gauriy-tech force-pushed the feature/XRAY-144147-onboard-yarn-v4 branch from d615404 to 9fd40e0 Compare June 19, 2026 11:53
@gauriy-tech gauriy-tech force-pushed the feature/XRAY-144147-onboard-yarn-v4 branch from 9fd40e0 to 8981284 Compare June 19, 2026 18:08
@gauriy-tech gauriy-tech force-pushed the feature/XRAY-144147-onboard-yarn-v4 branch from 8981284 to 79d1ae5 Compare June 19, 2026 18:45
@gauriy-tech gauriy-tech force-pushed the feature/XRAY-144147-onboard-yarn-v4 branch from 79d1ae5 to d9e1352 Compare June 19, 2026 19:31
…param refactor

Co-authored-by: Cursor <cursoragent@cursor.com>
Comment thread commands/curation/curationaudit.go Outdated
@gauriy-tech

Copy link
Copy Markdown
Contributor Author

I have read the CLA Document and I hereby sign the CLA

@gauriy-tech gauriy-tech added the safe to test Approve running integration tests on a pull request label Jun 29, 2026
@github-actions github-actions Bot removed the safe to test Approve running integration tests on a pull request label Jun 29, 2026
@attiasas attiasas requested a review from a team June 29, 2026 07:11
@attiasas attiasas added improvement Automatically generated release notes safe to test Approve running integration tests on a pull request labels Jun 29, 2026
@github-actions github-actions Bot removed the safe to test Approve running integration tests on a pull request label Jun 29, 2026

@attiasas attiasas left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Nice work!, check out my comments

In addition, please add integration tests at: curation_test.go

Comment thread sca/bom/buildinfo/technologies/yarn/yarn.go Outdated
Comment thread sca/bom/buildinfo/technologies/yarn/yarn.go
Comment thread commands/curation/curationaudit.go
Comment thread sca/bom/buildinfo/technologies/yarn/yarn.go
Comment thread sca/bom/buildinfo/technologies/yarn/yarn.go
@gauriy-tech gauriy-tech added the safe to test Approve running integration tests on a pull request label Jun 29, 2026
@github-actions github-actions Bot removed the safe to test Approve running integration tests on a pull request label Jun 29, 2026
@gauriy-tech gauriy-tech force-pushed the feature/XRAY-144147-onboard-yarn-v4 branch from a8f884d to 298fe3e Compare June 29, 2026 10:09
@gauriy-tech gauriy-tech added the safe to test Approve running integration tests on a pull request label Jun 29, 2026
@github-actions github-actions Bot removed the safe to test Approve running integration tests on a pull request label Jun 29, 2026
Comment thread sca/bom/buildinfo/technologies/yarn/yarn.go
@gauriy-tech gauriy-tech force-pushed the feature/XRAY-144147-onboard-yarn-v4 branch from 298fe3e to cf320af Compare June 29, 2026 13:05
@gauriy-tech gauriy-tech added the safe to test Approve running integration tests on a pull request label Jun 29, 2026
@github-actions github-actions Bot removed the safe to test Approve running integration tests on a pull request label Jun 29, 2026
@github-actions

Copy link
Copy Markdown

👍 Frogbot scanned this pull request and did not find any new security issues.


@attiasas attiasas self-requested a review June 29, 2026 15:00

@attiasas attiasas left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGTM

@attiasas attiasas changed the title Feature/xray 144147 onboard yarn v4 XRAY-144147 Support Yarn v4 for curation audit Jun 29, 2026
@attiasas attiasas merged commit 3a55e31 into jfrog:dev Jun 29, 2026
62 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

improvement Automatically generated release notes

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants