Skip to content

fix: allow the ADL conformance forks under blockExoticSubdeps - #128

Merged
emmanuel merged 1 commit into
mainfrom
fix/exotic-subdeps
Aug 5, 2026
Merged

fix: allow the ADL conformance forks under blockExoticSubdeps#128
emmanuel merged 1 commit into
mainfrom
fix/exotic-subdeps

Conversation

@emmanuel

@emmanuel emmanuel commented Aug 5, 2026

Copy link
Copy Markdown
Collaborator

Resolves:

[ERR_PNPM_EXOTIC_SUBDEP] Exotic dependency "supertest" (resolved via git-repository)
is not allowed in subdependencies when blockExoticSubdeps is enabled

Why this appeared now

blockExoticSubdeps defaults to true and rejects any transitive dependency resolved from git — which is precisely what the two ADL conformance suite overrides are.

Two things hid it until now, both confirmed in pnpm's source:

  1. The check is skipped for lockfile-resolved packages. resolveDependencies.ts gates on resolvedVia != null, with the comment "This is already coming from the lockfile, we skip the check in this case for now." So pnpm install --frozen-lockfile — what CI runs — never trips it. Only a fresh resolution does: pnpm install after a dependency change, Renovate regenerating the lockfile for chore(deps): update adl-lrs-conformance-tests>super-request digest to 6f960be #87/chore(deps): update adl-lrs-conformance-tests>supertest digest to f02f699 #90, or lockfile maintenance (chore(deps): lock file maintenance #45).
  2. It's version-dependent. I reproduced it on 11.20.0 and confirmed 11.15.1 (our current pin) does not enforce it.

So this was already queued to break Renovate's override-bump PRs and every future pnpm upgrade, regardless of the immediate trigger.

The fix, and what it costs

blockExoticSubdeps: false.

I looked for something narrower first and there isn't one:

  • No per-package allowlist exists. The implementation is a single global boolean (ctx.blockExoticSubdeps && currentDepth > 0 && isExoticDep(...)), with no exception list.
  • Making them direct devDependencies doesn't help — verified empirically; the check inspects the subdependency edge, so it still fails with both packages declared at the root.

So the guard goes off for the whole tree, not just these two packages. That's a real if modest reduction in supply-chain protection, and the comment in pnpm-workspace.yaml says so plainly rather than implying the change is free. It's acceptable here because the exposure is narrow and already deliberate: both are dev-only test tooling pinned to immutable commit SHAs and tracked by Renovate, so neither can change content without a reviewed PR. The comment also says to delete the setting rather than keep it if the forks are ever retired (upstream releasing the fixes, or vendoring them) — that's the real long-term fix.

Why the pnpm bump is in the same PR

Pinned pnpm goes 11.15.1 → 11.20.0. Without it, CI runs the one version that doesn't enforce the check, so the fix would be unverified and would break again on the next pnpm bump. The lockfile is unchanged by both the setting and the version bump.

Verification (all under 11.20.0)

Check Result
Fresh full resolution from empty node_modules passes (failed before)
Simulated Renovate override-SHA bump — the exact failing command passes (failed before)
typecheck / lint / fmt:check / lint:arch clean
Unit tests 293 passed
Integration (pg) 65 passed
ADL conformance (pg, 1.0.3) 37 passed — the actual consumer of the forks
Lockfile churn none

pnpm's blockExoticSubdeps defaults to true and rejects any transitive
dependency resolved from git, which is exactly what the two ADL conformance
suite overrides are:

  [ERR_PNPM_EXOTIC_SUBDEP] Exotic dependency "super-request" (resolved via
  git-repository) is not allowed in subdependencies

The check is skipped for packages that come straight from the lockfile
(resolveDependencies.ts gates on `resolvedVia != null`), so `--frozen-lockfile`
in CI kept passing and only a FRESH resolution trips it — `pnpm install` after
a dependency change, Renovate regenerating the lockfile for one of the
override-bump PRs, or lockfile maintenance. It is also version-dependent:
11.15.1 does not enforce it, 11.20.0 does.

pnpm exposes no per-package allowlist for this — it is a single global boolean
— and making the packages direct devDependencies does not help either, since
the check inspects the subdependency edge itself (both verified). So the guard
goes off for the whole tree, which the comment in pnpm-workspace.yaml states
plainly along with why it is acceptable here: both packages are dev-only test
tooling pinned to immutable commit SHAs and tracked by Renovate, so their
content cannot change without a reviewed PR. The note says to delete the
setting rather than keep it if the forks are ever retired.

Bumps the pinned pnpm 11.15.1 -> 11.20.0 in the same change so CI actually
exercises the version that enforces the check; pinning below it would leave
the fix unverified and break again on the next pnpm bump. The lockfile is
unchanged by both the setting and the version bump.

Verified under 11.20.0: fresh full resolution from an empty node_modules, a
simulated Renovate override-SHA bump (the exact command that failed),
typecheck/lint/fmt/arch, 293 unit tests, 65 integration, and the 37-test ADL
conformance suite — the actual consumer of the forked packages.
@emmanuel
emmanuel merged commit 733b2d0 into main Aug 5, 2026
16 checks passed
@emmanuel
emmanuel deleted the fix/exotic-subdeps branch August 5, 2026 13:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant