Skip to content

feat(unstable): support TC39 import defer proposal#32360

Merged
bartlomieju merged 12 commits intodenoland:mainfrom
bartlomieju:feat/import-defer-eval
Apr 29, 2026
Merged

feat(unstable): support TC39 import defer proposal#32360
bartlomieju merged 12 commits intodenoland:mainfrom
bartlomieju:feat/import-defer-eval

Conversation

@bartlomieju
Copy link
Copy Markdown
Member

@bartlomieju bartlomieju commented Feb 27, 2026

This commit adds an experimental support for import defer ... syntax,
for https://github.com/tc39/proposal-defer-import-eval proposal.

Closes #30053

Adds support for the TC39 "Deferred Module Evaluation" proposal
(https://github.com/tc39/proposal-defer-import-eval, Stage 3).

Changes:
- Enable V8 `--js-defer-import-eval` flag for parser/runtime support
- Separate `ModuleImportPhase::Defer` handling from `Evaluation` phase:
  deferred modules are instantiated but not evaluated, letting V8 create
  a deferred namespace that triggers evaluation on first property access
- Add integration test validating deferred evaluation semantics

Ported from denoland/deno_core#1280

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@bartlomieju bartlomieju changed the title feat(core): support TC39 import defer proposal feat(unstable): support TC39 import defer proposal Mar 3, 2026
@bartlomieju
Copy link
Copy Markdown
Member Author

Waiting on v8/v8@f2016e1 in V8 14.7.

@bartlomieju bartlomieju added the upstream Changes in upstream are required to solve these issues label Mar 3, 2026
@bartlomieju bartlomieju added this to the 2.8.0 milestone Apr 17, 2026
Upgrade rusty_v8 to 147.3.0 which includes the
Module::EvaluateForImportDefer and GetModuleNamespace with phase APIs
needed for dynamic import.defer() support.

Fix merge conflict in map.rs: restore separate Defer arm in dynamic
import handling (must NOT call dynamic_import_module_evaluate since
defer imports should not be evaluated until namespace access).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@bartlomieju bartlomieju removed the upstream Changes in upstream are required to solve these issues label Apr 19, 2026
bartlomieju and others added 7 commits April 19, 2026 16:02
Point to local deno_graph (with ImportDefer variants) and deno_doc.
Add ImportDefer handling to unfurl.rs.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Use the new V8 Module::evaluate_for_import_defer API for dynamic
import.defer() to properly gather async transitive dependencies before
resolving. Get the deferred namespace via get_module_namespace_with_phase
(kDefer) so V8 creates a namespace that triggers evaluation on first
property access.

Handles three promise states:
- Fulfilled: all async deps ready, resolve immediately with deferred ns
- Rejected: propagate error to dynamic import reject
- Pending: store for later resolution via pending_dyn_mod_evaluations

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Filter TS18060 diagnostic ("Deferred imports are only supported when
  module is esnext or preserve") since Deno handles module resolution
  natively and supports import defer.
- Add test for running import defer from TypeScript files.
- Add test for type-checking import defer TypeScript files.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace local path overrides with published crate versions that
include import defer support.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@bartlomieju bartlomieju merged commit 4df8b35 into denoland:main Apr 29, 2026
136 checks passed
@bartlomieju bartlomieju deleted the feat/import-defer-eval branch April 29, 2026 07:39
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.

Feature Request: implement import-defer

2 participants