Skip to content

bundler: bundle template-literal require()/import() via a __glob lookup map - #35680

Open
robobun wants to merge 9 commits into
mainfrom
farm/98859cff/bundler-glob-require
Open

bundler: bundle template-literal require()/import() via a __glob lookup map#35680
robobun wants to merge 9 commits into
mainfrom
farm/98859cff/bundler-glob-require

Conversation

@robobun

@robobun robobun commented Jul 25, 2026

Copy link
Copy Markdown
Collaborator

What

bun build now bundles require() / import() calls whose argument is a relative-path template literal (or string concatenation, or a const binding initialized with one of those). Every file matching the static shape is added as an import record and the call is rewritten to a runtime lookup:

// input
require(`./bin/${arch}-${platform}/client.node`)

// output
__glob({
  "./bin/x64-linux/client.node": () => require_client(),
  "./bin/arm64-darwin/client.node": () => require_client2(),
  ...
})(`./bin/${arch}-${platform}/client.node`)

This is the same approach esbuild takes for glob-style imports, with one extension: shape extraction also looks through a const binding whose initializer is a template or concat chain, so the common native-addon loader pattern

const filename = `./bin/${arch}-${platform}${abi}/client.node`;
return require(filename);

is handled as well.

Why

Packages that pick a platform-specific .node file at runtime (tigerbeetle-node, duckdb, sharp, libsql, tailwindcss-oxide, lzma-native, ...) fail after bun build --compile because the bundler can't statically resolve the dynamic specifier and the .node file is never embedded:

error: Cannot find module "./bin/x86_64-linux-gnu/client.node" from "/$bunfs/root/buntb"

With this change, each matched .node file goes through the existing Loader::Napi path and is embedded in the compiled binary, and the generated __glob map dispatches to the right one at runtime.

