Skip to content

fix(transforms): keep the subpath of scoped esm.sh specifiers - #4150

Merged
kwakayama merged 42 commits into
mainfrom
fix/issue-4098-esm-sh-subpath
Aug 26, 2026
Merged

kwakayama merged 42 commits into
mainfrom
fix/issue-4098-esm-sh-subpath

Conversation

@kojiwakayama

@kojiwakayama kojiwakayama commented Aug 25, 2026

Copy link
Copy Markdown
Contributor

Description

extractEsmShSubpath returned "" for every scoped package. The scoped branch took the first two path segments as the package name, which already includes the version, and then looked for the version again in the remainder:

step value for https://esm.sh/@scope/pkg@1.0/sub
pathname @scope/pkg@1.0/sub
packageParts @scope/pkg@1.0already contains the version
afterPackage /sub
versionMatch null, because /sub does not start with @
return ""

An empty subpath skips the esmShPackage + subpath lookup in resolveImportWithMap, so an import map entry keyed on @scope/pkg/sub never matched. The specifier resolved to the package root instead, or to null when only a package-plus-subpath key existed — silent wrong resolution rather than an error. Unversioned scoped specifiers (@scope/pkg/sub) were broken the same way.

Fix

Parse both specifier shapes with one expression:

const ESM_SH_SPECIFIER = /^(@[^/]+\/[^/@]+|[^/@]+)(?:@[^/]+)?(.*)$/;

The version is optional and never contains a slash, so splitting it off first leaves the subpath as the remainder for pkg[@version][/subpath] and @scope/pkg[@version][/subpath] alike. Having a single parse also removes the drift that caused this in the first place: the package name and the subpath now come from the same match rather than from two independent rules that disagreed.

One extra defect fixed by the same change

extractEsmShPackage stripped the version with /@[\d.]+.*$/, which only matches numeric versions. @scope/pkg@beta kept its tag in the package name and matched nothing in the import map. Sharing the parse fixes that too, and there is a test for it. Flagging it explicitly since it is beyond the literal text of the issue — it is the same scoped-parsing defect and separating the two parsers again would just reintroduce the drift.

Related Issue(s)

Fixes #4098

Type of Change

  • Bug fix (non-breaking change that fixes an issue)

Checklist

  • I have added tests that prove my fix is effective

Testing

Six cases added, five of which were verified red before the fix: exact package+subpath preference, subpath appended to a URL mapping, unversioned scoped specifiers, multi-segment esm.sh build targets (@scope/pkg@1.0/es2022/pkg.mjs), and non-numeric version tags. The sixth ("returns null when only a scoped package+subpath key is mapped") passes both before and after and is kept as a regression guard, so the fix cannot start silently falling back to the package root.

deno task test:file src/transforms/     164 passed (2847 steps) | 0 failed
deno check src/transforms/index.ts
deno task lint:esm-sh-codemod / lint:anti-slop / lint:test-semantic-dispositions / lint:module-boundaries
deno fmt --check, deno lint

Summary by CodeRabbit

  • Bug Fixes

    • Improved import-map resolution for esm.sh packages, scoped packages, subpaths, versions, and wildcard mappings.
    • Preserved separators, query strings, fragments, and file extensions when resolving mapped imports.
    • Improved compatibility with npm, jsr, jsDelivr, unpkg, Skypack, esm.run, and GitHub-based mappings.
    • Corrected handling of reserved path segments, dotted package names, encoded scopes, ports, and URL normalization.
  • Tests

    • Added comprehensive coverage for esm.sh URL and import-map resolution edge cases.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

kojiwakayama has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@coderabbitai

coderabbitai Bot commented Aug 25, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

Next included review available in 11 minutes.

View limit details

Limit details: You’ve used the included review currently available.

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Learn how review limits work.

Review configuration:

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 2cac68eb-9edf-4080-a6b8-cd6fc95bfae0

📥 Commits

Reviewing files that changed from the base of the PR and between d18868a and 16a976d.

📒 Files selected for processing (4)
  • src/modules/import-map/resolver.test.ts
  • src/transforms/import-rewriter/strategies/import-map-strategy.test.ts
  • src/transforms/shared/esm-sh-import-map.test.ts
  • src/transforms/shared/esm-sh-import-map.ts
📝 Walkthrough

Walkthrough

The change adds shared esm.sh import-map parsing and resolution. It handles scoped packages, subpaths, build channels, reserved names, CDN mappings, URL boundaries, and mapping precedence. Existing resolver paths now delegate esm.sh handling to the shared module.

Changes

esm.sh import-map resolution

