Skip to content

Turbopack: import.meta.glob docs + edge case support#92729

Merged
sokra merged 5 commits intocanaryfrom
sokra/import-meta-glob
Apr 27, 2026
Merged

Turbopack: import.meta.glob docs + edge case support#92729
sokra merged 5 commits intocanaryfrom
sokra/import-meta-glob

Conversation

@sokra
Copy link
Copy Markdown
Member

@sokra sokra commented Apr 13, 2026

What?

Adds documentation and TypeScript types for import.meta.glob in Turbopack, and implements additional edge cases for Vite compatibility.

Documentation

  • New ## import.meta.glob section in the Turbopack reference page covering: lazy/eager loading, named imports, query strings (including the object form), multiple patterns, negation, TypeScript types, and a full options table.
  • import.meta.glob row added to the Module Resolution feature table.
  • Migration note added to the from-Vite guide explaining that import.meta.glob works out of the box with Turbopack, with before/after for the deprecated asquery migration.

TypeScript types

  • Added ImportMetaGlobOptions interface and overloaded glob() signatures to ImportMeta in packages/next/types/global.d.ts.
  • The overloads return Record<string, unknown> when eager: true is passed and Record<string, () => Promise<unknown>> otherwise.

Implementation (edge cases)

  • import: '*' (namespace import): Treated the same as omitting the import option (returns the whole module namespace), matching Vite semantics. Previously would have generated broken module["*"] access.
  • query as object literal: { query: { bar: 'foo', raw: true } } is now supported. Keys and values are URL-encoded and joined into a query string (?bar=foo&raw=true).
  • Stricter option validation: A non-object-literal second argument (e.g. import.meta.glob('./*.js', 'eager')) is now a compile-time error instead of a warning, since the options cannot be safely defaulted.

Tests

  • Execution tests for new features: namespace import: '*', query object, combining query with negation, explicit dotfile patterns.
  • New import-meta-glob-errors execution test with issue snapshots covering: too many arguments, non-string pattern, and non-object options argument.

Why?

  1. The feature shipped in Turbopack: Add import.meta.glob support (Vite compat) #92640 but had no user-facing documentation and no TypeScript types.
  2. Several Vite-compatible edge cases were not handled: namespace imports (import: '*') and query objects. These gaps would cause subtle behavioral differences for users migrating from Vite.
  3. Option validation was too lenient — invalid second arguments fell through to defaults silently.

How?

Docs & types

  • docs/01-app/03-api-reference/08-turbopack.mdx — new section, table row, TypeScript subsection
  • docs/01-app/02-guides/migrating/from-vite.mdx — migration note
  • packages/next/types/global.d.tsImportMetaGlobOptions + ImportMeta.glob() overloads

Implementation

  • turbopack/crates/turbopack-ecmascript/src/references/import_meta_glob.rs:
    • parse_import_meta_glob(): import: '*' normalized to None; query object parsing via urlencoding::encode(); non-object options argument now emits an error and returns None.
  • turbopack/crates/turbopack-ecmascript/Cargo.toml: added urlencoding workspace dep.