Semantics

  • Only relative specifiers (./ or ../ prefix) are eligible; bare package specifiers are left to runtime require.
  • let/var bindings are not looked through (reassignment would invalidate the shape); only const.
  • A placeholder between two / becomes **/*; elsewhere it becomes * (same as esbuild), so ./mods/${x}.js stays bounded to one directory.
  • Zero matches falls through to the existing runtime-require path (no behavior change).
  • Shapes whose literal parts contain glob metacharacters are skipped.
  • A 256-match cap falls through to runtime require rather than exploding the bundle on a pathological pattern.

Verification

# fail-before (released bun):
$ bun build --compile --outfile=buntb --target=bun ./index.ts && ./buntb
error: Cannot find module './bin/x86_64-linux-gnu/client.node' from '/$bunfs/root/buntb'

# pass-after (this branch):
$ bun bd build --compile --outfile=buntb --target=bun ./index.ts && ./buntb
function

test/bundler/bundler_glob_require.test.ts covers: direct template, concat, const indirection, let (negative), zero matches, import(), subdirectory matches, the full tigerbeetle-style loader pattern, and bare specifiers (negative).

Fixes #9951


[review] gate passed · iteration 2 · 15 files touched

fails on main (without fix)
ASAN without fix: BUILD FAILED (no junit output)
$ BUN_DEBUG_QUIET_LOGS=1 bun scripts/build.ts --profile=debug --quiet test "--reporter=junit" "--reporter-outfile=/tmp/mechgate.xml" test/bundler/bundler_glob_require.test.ts test/bundler/bundler_promiseall_deadcode.test.ts test/bundler/html-import-manifest.test.ts test/regression/issue/cyclic-imports-async-bundler.test.js
ninja: Entering directory `/workspace/bun/build/debug'
[1/123] gen bindgenv2
[2/122] gen ErrorCode+*.h
[3/122] gen cpp.rs (cppbind)
[4/122] gen BunProcess.lut.h
Generating /workspace/bun/build/debug/codegen/BunProcess.lut.h from /workspace/bun/src/jsc/bindings/BunProcess.cpp
[5/122] gen ZigGeneratedClasses.{cpp,h,rs}
Found 2 classes from /workspace/bun/src/jsc/resolve_message.classes.ts
  - ResolveMessage (13 fields)
  - BuildMessage (10 fields)
Found 1 classes from /workspace/bun/src/runtime/api/Archive.classes.ts
  - Archive (4 fields, 1 class fields)
Found 2 classes from /workspace/bun/src/runtime/api/BunObject.classes.ts
  - ResourceUsage (8 fields)
  - Subprocess (20 fields)
Found 1 classes from /workspace/bun/src/runtime/api/cron.classes.ts
  - CronJob (5 fields)
Found 3 classes from /workspace/bun/src/runtime/api/filesystem_router.classes.t
... (truncated)

release without fix: all passed
bun test v1.4.0-canary.1 (c63a10cd8)

test/bundler/html-import-manifest.test.ts:
(pass) bundler > html-import/multiple-manifests [47.00ms]
(pass) bundler > html-import/etag-changes-with-referenced-chunks [53.76ms]
(pass) bundler > html-import/with-type-file-attribute [61.66ms]
(pass) bundler > html-import/manifest-with-metadata [113.77ms]
(pass) bundler > html-import/html-referenced-assets-in-manifest [73.72ms]

test/bundler/bundler_promiseall_deadcode.test.ts:
(pass) bundler > bundler/__promiseAll is tree-shaken when only one async import exists but __esm remains [95.67ms]
(pass) bundler > bundler/__promiseAll is included when multiple async imports exist with __esm [61.33ms]
(pass) bundler > bundler/__promiseAll is tree-shaken when no async imports despite circular deps with __esm [35.16ms]

test/bundler/bundler_glob_require.test.ts:
(pass) bundler > glob-require/TemplateLiteralDirect [112.10ms]
(pass) bundler > glob-require/TemplateLiteralMiss [110.14ms]
(pass) bundler > glob-require/StringConcatenation [49.31ms]
(pass) bundler > glob-require/StringConcatenationAdjacentLiterals [23.83ms]
(pass) bundler > glob-require/SelfReferentialConst [31.94ms]
(pass) bundler 
... (truncated)
passes on PR (with fix)
ASAN with fix: all passed
$ BUN_DEBUG_QUIET_LOGS=1 bun scripts/build.ts --profile=debug --quiet test "--reporter=junit" "--reporter-outfile=/tmp/mechgate.xml" test/bundler/bundler_glob_require.test.ts test/bundler/bundler_promiseall_deadcode.test.ts test/bundler/html-import-manifest.test.ts test/regression/issue/cyclic-imports-async-bundler.test.js
bun test v1.4.0 (9018c2bca)

test/bundler/html-import-manifest.test.ts:
(pass) bundler > html-import/etag-changes-with-referenced-chunks [970.01ms]
(pass) bundler > html-import/manifest-with-metadata [2358.64ms]
(pass) bundler > html-import/html-referenced-assets-in-manifest [1359.78ms]
(pass) bundler > html-import/multiple-manifests [1632.20ms]
(pass) bundler > html-import/with-type-file-attribute [1529.30ms]

test/bundler/bundler_promiseall_deadcode.test.ts:
(pass) bundler > bundler/__promiseAll is tree-shaken when only one async import exists but __esm remains [1844.37ms]
(pass) bundler > bundler/__promiseAll is included when multiple async imports exist with __esm [2218.78ms]
(pass) bundler > bundler/__promiseAll is tree-shaken when no async imports despite circular deps with __esm [2145.41ms]

test/bundler/bundler_glob_require.test.ts:
(pass)
... (truncated)

release with fix: all passed
$ bun scripts/build.ts --profile=release
[configured] bun-profile → bun (stripped) in 1937ms (unchanged)
ninja: Entering directory `/workspace/bun/build/release'
[1/99] gen bindgenv2
[2/98] gen ErrorCode+*.h
[3/52] gen cpp.rs (cppbind)
[4/52] gen BunProcess.lut.h
Generating /workspace/bun/build/release/codegen/BunProcess.lut.h from /workspace/bun/src/jsc/bindings/BunProcess.cpp
[5/52] gen ZigGeneratedClasses.{cpp,h,rs}
Found 2 classes from /workspace/bun/src/jsc/resolve_message.classes.ts
  - ResolveMessage (13 fields)
  - BuildMessage (10 fields)
Found 1 classes from /workspace/bun/src/runtime/api/Archive.classes.ts
  - Archive (4 fields, 1 class fields)
Found 2 classes from /workspace/bun/src/runtime/api/BunObject.classes.ts
  - ResourceUsage (8 fields)
  - Subprocess (20 fields)
Found 1 classes from /workspace/bun/src/runtime/api/cron.classes.ts
  - CronJob (5 fields)
Found 3 classes from /workspace/bun/src/runtime/api/filesystem_router.classes.ts
  - FileSystemRouter (5 fields)
  - FrameworkFileSystemRouter (2 fields)
  - MatchedRoute (8 fields)
Found 1 classes from /workspace/bun/src/runtime/api/Glob.classes.ts
  - Glob (5 fields)
Found 1 classes from /worksp
... (truncated)
diff hotspot
src/ast/runtime.rs                                 |  46 +--
 src/bundler/ParseTask.rs                           |   1 +
 src/bundler/options.rs                             |  41 +++
 src/bundler/transpiler.rs                          |   1 +
 src/js_parser/p.rs                                 | 343 ++++++++++++++++++++-
 src/js_parser/parse/parse_entry.rs                 |   7 +
 src/js_parser/parser.rs                            |   4 +
 src/js_parser/visit/mod.rs                         |   1 +
 src/js_parser/visit/visit_expr.rs                  |  10 +-
 src/runtime.js                                     |   9 +
 .../__snapshots__/bun-build-api.test.ts.snap       |   6 +-
 test/bundler/bundler_glob_require.test.ts          | 341 ++++++++++++++++++++
 test/bundler/bundler_promiseall_deadcode.test.ts   |   4 +-
 test/bundler/html-import-manifest.test.ts          |   6 +-
 .../issue/cyclic-imports-async-bundler.test.js     |   2 +-
 15 files changed, 777 insertions(+), 45 deletions(-)

gate history · 3 passed · 0 rejected · iteration 2

evidence per changed file
file                                                      reads  edits  tests
src/ast/runtime.rs                                            2      4      0
src/bundler/ParseTask.rs                                      1      2      0
src/bundler/options.rs                                        4      7      0
src/bundler/transpiler.rs                                     1      1      0
src/js_parser/p.rs                                           22     32      0
src/js_parser/parse/parse_entry.rs                            3      5      0
src/js_parser/parser.rs                                       2      3      0
src/js_parser/visit/mod.rs                                    2      1      0
src/js_parser/visit/visit_expr.rs                             3      2      0
src/runtime.js                                                3      3      0
test/bundler/__snapshots__/bun-build-api.test.ts.snap         0      0      0
test/bundler/bundler_glob_require.test.ts                     2      7      0
test/bundler/bundler_promiseall_deadcode.test.ts              0      0      0
test/bundler/html-import-manifest.test.ts                     0      0      0
…t/regression/issue/cyclic-imports-async-bundler.test.js      0      0      0

…up map

When the argument to require() or import() is a relative-path template
literal, walk the filesystem for files matching the static shape, add an
import record for each match, and rewrite the call to

    __glob({ "./bin/a/x.node": () => require("./bin/a/x.node"), ... })(arg)

so the dispatch happens at runtime against bundled modules instead of
falling through to import.meta.require. This is the same approach esbuild
takes for glob-style imports.

The shape extractor is extended to look through string concatenation and
through a const binding whose initializer is itself a template literal or
concat chain, which is how native-addon loaders such as tigerbeetle-node
pick a platform-specific .node file:

    const filename = `./bin/${arch}-${platform}${abi}/client.node`;
    return require(filename);

With --compile, each matched .node file goes through the existing Napi
loader path and is embedded in the binary, so the compiled executable no
longer fails with "Cannot find module './bin/.../client.node' from
'/$bunfs/root/...'".

Zero matches fall through to the existing runtime-require path (same as
before), let/var bindings are not looked through (reassignment would
invalidate the shape), bare specifiers and shapes containing glob
metacharacters are skipped, and a 256-match cap keeps a pathological
pattern from exploding the bundle.

Fixes #9951
@robobun

robobun commented Jul 25, 2026

Copy link
Copy Markdown
Collaborator Author
Updated 11:05 PM PT - Jul 25th, 2026

@robobun, your commit 9018c2b has 1 failures in Build #81684 (All Failures):


🧪   To try this PR locally:

bunx bun-pr 35680

That installs a local version of the PR into your bun-35680 executable, so you can run:

bun-35680 --bun

Comment thread src/bundler/options.rs Outdated
Comment thread src/bundler/options.rs Outdated
Comment thread src/bundler/options.rs Outdated
Comment thread src/js_parser/p.rs Outdated
Comment thread src/js_parser/p.rs Outdated
Comment thread src/js_parser/p.rs Outdated
Comment thread src/js_parser/p.rs Outdated
@coderabbitai

coderabbitai Bot commented Jul 25, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Warning

Review limit reached

@robobun, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 5 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 123746d5-4e0f-46ed-aa74-3a90a6a4e962

📥 Commits

Reviewing files that changed from the base of the PR and between 916492f and 9018c2b.

⛔ Files ignored due to path filters (1)
  • test/bundler/__snapshots__/bun-build-api.test.ts.snap is excluded by !**/*.snap
📒 Files selected for processing (14)
  • src/ast/runtime.rs
  • src/bundler/ParseTask.rs
  • src/bundler/options.rs
  • src/bundler/transpiler.rs
  • src/js_parser/p.rs
  • src/js_parser/parse/parse_entry.rs
  • src/js_parser/parser.rs
  • src/js_parser/visit/mod.rs
  • src/js_parser/visit/visit_expr.rs
  • src/runtime.js
  • test/bundler/bundler_glob_require.test.ts
  • test/bundler/bundler_promiseall_deadcode.test.ts
  • test/bundler/html-import-manifest.test.ts
  • test/regression/issue/cyclic-imports-async-bundler.test.js

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

Comment thread src/js_parser/p.rs Outdated
Comment thread src/js_parser/p.rs Outdated
Comment thread src/js_parser/p.rs Outdated
Comment thread src/js_parser/p.rs Outdated
Comment thread src/js_parser/p.rs Outdated
Comment thread src/js_parser/parse/parse_entry.rs Outdated
Comment thread src/js_parser/parser.rs Outdated
Comment thread src/runtime.js Outdated
@github-actions

Copy link
Copy Markdown
Contributor

Found 7 issues this PR may fix:

  1. Support Run-time import paths / template literals in Bun.build() #14877 - Directly requests support for template literal / run-time import paths in Bun.build(), citing esbuild's __glob approach — exactly what this PR implements
  2. Bun build --compile fails when including libraries that have native modules (DuckDB) #17312 - bun build --compile fails with DuckDB native modules — DuckDB is explicitly named in the PR as a target package
  3. bun build can't compile @libsql #18909 - bun build can't compile @libsql — libsql is explicitly named in the PR as a target package
  4. "bun build" does not embed binaries from node_modules correctly #15374 - bun build does not embed binaries from node_modules correctly — Sharp's dynamic platform-specific .node loading pattern is directly addressed
  5. In bun 1.3.4, sharp paackage is failing at build #25395 - Sharp package failing at build with bun build --compile — Sharp is explicitly named in the PR
  6. bun build --compile error: Cannot find module "./engines/boa.js" from "/$bunfs/root/esvu" #13672 - bun build --compile error: Cannot find module ./engines/boa.js — esvu dynamically requires ./engines/${engine}.js; glob rewriting would embed all engine files
  7. Better bundle tracing for dynamically resolved imports #18787 - Better bundle tracing for dynamically resolved imports — requests tracing of require('/dir/' + s) string-concatenation patterns, directly addressed by this PR

If this is helpful, copy the block below into the PR description to auto-close these issues on merge.

Fixes #14877
Fixes #17312
Fixes #18909
Fixes #15374
Fixes #25395
Fixes #13672
Fixes #18787

🤖 Generated with Claude Code

@github-actions

Copy link
Copy Markdown
Contributor

This PR may be a duplicate of:

  1. bundler: bundle require("./dir/" + x) by scanning the directory (shelljs) #35676 - Both PRs implement the same __glob runtime helper to bundle dynamic require()/import() with template literals and string concatenation by scanning directories at build time; bundler: bundle require("./dir/" + x) by scanning the directory (shelljs) #35676 is scoped to require() (shelljs, fixes ubable to package into binary or minify shelljs #12302) while bundler: bundle template-literal require()/import() via a __glob lookup map #35680 also covers import() (tigerbeetle/duckdb/sharp, fixes Cannot find module "client.node" using bun build with @tigerbeetle/tigerbeetle-node #9951)

🤖 Generated with Claude Code

Comment thread src/js_parser/p.rs Outdated
Comment thread src/runtime.js
Comment thread src/js_parser/p.rs Outdated
Comment thread src/js_parser/p.rs Outdated
Comment thread src/js_parser/p.rs Outdated
Comment thread src/bundler/options.rs Outdated
…OT_FOUND code, symlinks, snapshots

- Flatten rope EStrings before reading in shape extraction (adjacent
  literals folded under minify-syntax would otherwise lose segments).
- Bound append_dynamic_specifier_shape recursion at depth 32 so a
  self-referential const cannot stack-overflow the bundler.
- Skip the glob path for import() when a second argument is present so
  import attributes / loader overrides are preserved, and compute
  HANDLES_IMPORT_ERRORS per call-site kind.
- Set .code = 'MODULE_NOT_FOUND' on the __glob miss error so
  catch-by-code loaders keep their fallback behavior.
- Only rewrite backslash to slash on Windows; on POSIX it is a legal
  filename byte.
- Walker: follow_symlinks=false (matches esbuild, avoids pnpm cycles).
- Guard against empty source_dir.
- Trim doc comments.
- Update bundler output-hash / debugId snapshots shifted by the new
  __glob helper in runtime.js.
- Add tests for rope concat, self-referential const, import() with
  options, and an end-to-end --compile case with .node assets.
Comment thread src/bundler/options.rs
Comment thread src/bundler/options.rs Outdated
Comment thread src/js_parser/p.rs
Comment thread src/js_parser/p.rs
Comment thread src/js/internal/inspector/cdp.ts Outdated
Comment thread src/js/internal/inspector/cdp.ts Outdated
Comment thread src/js/internal/inspector/cdp.ts Outdated
Comment thread src/js/internal/inspector/cdp.ts Outdated
Comment thread src/js/internal/inspector/cdp.ts Outdated
Comment thread src/js/internal/inspector/cdp.ts Outdated
Comment thread src/js/internal/inspector/cdp.ts Outdated
Comment thread src/js/internal/inspector/cdp.ts Outdated
Comment thread src/js/internal/inspector/cdp.ts Outdated
Comment thread src/js/internal/inspector/cdp.ts Outdated
Comment thread src/js/internal/inspector/cdp.ts Outdated
Comment thread src/js/internal/inspector/cdp.ts Outdated
Comment thread src/js/internal/inspector/cdp.ts Outdated
Comment thread src/js/internal/inspector/cdp.ts Outdated
Comment thread src/js/internal/inspector/cdp.ts Outdated
Comment thread src/js/internal/inspector/cdp.ts Outdated
Comment thread src/js/internal/inspector/cdp.ts Outdated
Comment thread src/js/internal/inspector/cdp.ts Outdated
Comment thread src/js_parser/p.rs Outdated
Comment thread src/jsc/bindings/BunDebugger.h Outdated
append_estring_rope now treats a NUL byte in the literal content as
opaque so it cannot collide with the placeholder marker (filesystem
paths cannot contain NUL anyway). Also update the SelfReferentialConst
test's comment to match the remove-before-recurse behavior and pin the
emitted map with an onAfterBundle check.
@robobun
robobun force-pushed the farm/98859cff/bundler-glob-require branch from 3628109 to c63a10c Compare July 25, 2026 21:19
Comment thread src/js_parser/p.rs
Comment thread src/js_parser/p.rs
glob_shape_is_eligible now also rejects a literal backslash in the
static content (bun_glob treats it as an escape), and
append_estring_rope truncates the buffer back to its entry length when a
later rope segment contains NUL so the caller's nothing-appended
contract holds.
@robobun
robobun force-pushed the farm/98859cff/bundler-glob-require branch from 1dddbf8 to 3faf857 Compare July 25, 2026 22:05
Comment thread src/js_parser/p.rs
…er_shape

Snapshot buf.len() at the top of append_dynamic_specifier_shape and
truncate back to it whenever the match evaluates to false, so every arm
honours the contract without per-arm discipline. This closes the
ETemplate case where a NUL in a part's tail could leave the head and
earlier placeholders in buf.
Comment thread src/js_parser/p.rs

@claude claude Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

No new findings on 9018c2b — the uniform buf.truncate(start) at the tail of append_dynamic_specifier_shape now enforces the nothing-appended-on-false contract for every arm (the EIdentifier early-return is fine since the recursive call's entry length equals this frame's). Deferring to a maintainer: this is a ~330-line new bundler feature with user-visible semantics (filesystem walking during parse, a new __glob runtime helper, the const-indirection extension beyond esbuild, the 256-match cap) that warrants human sign-off on the design.

What was reviewed

  • Shape extraction in p.rs: NUL-in-literal rejection, backslash metachar, rope segments, depth cap, remove-before-recurse cycle guard, and the truncate-on-false invariant across EString/ETemplate/EBinary/EIdentifier.
  • glob_shape_is_eligible / glob_shape_to_pattern against bun_glob's actual metachar set and the **/*-vs-* boundary rule.
  • parser_glob_resolver mid-walk error handling (returns empty rather than partial) and Windows separator normalization.
  • Imports::ALL_SORTED / ALL_SORTED_INDEX re-derivation for __glob — matches the unit test's expectations.
Extended reasoning...

Overview

This PR adds esbuild-style glob resolution for template-literal / string-concat require() and import() arguments to bun build. It touches the JS parser (src/js_parser/p.rs, ~330 new lines implementing shape extraction, eligibility, pattern conversion, and the __glob({...})(arg) rewrite), the bundler (ParseTask.rs wires parser_glob_resolver, options.rs implements the filesystem walker), the runtime-imports table (ast/runtime.rs), runtime.js (new __glob helper), and adds a 341-line test file plus snapshot/hash updates in three existing tests.

Security risks

Low but non-zero. The new code walks the filesystem during parse using a pattern derived from user source code, but the pattern is constrained to ./ or ../ prefixes relative to the source file's own directory, glob metacharacters (including \\) in the literal parts abort the rewrite, and a 256-match cap bounds the walk. The __glob runtime helper does a plain own-property lookup on a bundler-generated object literal, so prototype pollution isn't a concern there. No auth/crypto/permissions code is touched.

Level of scrutiny

High. This is production-critical bundler + parser code introducing new user-visible semantics: previously-unbundled dynamic requires now pull additional files into the graph, which changes what bun build --compile embeds. It also extends esbuild's behavior (looking through const bindings), which is an API design decision. Filesystem I/O now happens inside the parse worker via an injected function pointer — architecturally reasonable given the crate-tier constraint, but a maintainer should confirm this is the intended layering.

Other factors

Five prior automated review rounds surfaced edge cases (literal NUL confused with the placeholder marker, \\ missing from the metachar reject list, partial-append-on-Ok(false) in the rope helper and the ETemplate arm, a stale test comment); all were addressed in c63a10c / 3faf857 / 9018c2b and are marked resolved. Test coverage is thorough (15 itBundled cases including --compile end-to-end, negative cases for let/bare specifiers/import-attributes/literal-NUL, and the tigerbeetle loader pattern). The snapshot-hash churn in bun-build-api.test.ts.snap, html-import-manifest.test.ts, and the two debugId updates are the expected consequence of runtime.js gaining __glob. Given the scope and the design choices involved (match cap, const-indirection, error-message wording, whether zero-matches should warn), this needs a maintainer's eyes rather than bot approval.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Cannot find module "client.node" using bun build with @tigerbeetle/tigerbeetle-node

1 participant