Layer / File(s) Summary
Parse esm.sh coordinates
src/transforms/shared/esm-sh-import-map.ts, src/transforms/shared/esm-sh-import-map.test.ts
The new parser handles build channels, scoped coordinates, reserved names, repeated separators, trailing separators, encoded segments, and normalized paths.
Classify mappings and resolve subpaths
src/transforms/shared/esm-sh-import-map.ts, src/transforms/shared/esm-sh-import-map.test.ts
The resolver distinguishes package roots from single-module mappings, preserves URL query and fragment boundaries, appends subpaths when applicable, and applies scoped-before-global precedence.
Integrate existing import-map resolvers
src/modules/import-map/resolver.ts, src/modules/import-map/resolver.test.ts, src/transforms/import-rewriter/strategies/import-map-strategy.ts, src/transforms/import-rewriter/strategies/import-map-strategy.test.ts
Both existing resolution paths delegate esm.sh handling to the shared resolver. Tests cover scoped subpaths, exact mappings, CDN routes, extensions, versions, wildcards, and reserved segments.

Estimated code review effort: 4 (Complex) | ~60 minutes

Merge Risk: ⚪ Minimal · up to d1886

The PR is merge-ready after normal review and checks; the remaining concern is limited to relocating documentation comments so they describe the correct declarations.

Suggested reviewers: kwakayama

Sequence Diagram(s)

sequenceDiagram
  participant ImportMapResolver
  participant resolveEsmShThroughImportMap
  participant ImportMap
  ImportMapResolver->>resolveEsmShThroughImportMap: resolve esm.sh specifier
  resolveEsmShThroughImportMap->>ImportMap: check scoped mapping
  ImportMap-->>resolveEsmShThroughImportMap: mapped URL or null
  resolveEsmShThroughImportMap->>ImportMap: check global mapping when needed
  ImportMap-->>resolveEsmShThroughImportMap: mapped URL or null
  resolveEsmShThroughImportMap-->>ImportMapResolver: resolved import or null
Loading
🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Out of Scope Changes check ⚠️ Warning The PR includes changes beyond #4098, including broad CDN mapping, URL normalization, reserved-name handling, export classification, and resolver changes in another consumer. These changes are related… Limit this PR to the scoped subpath fix and directly related regression tests, or link separate issues that explicitly cover the additional resolver behavior and refactoring.
Docstring Coverage ⚠️ Warning Docstring coverage is 63.16% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 19 functions across 6 files. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly identifies the primary fix: preserving subpaths for scoped esm.sh specifiers.
Linked Issues check ✅ Passed The PR satisfies #4098. It replaces the faulty scoped-package parsing with shared parsing for scoped and unscoped esm.sh specifiers, preserves optional versions and subpaths, and adds regression tests…
Full details: Linked Issues check

Explanation

The PR satisfies #4098. It replaces the faulty scoped-package parsing with shared parsing for scoped and unscoped esm.sh specifiers, preserves optional versions and subpaths, and adds regression tests for scoped subpath resolution.

Full details: Out of Scope Changes check

Explanation

The PR includes changes beyond #4098, including broad CDN mapping, URL normalization, reserved-name handling, export classification, and resolver changes in another consumer. These changes are related to esm.sh resolution but are not required by the linked issue.

✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/issue-4098-esm-sh-subpath

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

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

@github-actions

github-actions Bot commented Aug 25, 2026

Copy link
Copy Markdown

📦 Client bundle boundary

Entrypoint Modules Source size Server leaks
src/index.client.ts 333 2005 KiB ✅ 0

A server module in a client graph aborts hydration in the browser. New leaks fail CI; known leaks are tracked in scripts/lint/client-bundle-baseline.json to burn down.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 9ac791ac2d

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/transforms/import-rewriter/strategies/import-map-strategy.ts Outdated

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

kojiwakayama has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 00321cdf74

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/transforms/import-rewriter/strategies/import-map-strategy.ts Outdated
Comment thread src/transforms/import-rewriter/strategies/import-map-strategy.ts Outdated
Comment thread src/transforms/import-rewriter/strategies/import-map-strategy.ts Outdated

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

kojiwakayama has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 065b9fb4bc

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/transforms/import-rewriter/strategies/import-map-strategy.ts Outdated

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

kojiwakayama has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 7902972a6e

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/transforms/import-rewriter/strategies/import-map-strategy.ts Outdated
Comment thread src/transforms/import-rewriter/strategies/import-map-strategy.ts Outdated

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

kojiwakayama has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for security reviews. Please try again later.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 897fb5c327

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/transforms/import-rewriter/strategies/import-map-strategy.ts Outdated
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for security reviews. Please try again later.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

kojiwakayama has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@kojiwakayama

Copy link
Copy Markdown
Contributor Author

The earlier coverage shard 8/8 failure on this PR was the same unrelated WebSocket leak in src/proxy/websocket-client.test.ts, not these changes — this PR touches only src/transforms/import-rewriter/. It also hit #4149. Fixed at source in #4158.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: d0d5cc64ed

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/transforms/import-rewriter/strategies/import-map-strategy.ts Outdated

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

kojiwakayama has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for security reviews. Please try again later.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: fc5cf28350

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/transforms/import-rewriter/strategies/import-map-strategy.ts Outdated
Comment thread src/transforms/import-rewriter/strategies/import-map-strategy.ts Outdated
@kwakayama

Copy link
Copy Markdown
Contributor

@codex review

Please review the exact current head . All existing review threads are resolved. Please report any remaining findings against this SHA.

1 similar comment
@kwakayama

Copy link
Copy Markdown
Contributor

@codex review

Please review the exact current head . All existing review threads are resolved. Please report any remaining findings against this SHA.

@kwakayama

Copy link
Copy Markdown
Contributor

@codex review

Please review the exact current head fc5cf28. All existing review threads are resolved. Please report any remaining findings against this SHA.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: fc5cf28350

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/transforms/import-rewriter/strategies/import-map-strategy.ts Outdated

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

kojiwakayama has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for security reviews. Please try again later.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 22c427807b

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/transforms/shared/esm-sh-import-map.ts Outdated
Comment thread src/transforms/shared/esm-sh-import-map.ts Outdated
Comment thread src/transforms/shared/esm-sh-import-map.ts Outdated
kojiwakayama and others added 20 commits August 26, 2026 04:58
…ensions

Two review findings, both my heuristic reaching further than its evidence.

- The route search scanned every path segment for npm or jsr, so any site
  with a directory of that name looked like a package CDN and
  https://example.com/npm/some.js stopped being a file. The route is now
  recognised only at the front of a known CDN's path, which is the same
  restriction the package-root form already had through its host list.

- A version marked a coordinate unconditionally, so a stamped filename
  such as https://cdn.example/pkg@2.0.0.js was read as one. A version
  marks a coordinate only when the name carries no extension.

The extension pattern now requires a letter after the dot. That is what
keeps lodash@4.17.21 a coordinate, since .21 is the tail of a version
rather than an extension, while pkg@2.0.0.js is a file. There is a test
for each side.

Checked thirteen mapping shapes covering every case fixed earlier in this
review.

Claude-Session: https://claude.ai/code/session_01TNbcqUy64goaeCShfjbRmf
… a root

npm:react@19/ and jsr:@std/path@1/ name package roots, but
coordinateSelectsExport counted the trailing separator as an export and
dropped the subpath. The remote branch already reads a trailing separator
as a directory; this applies the same reading to the two schemes.

main produced npm:react@19//sub for that mapping, so neither behaviour
was right. Appending now goes through the same join that collapses the
doubled separator, giving npm:react@19/sub.

Claude-Session: https://claude.ai/code/session_01TNbcqUy64goaeCShfjbRmf
- A scope marker may arrive percent-encoded, and pathname does not decode
  it, so https://unpkg.com/%40scope/pkg@2 counted one coordinate segment
  instead of two and was read as an export rather than a root.

- A build channel disambiguates a reserved name the way a version does.
  Round-tripping the produced URL shows it: v135/v8/sub reads back as the
  package v8, while a bare stable/sub reads back as the package sub. The
  exactness rule now applies only when neither a version nor a channel is
  present, which is where the collision actually is.

Claude-Session: https://claude.ai/code/session_01TNbcqUy64goaeCShfjbRmf
…separator

stripTrailingSlash read the raw string, so a dot segment that URL
normalisation turns into a separator was invisible to it.
https://esm.sh/react@18/. reached the parser as the pathname /react@18/,
whose empty final segment it rejects, and the react mapping was bypassed.
main resolved all of these, since it normalised with new URL() before
extracting the package.

Normalise first, then detect and strip. That covers /., /./ and the
percent-encoded /%2e, and keeps the separator attached to a subpath when
one precedes it, so react@18/sub/. still resolves to .../sub/.

Claude-Session: https://claude.ai/code/session_01TNbcqUy64goaeCShfjbRmf
https://esm.sh/v135/stable/sub stopped resolving. Stripping the channel
left `stable/sub`, and the reserved-word rule only accepted a lone
segment, so the parser rejected it. main resolved these as the package
stable.

esm.sh does not nest channels, so once one has been stripped a leading
reserved word is a package name whatever follows it. The rule now allows
a subpath in that position only.

Without a channel ahead of it the ambiguity stands and is unchanged:
stable/sub still reads as the package sub, because stable is itself the
channel there.

Claude-Session: https://claude.ai/code/session_01TNbcqUy64goaeCShfjbRmf
@kwakayama
kwakayama force-pushed the fix/issue-4098-esm-sh-subpath branch from 2053774 to 52dedff Compare August 26, 2026 02:59

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

kojiwakayama has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 52dedffd04

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/transforms/shared/esm-sh-import-map.ts
Comment thread src/transforms/shared/esm-sh-import-map.ts

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

kojiwakayama has reached the 50-credit limit for trial accounts. To continue receiving code reviews, upgrade your plan.

@sonarqubecloud

Copy link
Copy Markdown

@kwakayama
kwakayama added this pull request to the merge queue Aug 26, 2026
Merged via the queue into main with commit a087713 Aug 26, 2026
56 of 58 checks passed
@kwakayama
kwakayama deleted the fix/issue-4098-esm-sh-subpath branch August 26, 2026 03:45
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.

extractEsmShSubpath always drops the subpath for scoped esm.sh packages

2 participants