Note: dotfile/dot-directory filtering is not needed in import.meta.glob itself — the underlying Glob pattern engine and read_glob_internal already handle dotfile semantics correctly (explicit ./.foo/*.js matches, wildcards include them).

Tests

  • turbopack-tests/tests/execution/turbopack/resolving/import-meta-glob/ — new cases for import: '*', query object, query + negation, explicit dotfile pattern, wildcard including dotfiles
  • turbopack-tests/tests/execution/turbopack/resolving/import-meta-glob-errors/ — new test suite for fatal parse errors with issue snapshots

Checklist

  • pnpm prettier-fix / cargo fmt run
  • Documentation follows the docs contribution guide
  • Execution tests pass (cargo test -p turbopack-tests --test execution -- "import_meta_glob")
  • cargo clippy clean
  • pnpm --filter=next types passes

@nextjs-bot nextjs-bot added created-by: Turbopack team PRs by the Turbopack team. Documentation Related to Next.js' official documentation. Turbopack Related to Turbopack with Next.js. labels Apr 13, 2026
@codspeed-hq
Copy link
Copy Markdown

codspeed-hq Bot commented Apr 14, 2026

Merging this PR will improve performance by 3.51%

⚡ 1 improved benchmark
✅ 16 untouched benchmarks
⏩ 3 skipped benchmarks1

Performance Changes

Mode Benchmark BASE HEAD Efficiency
Simulation app-page-turbo.runtime.prod.js[full] 641.3 ms 619.6 ms +3.51%

Comparing sokra/import-meta-glob (dfee998) with canary (c526347)

Open in CodSpeed

Footnotes

  1. 3 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

@nextjs-bot
Copy link
Copy Markdown
Contributor

nextjs-bot commented Apr 14, 2026

Stats from current PR

🟢 1 improvement

Metric Canary PR Change Trend
node_modules Size 494 MB 493 MB 🟢 1.05 MB (0%) █████
📊 All Metrics
📖 Metrics Glossary

Dev Server Metrics:

  • Listen = TCP port starts accepting connections
  • First Request = HTTP server returns successful response
  • Cold = Fresh build (no cache)
  • Warm = With cached build artifacts

Build Metrics:

  • Fresh = Clean build (no .next directory)
  • Cached = With existing .next directory

Change Thresholds:

  • Time: Changes < 50ms AND < 10%, OR < 2% are insignificant
  • Size: Changes < 1KB AND < 1% are insignificant
  • All other changes are flagged to catch regressions

⚡ Dev Server

Metric Canary PR Change Trend
Cold (Listen) 455ms 455ms ▁▁▁▁▁
Cold (Ready in log) 442ms 443ms ▁▁▂▂▁
Cold (First Request) 836ms 834ms █▇▁██
Warm (Listen) 456ms 455ms ▁▁▁▁▁
Warm (Ready in log) 442ms 442ms ▂▂▁▂▂
Warm (First Request) 346ms 343ms ▇█▃▆▇
📦 Dev Server (Webpack) (Legacy)

📦 Dev Server (Webpack)

Metric Canary PR Change Trend
Cold (Listen) 456ms 456ms ▅▁▁█▁
Cold (Ready in log) 441ms 441ms ▁▁▃█▃
Cold (First Request) 1.974s 1.960s ▁▄▅█▂
Warm (Listen) 456ms 456ms ▁▅▅█▅
Warm (Ready in log) 441ms 443ms ▁▁▂█▂
Warm (First Request) 1.969s 1.970s ▁▄▄█▂

⚡ Production Builds

Metric Canary PR Change Trend
Fresh Build 3.912s 3.948s ▁▂▂▂▂
Cached Build 3.972s 3.980s ▁▃▂▂▁
📦 Production Builds (Webpack) (Legacy)

📦 Production Builds (Webpack)

Metric Canary PR Change Trend
Fresh Build 14.589s 14.616s ▁▂▃█▂
Cached Build 14.723s 14.737s ▁▁▃█▃
node_modules Size 494 MB 493 MB 🟢 1.05 MB (0%) █████
📦 Bundle Sizes

Bundle Sizes

⚡ Turbopack

Client

Main Bundles
Canary PR Change
07rxhp_1_g4mu.js gzip 13.1 kB N/A -
08avva-dy02e7.js gzip 10.4 kB N/A -
0cz1d0mv5g_q7.js gzip 39.4 kB 39.4 kB
0fli3_wppnim5.js gzip 12.9 kB N/A -
0k09jwjeb-tki.js gzip 13.8 kB N/A -
0kb7_ep3r1z0_.js gzip 10.1 kB N/A -
0khj6l1dkbztz.js gzip 158 B N/A -
0kw8xgqdrilf6.js gzip 8.56 kB N/A -
0ojkk2e654xsc.js gzip 8.59 kB N/A -
0r13y5wryy_rb.js gzip 156 B N/A -
0wxpyd8r-vipl.js gzip 1.47 kB N/A -
0xy2fhla48_rd.js gzip 9.24 kB N/A -
10wqsvi2mgfmi.js gzip 9.82 kB N/A -
10x5yjviaxcoo.js gzip 155 B N/A -
16c9-6ahplfxj.js gzip 157 B N/A -
16lhqjoqbznyg.js gzip 220 B 220 B
16vepdkipri3r.js gzip 8.51 kB N/A -
17n96uu6y1pxq.js gzip 8.6 kB N/A -
18y4_8-9or0mn.js gzip 8.51 kB N/A -
1elt1qium-r2m.css gzip 115 B 115 B
1gq145j3kps-h.js gzip 8.62 kB N/A -
1nsh-mbn0e-se.js gzip 8.56 kB N/A -
1tsrrp1tdngti.js gzip 13.3 kB N/A -
2__-e_ym8n788.js gzip 450 B N/A -
22o6xd9_ywdu6.js gzip 233 B N/A -
25l6e629itu5j.js gzip 153 B N/A -
26ui6d5bv607a.js gzip 49.3 kB N/A -
27niq-zweblzs.js gzip 154 B N/A -
29bzq8qn1wyxo.js gzip 156 B N/A -
2jrge3u8y0nbz.js gzip 155 B N/A -
2kvj8yrfznmwx.js gzip 5.69 kB N/A -
2nrhepcp9ve2o.js gzip 70.8 kB N/A -
2qv7m7xjnokgr.js gzip 8.58 kB N/A -
2sewu64d_awot.js gzip 157 B N/A -
3_otef55yxm6_.js gzip 160 B N/A -
342ijzvrpe53h.js gzip 2.29 kB N/A -
3hiogkn179_b_.js gzip 169 B N/A -
3j78vioukb8ay.js gzip 156 B N/A -
3mm89bcl7qq09.js gzip 65.5 kB N/A -
3u73li4mpeclh.js gzip 157 B N/A -
44un3--wmqiyh.js gzip 7.61 kB N/A -
turbopack-0-..yjzq.js gzip 4.19 kB N/A -
turbopack-0h..4zvl.js gzip 4.19 kB N/A -
turbopack-0n..aaf6.js gzip 4.19 kB N/A -
turbopack-0u..8fol.js gzip 4.17 kB N/A -
turbopack-0x..iazv.js gzip 4.2 kB N/A -
turbopack-1x..5vxm.js gzip 4.19 kB N/A -
turbopack-2b..016f.js gzip 4.19 kB N/A -
turbopack-2h..-wl2.js gzip 4.19 kB N/A -
turbopack-2j..-y6j.js gzip 4.19 kB N/A -
turbopack-34..u2y9.js gzip 4.19 kB N/A -
turbopack-36..95b2.js gzip 4.19 kB N/A -
turbopack-3g..v35j.js gzip 4.19 kB N/A -
turbopack-3j..wswm.js gzip 4.19 kB N/A -
turbopack-3q..bf9c.js gzip 4.19 kB N/A -
06evto34q6kog.js gzip N/A 13 kB -
0aiow2efzggpv.js gzip N/A 8.59 kB -
0apirp-m3fna-.js gzip N/A 2.28 kB -
0de0kgzpgabvg.js gzip N/A 169 B -
0gvjtplu4ik03.js gzip N/A 152 B -
0ksot8co-qub9.js gzip N/A 7.6 kB -
0qu3po6qlx8a-.js gzip N/A 9.8 kB -
0r8j5khvzvo_j.js gzip N/A 65.5 kB -
0uzs-uwqfgoio.js gzip N/A 160 B -
1_4eo965gorrk.js gzip N/A 70.8 kB -
1-jqyfc89tixo.js gzip N/A 1.46 kB -
10ptfhou44vg-.js gzip N/A 8.55 kB -
15jd43m54o-sg.js gzip N/A 8.62 kB -
1ab2xruymo-oj.js gzip N/A 449 B -
1iw767e5p8p9h.js gzip N/A 8.57 kB -
1nriczg0wexxf.js gzip N/A 155 B -
1paexeze5sdue.js gzip N/A 13.8 kB -
1rjx6ckymkohg.js gzip N/A 8.51 kB -
1scs8sswn9jsh.js gzip N/A 8.55 kB -
24wn2rl84sy0i.js gzip N/A 158 B -
2ge98-e9rtitz.js gzip N/A 154 B -
2ksgupm1an68t.js gzip N/A 157 B -
2l29pfu4351tc.js gzip N/A 154 B -
2pw2bw36yjhgh.js gzip N/A 154 B -
2qj5rro7dykxa.js gzip N/A 10.1 kB -
2ts1tavx8j3c1.js gzip N/A 12.9 kB -
2ywlepa0j45yc.js gzip N/A 155 B -
3_i7z3jxw05k5.js gzip N/A 5.67 kB -
30qsbrhnphwel.js gzip N/A 225 B -
36pnnu0pdgtsd.js gzip N/A 13.3 kB -
3iollk8wxspot.js gzip N/A 49.1 kB -
3mqhaxomxkmxj.js gzip N/A 154 B -
3z635snb92bnv.js gzip N/A 160 B -
4193narqgrim_.js gzip N/A 8.51 kB -
43eq_mlh8zxb0.js gzip N/A 155 B -
43jskxgkj3cju.js gzip N/A 9.23 kB -
43mmjowxr8jv8.js gzip N/A 8.58 kB -
444c-df85h-wn.js gzip N/A 10.4 kB -
turbopack-04..bsgn.js gzip N/A 4.18 kB -
turbopack-08..8bvm.js gzip N/A 4.18 kB -
turbopack-0a..mo7t.js gzip N/A 4.18 kB -
turbopack-0d..nwno.js gzip N/A 4.17 kB -
turbopack-0l..ekiu.js gzip N/A 4.18 kB -
turbopack-0x..3xvi.js gzip N/A 4.18 kB -
turbopack-0y..m_45.js gzip N/A 4.18 kB -
turbopack-1u..0ul8.js gzip N/A 4.18 kB -
turbopack-1z..xti_.js gzip N/A 4.18 kB -
turbopack-2_..ow6a.js gzip N/A 4.18 kB -
turbopack-27..7ec6.js gzip N/A 4.18 kB -
turbopack-2r..okt3.js gzip N/A 4.16 kB -
turbopack-2v..8ndz.js gzip N/A 4.18 kB -
turbopack-3b..wsac.js gzip N/A 4.19 kB -
Total 465 kB 464 kB ✅ -647 B

Server

Middleware
Canary PR Change
middleware-b..fest.js gzip 719 B 717 B
Total 719 B 717 B ✅ -2 B
Build Details
Build Manifests
Canary PR Change
_buildManifest.js gzip 433 B 435 B
Total 433 B 435 B ⚠️ +2 B

📦 Webpack

Client

Main Bundles
Canary PR Change
2637-HASH.js gzip 4.63 kB N/A -
7724.HASH.js gzip 169 B N/A -
8274-HASH.js gzip 61.4 kB N/A -
8817-HASH.js gzip 5.59 kB N/A -
c3500254-HASH.js gzip 62.8 kB N/A -
framework-HASH.js gzip 59.7 kB 59.7 kB
main-app-HASH.js gzip 254 B 255 B
main-HASH.js gzip 39.4 kB 39.4 kB
webpack-HASH.js gzip 1.68 kB 1.68 kB
5887-HASH.js gzip N/A 5.61 kB -
6522-HASH.js gzip N/A 60.7 kB -
6779-HASH.js gzip N/A 4.63 kB -
8854.HASH.js gzip N/A 169 B -
eab920f9-HASH.js gzip N/A 62.8 kB -
Total 236 kB 235 kB ✅ -706 B
Polyfills
Canary PR Change
polyfills-HASH.js gzip 39.4 kB 39.4 kB
Total 39.4 kB 39.4 kB
Pages
Canary PR Change
_app-HASH.js gzip 193 B 193 B
_error-HASH.js gzip 182 B 182 B
css-HASH.js gzip 333 B 334 B
dynamic-HASH.js gzip 1.81 kB 1.8 kB
edge-ssr-HASH.js gzip 255 B 255 B
head-HASH.js gzip 353 B 349 B 🟢 4 B (-1%)
hooks-HASH.js gzip 384 B 382 B
image-HASH.js gzip 581 B 581 B
index-HASH.js gzip 260 B 259 B
link-HASH.js gzip 2.51 kB 2.51 kB
routerDirect..HASH.js gzip 316 B 318 B
script-HASH.js gzip 386 B 386 B
withRouter-HASH.js gzip 313 B 314 B
1afbb74e6ecf..834.css gzip 106 B 106 B
Total 7.98 kB 7.97 kB ✅ -10 B

Server

Edge SSR
Canary PR Change
edge-ssr.js gzip 126 kB 126 kB
page.js gzip 273 kB 272 kB
Total 399 kB 398 kB ✅ -919 B
Middleware
Canary PR Change
middleware-b..fest.js gzip 619 B 615 B
middleware-r..fest.js gzip 156 B 156 B
middleware.js gzip 44.2 kB 44.2 kB
edge-runtime..pack.js gzip 842 B 842 B
Total 45.8 kB 45.8 kB ✅ -5 B
Build Details
Build Manifests
Canary PR Change
_buildManifest.js gzip 721 B 720 B
Total 721 B 720 B ✅ -1 B
Build Cache
Canary PR Change
0.pack gzip 4.38 MB 4.37 MB 🟢 9.23 kB (0%)
index.pack gzip 114 kB 114 kB
index.pack.old gzip 113 kB 112 kB
Total 4.61 MB 4.6 MB ✅ -9.42 kB

🔄 Shared (bundler-independent)

Runtimes
Canary PR Change
app-page-exp...dev.js gzip 347 kB 346 kB
app-page-exp..prod.js gzip 192 kB 192 kB
app-page-tur...dev.js gzip 346 kB 346 kB
app-page-tur..prod.js gzip 192 kB 191 kB
app-page-tur...dev.js gzip 343 kB 342 kB
app-page-tur..prod.js gzip 190 kB 189 kB
app-page.run...dev.js gzip 343 kB 342 kB
app-page.run..prod.js gzip 190 kB 190 kB
app-route-ex...dev.js gzip 77 kB 77 kB
app-route-ex..prod.js gzip 52.5 kB 52.5 kB
app-route-tu...dev.js gzip 77.1 kB 77 kB
app-route-tu..prod.js gzip 52.6 kB 52.5 kB
app-route-tu...dev.js gzip 76.7 kB 76.6 kB
app-route-tu..prod.js gzip 52.3 kB 52.2 kB
app-route.ru...dev.js gzip 76.6 kB 76.6 kB
app-route.ru..prod.js gzip 52.3 kB 52.2 kB
dist_client_...dev.js gzip 324 B 324 B
dist_client_...dev.js gzip 326 B 326 B
dist_client_...dev.js gzip 318 B 318 B
dist_client_...dev.js gzip 317 B 317 B
pages-api-tu...dev.js gzip 43.9 kB 43.9 kB
pages-api-tu..prod.js gzip 33.5 kB 33.5 kB
pages-api.ru...dev.js gzip 43.9 kB 43.9 kB
pages-api.ru..prod.js gzip 33.5 kB 33.4 kB
pages-turbo....dev.js gzip 53.3 kB 53.3 kB
pages-turbo...prod.js gzip 39.1 kB 39.1 kB
pages.runtim...dev.js gzip 53.3 kB 53.3 kB
pages.runtim..prod.js gzip 39.1 kB 39 kB
server.runti..prod.js gzip 63 kB 62.9 kB
Total 3.06 MB 3.06 MB ✅ -5.55 kB
📝 Changed Files (25 files)

Files with changes:

  • app-page-exp..ntime.dev.js
  • app-page-exp..time.prod.js
  • app-page-tur..ntime.dev.js
  • app-page-tur..time.prod.js
  • app-page-tur..ntime.dev.js
  • app-page-tur..time.prod.js
  • app-page.runtime.dev.js
  • app-page.runtime.prod.js
  • app-route-ex..ntime.dev.js
  • app-route-ex..time.prod.js
  • app-route-tu..ntime.dev.js
  • app-route-tu..time.prod.js
  • app-route-tu..ntime.dev.js
  • app-route-tu..time.prod.js
  • app-route.runtime.dev.js
  • app-route.ru..time.prod.js
  • pages-api-tu..ntime.dev.js
  • pages-api-tu..time.prod.js
  • pages-api.runtime.dev.js
  • pages-api.ru..time.prod.js
  • ... and 5 more
View diffs
app-page-exp..ntime.dev.js
failed to diff
app-page-exp..time.prod.js
failed to diff
app-page-tur..ntime.dev.js
failed to diff
app-page-tur..time.prod.js
failed to diff
app-page-tur..ntime.dev.js
failed to diff
app-page-tur..time.prod.js
failed to diff
app-page.runtime.dev.js
failed to diff
app-page.runtime.prod.js
failed to diff
app-route-ex..ntime.dev.js

Diff too large to display

app-route-ex..time.prod.js

Diff too large to display

app-route-tu..ntime.dev.js

Diff too large to display

app-route-tu..time.prod.js

Diff too large to display

app-route-tu..ntime.dev.js

Diff too large to display

app-route-tu..time.prod.js

Diff too large to display

app-route.runtime.dev.js

Diff too large to display

app-route.ru..time.prod.js

Diff too large to display

pages-api-tu..ntime.dev.js

Diff too large to display

pages-api-tu..time.prod.js

Diff too large to display

pages-api.runtime.dev.js

Diff too large to display

pages-api.ru..time.prod.js

Diff too large to display

pages-turbo...ntime.dev.js

Diff too large to display

pages-turbo...time.prod.js

Diff too large to display

pages.runtime.dev.js

Diff too large to display

pages.runtime.prod.js

Diff too large to display

server.runtime.prod.js

Diff too large to display

📎 Tarball URL
https://vercel-packages.vercel.app/next/commits/f9b9ac550d966babfcba60e514857dc64e65ab58/next

@sokra sokra changed the title docs: Add import.meta.glob documentation for Turbopack Turbopack: import.meta.glob docs + edge case support Apr 14, 2026
Comment thread turbopack/crates/turbopack-ecmascript/src/references/import_meta_glob.rs Outdated
Comment thread turbopack/crates/turbopack-ecmascript/src/references/import_meta_glob.rs Outdated
Comment thread turbopack/crates/turbopack-ecmascript/src/references/import_meta_glob.rs Outdated
@nextjs-bot
Copy link
Copy Markdown
Contributor

nextjs-bot commented Apr 15, 2026

Failing test suites

Commit: f9b9ac5 | About building and testing Next.js

pnpm test test/integration/rewrites-manual-href-as/test/index.test.ts (turbopack) (job)

  • rewrites manual href/as > development mode > should allow manual href/as on index page (DD)
  • rewrites manual href/as > production mode > should allow manual href/as on index page (DD)
Expand output

● rewrites manual href/as › development mode › should allow manual href/as on index page

expect(received).toBeTruthy()

Received: false

  28 |
  29 |     expect(await browser.elementByCss('#index').text()).toBe('index page')
> 30 |     expect(await browser.hasElementByCssSelector('#modal')).toBeTruthy()
     |                                                             ^
  31 |     expect(await browser.eval('window.beforeNav')).toBe(1)
  32 |     expect(JSON.parse(await browser.elementByCss('#query').text())).toEqual({
  33 |       imageId: '123',

  at Object.toBeTruthy (integration/rewrites-manual-href-as/test/index.test.ts:30:61)

● rewrites manual href/as › production mode › should allow manual href/as on index page

expect(received).toBeTruthy()

Received: false

  28 |
  29 |     expect(await browser.elementByCss('#index').text()).toBe('index page')
> 30 |     expect(await browser.hasElementByCssSelector('#modal')).toBeTruthy()
     |                                                             ^
  31 |     expect(await browser.eval('window.beforeNav')).toBe(1)
  32 |     expect(JSON.parse(await browser.elementByCss('#query').text())).toEqual({
  33 |       imageId: '123',

  at Object.toBeTruthy (integration/rewrites-manual-href-as/test/index.test.ts:30:61)

@sokra sokra marked this pull request as ready for review April 16, 2026 18:34
@sokra sokra requested review from lukesandberg and mischnic April 16, 2026 18:34
Comment thread docs/01-app/03-api-reference/08-turbopack.mdx
Comment thread docs/01-app/03-api-reference/08-turbopack.mdx
glob(
pattern: string | string[],
options: ImportMetaGlobOptions & { eager: true }
): Record<string, unknown>
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.

We do know it is a namespace object, would setting the type to object be slightly more useful?

@sokra sokra force-pushed the sokra/import-meta-glob branch from f9b9ac5 to dfee998 Compare April 21, 2026 19:46
sokra and others added 4 commits April 27, 2026 08:57
Documents the Vite-compatible import.meta.glob API in the Turbopack
reference page (lazy/eager loading, named imports, query strings, multiple
patterns, negation, options table) and adds a migration note in the
from-Vite guide.

Co-Authored-By: Claude <noreply@anthropic.com>
… dotfile exclusion

- `import: '*'` is treated as a namespace import (whole module), same as
  omitting the import option entirely.
- `query` option now accepts object literals (e.g. `{ bar: 'foo', raw: true }`)
  which are serialized to a query string (`?bar=foo&raw=true`).
- Dotfiles and dot-directories (e.g. `.git`, `.foo`) are excluded from glob
  results, matching Vite's behavior.
- Added execution tests for all new features and error cases (no args, too many
  args, non-string pattern, non-object options).

Co-Authored-By: Claude <noreply@anthropic.com>
…ilters, error on bad options arg

- URL-encode query object keys and values using the `urlencoding` crate,
  matching Vite's behavior (e.g. { query: { 'foo bar': 'baz' } } →
  '?foo%20bar=baz').
- Remove manual dotfile/dot-directory filtering from `flatten_read_glob`;
  the underlying glob pattern already handles this correctly.
- Promoting "second argument must be an object literal" from warning to
  error and return None, since the options cannot be safely defaulted.
- Fix test: explicit dotfile pattern `./.foo/*.js` correctly includes
  dotfile entries; wildcard `**` also includes them now.

Co-Authored-By: Claude <noreply@anthropic.com>
…ormat

- Add ImportMetaGlobOptions interface and overloaded glob() signatures to
  ImportMeta in global.d.ts, with correct return types for eager vs lazy.
- Document the object form of the query option (auto-serialized to query string).
- Add a TypeScript section explaining the types and eager/lazy return differences.

Co-Authored-By: Claude <noreply@anthropic.com>
@sokra sokra force-pushed the sokra/import-meta-glob branch from dfee998 to 7540b1b Compare April 27, 2026 06:58
@sokra sokra enabled auto-merge (squash) April 27, 2026 06:58
Comment thread docs/01-app/03-api-reference/08-turbopack.mdx Outdated
@sokra sokra force-pushed the sokra/import-meta-glob branch from 14e39ed to b6916be Compare April 27, 2026 07:01
@sokra sokra merged commit 44722b8 into canary Apr 27, 2026
176 of 180 checks passed
@sokra sokra deleted the sokra/import-meta-glob branch April 27, 2026 07:37
@github-actions
Copy link
Copy Markdown
Contributor

Tests Passed

Commit: b6916be

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

Labels

created-by: Turbopack team PRs by the Turbopack team. Documentation Related to Next.js' official documentation. Turbopack Related to Turbopack with Next.js. type: next

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants