SyncValsverifier → artifact → classifier → verdict
SyncVals · Trajectory

evanw-esbuild-4417

codex gpt-5.5 ✓ resolved GOOD_SUCCESS ↑ View task
Solved from the instruction alone, tests/ and solution/ were withheld from the agent's workspace and restored only for grading.
Reward = tests/test.sh exit code (0 → resolved); the classification below is post-hoc and cannot change it.
Classification , post-hoc; cannot change the reward
GOOD_SUCCESSLegitimate solve, implements the asked-for behavior; tests verify real functionality.
SubtypeLegitimate Solution
EvidenceThe agent implemented the async generator runtime fix in /app/internal/runtime/runtime.go by converting __asyncGenerator from immediate reentrant calls to a linked promise-backed request queue. Key changes: (1) Added front/back queue tracking, (2) Created request() to queue operations, (3) Added run()/settle() for queue processing, (4) Ensured queued next/throw calls don't add extra promise hops while queued return() operations wait for pending yields. The agent added comprehensive Node-backed regression tests in runtime_test.go covering delegated generators, for-await loops, concurrent calls, cleanup yields, and recovery yields. All 6 Python verification tests passed: test_async_generator_lowering_matches_native, test_bundled_output_uses_lowered_async_generator_helpers, test_case_roster_actually_ran, test_output_is_json_trace, test_async_generator_compatibility_targets_still_require_lowering, test_no_hardcoded_hidden_literals. Go build and all test suites pass (go test ./... successful). Result: reward=1.0 (pass).
Root causeThe agent successfully diagnosed the async generator lowering bug through systematic exploration of the codebase and test patterns, then implemented a sophisticated queue-based solution that preserves native JavaScript semantics for concurrent iterator method calls while maintaining correct promise ordering.
RecommendationN/A - task is fine
Trajectory
Tool-by-tool agent trajectory
42 tool calls · 2 tool types · 64 steps
<permissions instructions> Filesystem sandboxing defines which files can be read or written. `sandbox_mode` is `danger-full-access`: No filesystem sandboxing - all commands are permitted. Network access is enabled. Approval policy is currently never. Do not provide the `sandbox_permissions` for any reason, commands will be rejected. </permissions instructions><apps_instructions> ## Apps (Connectors) Apps (Connectors) can be explicitly triggered in user messages in the format `[$app-name](app://{connector_id})`. Apps can also be implicitly triggered as long as the context suggests usage of available apps. An app is equivalent to a set of MCP tools within the `codex_apps` MCP. An installed app's MCP tools are either provided to you already, or can be lazy-loaded through the `tool_search` tool. If `tool_search` is available, the apps that are searchable by `tools_search` will be listed by it. Do not additionally call list_mcp_resources or list_mcp_resource_templates for apps. </apps_instructions><skills_instructions> ## Skills A skill is a set of instructions provided through a `SKILL.md` source. Below is the list of skills that can be used. Each entry includes a name, description, and source locator. `file` locators are on the host filesystem, `environment resource` locators are owned by an execution environment, `orchestrator resource` locators are opaque non-filesystem resources, and `custom resource` locators use their provider's access mechanism. ### Available skills - imagegen: Generate or edit raster images when the task benefits from AI-created bitmap visuals such as photos, illustrations, textures, sprites, mockups, or transparent-background cutouts. Use when Codex should create a brand-new image, transform an existing image, or derive visual variants from references, and the output should be a bitmap asset rather than repo-native code or vector. Do not use when the task is better handled by editing existing SVG/vector/code-native assets, extending an established icon or logo system, or building the visual directly in HTML/CSS/canvas. (file: /tmp/codex-home/skills/.system/imagegen/SKILL.md) - openai-docs: Use when the user asks how to build with OpenAI products or APIs, asks about Codex itself or choosing Codex surfaces, needs up-to-date official documentation with citations, help choosing the latest model for a use case, or model upgrade and prompt-upgrade guidance; use OpenAI docs MCP tools for non-Codex docs questions, use the Codex manual helper first for broad Codex self-knowledge, and restrict fallback browsing to official OpenAI domains. (file: /tmp/codex-home/skills/.system/openai-docs/SKILL.md) - plugin-creator: Create and scaffold plugin directories for Codex with a required `.codex-plugin/plugin.json`, optional plugin folders/files, valid manifest defaults, and personal-marketplace entries by default. Use when Codex needs to create a new personal plugin, add optional plugin structure, generate or update marketplace entries for plugin ordering and availability metadata, or update an existing local plugin during development with the CLI-driven cachebuster and reinstall flow. (file: /tmp/codex-home/skills/.system/plugin-creator/SKILL.md) - skill-creator: Guide for creating effective skills. This skill should be used when users want to create a new skill (or update an existing skill) that extends Codex's capabilities with specialized knowledge, workflows, or tool integrations. (file: /tmp/codex-home/skills/.system/skill-creator/SKILL.md) - skill-installer: Install Codex skills into $CODEX_HOME/skills from a curated list or a [code-host] repo path. Use when a user asks to list installable skills, install a curated skill, or install a skill from another repo (including private repos). (file: /tmp/codex-home/skills/.system/skill-installer/SKILL.md) ### How to use skills - Discovery: The list above is the skills available in this session (name + description + source locator). `file` entries live on the host filesystem, `environment resource` entries are owned by their execution environment, `orchestrator resource` entries must be accessed through `skills.list` and `skills.read`, and `custom resource` entries use their provider's access mechanism. - Trigger rules: If the user names a skill (with `$SkillName` or plain text) OR the task clearly matches a skill's description shown above, you must use that skill for that turn. Multiple mentions mean use them all. Do not carry skills across turns unless re-mentioned. - Missing/blocked: If a named skill isn't in the list or its source can't be read, say so briefly and continue with the best fallback. - How to use a skill (progressive disclosure): 1) After deciding to use a skill, the main agent must read its `SKILL.md` completely before taking task actions. For a `file` entry, open the listed path. For an `environment resource`, use the filesystem of the owning environment. For an `orchestrator resource`, call `skills.list` with `{"authority":{"kind":"orchestrator"}}`, select the matching package, and pass its `main_resource` to `skills.read`. If a read is truncated or paginated, continue until EOF. 2) When `SKILL.md` references another resource, use the same access mechanism. Resolve relative paths against a filesystem-backed skill directory. For orchestrator skills, pass the exact referenced resource identifier with the same authority and package to `skills.read`; do not treat `skill://` identifiers as filesystem paths. 3) If `SKILL.md` points to extra folders such as `references/`, use its routing instructions to identify the resources required for the task. The main agent must read each required instruction or reference file itself before acting on it. Do not delegate reading, summarizing, or interpreting skill instructions to a subagent. Subagents may still perform task work when the selected skill allows it. 4) For filesystem-backed skills, prefer running or patching provided scripts instead of retyping large code blocks. For orchestrator skills, use `skills.read` and the available tools; do not invent a local path. 5) Reuse provided assets or templates through the same source access mechanism instead of recreating them. - Coordination and sequencing: - If multiple skills apply, choose the minimal set that covers the request and state the order you'll use them. - Announce which skill(s) you're using and why (one short line). If you skip an obvious skill, say why. - Context hygiene: - Progressive disclosure applies to selecting relevant files, not partially reading a selected instruction file. Do not load unrelated references, scripts, or assets. - Avoid deep reference-chasing: prefer opening only files directly linked from `SKILL.md` unless you're blocked. - When variants exist (frameworks, providers, domains), pick only the relevant reference file(s) and note that choice. - Safety and fallback: If a skill can't be applied cleanly (missing files, unclear instructions), state the issue, pick the next-best approach, and continue. </skills_instructions>
<environment_context> <cwd>/app</cwd> <shell>bash</shell> <current_date>2026-06-21</current_date> <timezone>Etc/UTC</timezone> <filesystem><workspace_roots><root>/app</root></workspace_roots><permission_profile type="disabled"><file_system type="unrestricted" /></permission_profile></filesystem> </environment_context>
The project in /app is a JavaScript bundler written in Go. When it lowers async generator syntax for older targets, the transformed program should preserve native async generator behavior. Calling next, throw, or return on an async generator before earlier iterator method promises have settled must behave like native JavaScript. The first call should start synchronously up to the first await or yield point, later calls must be sequenced correctly, delegated async iteration must not skip values, and a return value supplied to a queued call must be delivered to the right suspended yield expression. Fix the lowering so transformed output matches native Node behavior for concurrent iterator method calls, delegated async generators, for-await loops, return-through-yield flows, and synchronous side-effect ordering. Queued return() calls must still run cleanup code from finally blocks and deliver any value yielded by that cleanup. Queued throw() calls must enter matching catch blocks at the same suspended point as native async generators and preserve the yielded recovery value. The observable contract includes yielded values, done flags, propagated errors, values sent back into suspended yield expressions, and the order of synchronous side effects that occur before and after awaited work. The runtime helpers are in /app/internal/runtime/runtime.go. Coordinate __asyncGenerator with delegated iteration through __yieldStar so queued return, throw, and next calls preserve native finally-yield timing. Keep existing CLI and API behavior unchanged. The fix must handle dozens of concurrent-call patterns, including delegated generators whose inner iterator is waiting on a promise inside try/finally or catch code. A queue that only uses an array plus a running flag is not enough if it lets delegated return() or throw() skip the same promise-completion ordering as native async generators. Preserve the __yieldStar __await handoff protocol: when a delegated iterator result is pending, the outer async generator must resume through the same ordered promise chain instead of resolving the delegated call outside that chain. Use a promise-valued queue rather than a detached array of pending calls when sequencing iterator methods. Each next, throw, and return call should chain its resume work from the previous call's promise so native microtask order is preserved. When no earlier iterator method is still pending, the first resume callback must start immediately and run synchronously until the generator reaches its next await or yield point. Do not add a microtask hop before that first resume; doing so changes side effects that occur before the first await. The scheduling is intentionally asymmetric. A queued next or throw operation that can resume the generator must not be delayed behind an extra Promise.resolve().then hop just because the implementation uses a promise-valued queue. A queued return operation, however, must still wait for the pending yield or delegated-yield handoff to settle before running return cleanup, so the first next result is observed before finally-side effects and cleanup yields from the queued return. A useful minimal check is an outer async generator that yield* delegates to an inner async generator whose try block yields an awaited value and whose finally block records a side effect before yielding a cleanup value. If a caller issues next() and then return("done") before awaiting either promise, the finally side effect is not visible when the first next() promise resolves; the cleanup yield belongs to the queued return() continuation. Seeing the side effect before the first result is observed means delegated cleanup is running too early. The same ordering must hold when more than one resume is queued before a return. For example, if a caller starts two next() calls, then a return("done") call, and then another next("after") call before awaiting any of those promises, the second next() result must settle before return cleanup runs. Cleanup side effects and cleanup yields belong to the queued return() continuation, and the later next("after") observes the generator state that native JavaScript would leave after that return path. Acceptance criteria: - `go build ./cmd/...` succeeds. - Bundled output for es2017 and es6 uses the async generator runtime helpers instead of native async generator or for-await syntax. - Lowered output produces the same JSON trace as native Node.js for concurrent next, throw, and return calls, including delegated generators with awaited yields, try/finally cleanup yields, try/catch recovery yields, and values sent back into suspended yield expressions. - The compatibility table must continue to require async-generator lowering for es2017 and es6 targets. Do not make compatibility-table changes that avoid lowering instead of fixing the runtime helper. Preserve the existing runtime helper exports, including __forAwait, so lowered for-await loops continue to link and execute through the runtime helpers.
I’ll inspect the Go runtime helper and existing lowering tests first, then patch the helper and add focused coverage around the concurrent iterator cases you described.
shell
rg -n "asyncGenerator|yieldStar|forAwait|async generator|for-await" internal test scripts cmd
output
Chunk ID: b85d24
Wall time: 0.0000 seconds
Process exited with code 2
Original token count: 2912
Output:
rg: test: No such file or directory (os error 2)
rg: scripts: No such file or directory (os error 2)
internal/compat/js_table.go:151:	"for-await":                         ForAwait,
internal/compat/js_table.go:250:		// Note: The latest version of "Hermes" failed this test: Asynchronous Iterators: async generators
internal/compat/js_table.go:251:		// Note: The latest version of "IE" failed this test: Asynchronous Iterators: async generators
internal/compat/js_table.go:252:		// Note: The latest version of "Rhino" failed this test: Asynchronous Iterators: async generators
internal/compat/js_table.go:507:		// Note: The latest version of "Hermes" failed this test: Asynchronous Iterators: for-await-of loops
internal/compat/js_table.go:508:		// Note: The latest version of "IE" failed this test: Asynchronous Iterators: for-await-of loops
internal/compat/js_table.go:509:		// Note: The latest version of "Rhino" failed this test: Asynchronous Iterators: for-await-of loops
internal/bundler_tests/snapshots/snapshots_lower.txt:24:    for (var iter = __forAwait(b), more, temp, error; more = !(temp = await iter.next()).done; more = !1) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1180:  return __asyncGenerator(this, null, function* () {
internal/bundler_tests/snapshots/snapshots_lower.txt:1185:      yield* __yieldStar(x);
internal/bundler_tests/snapshots/snapshots_lower.txt:1188:        for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield new __await(iter.next())).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1202:        for (var iter2 = __forAwait(y), more2, temp2, error2; more2 = !(temp2 = yield new __await(iter2.next())).done; more2 = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1233:  return __asyncGenerator(this, null, function* () {
internal/bundler_tests/snapshots/snapshots_lower.txt:1238:      yield* __yieldStar(x);
internal/bundler_tests/snapshots/snapshots_lower.txt:1241:        for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield new __await(iter.next())).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1255:        for (var iter2 = __forAwait(y), more2, temp2, error2; more2 = !(temp2 = yield new __await(iter2.next())).done; more2 = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1286:  return __asyncGenerator(this, null, function* () {
internal/bundler_tests/snapshots/snapshots_lower.txt:1291:      yield* __yieldStar(x);
internal/bundler_tests/snapshots/snapshots_lower.txt:1294:        for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield new __await(iter.next())).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1308:        for (var iter2 = __forAwait(y), more2, temp2, error2; more2 = !(temp2 = yield new __await(iter2.next())).done; more2 = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1340:    return __asyncGenerator(this, null, function* () {
internal/bundler_tests/snapshots/snapshots_lower.txt:1345:        yield* __yieldStar(x);
internal/bundler_tests/snapshots/snapshots_lower.txt:1348:          for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield new __await(iter.next())).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1362:          for (var iter2 = __forAwait(y), more2, temp2, error2; more2 = !(temp2 = yield new __await(iter2.next())).done; more2 = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1395:    return __asyncGenerator(this, null, function* () {
internal/bundler_tests/snapshots/snapshots_lower.txt:1400:        yield* __yieldStar(x);
internal/bundler_tests/snapshots/snapshots_lower.txt:1403:          for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield new __await(iter.next())).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1417:          for (var iter2 = __forAwait(y), more2, temp2, error2; more2 = !(temp2 = yield new __await(iter2.next())).done; more2 = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1460:  return __asyncGenerator(this, null, function* () {
internal/bundler_tests/snapshots/snapshots_lower.txt:1465:      yield* __yieldStar(x);
internal/bundler_tests/snapshots/snapshots_lower.txt:1468:        for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield new __await(iter.next())).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1482:        for (var iter2 = __forAwait(y), more2, temp2, error2; more2 = !(temp2 = yield new __await(iter2.next())).done; more2 = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1513:  return __asyncGenerator(this, null, function* () {
internal/bundler_tests/snapshots/snapshots_lower.txt:1518:      yield* __yieldStar(x);
internal/bundler_tests/snapshots/snapshots_lower.txt:1521:        for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield new __await(iter.next())).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1535:        for (var iter2 = __forAwait(y), more2, temp2, error2; more2 = !(temp2 = yield new __await(iter2.next())).done; more2 = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1566:  return __asyncGenerator(this, null, function* () {
internal/bundler_tests/snapshots/snapshots_lower.txt:1571:      yield* __yieldStar(x);
internal/bundler_tests/snapshots/snapshots_lower.txt:1574:        for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield new __await(iter.next())).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1588:        for (var iter2 = __forAwait(y), more2, temp2, error2; more2 = !(temp2 = yield new __await(iter2.next())).done; more2 = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1620:    return __asyncGenerator(this, null, function* () {
internal/bundler_tests/snapshots/snapshots_lower.txt:1625:        yield* __yieldStar(x);
internal/bundler_tests/snapshots/snapshots_lower.txt:1628:          for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield new __await(iter.next())).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1642:          for (var iter2 = __forAwait(y), more2, temp2, error2; more2 = !(temp2 = yield new __await(iter2.next())).done; more2 = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1675:    return __asyncGenerator(this, null, function* () {
internal/bundler_tests/snapshots/snapshots_lower.txt:1680:        yield* __yieldStar(x);
internal/bundler_tests/snapshots/snapshots_lower.txt:1683:          for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield new __await(iter.next())).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1697:          for (var iter2 = __forAwait(y), more2, temp2, error2; more2 = !(temp2 = yield new __await(iter2.next())).done; more2 = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:2077:      for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield iter.next()).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:2094:      for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield iter.next()).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:2111:      for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield iter.next()).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:2128:      for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield iter.next()).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:2145:      label: for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield iter.next()).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:2162:      label: for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield iter.next()).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:2185:      for (var iter = __forAwait(y), more, temp, error; more = !(temp = await iter.next()).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:2202:      for (var iter = __forAwait(y), more, temp, error; more = !(temp = await iter.next()).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:2219:      for (var iter = __forAwait(y), more, temp, error; more = !(temp = await iter.next()).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:2236:      for (var iter = __forAwait(y), more, temp, error; more = !(temp = await iter.next()).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:2253:      label: for (var iter = __forAwait(y), more, temp, error; more = !(temp = await iter.next()).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:2270:      label: for (var iter = __forAwait(y), more, temp, error; more = !(temp = await iter.next()).done; more = false) {
internal/runtime/runtime.go:38:	//   __asyncGenerator
internal/runtime/runtime.go:412:		// These help for lowering async generator functions
internal/runtime/runtime.go:417:		export var __asyncGenerator = (__this, __arguments, generator) => {
internal/runtime/runtime.go:437:		export var __yieldStar = value => {
internal/runtime/runtime.go:468:		// This helps for lowering for-await loops
internal/runtime/runtime.go:469:		export var __forAwait = (obj, it, method) =>
internal/js_parser/js_parser.go:7751:					// If for-await loops aren't supported, then we only support lowering
internal/js_parser/js_parser.go:7753:					// cannot lower for-await loops.
internal/js_parser/js_parser.go:10832:			// Returning undefined is implicit except when inside an async generator
internal/js_parser/js_parser.go:11072:		// Lower "for await" if it's unsupported if it's in a lowered async generator
internal/js_parser/js_parser.go:14765:		// "yield* x" turns into "yield* __yieldStar(x)" when lowering async generator functions
internal/js_parser/js_parser.go:14767:			e.ValueOrNil = p.callRuntime(expr.Loc, "__yieldStar", []js_ast.Expr{e.ValueOrNil})
internal/js_parser/js_parser_lower.go:73:		name = "async generator functions"
internal/js_parser/js_parser_lower.go:76:		name = "for-await loops"
internal/js_parser/js_parser_lower.go:343:	// Lower async functions and async generator functions
internal/js_parser/js_parser_lower.go:478:			// "async function* foo(a, b) { stmts }" => "function foo(a, b) { return __asyncGenerator(this, null, function* () { stmts }) }"
internal/js_parser/js_parser_lower.go:479:			name = "__asyncGenerator"
internal/js_parser/js_parser_lower.go:1050:	// "await x" turns into "yield __await(x)" when lowering async generator functions
internal/js_parser/js_parser_lower.go:1078:	//     for (var iter = __forAwait(y), more, temp, error; more = !(temp = await iter.next()).done; more = false) {
internal/js_parser/js_parser_lower.go:1166:						ValueOrNil: p.callRuntime(loc, "__forAwait", []js_ast.Expr{loop.Value})},
internal/js_parser/js_parser_lower_test.go:812:	// This is ok because for-await can be lowered to await
internal/js_parser/js_parser_lower_test.go:815:	// This is ok because for-await can be lowered to yield
internal/js_parser/js_parser_lower_test.go:818:	// This is not ok because for-await can't be lowered
internal/js_parser/js_parser_lower_test.go:821:			"<stdin>: ERROR: Transforming for-await loops to the configured target environment is not supported yet\n"
internal/js_parser/js_parser_lower_test.go:824:	// Can't use for-await at the top-level without top-level await
shell
sed -n '1,260p' internal/runtime/runtime.go
output
Chunk ID: 06fdd5
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 2542
Output:
package runtime

// This is esbuild's runtime code. It contains helper functions that are
// automatically injected into output files to implement certain features. For
// example, the "**" operator is replaced with a call to "__pow" when targeting
// ES2015. Tree shaking automatically removes unused code from the runtime.

import (
	"[code-host]/evanw/esbuild/internal/compat"
	"[code-host]/evanw/esbuild/internal/logger"
)

// The runtime source is always at a special index. The index is always zero
// but this constant is always used instead to improve readability and ensure
// all code that references this index can be discovered easily.
const SourceIndex = uint32(0)

func Source(unsupportedJSFeatures compat.JSFeature) logger.Source {
	// Note: These helper functions used to be named similar things to the helper
	// functions from the TypeScript compiler. However, people sometimes use these
	// two projects in combination and TypeScript's implementation of these helpers
	// causes name collisions. Some examples:
	//
	// * The "tslib" library will overwrite esbuild's helper functions if the bundled
	//   code is run in the global scope: https://[code-host]/evanw/esbuild/issues/1102
	//
	// * Running the TypeScript compiler on esbuild's output to convert ES6 to ES5
	//   will also overwrite esbuild's helper functions because TypeScript doesn't
	//   change the names of its helper functions to avoid name collisions:
	//   https://[code-host]/microsoft/TypeScript/issues/43296
	//
	// These can both be considered bugs in TypeScript. However, they are unlikely
	// to be fixed and it's simplest to just avoid using the same names to avoid
	// these bugs. Forbidden names (from "tslib"):
	//
	//   __assign
	//   __asyncDelegator
	//   __asyncGenerator
	//   __asyncValues
	//   __await
	//   __awaiter
	//   __classPrivateFieldGet
	//   __classPrivateFieldSet
	//   __createBinding
	//   __decorate
	//   __exportStar
	//   __extends
	//   __generator
	//   __importDefault
	//   __importStar
	//   __makeTemplateObject
	//   __metadata
	//   __param
	//   __read
	//   __rest
	//   __spread
	//   __spreadArray
	//   __spreadArrays
	//   __values
	//
	// Note: The "__objRest" function has a for-of loop which requires ES6, but
	// transforming destructuring to ES5 isn't even supported so it's ok.
	text := `
		var __create = Object.create
		var __freeze = Object.freeze
		var __defProp = Object.defineProperty
		var __defProps = Object.defineProperties
		var __getOwnPropDesc = Object.getOwnPropertyDescriptor // Note: can return "undefined" due to a Safari bug
		var __getOwnPropDescs = Object.getOwnPropertyDescriptors
		var __getOwnPropNames = Object.getOwnPropertyNames
		var __getOwnPropSymbols = Object.getOwnPropertySymbols
		var __getProtoOf = Object.getPrototypeOf
		var __hasOwnProp = Object.prototype.hasOwnProperty
		var __propIsEnum = Object.prototype.propertyIsEnumerable
		var __reflectGet = Reflect.get
		var __reflectSet = Reflect.set

		var __knownSymbol = (name, symbol) => (symbol = Symbol[name]) ? symbol : Symbol.for('Symbol.' + name)
		var __typeError = msg => { throw TypeError(msg) }

		export var __pow = Math.pow

		var __defNormalProp = (obj, key, value) => key in obj
			? __defProp(obj, key, {enumerable: true, configurable: true, writable: true, value})
			: obj[key] = value

		export var __spreadValues = (a, b) => {
			for (var prop in b ||= {})
				if (__hasOwnProp.call(b, prop))
					__defNormalProp(a, prop, b[prop])
			if (__getOwnPropSymbols)
		`

	// Avoid "of" when not using ES6
	if !unsupportedJSFeatures.Has(compat.ForOf) {
		text += `
				for (var prop of __getOwnPropSymbols(b)) {
		`
	} else {
		text += `
				for (var props = __getOwnPropSymbols(b), i = 0, n = props.length, prop; i < n; i++) {
					prop = props[i]
		`
	}

	text += `
					if (__propIsEnum.call(b, prop))
						__defNormalProp(a, prop, b[prop])
				}
			return a
		}
		export var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b))

		// Update the "name" property on the function or class for "--keep-names"
		export var __name = (target, value) => __defProp(target, 'name', { value, configurable: true })

		// This fallback "require" function exists so that "typeof require" can
		// naturally be "function" even in non-CommonJS environments since esbuild
		// emulates a CommonJS environment (issue #1202). However, people want this
		// shim to fall back to "globalThis.require" even if it's defined later
		// (including property accesses such as "require.resolve") so we need to
		// use a proxy (issue #1614).
		export var __require =
			/* @__PURE__ */ (x =>
				typeof require !== 'undefined' ? require :
				typeof Proxy !== 'undefined' ? new Proxy(x, {
					get: (a, b) => (typeof require !== 'undefined' ? require : a)[b]
				}) : x
			)(function(x) {
				if (typeof require !== 'undefined') return require.apply(this, arguments)
				throw Error('Dynamic require of "' + x + '" is not supported')
			})

		// This is used for glob imports
		export var __glob = map => path => {
			var fn = map[path]
			if (fn) return fn()
			throw new Error('Module not found in bundle: ' + path)
		}

		// For object rest patterns
		export var __restKey = key => typeof key === 'symbol' ? key : key + ''
		export var __objRest = (source, exclude) => {
			var target = {}
			for (var prop in source)
				if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
					target[prop] = source[prop]
			if (source != null && __getOwnPropSymbols)
	`

	// Avoid "of" when not using ES6
	if !unsupportedJSFeatures.Has(compat.ForOf) {
		text += `
				for (var prop of __getOwnPropSymbols(source)) {
		`
	} else {
		text += `
				for (var props = __getOwnPropSymbols(source), i = 0, n = props.length, prop; i < n; i++) {
					prop = props[i]
		`
	}

	text += `
					if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
						target[prop] = source[prop]
				}
			return target
		}

		// This is for lazily-initialized ESM code. This has two implementations, a
		// compact one for minified code and a verbose one that generates friendly
		// names in V8's profiler and in stack traces.
		export var __esm = (fn, res) => function __init() {
			return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res
		}
		export var __esmMin = (fn, res) => () => (fn && (res = fn(fn = 0)), res)

		// Wraps a CommonJS closure and returns a require() function. This has two
		// implementations, a compact one for minified code and a verbose one that
		// generates friendly names in V8's profiler and in stack traces.
		export var __commonJS = (cb, mod) => function __require() {
			return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = {exports: {}}).exports, mod), mod.exports
		}
		export var __commonJSMin = (cb, mod) => () => (mod || cb((mod = {exports: {}}).exports, mod), mod.exports)

		// Used to implement ESM exports both for "require()" and "import * as"
		export var __export = (target, all) => {
			for (var name in all)
				__defProp(target, name, { get: all[name], enumerable: true })
		}

		var __copyProps = (to, from, except, desc) => {
			if (from && typeof from === 'object' || typeof from === 'function')
	`

	// Avoid "let" when not using ES6
	if !unsupportedJSFeatures.Has(compat.ForOf) && !unsupportedJSFeatures.Has(compat.ConstAndLet) {
		text += `
				for (let key of __getOwnPropNames(from))
					if (!__hasOwnProp.call(to, key) && key !== except)
						__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable })
		`
	} else {
		text += `
				for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
					key = keys[i]
					if (!__hasOwnProp.call(to, key) && key !== except)
						__defProp(to, key, { get: (k => from[k]).bind(null, key), enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable })
				}
		`
	}

	text += `
			return to
		}

		// This is used to implement "export * from" statements. It copies properties
		// from the imported module to the current module's ESM export object. If the
		// current module is an entry point and the target format is CommonJS, we
		// also copy the properties to "module.exports" in addition to our module's
		// internal ESM export object.
		export var __reExport = (target, mod, secondTarget) => (
			__copyProps(target, mod, 'default'),
			secondTarget && __copyProps(secondTarget, mod, 'default')
		)

		// Converts the module from CommonJS to ESM. When in node mode (i.e. in an
		// ".mjs" file, package.json has "type: module", or the "__esModule" export
		// in the CommonJS file is falsy or missing), the "default" property is
		// overridden to point to the original CommonJS exports object instead.
		export var __toESM = (mod, isNodeMode, target) => (
			target = mod != null ? __create(__getProtoOf(mod)) : {},
			__copyProps(
				// If the importer is in node compatibility mode or this is not an ESM
				// file that has been converted to a CommonJS file using a Babel-
				// compatible transform (i.e. "__esModule" has not been set), then set
				// "default" to the CommonJS "module.exports" for node compatibility.
				isNodeMode || !mod || !mod.__esModule
					? __defProp(target, 'default', { value: mod, enumerable: true })
					: target,
				mod)
		)

		// Converts the module from ESM to CommonJS. This clones the input module
		// object with the addition of a non-enumerable "__esModule" property set
		// to "true", which overwrites any existing export named "__esModule".
		export var __toCommonJS = mod => __copyProps(__defProp({}, '__esModule', { value: true }), mod)

		// For TypeScript experimental decorators
		// - kind === undefined: class
		// - kind === 1: method, parameter
		// - kind === 2: field
		export var __decorateClass = (decorators, target, key, kind) => {
			var result = kind > 1 ? void 0 : kind ? __getOwnPropDesc(target, key) : target
			for (var i = decorators.length - 1, decorator; i >= 0; i--)
				if (decorator = decorators[i])
					result = (kind ? decorator(target, key, result) : decorator(result)) || result
			if (kind && result) __defProp(target, key, result)
			return result
		}
shell
git status --short
output
Chunk ID: c59765
Wall time: 0.0000 seconds
Process exited with code 128
Original token count: 18
Output:
fatal: not a git repository (or any of the parent directories): .git
This looks like esbuild’s code layout, but `/app` is not a git worktree, so I’ll avoid relying on git diffs. The relevant helper is in `internal/runtime/runtime.go`; I’m narrowing to that helper and the parser/runtime tests now.
shell
sed -n '400,490p' internal/runtime/runtime.go
output
Chunk ID: 46a2c3
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 752
Output:
				var rejected = value => {
					try {
						step(generator.throw(value))
					} catch (e) {
						reject(e)
					}
				}
				var step = x => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected)
				step((generator = generator.apply(__this, __arguments)).next())
			})
		}

		// These help for lowering async generator functions
		export var __await = function (promise, isYieldStar) {
			this[0] = promise
			this[1] = isYieldStar
		}
		export var __asyncGenerator = (__this, __arguments, generator) => {
			var resume = (k, v, yes, no) => {
				try {
					var x = generator[k](v), isAwait = (v = x.value) instanceof __await, done = x.done
					Promise.resolve(isAwait ? v[0] : v)
						.then(y => isAwait
							? resume(k === 'return' ? k : 'next', v[1] ? { done: y.done, value: y.value } : y, yes, no)
							: yes({ value: y, done }))
						.catch(e => resume('throw', e, yes, no))
				} catch (e) {
					no(e)
				}
			}, method = k => it[k] = x => new Promise((yes, no) => resume(k, x, yes, no)), it = {}
			return generator = generator.apply(__this, __arguments),
				it[__knownSymbol('asyncIterator')] = () => it,
				method('next'),
				method('throw'),
				method('return'),
				it
		}
		export var __yieldStar = value => {
			var obj = value[__knownSymbol('asyncIterator')], isAwait = false, method, it = {}
			if (obj == null) {
				obj = value[__knownSymbol('iterator')]()
				method = k => it[k] = x => obj[k](x)
			} else {
				obj = obj.call(value)
				method = k => it[k] = v => {
					if (isAwait) {
						isAwait = false
						if (k === 'throw') throw v
						return v
					}
					isAwait = true
					return {
						done: false,
						value: new __await(new Promise(resolve => {
							var x = obj[k](v)
							if (!(x instanceof Object)) __typeError('Object expected')
							resolve(x)
						}), 1),
					}
				}
			}
			return it[__knownSymbol('iterator')] = () => it,
				method('next'),
				'throw' in obj ? method('throw') : it.throw = x => { throw x },
				'return' in obj && method('return'),
				it
		}

		// This helps for lowering for-await loops
		export var __forAwait = (obj, it, method) =>
			(it = obj[__knownSymbol('asyncIterator')])
				? it.call(obj)
				: (obj = obj[__knownSymbol('iterator')](),
					it = {},
					method = (key, fn) =>
						(fn = obj[key]) && (it[key] = arg =>
							new Promise((yes, no, done) => (
								arg = fn.call(obj, arg),
								done = arg.done,
								Promise.resolve(arg.value)
									.then(value => yes({ value, done }), no)
							))),
					method('next'),
					method('return'),
					it)

		// This is for the "binary" loader (custom code is ~2x faster than "atob")
		export var __toBinaryNode = Uint8Array.fromBase64 || (base64 => new Uint8Array(Buffer.from(base64, 'base64')))
		export var __toBinary = Uint8Array.fromBase64 || /* @__PURE__ */ (() => {
			var table = new Uint8Array(128)
			for (var i = 0; i < 64; i++) table[i < 26 ? i + 65 : i < 52 ? i + 71 : i < 62 ? i - 4 : i * 4 - 205] = i
shell
rg -n "asyncGenerator|yieldStar|forAwait|AsyncGenerator|ForAwait" internal/*_tests internal cmd
output
Chunk ID: f4a46c
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 6027
Output:
internal/bundler_tests/bundler_lower_test.go:2343:func TestLowerForAwait2017(t *testing.T) {
internal/bundler_tests/bundler_lower_test.go:2366:func TestLowerForAwait2015(t *testing.T) {
internal/bundler_tests/bundler_lower_test.go:2998:func TestLowerAsyncGenerator(t *testing.T) {
internal/bundler_tests/bundler_lower_test.go:3053:			UnsupportedJSFeatures: compat.AsyncGenerator,
internal/bundler_tests/bundler_lower_test.go:3058:func TestLowerAsyncGeneratorNoAwait(t *testing.T) {
internal/bundler_tests/bundler_lower_test.go:3113:			UnsupportedJSFeatures: compat.AsyncGenerator | compat.AsyncAwait,
internal/bundler_tests/bundler_lower_test.go:3148:func TestForAwaitWithOptionalCatchIssue4378(t *testing.T) {
internal/bundler_tests/bundler_lower_test.go:3161:			UnsupportedJSFeatures: compat.ForAwait,
internal/bundler_tests/bundler_lower_test.go:2343:func TestLowerForAwait2017(t *testing.T) {
internal/bundler_tests/bundler_lower_test.go:2366:func TestLowerForAwait2015(t *testing.T) {
internal/bundler_tests/bundler_lower_test.go:2998:func TestLowerAsyncGenerator(t *testing.T) {
internal/bundler_tests/bundler_lower_test.go:3053:			UnsupportedJSFeatures: compat.AsyncGenerator,
internal/bundler_tests/bundler_lower_test.go:3058:func TestLowerAsyncGeneratorNoAwait(t *testing.T) {
internal/bundler_tests/bundler_lower_test.go:3113:			UnsupportedJSFeatures: compat.AsyncGenerator | compat.AsyncAwait,
internal/bundler_tests/bundler_lower_test.go:3148:func TestForAwaitWithOptionalCatchIssue4378(t *testing.T) {
internal/bundler_tests/bundler_lower_test.go:3161:			UnsupportedJSFeatures: compat.ForAwait,
internal/bundler_tests/snapshots/snapshots_lower.txt:20:TestForAwaitWithOptionalCatchIssue4378
internal/bundler_tests/snapshots/snapshots_lower.txt:24:    for (var iter = __forAwait(b), more, temp, error; more = !(temp = await iter.next()).done; more = !1) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1177:TestLowerAsyncGenerator
internal/bundler_tests/snapshots/snapshots_lower.txt:1180:  return __asyncGenerator(this, null, function* () {
internal/bundler_tests/snapshots/snapshots_lower.txt:1185:      yield* __yieldStar(x);
internal/bundler_tests/snapshots/snapshots_lower.txt:1188:        for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield new __await(iter.next())).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1202:        for (var iter2 = __forAwait(y), more2, temp2, error2; more2 = !(temp2 = yield new __await(iter2.next())).done; more2 = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1233:  return __asyncGenerator(this, null, function* () {
internal/bundler_tests/snapshots/snapshots_lower.txt:1238:      yield* __yieldStar(x);
internal/bundler_tests/snapshots/snapshots_lower.txt:1241:        for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield new __await(iter.next())).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1255:        for (var iter2 = __forAwait(y), more2, temp2, error2; more2 = !(temp2 = yield new __await(iter2.next())).done; more2 = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1286:  return __asyncGenerator(this, null, function* () {
internal/bundler_tests/snapshots/snapshots_lower.txt:1291:      yield* __yieldStar(x);
internal/bundler_tests/snapshots/snapshots_lower.txt:1294:        for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield new __await(iter.next())).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1308:        for (var iter2 = __forAwait(y), more2, temp2, error2; more2 = !(temp2 = yield new __await(iter2.next())).done; more2 = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1340:    return __asyncGenerator(this, null, function* () {
internal/bundler_tests/snapshots/snapshots_lower.txt:1345:        yield* __yieldStar(x);
internal/bundler_tests/snapshots/snapshots_lower.txt:1348:          for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield new __await(iter.next())).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1362:          for (var iter2 = __forAwait(y), more2, temp2, error2; more2 = !(temp2 = yield new __await(iter2.next())).done; more2 = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1395:    return __asyncGenerator(this, null, function* () {
internal/bundler_tests/snapshots/snapshots_lower.txt:1400:        yield* __yieldStar(x);
internal/bundler_tests/snapshots/snapshots_lower.txt:1403:          for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield new __await(iter.next())).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1417:          for (var iter2 = __forAwait(y), more2, temp2, error2; more2 = !(temp2 = yield new __await(iter2.next())).done; more2 = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1457:TestLowerAsyncGeneratorNoAwait
internal/bundler_tests/snapshots/snapshots_lower.txt:1460:  return __asyncGenerator(this, null, function* () {
internal/bundler_tests/snapshots/snapshots_lower.txt:1465:      yield* __yieldStar(x);
internal/bundler_tests/snapshots/snapshots_lower.txt:1468:        for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield new __await(iter.next())).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1482:        for (var iter2 = __forAwait(y), more2, temp2, error2; more2 = !(temp2 = yield new __await(iter2.next())).done; more2 = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1513:  return __asyncGenerator(this, null, function* () {
internal/bundler_tests/snapshots/snapshots_lower.txt:1518:      yield* __yieldStar(x);
internal/bundler_tests/snapshots/snapshots_lower.txt:1521:        for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield new __await(iter.next())).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1535:        for (var iter2 = __forAwait(y), more2, temp2, error2; more2 = !(temp2 = yield new __await(iter2.next())).done; more2 = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1566:  return __asyncGenerator(this, null, function* () {
internal/bundler_tests/snapshots/snapshots_lower.txt:1571:      yield* __yieldStar(x);
internal/bundler_tests/snapshots/snapshots_lower.txt:1574:        for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield new __await(iter.next())).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1588:        for (var iter2 = __forAwait(y), more2, temp2, error2; more2 = !(temp2 = yield new __await(iter2.next())).done; more2 = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1620:    return __asyncGenerator(this, null, function* () {
internal/bundler_tests/snapshots/snapshots_lower.txt:1625:        yield* __yieldStar(x);
internal/bundler_tests/snapshots/snapshots_lower.txt:1628:          for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield new __await(iter.next())).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1642:          for (var iter2 = __forAwait(y), more2, temp2, error2; more2 = !(temp2 = yield new __await(iter2.next())).done; more2 = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1675:    return __asyncGenerator(this, null, function* () {
internal/bundler_tests/snapshots/snapshots_lower.txt:1680:        yield* __yieldStar(x);
internal/bundler_tests/snapshots/snapshots_lower.txt:1683:          for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield new __await(iter.next())).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1697:          for (var iter2 = __forAwait(y), more2, temp2, error2; more2 = !(temp2 = yield new __await(iter2.next())).done; more2 = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:2072:TestLowerForAwait2015
internal/bundler_tests/snapshots/snapshots_lower.txt:2077:      for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield iter.next()).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:2094:      for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield iter.next()).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:2111:      for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield iter.next()).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:2128:      for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield iter.next()).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:2145:      label: for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield iter.next()).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:2162:      label: for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield iter.next()).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:2180:TestLowerForAwait2017
internal/bundler_tests/snapshots/snapshots_lower.txt:2185:      for (var iter = __forAwait(y), more, temp, error; more = !(temp = await iter.next()).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:2202:      for (var iter = __forAwait(y), more, temp, error; more = !(temp = await iter.next()).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:2219:      for (var iter = __forAwait(y), more, temp, error; more = !(temp = await iter.next()).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:2236:      for (var iter = __forAwait(y), more, temp, error; more = !(temp = await iter.next()).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:2253:      label: for (var iter = __forAwait(y), more, temp, error; more = !(temp = await iter.next()).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:2270:      label: for (var iter = __forAwait(y), more, temp, error; more = !(temp = await iter.next()).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:20:TestForAwaitWithOptionalCatchIssue4378
internal/bundler_tests/snapshots/snapshots_lower.txt:24:    for (var iter = __forAwait(b), more, temp, error; more = !(temp = await iter.next()).done; more = !1) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1177:TestLowerAsyncGenerator
internal/bundler_tests/snapshots/snapshots_lower.txt:1180:  return __asyncGenerator(this, null, function* () {
internal/bundler_tests/snapshots/snapshots_lower.txt:1185:      yield* __yieldStar(x);
internal/bundler_tests/snapshots/snapshots_lower.txt:1188:        for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield new __await(iter.next())).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1202:        for (var iter2 = __forAwait(y), more2, temp2, error2; more2 = !(temp2 = yield new __await(iter2.next())).done; more2 = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1233:  return __asyncGenerator(this, null, function* () {
internal/bundler_tests/snapshots/snapshots_lower.txt:1238:      yield* __yieldStar(x);
internal/bundler_tests/snapshots/snapshots_lower.txt:1241:        for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield new __await(iter.next())).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1255:        for (var iter2 = __forAwait(y), more2, temp2, error2; more2 = !(temp2 = yield new __await(iter2.next())).done; more2 = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1286:  return __asyncGenerator(this, null, function* () {
internal/bundler_tests/snapshots/snapshots_lower.txt:1291:      yield* __yieldStar(x);
internal/bundler_tests/snapshots/snapshots_lower.txt:1294:        for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield new __await(iter.next())).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1308:        for (var iter2 = __forAwait(y), more2, temp2, error2; more2 = !(temp2 = yield new __await(iter2.next())).done; more2 = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1340:    return __asyncGenerator(this, null, function* () {
internal/bundler_tests/snapshots/snapshots_lower.txt:1345:        yield* __yieldStar(x);
internal/bundler_tests/snapshots/snapshots_lower.txt:1348:          for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield new __await(iter.next())).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1362:          for (var iter2 = __forAwait(y), more2, temp2, error2; more2 = !(temp2 = yield new __await(iter2.next())).done; more2 = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1395:    return __asyncGenerator(this, null, function* () {
internal/bundler_tests/snapshots/snapshots_lower.txt:1400:        yield* __yieldStar(x);
internal/bundler_tests/snapshots/snapshots_lower.txt:1403:          for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield new __await(iter.next())).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1417:          for (var iter2 = __forAwait(y), more2, temp2, error2; more2 = !(temp2 = yield new __await(iter2.next())).done; more2 = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1457:TestLowerAsyncGeneratorNoAwait
internal/bundler_tests/snapshots/snapshots_lower.txt:1460:  return __asyncGenerator(this, null, function* () {
internal/bundler_tests/snapshots/snapshots_lower.txt:1465:      yield* __yieldStar(x);
internal/bundler_tests/snapshots/snapshots_lower.txt:1468:        for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield new __await(iter.next())).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1482:        for (var iter2 = __forAwait(y), more2, temp2, error2; more2 = !(temp2 = yield new __await(iter2.next())).done; more2 = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1513:  return __asyncGenerator(this, null, function* () {
internal/bundler_tests/snapshots/snapshots_lower.txt:1518:      yield* __yieldStar(x);
internal/bundler_tests/snapshots/snapshots_lower.txt:1521:        for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield new __await(iter.next())).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1535:        for (var iter2 = __forAwait(y), more2, temp2, error2; more2 = !(temp2 = yield new __await(iter2.next())).done; more2 = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1566:  return __asyncGenerator(this, null, function* () {
internal/bundler_tests/snapshots/snapshots_lower.txt:1571:      yield* __yieldStar(x);
internal/bundler_tests/snapshots/snapshots_lower.txt:1574:        for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield new __await(iter.next())).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1588:        for (var iter2 = __forAwait(y), more2, temp2, error2; more2 = !(temp2 = yield new __await(iter2.next())).done; more2 = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1620:    return __asyncGenerator(this, null, function* () {
internal/bundler_tests/snapshots/snapshots_lower.txt:1625:        yield* __yieldStar(x);
internal/bundler_tests/snapshots/snapshots_lower.txt:1628:          for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield new __await(iter.next())).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1642:          for (var iter2 = __forAwait(y), more2, temp2, error2; more2 = !(temp2 = yield new __await(iter2.next())).done; more2 = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1675:    return __asyncGenerator(this, null, function* () {
internal/bundler_tests/snapshots/snapshots_lower.txt:1680:        yield* __yieldStar(x);
internal/bundler_tests/snapshots/snapshots_lower.txt:1683:          for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield new __await(iter.next())).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:1697:          for (var iter2 = __forAwait(y), more2, temp2, error2; more2 = !(temp2 = yield new __await(iter2.next())).done; more2 = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:2072:TestLowerForAwait2015
internal/bundler_tests/snapshots/snapshots_lower.txt:2077:      for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield iter.next()).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:2094:      for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield iter.next()).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:2111:      for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield iter.next()).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:2128:      for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield iter.next()).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:2145:      label: for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield iter.next()).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:2162:      label: for (var iter = __forAwait(y), more, temp, error; more = !(temp = yield iter.next()).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:2180:TestLowerForAwait2017
internal/bundler_tests/snapshots/snapshots_lower.txt:2185:      for (var iter = __forAwait(y), more, temp, error; more = !(temp = await iter.next()).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:2202:      for (var iter = __forAwait(y), more, temp, error; more = !(temp = await iter.next()).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:2219:      for (var iter = __forAwait(y), more, temp, error; more = !(temp = await iter.next()).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:2236:      for (var iter = __forAwait(y), more, temp, error; more = !(temp = await iter.next()).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:2253:      label: for (var iter = __forAwait(y), more, temp, error; more = !(temp = await iter.next()).done; more = false) {
internal/bundler_tests/snapshots/snapshots_lower.txt:2270:      label: for (var iter = __forAwait(y), more, temp, error; more = !(temp = await iter.next()).done; more = false) {
internal/runtime/runtime.go:38:	//   __asyncGenerator
internal/runtime/runtime.go:417:		export var __asyncGenerator = (__this, __arguments, generator) => {
internal/runtime/runtime.go:437:		export var __yieldStar = value => {
internal/runtime/runtime.go:469:		export var __forAwait = (obj, it, method) =>
internal/js_printer/js_printer.go:1998:	isInsideForAwait
internal/js_printer/js_printer.go:3150:			((flags&isFollowedByOf) != 0 && (flags&isInsideForAwait) == 0 && name == "async"))
internal/js_printer/js_printer.go:4466:			flags |= isInsideForAwait
internal/js_parser/js_parser.go:3023:					if !isArrowFn && (flags&exprFlagForAwaitLoopInit) == 0 && p.lexer.Raw() == "of" {
internal/js_parser/js_parser.go:3489:	exprFlagForAwaitLoopInit
internal/js_parser/js_parser.go:4995:		if opts.isForAwaitLoopInit {
internal/js_parser/js_parser.go:4996:			flags |= exprFlagForAwaitLoopInit
internal/js_parser/js_parser.go:7044:	isForAwaitLoopInit      bool
internal/js_parser/js_parser.go:7754:					p.markSyntaxFeature(compat.ForAwait, awaitRange)
internal/js_parser/js_parser.go:7797:				isForAwaitLoopInit: awaitRange.Len > 0,
internal/js_parser/js_parser.go:10649:			if loop, ok := try.Block.Stmts[0].Data.(*js_ast.SFor); ok && loop.IsLoweredForAwait {
internal/js_parser/js_parser.go:11062:					(p.options.unsupportedJSFeatures.Has(compat.AsyncGenerator) && p.fnOrArrowDataVisit.isGenerator) {
internal/js_parser/js_parser.go:11073:		if s.Await.Len > 0 && (p.options.unsupportedJSFeatures.Has(compat.ForAwait) ||
internal/js_parser/js_parser.go:11074:			(p.options.unsupportedJSFeatures.Has(compat.AsyncGenerator) && p.fnOrArrowDataVisit.isGenerator)) {
internal/js_parser/js_parser.go:11075:			return p.lowerForAwaitLoop(stmt.Loc, s, stmts)
internal/js_parser/js_parser.go:14765:		// "yield* x" turns into "yield* __yieldStar(x)" when lowering async generator functions
internal/js_parser/js_parser.go:14766:		if e.IsStar && p.options.unsupportedJSFeatures.Has(compat.AsyncGenerator) && p.fnOrArrowDataVisit.isGenerator {
internal/js_parser/js_parser.go:14767:			e.ValueOrNil = p.callRuntime(expr.Loc, "__yieldStar", []js_ast.Expr{e.ValueOrNil})
internal/js_parser/js_parser_lower.go:72:	case compat.AsyncGenerator:
internal/js_parser/js_parser_lower.go:75:	case compat.ForAwait:
internal/js_parser/js_parser_lower.go:249:		feature = compat.AsyncGenerator
internal/js_parser/js_parser_lower.go:344:	if *isAsync && (p.options.unsupportedJSFeatures.Has(compat.AsyncAwait) || (isGenerator != nil && *isGenerator && p.options.unsupportedJSFeatures.Has(compat.AsyncGenerator))) {
internal/js_parser/js_parser_lower.go:478:			// "async function* foo(a, b) { stmts }" => "function foo(a, b) { return __asyncGenerator(this, null, function* () { stmts }) }"
internal/js_parser/js_parser_lower.go:479:			name = "__asyncGenerator"
internal/js_parser/js_parser_lower.go:1051:	if p.fnOrArrowDataVisit.isGenerator && (p.options.unsupportedJSFeatures.Has(compat.AsyncAwait) || p.options.unsupportedJSFeatures.Has(compat.AsyncGenerator)) {
internal/js_parser/js_parser_lower.go:1070:func (p *parser) lowerForAwaitLoop(loc logger.Loc, loop *js_ast.SForOf, stmts []js_ast.Stmt) []js_ast.Stmt {
internal/js_parser/js_parser_lower.go:1078:	//     for (var iter = __forAwait(y), more, temp, error; more = !(temp = await iter.next()).done; more = false) {
internal/js_parser/js_parser_lower.go:1163:				IsLoweredForAwait: true,
internal/js_parser/js_parser_lower.go:1166:						ValueOrNil: p.callRuntime(loc, "__forAwait", []js_ast.Expr{loop.Value})},
internal/js_parser/js_parser_lower.go:1892:					(p.options.unsupportedJSFeatures.Has(compat.AsyncGenerator) && p.fnOrArrowDataVisit.isGenerator)))) {
internal/compat/js_table.go:67:	AsyncGenerator
internal/compat/js_table.go:87:	ForAwait
internal/compat/js_table.go:131:	"async-generator":                   AsyncGenerator,
internal/compat/js_table.go:151:	"for-await":                         ForAwait,
internal/compat/js_table.go:249:	AsyncGenerator: {
internal/compat/js_table.go:506:	ForAwait: {
internal/bundler/bundler.go:2965:	fixInvalidUnsupportedJSFeatureOverrides(options, compat.AsyncAwait, compat.AsyncGenerator|compat.ForAwait|compat.TopLevelAwait)
internal/bundler/bundler.go:2966:	fixInvalidUnsupportedJSFeatureOverrides(options, compat.Generator, compat.AsyncGenerator)
internal/js_ast/js_ast.go:1107:	IsLoweredForAwait bool
internal/js_parser/js_parser_lower_test.go:785:func TestAsyncGeneratorFns(t *testing.T) {
internal/js_parser/js_parser_lower_test.go:802:	expectParseErrorWithUnsupportedFeatures(t, compat.AsyncGenerator, "async function* gen() {}", err)
internal/js_parser/js_parser_lower_test.go:803:	expectParseErrorWithUnsupportedFeatures(t, compat.AsyncGenerator, "(async function* () {});", err)
internal/js_parser/js_parser_lower_test.go:804:	expectParseErrorWithUnsupportedFeatures(t, compat.AsyncGenerator, "({ async *foo() {} });", err)
internal/js_parser/js_parser_lower_test.go:807:func TestForAwait(t *testing.T) {
internal/js_parser/js_parser_lower_test.go:813:	expectParseErrorWithUnsupportedFeatures(t, compat.ForAwait|compat.Generator, "async function gen() { for await (x of y) ; }", err)
internal/js_parser/js_parser_lower_test.go:816:	expectParseErrorWithUnsupportedFeatures(t, compat.ForAwait|compat.AsyncAwait, "async function gen() { for await (x of y) ; }", err)
internal/js_parser/js_parser_lower_test.go:822:	expectParseErrorWithUnsupportedFeatures(t, compat.ForAwait|compat.AsyncAwait|compat.Generator, "async function gen() { for await (x of y) ; }", err)
shell
rg --files -g '*test.go' internal | sed -n '1,120p'
output
Chunk ID: 0d5f21
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 317
Output:
internal/bundler_tests/bundler_dce_test.go
internal/bundler_tests/bundler_glob_test.go
internal/bundler_tests/bundler_lower_test.go
internal/bundler_tests/bundler_importphase_test.go
internal/bundler_tests/bundler_importstar_ts_test.go
internal/bundler_tests/bundler_splitting_test.go
internal/bundler_tests/bundler_test.go
internal/bundler_tests/bundler_ts_test.go
internal/bundler_tests/bundler_loader_test.go
internal/bundler_tests/bundler_css_test.go
internal/bundler_tests/bundler_yarnpnp_test.go
internal/bundler_tests/bundler_packagejson_test.go
internal/bundler_tests/bundler_tsconfig_test.go
internal/bundler_tests/bundler_importstar_test.go
internal/bundler_tests/bundler_default_test.go
internal/resolver/yarnpnp_test.go
internal/js_lexer/js_lexer_test.go
internal/css_lexer/css_lexer_test.go
internal/js_parser/ts_parser_test.go
internal/js_parser/js_parser_test.go
internal/js_parser/js_parser_lower_test.go
internal/js_parser/json_parser_test.go
internal/helpers/dataurl_test.go
internal/compat/compat_test.go
internal/js_ast/js_ast_test.go
internal/runtime/runtime_test.go
internal/js_printer/js_printer_test.go
internal/css_parser/css_parser_test.go
internal/css_printer/css_printer_test.go
internal/fs/fs_mock_test.go
internal/logger/logger_test.go
The current `__asyncGenerator` has no iterator-method sequencing at all: every `next`/`throw`/`return` calls `generator[k]` immediately. That explains both reentrancy hazards and delegated `yield*` timing problems.
shell
sed -n '1,240p' internal/runtime/runtime_test.go
output
Chunk ID: b7d584
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 228
Output:
package runtime_test

import (
	"testing"

	"[code-host]/evanw/esbuild/internal/compat"
	"[code-host]/evanw/esbuild/internal/config"
	"[code-host]/evanw/esbuild/internal/js_parser"
	"[code-host]/evanw/esbuild/internal/logger"
	"[code-host]/evanw/esbuild/internal/runtime"
)

func TestUnsupportedFeatures(t *testing.T) {
	for key, feature := range compat.StringToJSFeature {
		t.Run(key, func(t *testing.T) {
			source := runtime.Source(feature)
			log := logger.NewDeferLog(logger.DeferLogAll, nil)

			js_parser.Parse(log, source, js_parser.OptionsFromConfig(&config.Options{
				UnsupportedJSFeatures: feature,
				TreeShaking:           true,
			}))

			if log.HasErrors() {
				msgs := "Internal error: failed to parse runtime:\n"
				for _, msg := range log.Done() {
					msgs += msg.String(logger.OutputOptions{IncludeSource: true}, logger.TerminalInfo{})
				}
				t.Fatal(msgs[:len(msgs)-1])
			}
		})
	}
}
shell
sed -n '2960,3175p' internal/bundler_tests/bundler_lower_test.go
output
Chunk ID: 449875
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 1405
Output:
			"/hoist-export-function-direct.js",
			"/hoist-export-function-indirect.js",
			"/hoist-export-default-class-name-unused.js",
			"/hoist-export-default-class-name-used.js",
			"/hoist-export-default-class-anonymous.js",
			"/hoist-export-default-function-name-unused.js",
			"/hoist-export-default-function-name-used.js",
			"/hoist-export-default-function-anonymous.js",
			"/hoist-export-default-expr.js",
		},
		options: config.Options{
			Mode:                  config.ModePassThrough,
			AbsOutputDir:          "/out",
			UnsupportedJSFeatures: compat.Using,
		},
	})
}

func TestLowerUsingInsideTSNamespace(t *testing.T) {
	lower_suite.expectBundled(t, bundled{
		files: map[string]string{
			"/entry.ts": `
				namespace ns {
					export let a = b
					using c = d
					export let e = f
				}
			`,
		},
		entryPaths: []string{"/entry.ts"},
		options: config.Options{
			Mode:                  config.ModePassThrough,
			AbsOutputDir:          "/out",
			UnsupportedJSFeatures: compat.Using,
		},
	})
}

func TestLowerAsyncGenerator(t *testing.T) {
	lower_suite.expectBundled(t, bundled{
		files: map[string]string{
			"/entry.ts": `
				async function* foo() {
					yield
					yield x
					yield *x
					await using x = await y
					for await (let x of y) {}
					for await (await using x of y) {}
				}
				foo = async function* () {
					yield
					yield x
					yield *x
					await using x = await y
					for await (let x of y) {}
					for await (await using x of y) {}
				}
				foo = { async *bar () {
					yield
					yield x
					yield *x
					await using x = await y
					for await (let x of y) {}
					for await (await using x of y) {}
				} }
				class Foo { async *bar () {
					yield
					yield x
					yield *x
					await using x = await y
					for await (let x of y) {}
					for await (await using x of y) {}
				} }
				Foo = class { async *bar () {
					yield
					yield x
					yield *x
					await using x = await y
					for await (let x of y) {}
					for await (await using x of y) {}
				} }
				async function bar() {
					await using x = await y
					for await (let x of y) {}
					for await (await using x of y) {}
				}
			`,
		},
		entryPaths: []string{"/entry.ts"},
		options: config.Options{
			Mode:                  config.ModePassThrough,
			AbsOutputDir:          "/out",
			UnsupportedJSFeatures: compat.AsyncGenerator,
		},
	})
}

func TestLowerAsyncGeneratorNoAwait(t *testing.T) {
	lower_suite.expectBundled(t, bundled{
		files: map[string]string{
			"/entry.ts": `
				async function* foo() {
					yield
					yield x
					yield *x
					await using x = await y
					for await (let x of y) {}
					for await (await using x of y) {}
				}
				foo = async function* () {
					yield
					yield x
					yield *x
					await using x = await y
					for await (let x of y) {}
					for await (await using x of y) {}
				}
				foo = { async *bar () {
					yield
					yield x
					yield *x
					await using x = await y
					for await (let x of y) {}
					for await (await using x of y) {}
				} }
				class Foo { async *bar () {
					yield
					yield x
					yield *x
					await using x = await y
					for await (let x of y) {}
					for await (await using x of y) {}
				} }
				Foo = class { async *bar () {
					yield
					yield x
					yield *x
					await using x = await y
					for await (let x of y) {}
					for await (await using x of y) {}
				} }
				async function bar() {
					await using x = await y
					for await (let x of y) {}
					for await (await using x of y) {}
				}
			`,
		},
		entryPaths: []string{"/entry.ts"},
		options: config.Options{
			Mode:                  config.ModePassThrough,
			AbsOutputDir:          "/out",
			UnsupportedJSFeatures: compat.AsyncGenerator | compat.AsyncAwait,
		},
	})
}

// https://[code-host]/evanw/esbuild/issues/3768
func TestJavaScriptDecoratorsBundleIssue3768(t *testing.T) {
	lower_suite.expectBundled(t, bundled{
		files: map[string]string{
			"/base-instance-method.js":   `class Foo { @dec foo() { return Foo } }`,
			"/base-instance-field.js":    `class Foo { @dec foo = Foo }`,
			"/base-instance-accessor.js": `class Foo { @dec accessor foo = Foo }`,

			"/base-static-method.js":   `class Foo { @dec static foo() { return Foo } }`,
			"/base-static-field.js":    `class Foo { @dec static foo = Foo }`,
			"/base-static-accessor.js": `class Foo { @dec static accessor foo = Foo }`,

			"/derived-instance-method.js":   `class Foo extends Bar { @dec foo() { return Foo } }`,
			"/derived-instance-field.js":    `class Foo extends Bar { @dec foo = Foo }`,
			"/derived-instance-accessor.js": `class Foo extends Bar { @dec accessor foo = Foo }`,

			"/derived-static-method.js":   `class Foo extends Bar { @dec static foo() { return Foo } }`,
			"/derived-static-field.js":    `class Foo extends Bar { @dec static foo = Foo }`,
			"/derived-static-accessor.js": `class Foo extends Bar { @dec static accessor foo = Foo }`,
		},
		entryPaths: []string{"/*"},
		options: config.Options{
			Mode:                  config.ModeBundle,
			AbsOutputDir:          "/out",
			UnsupportedJSFeatures: compat.Decorators,
		},
	})
}

// https://[code-host]/evanw/esbuild/issues/4378
func TestForAwaitWithOptionalCatchIssue4378(t *testing.T) {
	lower_suite.expectBundled(t, bundled{
		files: map[string]string{
			"/entry.js": `
				async function test(b) {
					for await (const a of b) a()
				}
			`,
		},
		entryPaths: []string{"/entry.js"},
		options: config.Options{
			Mode:                  config.ModePassThrough,
			AbsOutputFile:         "/out.js",
			UnsupportedJSFeatures: compat.ForAwait,
			MinifySyntax:          true,
		},
	})
}
shell
ls
output
Chunk ID: d5d3f2
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 16
Output:
LICENSE.md
cmd
esbuild
go.mod
go.sum
internal
pkg
version.txt
shell
rg -n "node|exec|Run|runtime" internal/*_tests internal/runtime internal/helpers
output
Chunk ID: 47f476
Wall time: 0.0001 seconds
Process exited with code 0
Original token count: 31195
Output:
Total output lines: 1088

internal/runtime/runtime.go:1:package runtime
internal/runtime/runtime.go:3:// This is esbuild's runtime code. It contains helper functions that are
internal/runtime/runtime.go:6:// ES2015. Tree shaking automatically removes unused code from the runtime.
internal/runtime/runtime.go:13:// The runtime source is always at a special index. The index is always zero
internal/runtime/runtime.go:27:	// * Running the TypeScript compiler on esbuild's output to convert ES6 to ES5
internal/runtime/runtime.go:227:		// Converts the module from CommonJS to ESM. When in node mode (i.e. in an
internal/runtime/runtime.go:234:				// If the importer is in node compatibility mode or this is not an ESM
internal/runtime/runtime.go:237:				// "default" to the CommonJS "module.exports" for node compatibility.
internal/runtime/runtime.go:543:		KeyPath:        logger.Path{Text: "<runtime>"},
internal/runtime/runtime.go:544:		PrettyPaths:    logger.PrettyPaths{Abs: "<runtime>", Rel: "<runtime>"},
internal/runtime/runtime.go:545:		IdentifierName: "runtime",
internal/runtime/runtime_test.go:1:package runtime_test
internal/runtime/runtime_test.go:10:	"[code-host]/evanw/esbuild/internal/runtime"
internal/runtime/runtime_test.go:15:		t.Run(key, func(t *testing.T) {
internal/runtime/runtime_test.go:16:			source := runtime.Source(feature)
internal/runtime/runtime_test.go:25:				msgs := "Internal error: failed to parse runtime:\n"
internal/bundler_tests/bundler_loader_test.go:1261:				AutomaticRuntime: true,
internal/bundler_tests/bundler_loader_test.go:1529:// to node's implicit "index.js" path resolution logic.
internal/bundler_tests/bundler_dce_test.go:22:			"~/project/node_modules/demo-pkg/index.js": `
internal/bundler_tests/bundler_dce_test.go:26:			"~/project/node_modules/demo-pkg/package.json": `
internal/bundler_tests/bundler_dce_test.go:47:			"~/project/node_modules/demo-pkg/index.js": `
internal/bundler_tests/bundler_dce_test.go:51:			"~/project/node_modules/demo-pkg/package.json": `
internal/bundler_tests/bundler_dce_test.go:72:			"~/project/node_modules/demo-pkg/index.js": `
internal/bundler_tests/bundler_dce_test.go:76:			"~/project/node_modules/demo-pkg/package.json": `
internal/bundler_tests/bundler_dce_test.go:97:			"~/project/node_modules/demo-pkg/index.js": `
internal/bundler_tests/bundler_dce_test.go:101:			"~/project/node_modules/demo-pkg/package.json": `
internal/bundler_tests/bundler_dce_test.go:122:			"~/project/node_modules/demo-pkg/index.js": `
internal/bundler_tests/bundler_dce_test.go:126:			"~/project/node_modules/demo-pkg/package.json": `
internal/bundler_tests/bundler_dce_test.go:147:			"~/project/node_modules/demo-pkg/index.js": `
internal/bundler_tests/bundler_dce_test.go:151:			"~/project/node_modules/demo-pkg/package.json": `
internal/bundler_tests/bundler_dce_test.go:173:			"~/project/node_modules/demo-pkg/index.js": `
internal/bundler_tests/bundler_dce_test.go:177:			"~/project/node_modules/demo-pkg/package.json": `
internal/bundler_tests/bundler_dce_test.go:188:		expectedScanLog: `Users/user/project/src/entry.js: WARNING: Ignoring this import because "Users/user/project/node_modules/demo-pkg/index.js" was marked as having no side effects
internal/bundler_tests/bundler_dce_test.go:189:Users/user/project/node_modules/demo-pkg/package.json: NOTE: "sideEffects" is false in the enclosing "package.json" file:
internal/bundler_tests/bundler_dce_test.go:202:			"~/project/node_modules/demo-pkg/index.js": `
internal/bundler_tests/bundler_dce_test.go:206:			"~/project/node_modules/demo-pkg/package.json": `
internal/bundler_tests/bundler_dce_test.go:217:		expectedScanLog: `Users/user/project/src/entry.js: WARNING: Ignoring this import because "Users/user/project/node_modules/demo-pkg/index.js" was marked as having no side effects
internal/bundler_tests/bundler_dce_test.go:218:Users/user/project/node_modules/demo-pkg/package.json: NOTE: "sideEffects" is false in the enclosing "package.json" file:
internal/bundler_tests/bundler_dce_test.go:230:			"~/project/node_modules/demo-pkg/index.js": `
internal/bundler_tests/bundler_dce_test.go:234:			"~/project/node_modules/demo-pkg/package.json": `
internal/bundler_tests/bundler_dce_test.go:245:		expectedScanLog: `Users/user/project/src/entry.js: WARNING: Ignoring this import because "Users/user/project/node_modules/demo-pkg/index.js" was marked as having no side effects
internal/bundler_tests/bundler_dce_test.go:246:Users/user/project/node_modules/demo-pkg/package.json: NOTE: "sideEffects" is false in the enclosing "package.json" file:
internal/bundler_tests/bundler_dce_test.go:258:			"~/project/node_modules/demo-pkg/index.js": `
internal/bundler_tests/bundler_dce_test.go:262:			"~/project/node_modules/demo-pkg/package.json": `
internal/bundler_tests/bundler_dce_test.go:273:		expectedScanLog: `Users/user/project/src/entry.js: WARNING: Ignoring this import because "Users/user/project/node_modules/demo-pkg/index.js" was marked as having no side effects
internal/bundler_tests/bundler_dce_test.go:274:Users/user/project/node_modules/demo-pkg/package.json: NOTE: "sideEffects" is false in the enclosing "package.json" file:
internal/bundler_tests/bundler_dce_test.go:286:			"~/project/node_modules/demo-pkg/index.js": `
internal/bundler_tests/bundler_dce_test.go:290:			"~/project/node_modules/demo-pkg/package.json": `
internal/bundler_tests/bundler_dce_test.go:311:			"~/project/node_modules/demo-pkg/index.js": `
internal/bundler_tests/bundler_dce_test.go:315:			"~/project/node_modules/demo-pkg/package.json": `
internal/bundler_tests/bundler_dce_test.go:336:			"~/project/node_modules/demo-pkg/index.js": `
internal/bundler_tests/bundler_dce_test.go:340:			"~/project/node_modules/demo-pkg/package.json": `
internal/bundler_tests/bundler_dce_test.go:361:			"~/project/node_modules/demo-pkg/index.js": `
internal/bundler_tests/bundler_dce_test.go:365:			"~/project/node_modules/demo-pkg/package.json": `
internal/bundler_tests/bundler_dce_test.go:386:			"~/project/node_modules/demo-pkg/index.js": `
internal/bundler_tests/bundler_dce_test.go:390:			"~/project/node_modules/demo-pkg/package.json": `
internal/bundler_tests/bundler_dce_test.go:411:			"~/project/node_modules/demo-pkg/index.js": `
internal/bundler_tests/bundler_dce_test.go:415:			"~/project/node_modules/demo-pkg/package.json": `
internal/bundler_tests/bundler_dce_test.go:436:			"~/project/node_modules/demo-pkg/index-main.js": `
internal/bundler_tests/bundler_dce_test.go:440:			"~/project/node_modules/demo-pkg/index-module.js": `
internal/bundler_tests/bundler_dce_test.go:444:			"~/project/node_modules/demo-pkg/package.json": `
internal/bundler_tests/bundler_dce_test.go:468:			"~/project/node_modules/demo-pkg/index-main.js": `
internal/bundler_tests/bundler_dce_test.go:472:			"~/project/node_modules/demo-pkg/index-module.js": `
internal/bundler_tests/bundler_dce_test.go:476:			"~/project/node_modules/demo-pkg/package.json": `
internal/bundler_tests/bundler_dce_test.go:500:			"~/project/node_modules/demo-pkg/index-main.js": `
internal/bundler_tests/bundler_dce_test.go:504:			"~/project/node_modules/demo-pkg/index-module.js": `
internal/bundler_tests/bundler_dce_test.go:508:			"~/project/node_modules/demo-pkg/package.json": `
internal/bundler_tests/bundler_dce_test.go:536:			"~/project/node_modules/demo-pkg/index-main.js": `
internal/bundler_tests/bundler_dce_test.go:540:			"~/project/node_modules/demo-pkg/index-module.js": `
internal/bundler_tests/bundler_dce_test.go:544:			"~/project/node_modules/demo-pkg/package.json": `
internal/bundler_tests/bundler_dce_test.go:567:			"~/project/node_modules/demo-pkg/index-main.js": `
internal/bundler_tests/bundler_dce_test.go:571:			"~/project/node_modules/demo-pkg/index-module.js": `
internal/bundler_tests/bundler_dce_test.go:575:			"~/project/node_modules/demo-pkg/package.json": `
internal/bundler_tests/bundler_dce_test.go:599:			"~/project/node_modules/demo-pkg/index-main.js": `
internal/bundler_tests/bundler_dce_test.go:603:			"~/project/node_modules/demo-pkg/index-module.js": `
internal/bundler_tests/bundler_dce_test.go:607:			"~/project/node_modules/demo-pkg/package.json": `
internal/bundler_tests/bundler_dce_test.go:631:			"~/project/node_modules/demo-pkg/index-main.js": `
internal/bundler_tests/bundler_dce_test.go:635:			"~/project/node_modules/demo-pkg/index-module.js": `
internal/bundler_tests/bundler_dce_test.go:639:			"~/project/node_modules/demo-pkg/package.json": `
internal/bundler_tests/bundler_dce_test.go:667:			"~/project/node_modules/demo-pkg/index-main.js": `
internal/bundler_tests/bundler_dce_test.go:671:			"~/project/node_modules/demo-pkg/index-module.js": `
internal/bundler_tests/bundler_dce_test.go:675:			"~/project/node_modules/demo-pkg/package.json": `
internal/bundler_tests/bundler_dce_test.go:698:			"~/project/node_modules/demo-pkg/keep/this/file.js": `
internal/bundler_tests/bundler_dce_test.go:701:			"~/project/node_modules/demo-pkg/remove/this/file.js": `
internal/bundler_tests/bundler_dce_test.go:704:			"~/project/node_modules/demo-pkg/package.json": `
internal/bundler_tests/bundler_dce_test.go:719:		expectedScanLog: `Users/user/project/src/entry.js: WARNING: Ignoring this import because "Users/user/project/node_modules/demo-pkg/remove/this/file.js" was marked as having no side effects
internal/bundler_tests/bundler_dce_test.go:720:Users/user/project/node_modules/demo-pkg/package.json: NOTE: It was excluded from the "sideEffects" array in the enclosing "package.json" file:
internal/bundler_tests/bundler_dce_test.go:732:			"~/project/node_modules/demo-pkg/package.json": `
internal/bundler_tests/bundler_dce_test.go:737:			"~/project/node_modules/demo-pkg/a/b/c/index.js": `
internal/bundler_tests/bundler_dce_test.go:757:			"~/project/node_modules/demo-pkg/index.js": `
internal/bundler_tests/bundler_dce_test.go:760:			"~/project/node_modules/demo-pkg/package.json": `
internal/bundler_tests/bundler_dce_test.go:781:			"~/project/node_modules/demo-pkg/index.js": `
internal/bundler_tests/bundler_dce_test.go:785:			"~/project/node_modules/demo-pkg2/index.js": `
internal/bundler_tests/bundler_dce_test.go:789:			"~/project/node_modules/demo-pkg2/package.json": `
internal/bundler_tests/bundler_dce_test.go:809:			"~/project/node_modules/demo-pkg/index.js": `
internal/bundler_tests/bundler_dce_test.go:813:			"~/project/node_modules/demo-pkg/foo.js": `
internal/bundler_tests/bundler_dce_test.go:816:			"~/project/node_modules/demo-pkg/package.json": `
internal/bundler_tests/bundler_dce_test.go:835:			"~/project/node_modules/demo-pkg/index.js": `
internal/bundler_tests/bundler_dce_test.go:839:			"~/project/node_modules/demo-pkg/foo.js": `
internal/bundler_tests/bundler_dce_test.go:842:			"~/project/node_modules/demo-pkg/package.json": `
internal/bundler_tests/bundler_dce_test.go:861:			"~/project/node_modules/a/index.js": `
internal/bundler_tests/bundler_dce_test.go:864:			"~/project/node_modules/a/package.json": `
internal/bundler_tests/bundler_dce_test.go:867:			"~/project/node_modules/b/index.js": `
internal/bundler_tests/bundler_dce_test.go:871:			"~/project/node_modules/b/package.json": `
internal/bundler_tests/bundler_dce_test.go:874:			"~/project/node_modules/c/index.js": `
internal/bundler_tests/bundler_dce_test.go:877:			"~/project/node_modules/c/package.json": `
internal/bundler_tests/bundler_dce_test.go:880:			"~/project/node_modules/d/index.js": `
internal/bundler_tests/bundler_dce_test.go:883:			"~/project/node_modules/d/package.json": `
internal/bundler_tests/bundler_dce_test.go:902:			"~/project/node_modules/a/index.js": `
internal/bundler_tests/bundler_dce_test.go:905:			"~/project/node_modules/b/index.js": `
internal/bundler_tests/bundler_dce_test.go:909:			"~/project/node_modules/b/package.json": `
internal/bundler_tests/bundler_dce_test.go:912:			"~/project/node_modules/c/index.js": `
internal/bundler_tests/bundler_dce_test.go:915:			"~/project/node_modules/d/index.js": `
internal/bundler_tests/bundler_dce_test.go:934:			"~/project/node_modules/a/index.js": `
internal/bundler_tests/bundler_dce_test.go:938:			"~/project/node_modules/b1/index.js": `
internal/bundler_tests/bundler_dce_test.go:942:			"~/project/node_modules/b1/package.json": `
internal/bundler_tests/bundler_dce_test.go:945:			"~/project/node_modules/b2/index.js": `
internal/bundler_tests/bundler_dce_test.go:949:			"~/project/node_modules/b2/package.json": `
internal/bundler_tests/bundler_dce_test.go:952:			"~/project/node_modules/c/index.js": `
internal/bundler_tests/bundler_dce_test.go:955:			"~/project/node_modules/d/index.js": `
internal/bundler_tests/bundler_dce_test.go:973:			"~/project/node_modules/a/index.js": `
internal/bundler_tests/bundler_dce_test.go:976:			"~/project/node_modules/b/index.js": `
internal/bundler_tests/bundler_dce_test.go:980:			"~/project/node_modules/b/package.json": `
internal/bundler_tests/bundler_dce_test.go:983:			"~/project/node_modules/c/index.js": `
internal/bundler_tests/bundler_dce_test.go:987:			"~/project/node_modules/d/index.js": `
internal/bundler_tests/bundler_dce_test.go:1005:			"~/project/node_modules/a/index.js": `
internal/bundler_tests/bundler_dce_test.go:1008:			"~/project/node_modules/b/index.js": `
internal/bundler_tests/bundler_dce_test.go:1012:			"~/project/node_modules/b/package.json": `
internal/bundler_tests/bundler_dce_test.go:1015:			"~/project/node_modules/c/index.js": `
internal/bundler_tests/bundler_dce_test.go:1019:			"~/project/node_modules/c/package.json": `
internal/bundler_tests/bundler_dce_test.go:1022:			"~/project/node_modules/d/index.js": `
internal/bundler_tests/bundler_dce_test.go:1025:			"~/project/node_modules/d/package.json": `
internal/bundler_tests/bundler_dce_test.go:1571:			"~/project/node_modules/pkg/index.js": `
internal/bundler_tests/bundler_dce_test.go:1575:			"~/project/node_modules/pkg/package.json": `
internal/bundler_tests/bundler_dce_test.go:1578:			"~/project/node_modules/pkg/foo.js": `
internal/bundler_tests/bundler_dce_test.go:1581:			"~/project/node_modules/pkg/bar.js": `
internal/bundler_tests/bundler_dce_test.go:2348:// Calls to the runtime "__publicField" function are not considered side effects
internal/bundler_tests/bundler_dce_test.go:3780:			"~/project/node_modules/demo-pkg/foo.js": `
internal/bundler_tests/bundler_dce_test.go:3783:			"~/project/node_modules/demo-pkg/bar/index.js": `
internal/bundler_tests/bundler_dce_test.go:3786:			"~/project/node_modules/demo-pkg/package.json": `
internal/bundler_tests/bundler_dce_test.go:3811:			"/project/node_modules/pkg/button.js": `
internal/bundler_tests/bundler_dce_test.go:3815:			"/project/node_modules/pkg/button.css": `
internal/bundler_tests/bundler_dce_test.go:3818:			"/project/node_modules/pkg/menu.js": `
internal/bundler_tests/bundler_dce_test.go:3822:			"/project/node_modules/pkg/menu.css": `
internal/bundler_tests/bundler_dce_test.go:3841:			"/project/node_modules/pkg/entry.js": `
internal/bundler_tests/bundler_dce_test.go:3844:			"/project/node_modules/pkg/package.json": `{
internal/bundler_tests/bundler_dce_test.go:3848:			"/project/node_modules/pkg/components.jsx": `
internal/bundler_tests/bundler_dce_test.go:3852:			"/project/node_modules/pkg/button.css": `
internal/bundler_tests/bundler_dce_test.go:3871:			"/project/node_modules/pkg/entry.js": `
internal/bundler_tests/bundler_dce_test.go:3874:			"/project/node_modules/pkg/package.json": `{
internal/bundler_tests/bundler_dce_test.go:3878:			"/project/node_modules/pkg/components.jsx": `
internal/bundler_tests/bundler_dce_test.go:3882:			"/project/node_modules/pkg/button.css": `
internal/bundler_tests/bundler_dce_test.go:3901:			"/project/node_modules/pkg/entry.js": `
internal/bundler_tests/bundler_dce_test.go:3904:			"/project/node_modules/pkg/package.json": `{
internal/bundler_tests/bundler_dce_test.go:3908:			"/project/node_modules/pkg/components.jsx": `
internal/bundler_tests/bundler_dce_test.go:3912:			"/project/node_modules/pkg/button.css": `
internal/bundler_tests/bundler_dce_test.go:3931:			"/project/node_modules/pkg/entry.js": `
internal/bundler_tests/bundler_dce_test.go:3934:			"/project/node_modules/pkg/package.json": `{
internal/bundler_tests/bundler_dce_test.go:3938:			"/project/node_modules/pkg/components.jsx": `
internal/bundler_tests/bundler_dce_test.go:3942:			"/project/node_modules/pkg/button.css": `
internal/bundler_tests/bundler_dce_test.go:3961:			"/project/node_modules/pkg/package.json": `{
internal/bundler_tests/bundler_dce_test.go:3964:			"/project/node_modules/pkg/button.jsx": `
internal/bundler_tests/bundler_dce_test.go:3968:			"/project/node_modules/pkg/styles.js": `
internal/bundler_tests/bundler_dce_test.go:3972:			"/project/node_modules/pkg/styles.css": `
internal/bundler_tests/bundler_dce_test.go:3991:			"/project/node_modules/pkg/package.json": `{
internal/bundler_tests/bundler_dce_test.go:3994:			"/project/node_modules/pkg/button.jsx": `
internal/bundler_tests/bundler_dce_test.go:3998:			"/project/node_modules/pkg/styles.js": `
internal/bundler_tests/bundler_dce_test.go:4002:			"/project/node_modules/pkg/styles.css": `
internal/bundler_tests/bundler_css_test.go:1280:			"/node_modules/b/2.png": `b-2-node_modules`,
internal/bundler_tests/bundler_css_test.go:1282:			"/node_modules/c/3.png": `c-3-node_modules`,
internal/bundler_tests/bundler_css_test.go:2408:			"/node_modules/pkg/empty.js":         ``,
internal/bundler_tests/bundler_css_test.go:2409:			"/node_modules/pkg/empty.esm.js":     `export {}`,
internal/bundler_tests/bundler_css_test.go:2410:			"/node_modules/pkg/empty.json":       `{}`,
internal/bundler_tests/bundler_css_test.go:2411:			"/node_modules/pkg/empty.css":        ``,
internal/bundler_tests/bundler_css_test.go:2412:			"/node_modules/pkg/empty.global-css": ``,
internal/bundler_tests/bundler_css_test.go:2413:			"/node_modules/pkg/empty.local-css":  ``,
internal/bundler_tests/bundler_css_test.go:2415:			// Files inside of "node_modules" should not generate a warning
internal/bundler_tests/bundler_css_test.go:2416:			"/node_modules/pkg/index.js": `
internal/bundler_tests/bundler_css_test.go:2452:entry.js: WARNING: Import "foo" will always be undefined because the file "node_modules/pkg/empty.js" has no exports
internal/bundler_tests/bundler_css_test.go:2453:entry.js: WARNING: Import "foo" will always be undefined because there is no matching export in "node_modules/pkg/empty.esm.js"
internal/bundler_tests/bundler_css_test.go:2454:entry.js: WARNING: Import "foo" will always be undefined because there is no matching export in "node_modules/pkg/empty.json"
internal/bundler_tests/bundler_css_test.go:2455:entry.js: WARNING: Import "foo" will always be undefined because there is no matching export in "node_modules/pkg/empty.css"
internal/bundler_tests/bundler_css_test.go:2456:entry.js: WARNING: Import "foo" will always be undefined because there is no matching export in "node_modules/pkg/…21195 tokens truncated…pshots_packagejson.txt:661:// Users/user/project/node_modules/pkg/node.js
internal/bundler_tests/snapshots/snapshots_packagejson.txt:667:// Users/user/project/node_modules/pkg1/dir/bar.js
internal/bundler_tests/snapshots/snapshots_packagejson.txt:673:// Users/user/project/node_modules/pkg1/2/bar.js
internal/bundler_tests/snapshots/snapshots_packagejson.txt:676:// Users/user/project/node_modules/pkg2/1/bar.js
internal/bundler_tests/snapshots/snapshots_packagejson.txt:682:// Users/user/project/node_modules/pkg/dir/baz-foo.js
internal/bundler_tests/snapshots/snapshots_packagejson.txt:685:// Users/user/project/node_modules/pkg2/public/abc.js
internal/bundler_tests/snapshots/snapshots_packagejson.txt:688:// Users/user/project/node_modules/pkg2/public/xyz.js
internal/bundler_tests/snapshots/snapshots_packagejson.txt:694:// Users/user/project/node_modules/pkg/require.js
internal/bundler_tests/snapshots/snapshots_packagejson.txt:696:  "Users/user/project/node_modules/pkg/require.js"() {
internal/bundler_tests/snapshots/snapshots_packagejson.txt:707:// Users/user/project/node_modules/pkg1/file.js
internal/bundler_tests/snapshots/snapshots_packagejson.txt:710:// Users/user/project/node_modules/pkg1/file2.js
internal/bundler_tests/snapshots/snapshots_packagejson.txt:801:// Users/user/project/src/node_modules/pkg/a.js
internal/bundler_tests/snapshots/snapshots_packagejson.txt:804:// Users/user/project/src/node_modules/pkg/b.js
internal/bundler_tests/snapshots/snapshots_packagejson.txt:807:// Users/user/project/src/node_modules/pkg/some-star/c.js
internal/bundler_tests/snapshots/snapshots_packagejson.txt:810:// Users/user/project/src/node_modules/pkg/some-slash/d.js
internal/bundler_tests/snapshots/snapshots_packagejson.txt:849:// Users/user/project/node_modules/demo-pkg/custom-main.js
internal/bundler_tests/snapshots/snapshots_packagejson.txt:851:  "Users/user/project/node_modules/demo-pkg/custom-main.js"(exports, module) {
internal/bundler_tests/snapshots/snapshots_packagejson.txt:865:// Users/user/project/node_modules/demo-pkg/a.js
internal/bundler_tests/snapshots/snapshots_packagejson.txt:867:  "Users/user/project/node_modules/demo-pkg/a.js"(exports, module) {
internal/bundler_tests/snapshots/snapshots_packagejson.txt:879:// Users/user/project/node_modules/demo-pkg/b.js
internal/bundler_tests/snapshots/snapshots_packagejson.txt:888:// Users/user/project/node_modules/demo-pkg/main.esm.js
internal/bundler_tests/snapshots/snapshots_packagejson.txt:899:// Users/user/project/node_modules/demo-pkg/main.js
internal/bundler_tests/snapshots/snapshots_packagejson.txt:901:  "Users/user/project/node_modules/demo-pkg/main.js"(exports, module) {
internal/bundler_tests/snapshots/snapshots_packagejson.txt:932:import http from "node:http";
internal/helpers/dataurl.go:41:		c, width := utf8.DecodeRuneInString(text[i:])
internal/helpers/dataurl.go:44:		if c == utf8.RuneError && width == 1 {
internal/bundler_tests/snapshots/snapshots_ts.txt:1366:// node_modules/pkg/foo-js.ts
internal/bundler_tests/snapshots/snapshots_ts.txt:1369:// node_modules/pkg/foo-jsx.tsx
internal/bundler_tests/snapshots/snapshots_ts.txt:1372:// node_modules/pkg-exports/abc-js.ts
internal/bundler_tests/snapshots/snapshots_ts.txt:1375:// node_modules/pkg-exports/abc-jsx.tsx
internal/bundler_tests/snapshots/snapshots_ts.txt:1378:// node_modules/pkg-exports/lib/foo-js.ts
internal/bundler_tests/snapshots/snapshots_ts.txt:1381:// node_modules/pkg-exports/lib/foo-jsx.tsx
internal/bundler_tests/snapshots/snapshots_ts.txt:1384:// node_modules/pkg-imports/abc-js.ts
internal/bundler_tests/snapshots/snapshots_ts.txt:1387:// node_modules/pkg-imports/abc-jsx.tsx
internal/bundler_tests/snapshots/snapshots_ts.txt:1390:// node_modules/pkg-imports/lib/foo-js.ts
internal/bundler_tests/snapshots/snapshots_ts.txt:1393:// node_modules/pkg-imports/lib/foo-jsx.tsx
internal/bundler_tests/snapshots/snapshots_ts.txt:1467:// node_modules/pkg/js_ts_css.js
internal/bundler_tests/snapshots/snapshots_ts.txt:1471:// node_modules/pkg/ts_css.ts
internal/bundler_tests/snapshots/snapshots_ts.txt:1475:// node_modules/pkg/js_ts.js
internal/bundler_tests/snapshots/snapshots_ts.txt:1479:// node_modules/pkg/index.ts
internal/bundler_tests/snapshots/snapshots_ts.txt:1485:/* node_modules/pkg/js_ts_css.css */
internal/bundler_tests/snapshots/snapshots_ts.txt:1489:/* node_modules/pkg/ts_css.css */
internal/bundler_tests/snapshots/snapshots_ts.txt:1726:// Users/user/project/node_modules/package/path.js
internal/bundler_tests/snapshots/snapshots_ts.txt:1732:// Users/user/project/node_modules/package2/path.js
internal/helpers/utf.go:58:		width := encodeWTF8Rune(temp[:], r1)
internal/helpers/utf.go:84:		width := encodeWTF8Rune(temp[:], r1)
internal/helpers/utf.go:107:		width := encodeWTF8Rune(temp[:], r1)
internal/helpers/utf.go:133:// This is a clone of "utf8.EncodeRune" that has been modified to encode using
internal/helpers/utf.go:135:func encodeWTF8Rune(p []byte, r rune) int {
internal/helpers/utf.go:146:	case i > utf8.MaxRune:
internal/helpers/utf.go:147:		r = utf8.RuneError
internal/helpers/utf.go:165:// This is a clone of "utf8.DecodeRuneInString" that has been modified to
internal/helpers/utf.go:168:func DecodeWTF8Rune(s string) (rune, int) {
internal/helpers/utf.go:171:		return utf8.RuneError, 0
internal/helpers/utf.go:187:		return utf8.RuneError, 1
internal/helpers/utf.go:191:		return utf8.RuneError, 0
internal/helpers/utf.go:196:		return utf8.RuneError, 1
internal/helpers/utf.go:202:			return utf8.RuneError, 1
internal/helpers/utf.go:209:		return utf8.RuneError, 1
internal/helpers/utf.go:215:			return utf8.RuneError, 1
internal/helpers/utf.go:222:		return utf8.RuneError, 1
internal/helpers/utf.go:227:		return utf8.RuneError, 1
internal/helpers/typos.go:16:				detector.oneCharTypos[correct[:i]+correct[i+utf8.RuneLen(ch):]] = correct
internal/helpers/typos.go:32:		if corrected, ok := detector.oneCharTypos[typo[:i]+typo[i+utf8.RuneLen(ch):]]; ok {
internal/helpers/path.go:22:		if base == "node_modules" {
internal/helpers/quote.go:33:			lenEstimate += utf8.RuneLen(c)
internal/helpers/quote.go:63:		c, width := DecodeWTF8Rune(text[i:])
internal/helpers/quote.go:70:				c, width = DecodeWTF8Rune(text[i:])
internal/helpers/float.go:14://	that differs from the value obtained by executing and rounding the
internal/bundler_tests/snapshots/snapshots_default.txt:157:import fs from "node:fs/promises";
internal/bundler_tests/snapshots/snapshots_default.txt:158:import "node:what-is-this";
internal/bundler_tests/snapshots/snapshots_default.txt:205:// node_modules/fs/abc.js
internal/bundler_tests/snapshots/snapshots_default.txt:207:  "node_modules/fs/abc.js"() {
internal/bundler_tests/snapshots/snapshots_default.txt:212:// node_modules/fs/index.js
internal/bundler_tests/snapshots/snapshots_default.txt:214:  "node_modules/fs/index.js"() {
internal/bundler_tests/snapshots/snapshots_default.txt:221:  // These are node core modules
internal/bundler_tests/snapshots/snapshots_default.txt:224:  require("node:foo"),
internal/bundler_tests/snapshots/snapshots_default.txt:225:  // These are not node core modules
internal/bundler_tests/snapshots/snapshots_default.txt:703:  // Comments on absent AST nodes
internal/bundler_tests/snapshots/snapshots_default.txt:757:  // Comments on absent AST nodes
internal/bundler_tests/snapshots/snapshots_default.txt:1168:// outside-node-modules/index.jsx
internal/bundler_tests/snapshots/snapshots_default.txt:1171:// node_modules/inside-node-modules/index.jsx
internal/bundler_tests/snapshots/snapshots_default.txt:1575:// Annotate the CommonJS export names for ESM import in node:
internal/bundler_tests/snapshots/snapshots_default.txt:1615:// Annotate the CommonJS export names for ESM import in node:
internal/bundler_tests/snapshots/snapshots_default.txt:1752:// project/node_modules/pkg2/index.js
internal/bundler_tests/snapshots/snapshots_default.txt:1795:#!/usr/bin/env node
internal/bundler_tests/snapshots/snapshots_default.txt:1809:// Users/user/project/node_modules/pkg/index.js
internal/bundler_tests/snapshots/snapshots_default.txt:1818:// Users/user/project/node_modules/pkg/index.js
internal/bundler_tests/snapshots/snapshots_default.txt:2087:// node_modules/unused/index.js
internal/bundler_tests/snapshots/snapshots_default.txt:2270:import { Fragment as Fragment2, jsx as jsx2 } from "react/jsx-runtime";
internal/bundler_tests/snapshots/snapshots_default.txt:2283:import { Fragment as Fragment2, jsx as jsx2 } from "react/jsx-runtime";
internal/bundler_tests/snapshots/snapshots_default.txt:2320:import { jsxDEV } from "react/jsx-dev-runtime";
internal/bundler_tests/snapshots/snapshots_default.txt:2336:import { jsxDEV } from "react/jsx-dev-runtime";
internal/bundler_tests/snapshots/snapshots_default.txt:2352:import { jsxDEV } from "react/jsx-dev-runtime";
internal/bundler_tests/snapshots/snapshots_default.txt:2369:import { jsxDEV } from "react/jsx-dev-runtime";
internal/bundler_tests/snapshots/snapshots_default.txt:2390:import { jsxDEV } from "react/jsx-dev-runtime";
internal/bundler_tests/snapshots/snapshots_default.txt:2404:import { jsxDEV } from "react/jsx-dev-runtime";
internal/bundler_tests/snapshots/snapshots_default.txt:2419:import { jsxDEV } from "react/jsx-dev-runtime";
internal/bundler_tests/snapshots/snapshots_default.txt:2435:import { jsxDEV } from "react/jsx-dev-runtime";
internal/bundler_tests/snapshots/snapshots_default.txt:2451:import { jsxDEV } from "react/jsx-dev-runtime";
internal/bundler_tests/snapshots/snapshots_default.txt:2466:import { jsxDEV } from "react/jsx-dev-runtime";
internal/bundler_tests/snapshots/snapshots_default.txt:2480:import { jsxDEV } from "react/jsx-dev-runtime";
internal/bundler_tests/snapshots/snapshots_default.txt:2508:import { jsxDEV } from "react/jsx-dev-runtime";
internal/bundler_tests/snapshots/snapshots_default.txt:2523:import { jsxDEV } from "react/jsx-dev-runtime";
internal/bundler_tests/snapshots/snapshots_default.txt:5493:// Annotate the CommonJS export names for ESM import in node:
internal/bundler_tests/snapshots/snapshots_default.txt:5512:// Annotate the CommonJS export names for ESM import in node:
internal/bundler_tests/snapshots/snapshots_default.txt:5522:// Users/user/project/node_modules/demo-pkg/index.js
internal/bundler_tests/snapshots/snapshots_default.txt:5524:  "Users/user/project/node_modules/demo-pkg/index.js"(exports, module) {
internal/bundler_tests/snapshots/snapshots_default.txt:5709:// node_modules/alias1/index.js
internal/bundler_tests/snapshots/snapshots_default.txt:5712:// node_modules/alias2/foo.js
internal/bundler_tests/snapshots/snapshots_default.txt:5715:// node_modules/alias3/index.js
internal/bundler_tests/snapshots/snapshots_default.txt:5718:// node_modules/alias4/index.js
internal/bundler_tests/snapshots/snapshots_default.txt:5721:// node_modules/alias5/foo.js
internal/bundler_tests/snapshots/snapshots_default.txt:5736:// node_modules/prefix-foo/index.js
internal/bundler_tests/snapshots/snapshots_default.txt:5739:// node_modules/@scope/prefix-foo/index.js
internal/bundler_tests/snapshots/snapshots_default.txt:6213:TestRuntimeNameCollisionNoBundle
internal/bundler_tests/snapshots/snapshots_default.txt:6263:// Users/user/project/node_modules/pkg/index.js
internal/bundler_tests/snapshots/snapshots_default.txt:6265:  "Users/user/project/node_modules/pkg/index.js"(exports) {
internal/bundler_tests/snapshots/snapshots_default.txt:6288:// Users/user/project/node_modules/pkg/index.js
internal/bundler_tests/snapshots/snapshots_default.txt:6290:  "Users/user/project/node_modules/pkg/index.js"(exports) {
internal/bundler_tests/snapshots/snapshots_default.txt:6315:// Users/user/project/node_modules/pkg/index.js
internal/bundler_tests/snapshots/snapshots_default.txt:6317:  "Users/user/project/node_modules/pkg/index.js"(exports) {
internal/bundler_tests/snapshots/snapshots_default.txt:6523:// node_modules/pkg/file2.js
internal/bundler_tests/snapshots/snapshots_default.txt:7276:// node_modules/return-asi.js
internal/bundler_tests/snapshots/snapshots_default.txt:7278:  "node_modules/return-asi.js"() {
internal/bundler_tests/snapshots/snapshots_default.txt:7283:// plugin-dir/node_modules/return-asi.js
internal/bundler_tests/snapshots/snapshots_default.txt:7285:  "plugin-dir/node_modules/return-asi.js"() {
internal/bundler_tests/snapshots/snapshots_default.txt:7296:// node_modules/dup-case.js
internal/bundler_tests/snapshots/snapshots_default.txt:7302:// plugin-dir/node_modules/dup-case.js
internal/bundler_tests/snapshots/snapshots_default.txt:7311:// node_modules/not-in.js
internal/bundler_tests/snapshots/snapshots_default.txt:7314:// plugin-dir/node_modules/not-in.js
internal/bundler_tests/snapshots/snapshots_default.txt:7320:// node_modules/not-instanceof.js
internal/bundler_tests/snapshots/snapshots_default.txt:7323:// plugin-dir/node_modules/not-instanceof.js
internal/bundler_tests/snapshots/snapshots_default.txt:7334:// node_modules/equals-neg-zero.js
internal/bundler_tests/snapshots/snapshots_default.txt:7337:// plugin-dir/node_modules/equals-neg-zero.js
internal/bundler_tests/snapshots/snapshots_default.txt:7343:// node_modules/equals-nan.js
internal/bundler_tests/snapshots/snapshots_default.txt:7346:// plugin-dir/node_modules/equals-nan.js
internal/bundler_tests/snapshots/snapshots_default.txt:7352:// node_modules/equals-object.js
internal/bundler_tests/snapshots/snapshots_default.txt:7355:// plugin-dir/node_modules/equals-object.js
internal/bundler_tests/snapshots/snapshots_default.txt:7365:// node_modules/delete-super.js
internal/bundler_tests/snapshots/snapshots_default.txt:7372:// plugin-dir/node_modules/delete-super.js
internal/helpers/stack.go:4:	"runtime/debug"
internal/bundler_tests/snapshots/snapshots_tsconfig.txt:227:// Users/user/project/node_modules/pkg/index.js
internal/bundler_tests/snapshots/snapshots_tsconfig.txt:231:// Users/user/project/node_modules/js-pkg/index.js
internal/bundler_tests/snapshots/snapshots_tsconfig.txt:234:// Users/user/project/node_modules/ts-pkg/index.ts
internal/bundler_tests/snapshots/snapshots_tsconfig.txt:399:// Users/user/project/src/node_modules/foo/index.tsx
internal/bundler_tests/snapshots/snapshots_tsconfig.txt:583:// Users/user/project/node_modules/wow/dist/first.js
internal/bundler_tests/snapshots/snapshots_tsconfig.txt:586:// Users/user/project/node_modules/wow/dist/next.js
internal/bundler_tests/snapshots/snapshots_tsconfig.txt:683:// Users/user/project/node_modules/fib/index.js
internal/bundler_tests/snapshots/snapshots_tsconfig.txt:704:import { Fragment, jsx, jsxs } from "react/jsx-runtime";
internal/bundler_tests/snapshots/snapshots_tsconfig.txt:747:import { Fragment, jsx, jsxs } from "notreact/jsx-runtime";
internal/bundler_tests/snapshots/snapshots_tsconfig.txt:757:import { Fragment, jsxDEV } from "react/jsx-dev-runtime";
internal/bundler_tests/snapshots/snapshots_tsconfig.txt:779:import { Fragment, jsxDEV } from "react/jsx-dev-runtime";
internal/bundler_tests/bundler_splitting_test.go:329:			"~/project/node_modules/package/index.js": `
internal/bundler_tests/bundler_test.go:139:	t.Run(subName, func(t *testing.T) {
internal/bundler_tests/bundler_test.go:181:		// Run the bundler
internal/bundler_tests/bundler_test.go:185:		args.options.OmitRuntimeForTests = true
internal/bundler_tests/bundler_test.go:313:	code := m.Run()
internal/bundler_tests/bundler_ts_test.go:1419:			"/node_modules/pkg/foo-js.ts":   `console.log("correct")`,
internal/bundler_tests/bundler_ts_test.go:1420:			"/node_modules/pkg/foo-jsx.tsx": `console.log("correct")`,
internal/bundler_tests/bundler_ts_test.go:1422:			"/node_modules/pkg-exports/package.json": `{
internal/bundler_tests/bundler_ts_test.go:1429:			"/node_modules/pkg-exports/abc-js.ts":       `console.log("correct")`,
internal/bundler_tests/bundler_ts_test.go:1430:			"/node_modules/pkg-exports/abc-jsx.tsx":     `console.log("correct")`,
internal/bundler_tests/bundler_ts_test.go:1431:			"/node_modules/pkg-exports/lib/foo-js.ts":   `console.log("correct")`,
internal/bundler_tests/bundler_ts_test.go:1432:			"/node_modules/pkg-exports/lib/foo-jsx.tsx": `console.log("correct")`,
internal/bundler_tests/bundler_ts_test.go:1434:			"/node_modules/pkg-imports/package.json": `{
internal/bundler_tests/bundler_ts_test.go:1441:			"/node_modules/pkg-imports/index.js": `
internal/bundler_tests/bundler_ts_test.go:1447:			"/node_modules/pkg-imports/abc-js.ts":       `console.log("correct")`,
internal/bundler_tests/bundler_ts_test.go:1448:			"/node_modules/pkg-imports/abc-jsx.tsx":     `console.log("correct")`,
internal/bundler_tests/bundler_ts_test.go:1449:			"/node_modules/pkg-imports/lib/foo-js.ts":   `console.log("correct")`,
internal/bundler_tests/bundler_ts_test.go:1450:			"/node_modules/pkg-imports/lib/foo-jsx.tsx": `console.log("correct")`,
internal/bundler_tests/bundler_ts_test.go:1892:			"/node_modules/some-js/package.json": `{ "main": "./foo.js", "sideEffects": false }`,
internal/bundler_tests/bundler_ts_test.go:1893:			"/node_modules/some-js/foo.js":       `console.log('foo')`,
internal/bundler_tests/bundler_ts_test.go:1895:			"/node_modules/some-ts/package.json": `{ "main": "./foo.ts", "sideEffects": false }`,
internal/bundler_tests/bundler_ts_test.go:1896:			"/node_modules/some-ts/foo.ts":       `console.log('foo' as string)`,
internal/bundler_tests/bundler_ts_test.go:1898:			"/node_modules/empty-js/package.json": `{ "main": "./foo.js", "sideEffects": false }`,
internal/bundler_tests/bundler_ts_test.go:1899:			"/node_modules/empty-js/foo.js":       ``,
internal/bundler_tests/bundler_ts_test.go:1901:			"/node_modules/empty-ts/package.json": `{ "main": "./foo.ts", "sideEffects": false }`,
internal/bundler_tests/bundler_ts_test.go:1902:			"/node_modules/empty-ts/foo.ts":       `export type Foo = number`,
internal/bundler_tests/bundler_ts_test.go:1904:			"/node_modules/empty-dts/package.json": `{ "main": "./foo.d.ts", "sideEffects": false }`,
internal/bundler_tests/bundler_ts_test.go:1905:			"/node_modules/empty-dts/foo.d.ts":     `export type Foo = number`,
internal/bundler_tests/bundler_ts_test.go:1912:		expectedScanLog: `entry.ts: WARNING: Ignoring this import because "node_modules/some-js/foo.js" was marked as having no side effects
internal/bundler_tests/bundler_ts_test.go:1913:node_modules/some-js/package.json: NOTE: "sideEffects" is false in the enclosing "package.json" file:
internal/bundler_tests/bundler_ts_test.go:1914:entry.ts: WARNING: Ignoring this import because "node_modules/some-ts/foo.ts" was marked as having no side effects
internal/bundler_tests/bundler_ts_test.go:1915:node_modules/some-ts/package.json: NOTE: "sideEffects" is false in the enclosing "package.json" file:
internal/bundler_tests/bundler_ts_test.go:2689:	// We now prefer ".js" over ".ts" inside "node_modules"
internal/bundler_tests/bundler_ts_test.go:2708:			"~/project/node_modules/package/path.ts": `console.log('FAILURE')`,
internal/bundler_tests/bundler_ts_test.go:2709:			"~/project/node_modules/package/path.js": `console.log('success')`,
internal/bundler_tests/bundler_ts_test.go:2711:			"~/project/node_modules/package2/path.ts": `console.log('FAILURE')`,
internal/bundler_tests/bundler_ts_test.go:2712:			"~/project/node_modules/package2/path.js": `console.log('success')`,
internal/bundler_tests/bundler_ts_test.go:2946:			"/node_modules/pkg/index.ts": `
internal/bundler_tests/bundler_ts_test.go:2954:			"/node_modules/pkg/js_ts_css.js": `
internal/bundler_tests/bundler_ts_test.go:2958:			"/node_modules/pkg/js_ts_css.ts": `
internal/bundler_tests/bundler_ts_test.go:2961:			"/node_modules/pkg/js_ts_css.css": `
internal/bundler_tests/bundler_ts_test.go:2964:			"/node_modules/pkg/ts_css.ts": `
internal/bundler_tests/bundler_ts_test.go:2968:			"/node_modules/pkg/ts_css.css": `
internal/bundler_tests/bundler_ts_test.go:2971:			"/node_modules/pkg/js_ts.js": `
internal/bundler_tests/bundler_ts_test.go:2974:			"/node_modules/pkg/js_ts.ts": `
I’m going to use Node as an oracle for a few small traces before editing. The tricky part is separating “request promise settlement” from “generator may resume again,” especially around `yield*` and `return()`.
shell
node - <<'JS'
let log=[];
async function* gen(){ log.push('start'); const x = yield Promise.resolve('yield'); log.push('after yield '+x); return 'ret'; }
let it=gen(); let p1=it.next('a'); log.push('after p1'); let p2=it.next('b'); log.push('after p2'); Promise.resolve().then(()=>log.push('micro')); p1.then(v=>log.push('p1 '+JSON.stringify(v))); p2.then(v=>log.push('p2 '+JSON.stringify(v))); setTimeout(()=>console.log(log),0);
JS
output
Chunk ID: 9740c1
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 37
Output:
[
  'start',
  'after p1',
  'after p2',
  'after yield b',
  'micro',
  'p1 {"value":"yield","done":false}',
  'p2 {"value":"ret","done":true}'
]
shell
node - <<'JS'
let log=[];
let resolve;
let gate = new Promise(r => resolve = r);
async function* inner(){ try { log.push('inner start'); yield await gate; log.push('inner after yield'); } finally { log.push('inner finally before yield'); yield 'cleanup'; log.push('inner finally after yield'); } }
async function* outer(){ log.push('outer start'); yield* inner(); log.push('outer after'); }
let it=outer(); let p1=it.next(); log.push('after next'); let pr=it.return('done'); log.push('after return'); p1.then(v=>log.push('p1 '+JSON.stringify(v))); pr.then(v=>log.push('pr '+JSON.stringify(v))); Promise.resolve().then(()=>log.push('micro1')); resolve('value'); Promise.resolve().then(()=>log.push('micro2')); setTimeout(()=>console.log(log),0);
JS
output
Chunk ID: cd6c6b
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 52
Output:
[
  'outer start',
  'inner start',
  'after next',
  'after return',
  'micro1',
  'micro2',
  'p1 {"value":"value","done":false}',
  'inner finally before yield',
  'pr {"value":"cleanup","done":false}'
]
shell
node - <<'JS'
let log=[];
let resolve;
let gate = new Promise(r => resolve = r);
async function* gen(){ try { log.push('start'); yield await gate; log.push('after yield'); } finally { log.push('finally before yield'); yield 'cleanup'; log.push('finally after yield'); } }
let it=gen(); let p1=it.next(); log.push('after next'); let pr=it.return('done'); log.push('after return'); p1.then(v=>log.push('p1 '+JSON.stringify(v))); pr.then(v=>log.push('pr '+JSON.stringify(v))); Promise.resolve().then(()=>log.push('micro1')); resolve('value'); Promise.resolve().then(()=>log.push('micro2')); setTimeout(()=>console.log(log),0);
JS
output
Chunk ID: 44a83d
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 45
Output:
[
  'start',
  'after next',
  'after return',
  'micro1',
  'micro2',
  'p1 {"value":"value","done":false}',
  'finally before yield',
  'pr {"value":"cleanup","done":false}'
]
shell
node - <<'JS'
let log=[];
async function* gen(){ try { log.push('start'); let x = yield Promise.resolve('yield'); log.push('after yield '+x); } catch(e) { log.push('catch '+e); yield 'recovery'; log.push('after recovery'); } }
let it=gen(); let p1=it.next(); log.push('after next'); let pt=it.throw('err'); log.push('after throw'); p1.then(v=>log.push('p1 '+JSON.stringify(v))); pt.then(v=>log.push('pt '+JSON.stringify(v))); Promise.resolve().then(()=>log.push('micro')); setTimeout(()=>console.log(log),0);
JS
output
Chunk ID: 05004d
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 39
Output:
[
  'start',
  'after next',
  'after throw',
  'catch err',
  'micro',
  'p1 {"value":"yield","done":false}',
  'pt {"value":"recovery","done":false}'
]
shell
node - <<'JS'
let log=[];
async function* gen(){ try { log.push('start'); let x = yield await Promise.resolve('yield'); log.push('after yield '+x); } catch(e) { log.push('catch '+e); yield 'recovery'; } }
let it=gen(); let p1=it.next(); log.push('after next'); let pt=it.throw('err'); log.push('after throw'); p1.then(v=>log.push('p1 '+JSON.stringify(v))); pt.then(v=>log.push('pt '+JSON.stringify(v))); Promise.resolve().then(()=>log.push('micro')); setTimeout(()=>console.log(log),0);
JS
output
Chunk ID: 058afd
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 39
Output:
[
  'start',
  'after next',
  'after throw',
  'micro',
  'catch err',
  'p1 {"value":"yield","done":false}',
  'pt {"value":"recovery","done":false}'
]
shell
node - <<'JS'
async function* gen(){ yield Promise.resolve('yield') }
gen().next().then(v=>{ console.log(v.value, v.value && typeof v.value.then, JSON.stringify(v)) })
JS
output
Chunk ID: 32bd54
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 12
Output:
yield undefined {"value":"yield","done":false}
shell
node - <<'JS'
let log=[];
let resolve;
let gate = new Promise(r=>resolve=r);
async function* gen(){ try { log.push('start'); yield await gate; log.push('after yield'); } finally { log.push('finally before yield'); let y=yield 'cleanup'; log.push('finally after yield '+y); } log.push('after finally'); }
let it=gen(); let p1=it.next(); let pr=it.return('done'); let p2=it.next('after'); p1.then(v=>log.push('p1 '+JSON.stringify(v))); pr.then(v=>log.push('pr '+JSON.stringify(v))); p2.then(v=>log.push('p2 '+JSON.stringify(v))); resolve('value'); setTimeout(()=>console.log(log),0);
JS
output
Chunk ID: 0dae91
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 47
Output:
[
  'start',
  'p1 {"value":"value","done":false}',
  'finally before yield',
  'finally after yield after',
  'pr {"value":"cleanup","done":false}',
  'p2 {"value":"done","done":true}'
]
shell
node - <<'JS'
let log=[], resolve; let gate=new Promise(r=>resolve=r);
async function* gen(){ try { log.push('start'); let x=yield await gate; log.push('after yield '+x); } catch(e) { log.push('catch '+e); let y=yield 'recovery'; log.push('after recovery '+y); return 'done'; } }
let it=gen(); let p1=it.next(); let pt=it.throw('boom'); let pn=it.next('sent'); p1.then(v=>log.push('p1 '+JSON.stringify(v))); pt.then(v=>log.push('pt '+JSON.stringify(v))); pn.then(v=>log.push('pn '+JSON.stringify(v))); resolve('value'); setTimeout(()=>console.log(log),0);
JS
output
Chunk ID: 9d1bfe
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 44
Output:
[
  'start',
  'catch boom',
  'p1 {"value":"value","done":false}',
  'after recovery sent',
  'pt {"value":"recovery","done":false}',
  'pn {"value":"done","done":true}'
]
I’m going to patch only the runtime helper. The change will keep the first call immediate, hand off queued `next`/`throw` without an extra promise hop, and deliberately defer queued `return` cleanup until after the currently yielded result’s promise reactions.
apply_patch
*** Begin Patch
*** Update File: /app/internal/runtime/runtime.go
@@
 		export var __asyncGenerator = (__this, __arguments, generator) => {
-			var resume = (k, v, yes, no) => {
+			var resume = (k, v, yes, no, settle) => {
 				try {
 					var x = generator[k](v), isAwait = (v = x.value) instanceof __await, done = x.done
 					Promise.resolve(isAwait ? v[0] : v)
 						.then(y => isAwait
-							? resume(k === 'return' ? k : 'next', v[1] ? { done: y.done, value: y.value } : y, yes, no)
-							: yes({ value: y, done }))
-						.catch(e => resume('throw', e, yes, no))
+							? resume(k === 'return' ? k : 'next', v[1] ? { done: y.done, value: y.value } : y, yes, no, settle)
+							: settle(yes, { value: y, done }))
+						.catch(e => resume('throw', e, yes, no, settle))
 				} catch (e) {
-					no(e)
+					settle(no, e)
 				}
-			}, method = k => it[k] = x => new Promise((yes, no) => resume(k, x, yes, no)), it = {}
+			}, front, back, request = (k, x) => {
+				var req, promise = new Promise((yes, no) => {
+					req = { k, x, yes, no, next: null }
+				})
+				req.promise = promise
+				return back = back ? back.next = req : front = req, front === req && run(req), promise
+			}, run = req => resume(req.k, req.x, req.yes, req.no, settle), settle = (fn, value) => {
+				var req = front
+				fn(value)
+				front = front.next
+				if (front) (front.k === 'return' ? Promise.resolve().then : fn => fn())(() => run(front))
+				else back = null
+			}, method = k => it[k] = x => request(k, x), it = {}
*** End Patch


Exit code: 0
Wall time: 0 seconds
Output:
Success. Updated the following files:
M /app/internal/runtime/runtime.go
apply_patch
*** Begin Patch
*** Update File: /app/internal/runtime/runtime.go
@@
 				var req = front
 				fn(value)
 				front = front.next
-				if (front) (front.k === 'return' ? Promise.resolve().then : fn => fn())(() => run(front))
+				if (front) front.k === 'return' ? Promise.resolve().then(() => run(front)) : run(front)
 				else back = null
 			}, method = k => it[k] = x => request(k, x), it = {}
*** End Patch


Exit code: 0
Wall time: 0 seconds
Output:
Success. Updated the following files:
M /app/internal/runtime/runtime.go
The helper is now a linked promise-backed request queue instead of immediate reentrant calls. I’m checking parse/build next because a small syntax issue inside the runtime string would surface through Go tests.
shell
gofmt -w internal/runtime/runtime.go
output
Chunk ID: fbadac
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 0
Output:
shell
go test ./internal/runtime
output
Chunk ID: 08d895
Wall time: 1.7193 seconds
Process exited with code 0
Original token count: 14
Output:
ok  	[code-host]/evanw/esbuild/internal/runtime	0.029s
The runtime parses cleanly. I’m going to run native-vs-lowered traces through Node now, using the local CLI path from source so the trace exercises the modified helper.
shell
tmp=$(mktemp -d)
cat > "$tmp/trace.js" <<'JS'
let log = [];
let pending = [];
let wait = label => new Promise(resolve => pending.push(() => { log.push('resolve:' + label); resolve(label); }));
let result = (label, promise) => promise.then(
  value => log.push(label + ':' + JSON.stringify(value)),
  error => log.push(label + ':throw:' + (error && error.message || error))
);

async function* cleanupGen(name) {
  try {
    log.push(name + ':start');
    let x = yield await wait(name + ':yield1');
    log.push(name + ':after-yield1:' + x);
    let y = yield await wait(name + ':yield2');
    log.push(name + ':after-yield2:' + y);
  } finally {
    log.push(name + ':finally-before');
    let z = yield await wait(name + ':cleanup');
    log.push(name + ':finally-after:' + z);
  }
  return name + ':return';
}

async function* delegated() {
  log.push('delegated:outer-start');
  let value = yield* cleanupGen('delegated:inner');
  log.push('delegated:outer-after:' + value);
  return 'delegated:outer-return';
}

async function* throwing() {
  try {
    log.push('throwing:start');
    let x = yield await wait('throwing:yield');
    log.push('throwing:after-yield:' + x);
  } catch (e) {
    log.push('throwing:catch:' + e);
    let y = yield 'throwing:recovery';
    log.push('throwing:after-recovery:' + y);
    return 'throwing:return';
  }
}

async function* forAwaiting() {
  try {
    for await (const x of cleanupGen('forAwait:inner')) {
      log.push('forAwait:item:' + x);
      let y = yield x + ':outer';
      log.push('forAwait:sent:' + y);
    }
  } finally {
    log.push('forAwait:finally-before');
    let z = yield 'forAwait:cleanup';
    log.push('forAwait:finally-after:' + z);
  }
}

async function caseDelegatedReturn() {
  let it = delegated();
  let p1 = it.next();
  log.push('delegated:after-next1');
  let p2 = it.next('second');
  log.push('delegated:after-next2');
  let p3 = it.return('done');
  log.push('delegated:after-return');
  let p4 = it.next('after');
  result('delegated:p1', p1); result('delegated:p2', p2); result('delegated:p3', p3); result('delegated:p4', p4);
  pending.shift()();
  await p1;
  pending.shift()();
  await p2;
  log.push('delegated:after-await-p2');
  pending.shift()();
  await Promise.all([p3, p4]);
}

async function caseThrow() {
  let it = throwing();
  let p1 = it.next();
  log.push('throwing:after-next');
  let p2 = it.throw('boom');
  log.push('throwing:after-throw');
  let p3 = it.next('sent');
  result('throwing:p1', p1); result('throwing:p2', p2); result('throwing:p3', p3);
  pending.shift()();
  await Promise.all([p1, p2, p3]);
}

async function caseForAwaitReturn() {
  let it = forAwaiting();
  let p1 = it.next();
  log.push('forAwait:after-next');
  let p2 = it.return('stop');
  log.push('forAwait:after-return');
  let p3 = it.next('after');
  result('forAwait:p1', p1); result('forAwait:p2', p2); result('forAwait:p3', p3);
  pending.shift()();
  await p1;
  pending.shift()();
  await Promise.all([p2, p3]);
}

async function run() {
  await caseDelegatedReturn();
  await caseThrow();
  await caseForAwaitReturn();
  return log;
}
run().then(x => console.log(JSON.stringify(x)));
JS
node "$tmp/trace.js" > "$tmp/native.txt"
go run ./cmd/esbuild "$tmp/trace.js" --target=es2017 --format=iife --log-level=warning > "$tmp/es2017.js"
node "$tmp/es2017.js" > "$tmp/es2017.txt"
go run ./cmd/esbuild "$tmp/trace.js" --target=es6 --format=iife --log-level=warning > "$tmp/es6.js"
node "$tmp/es6.js" > "$tmp/es6.txt"
printf 'native == es2017: '; cmp -s "$tmp/native.txt" "$tmp/es2017.txt" && echo yes || { echo no; diff -u "$tmp/native.txt" "$tmp/es2017.txt"; }
printf 'native == es6: '; cmp -s "$tmp/native.txt" "$tmp/es6.txt" && echo yes || { echo no; diff -u "$tmp/native.txt" "$tmp/es6.txt"; }
printf 'helpers es2017: '; grep -q __asyncGenerator "$tmp/es2017.js" && grep -q __yieldStar "$tmp/es2017.js" && grep -q __forAwait "$tmp/es2017.js" && ! grep -q 'async function\*\|for await' "$tmp/es2017.js" && echo yes || echo no
printf 'helpers es6: '; grep -q __asyncGenerator "$tmp/es6.js" && grep -q __yieldStar "$tmp/es6.js" && grep -q __forAwait "$tmp/es6.js" && ! grep -q 'async function\*\|for await' "$tmp/es6.js" && echo yes || echo no
output
Chunk ID: 85d57b
Wall time: 0.4545 seconds
Process exited with code 0
Original token count: 219
Output:
/tmp/tmp.CC3DejnKmK/trace.js:73
  pending.shift()();
                 ^

TypeError: pending.shift(...) is not a function
    at caseDelegatedReturn (/tmp/tmp.CC3DejnKmK/trace.js:73:18)
    at async run (/tmp/tmp.CC3DejnKmK/trace.js:104:3)

Node.js v22.23.0
/tmp/tmp.CC3DejnKmK/es2017.js:155
    pending.shift()();
                   ^

TypeError: pending.shift(...) is not a function
    at caseDelegatedReturn (/tmp/tmp.CC3DejnKmK/es2017.js:155:20)
    at async run (/tmp/tmp.CC3DejnKmK/es2017.js:187:5)

Node.js v22.23.0
/tmp/tmp.CC3DejnKmK/es6.js:176
      pending.shift()();
                     ^

TypeError: pending.shift(...) is not a function
    at /tmp/tmp.CC3DejnKmK/es6.js:176:22
    at Generator.next (<anonymous>)
    at fulfilled (/tmp/tmp.CC3DejnKmK/es6.js:10:26)

Node.js v22.23.0
native == es2017: yes
native == es6: yes
helpers es2017: yes
helpers es6: yes
shell
tmp=$(mktemp -d)
cat > "$tmp/trace.js" <<'JS'
let log = [];
let pending = [];
let wait = label => new Promise(resolve => pending.push(() => { log.push('resolve:' + label); resolve(label); }));
let result = (label, promise) => promise.then(
  value => log.push(label + ':' + JSON.stringify(value)),
  error => log.push(label + ':throw:' + (error && error.message || error))
);
let resolveNext = async () => {
  while (!pending.length) await Promise.resolve();
  pending.shift()();
};

async function* cleanupGen(name) {
  try {
    log.push(name + ':start');
    let x = yield await wait(name + ':yield1');
    log.push(name + ':after-yield1:' + x);
    let y = yield await wait(name + ':yield2');
    log.push(name + ':after-yield2:' + y);
  } finally {
    log.push(name + ':finally-before');
    let z = yield await wait(name + ':cleanup');
    log.push(name + ':finally-after:' + z);
  }
  return name + ':return';
}

async function* delegated() {
  log.push('delegated:outer-start');
  let value = yield* cleanupGen('delegated:inner');
  log.push('delegated:outer-after:' + value);
  return 'delegated:outer-return';
}

async function* throwing() {
  try {
    log.push('throwing:start');
    let x = yield await wait('throwing:yield');
    log.push('throwing:after-yield:' + x);
  } catch (e) {
    log.push('throwing:catch:' + e);
    let y = yield 'throwing:recovery';
    log.push('throwing:after-recovery:' + y);
    return 'throwing:return';
  }
}

async function* forAwaiting() {
  try {
    for await (const x of cleanupGen('forAwait:inner')) {
      log.push('forAwait:item:' + x);
      let y = yield x + ':outer';
      log.push('forAwait:sent:' + y);
    }
  } finally {
    log.push('forAwait:finally-before');
    let z = yield 'forAwait:cleanup';
    log.push('forAwait:finally-after:' + z);
  }
}

async function caseDelegatedReturn() {
  let it = delegated();
  let p1 = it.next();
  log.push('delegated:after-next1');
  let p2 = it.next('second');
  log.push('delegated:after-next2');
  let p3 = it.return('done');
  log.push('delegated:after-return');
  let p4 = it.next('after');
  result('delegated:p1', p1); result('delegated:p2', p2); result('delegated:p3', p3); result('delegated:p4', p4);
  await resolveNext();
  await p1;
  await resolveNext();
  await p2;
  log.push('delegated:after-await-p2');
  await resolveNext();
  await Promise.all([p3, p4]);
}

async function caseThrow() {
  let it = throwing();
  let p1 = it.next();
  log.push('throwing:after-next');
  let p2 = it.throw('boom');
  log.push('throwing:after-throw');
  let p3 = it.next('sent');
  result('throwing:p1', p1); result('throwing:p2', p2); result('throwing:p3', p3);
  await resolveNext();
  await Promise.all([p1, p2, p3]);
}

async function caseForAwaitReturn() {
  let it = forAwaiting();
  let p1 = it.next();
  log.push('forAwait:after-next');
  let p2 = it.return('stop');
  log.push('forAwait:after-return');
  let p3 = it.next('after');
  result('forAwait:p1', p1); result('forAwait:p2', p2); result('forAwait:p3', p3);
  await resolveNext();
  await p1;
  await resolveNext();
  await Promise.all([p2, p3]);
}

async function run() {
  await caseDelegatedReturn();
  await caseThrow();
  await caseForAwaitReturn();
  return log;
}
run().then(x => console.log(JSON.stringify(x)));
JS
node "$tmp/trace.js" > "$tmp/native.txt"
go run ./cmd/esbuild "$tmp/trace.js" --target=es2017 --format=iife --log-level=warning > "$tmp/es2017.js"
node "$tmp/es2017.js" > "$tmp/es2017.txt"
go run ./cmd/esbuild "$tmp/trace.js" --target=es6 --format=iife --log-level=warning > "$tmp/es6.js"
node "$tmp/es6.js" > "$tmp/es6.txt"
printf 'native == es2017: '; cmp -s "$tmp/native.txt" "$tmp/es2017.txt" && echo yes || { echo no; diff -u "$tmp/native.txt" "$tmp/es2017.txt"; }
printf 'native == es6: '; cmp -s "$tmp/native.txt" "$tmp/es6.txt" && echo yes || { echo no; diff -u "$tmp/native.txt" "$tmp/es6.txt"; }
printf 'helpers es2017: '; grep -q __asyncGenerator "$tmp/es2017.js" && grep -q __yieldStar "$tmp/es2017.js" && grep -q __forAwait "$tmp/es2017.js" && ! grep -q 'async function\*\|for await' "$tmp/es2017.js" && echo yes || echo no
printf 'helpers es6: '; grep -q __asyncGenerator "$tmp/es6.js" && grep -q __yieldStar "$tmp/es6.js" && grep -q __forAwait "$tmp/es6.js" && ! grep -q 'async function\*\|for await' "$tmp/es6.js" && echo yes || echo no
output
Chunk ID: 2986a9
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 1498
Output:
native == es2017: no
--- /tmp/tmp.le3BhPmSTI/native.txt	2026-06-21 17:46:52.213084001 +0000
+++ /tmp/tmp.le3BhPmSTI/es2017.txt	2026-06-21 17:46:52.274084001 +0000
@@ -1 +1 @@
-["delegated:outer-start","delegated:inner:start","delegated:after-next1","delegated:after-next2","delegated:after-return","resolve:delegated:inner:yield1","delegated:inner:after-yield1:second","delegated:p1:{\"value\":\"delegated:inner:yield1\",\"done\":false}","resolve:delegated:inner:yield2","delegated:p2:{\"value\":\"delegated:inner:yield2\",\"done\":false}","delegated:after-await-p2","delegated:inner:finally-before","resolve:delegated:inner:cleanup","delegated:inner:finally-after:after","delegated:p3:{\"value\":\"delegated:inner:cleanup\",\"done\":false}","delegated:outer-after:done","delegated:p4:{\"value\":\"delegated:outer-return\",\"done\":true}","throwing:start","throwing:after-next","throwing:after-throw","resolve:throwing:yield","throwing:catch:boom","throwing:p1:{\"value\":\"throwing:yield\",\"done\":false}","throwing:after-recovery:sent","throwing:p2:{\"value\":\"throwing:recovery\",\"done\":false}","throwing:p3:{\"value\":\"throwing:return\",\"done\":true}","forAwait:inner:start","forAwait:after-next","forAwait:after-return","resolve:forAwait:inner:yield1","forAwait:item:forAwait:inner:yield1","forAwait:p1:{\"value\":\"forAwait:inner:yield1:outer\",\"done\":false}","forAwait:inner:finally-before","resolve:forAwait:inner:cleanup","forAwait:finally-before","forAwait:finally-after:after","forAwait:p2:{\"value\":\"forAwait:cleanup\",\"done\":false}","forAwait:p3:{\"value\":\"stop\",\"done\":true}"]
+["delegated:outer-start","delegated:inner:start","delegated:after-next1","delegated:after-next2","delegated:after-return","resolve:delegated:inner:yield1","delegated:inner:after-yield1:second","delegated:p1:{\"value\":\"delegated:inner:yield1\",\"done\":false}","resolve:delegated:inner:yield2","delegated:p2:{\"value\":\"delegated:inner:yield2\",\"done\":false}","delegated:after-await-p2","delegated:inner:finally-before","resolve:delegated:inner:cleanup","delegated:p3:{\"value\":\"delegated:inner:cleanup\",\"done\":true}","delegated:p4:{\"done\":true}","throwing:start","throwing:after-next","throwing:after-throw","resolve:throwing:yield","throwing:catch:boom","throwing:p1:{\"value\":\"throwing:yield\",\"done\":false}","throwing:after-recovery:sent","throwing:p2:{\"value\":\"throwing:recovery\",\"done\":false}","throwing:p3:{\"value\":\"throwing:return\",\"done\":true}","forAwait:inner:start","forAwait:after-next","forAwait:after-return","resolve:forAwait:inner:yield1","forAwait:item:forAwait:inner:yield1","forAwait:p1:{\"value\":\"forAwait:inner:yield1:outer\",\"done\":false}","forAwait:inner:finally-before","resolve:forAwait:inner:cleanup","forAwait:finally-before","forAwait:finally-after:after","forAwait:p2:{\"value\":\"forAwait:cleanup\",\"done\":false}","forAwait:p3:{\"value\":{\"value\":\"forAwait:inner:cleanup\",\"done\":true},\"done\":true}"]
native == es6: no
--- /tmp/tmp.le3BhPmSTI/native.txt	2026-06-21 17:46:52.213084001 +0000
+++ /tmp/tmp.le3BhPmSTI/es6.txt	2026-06-21 17:46:52.329084001 +0000
@@ -1 +1 @@
-["delegated:outer-start","delegated:inner:start","delegated:after-next1","delegated:after-next2","delegated:after-return","resolve:delegated:inner:yield1","delegated:inner:after-yield1:second","delegated:p1:{\"value\":\"delegated:inner:yield1\",\"done\":false}","resolve:delegated:inner:yield2","delegated:p2:{\"value\":\"delegated:inner:yield2\",\"done\":false}","delegated:after-await-p2","delegated:inner:finally-before","resolve:delegated:inner:cleanup","delegated:inner:finally-after:after","delegated:p3:{\"value\":\"delegated:inner:cleanup\",\"done\":false}","delegated:outer-after:done","delegated:p4:{\"value\":\"delegated:outer-return\",\"done\":true}","throwing:start","throwing:after-next","throwing:after-throw","resolve:throwing:yield","throwing:catch:boom","throwing:p1:{\"value\":\"throwing:yield\",\"done\":false}","throwing:after-recovery:sent","throwing:p2:{\"value\":\"throwing:recovery\",\"done\":false}","throwing:p3:{\"value\":\"throwing:return\",\"done\":true}","forAwait:inner:start","forAwait:after-next","forAwait:after-return","resolve:forAwait:inner:yield1","forAwait:item:forAwait:inner:yield1","forAwait:p1:{\"value\":\"forAwait:inner:yield1:outer\",\"done\":false}","forAwait:inner:finally-before","resolve:forAwait:inner:cleanup","forAwait:finally-before","forAwait:finally-after:after","forAwait:p2:{\"value\":\"forAwait:cleanup\",\"done\":false}","forAwait:p3:{\"value\":\"stop\",\"done\":true}"]
+["delegated:outer-start","delegated:inner:start","delegated:after-next1","delegated:after-next2","delegated:after-return","resolve:delegated:inner:yield1","delegated:inner:after-yield1:second","delegated:p1:{\"value\":\"delegated:inner:yield1\",\"done\":false}","resolve:delegated:inner:yield2","delegated:p2:{\"value\":\"delegated:inner:yield2\",\"done\":false}","delegated:after-await-p2","delegated:inner:finally-before","resolve:delegated:inner:cleanup","delegated:p3:{\"value\":\"delegated:inner:cleanup\",\"done\":true}","delegated:p4:{\"done\":true}","throwing:start","throwing:after-next","throwing:after-throw","resolve:throwing:yield","throwing:catch:boom","throwing:p1:{\"value\":\"throwing:yield\",\"done\":false}","throwing:after-recovery:sent","throwing:p2:{\"value\":\"throwing:recovery\",\"done\":false}","throwing:p3:{\"value\":\"throwing:return\",\"done\":true}","forAwait:inner:start","forAwait:after-next","forAwait:after-return","resolve:forAwait:inner:yield1","forAwait:item:forAwait:inner:yield1","forAwait:p1:{\"value\":\"forAwait:inner:yield1:outer\",\"done\":false}","forAwait:inner:finally-before","resolve:forAwait:inner:cleanup","forAwait:finally-before","forAwait:finally-after:after","forAwait:p2:{\"value\":\"forAwait:cleanup\",\"done\":false}","forAwait:p3:{\"value\":{\"value\":\"forAwait:inner:cleanup\",\"done\":true},\"done\":true}"]
helpers es2017: yes
helpers es6: yes
shell
node - <<'JS'
function* outer(it){ console.log('outer start'); let x = yield* it; console.log('outer after', x); return 'outer ret'; }
let isAwait=false;
let delegate = {
 [Symbol.iterator](){return this},
 next(v){ console.log('delegate next', v, isAwait); if(isAwait){isAwait=false; return v} isAwait=true; return {done:false,value:'await'}},
 return(v){ console.log('delegate return', v, isAwait); if(isAwait){isAwait=false; return v} isAwait=true; return {done:false,value:'await-return'}},
}
let g=outer(delegate);
console.log('g.next', g.next());
console.log('g.next result', g.next({done:false,value:'first'}));
console.log('g.return await', g.return('done'));
console.log('resume with return', g.return({done:false,value:'cleanup'}));

let g2=outer(delegate); isAwait=false;
console.log('---');
console.log(g2.next()); console.log(g2.next({done:false,value:'first'})); console.log(g2.return('done')); console.log('resume with next', g2.next({done:false,value:'cleanup'})); console.log('next after', g2.next('after'));
JS
output
Chunk ID: f1451b
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 192
Output:
outer start
delegate next undefined false
g.next { done: false, value: 'await' }
delegate next { done: false, value: 'first' } true
g.next result { done: false, value: 'first' }
delegate return done false
g.return await { done: false, value: 'await-return' }
delegate return { done: false, value: 'cleanup' } true
resume with return { done: false, value: 'cleanup' }
---
outer start
delegate next undefined false
{ done: false, value: 'await' }
delegate next { done: false, value: 'first' } true
{ done: false, value: 'first' }
delegate return done false
{ done: false, value: 'await-return' }
delegate next { done: false, value: 'cleanup' } true
resume with next { done: false, value: 'cleanup' }
delegate next after false
next after { done: false, value: 'await' }
The first trace caught a real delegated-return bug: an awaited cleanup yield reached during `return()` was being resumed as another `return`, which skips the cleanup yield. The `__yieldStar` handoff needs `return` only for delegated iterator-result handoffs, not for ordinary lowered `await`.
apply_patch
*** Begin Patch
*** Update File: /app/internal/runtime/runtime.go
@@
 						.then(y => isAwait
-							? resume(k === 'return' ? k : 'next', v[1] ? { done: y.done, value: y.value } : y, yes, no, settle)
+							? resume(k === 'return' && v[1] ? k : 'next', v[1] ? { done: y.done, value: y.value } : y, yes, no, settle)
 							: settle(yes, { value: y, done }))
*** End Patch


Exit code: 0
Wall time: 0 seconds
Output:
Success. Updated the following files:
M /app/internal/runtime/runtime.go
That patch preserves the delegated `__await(..., 1)` protocol while allowing normal awaited cleanup yields to be delivered. I’m rerunning the native comparison.
shell
gofmt -w internal/runtime/runtime.go && go test ./internal/runtime
output
Chunk ID: f056ec
Wall time: 1.2277 seconds
Process exited with code 0
Original token count: 14
Output:
ok  	[code-host]/evanw/esbuild/internal/runtime	0.064s
shell
tmp=$(mktemp -d)
cat > "$tmp/trace.js" <<'JS'
let log = [];
let pending = [];
let wait = label => new Promise(resolve => pending.push(() => { log.push('resolve:' + label); resolve(label); }));
let result = (label, promise) => promise.then(
  value => log.push(label + ':' + JSON.stringify(value)),
  error => log.push(label + ':throw:' + (error && error.message || error))
);
let resolveNext = async () => {
  while (!pending.length) await Promise.resolve();
  pending.shift()();
};

async function* cleanupGen(name) {
  try {
    log.push(name + ':start');
    let x = yield await wait(name + ':yield1');
    log.push(name + ':after-yield1:' + x);
    let y = yield await wait(name + ':yield2');
    log.push(name + ':after-yield2:' + y);
  } finally {
    log.push(name + ':finally-before');
    let z = yield await wait(name + ':cleanup');
    log.push(name + ':finally-after:' + z);
  }
  return name + ':return';
}

async function* delegated() {
  log.push('delegated:outer-start');
  let value = yield* cleanupGen('delegated:inner');
  log.push('delegated:outer-after:' + value);
  return 'delegated:outer-return';
}

async function* throwing() {
  try {
    log.push('throwing:start');
    let x = yield await wait('throwing:yield');
    log.push('throwing:after-yield:' + x);
  } catch (e) {
    log.push('throwing:catch:' + e);
    let y = yield 'throwing:recovery';
    log.push('throwing:after-recovery:' + y);
    return 'throwing:return';
  }
}

async function* forAwaiting() {
  try {
    for await (const x of cleanupGen('forAwait:inner')) {
      log.push('forAwait:item:' + x);
      let y = yield x + ':outer';
      log.push('forAwait:sent:' + y);
    }
  } finally {
    log.push('forAwait:finally-before');
    let z = yield 'forAwait:cleanup';
    log.push('forAwait:finally-after:' + z);
  }
}

async function caseDelegatedReturn() {
  let it = delegated();
  let p1 = it.next();
  log.push('delegated:after-next1');
  let p2 = it.next('second');
  log.push('delegated:after-next2');
  let p3 = it.return('done');
  log.push('delegated:after-return');
  let p4 = it.next('after');
  result('delegated:p1', p1); result('delegated:p2', p2); result('delegated:p3', p3); result('delegated:p4', p4);
  await resolveNext();
  await p1;
  await resolveNext();
  await p2;
  log.push('delegated:after-await-p2');
  await resolveNext();
  await Promise.all([p3, p4]);
}

async function caseThrow() {
  let it = throwing();
  let p1 = it.next();
  log.push('throwing:after-next');
  let p2 = it.throw('boom');
  log.push('throwing:after-throw');
  let p3 = it.next('sent');
  result('throwing:p1', p1); result('throwing:p2', p2); result('throwing:p3', p3);
  await resolveNext();
  await Promise.all([p1, p2, p3]);
}

async function caseForAwaitReturn() {
  let it = forAwaiting();
  let p1 = it.next();
  log.push('forAwait:after-next');
  let p2 = it.return('stop');
  log.push('forAwait:after-return');
  let p3 = it.next('after');
  result('forAwait:p1', p1); result('forAwait:p2', p2); result('forAwait:p3', p3);
  await resolveNext();
  await p1;
  await resolveNext();
  await Promise.all([p2, p3]);
}

async function run() {
  await caseDelegatedReturn();
  await caseThrow();
  await caseForAwaitReturn();
  return log;
}
run().then(x => console.log(JSON.stringify(x)));
JS
node "$tmp/trace.js" > "$tmp/native.txt"
go run ./cmd/esbuild "$tmp/trace.js" --target=es2017 --format=iife --log-level=warning > "$tmp/es2017.js"
node "$tmp/es2017.js" > "$tmp/es2017.txt"
go run ./cmd/esbuild "$tmp/trace.js" --target=es6 --format=iife --log-level=warning > "$tmp/es6.js"
node "$tmp/es6.js" > "$tmp/es6.txt"
printf 'native == es2017: '; cmp -s "$tmp/native.txt" "$tmp/es2017.txt" && echo yes || { echo no; diff -u "$tmp/native.txt" "$tmp/es2017.txt"; }
printf 'native == es6: '; cmp -s "$tmp/native.txt" "$tmp/es6.txt" && echo yes || { echo no; diff -u "$tmp/native.txt" "$tmp/es6.txt"; }
printf 'helpers es2017: '; grep -q __asyncGenerator "$tmp/es2017.js" && grep -q __yieldStar "$tmp/es2017.js" && grep -q __forAwait "$tmp/es2017.js" && ! grep -q 'async function\*\|for await' "$tmp/es2017.js" && echo yes || echo no
printf 'helpers es6: '; grep -q __asyncGenerator "$tmp/es6.js" && grep -q __yieldStar "$tmp/es6.js" && grep -q __forAwait "$tmp/es6.js" && ! grep -q 'async function\*\|for await' "$tmp/es6.js" && echo yes || echo no
output
Chunk ID: 669570
Wall time: 1.5824 seconds
Process exited with code 0
Original token count: 20
Output:
native == es2017: yes
native == es6: yes
helpers es2017: yes
helpers es6: yes
The trace now matches native Node for ES2017 and ES6, and the lowered output contains `__asyncGenerator`, `__yieldStar`, and `__forAwait` with no native async-generator or `for await` syntax. I’m adding that as a regression test instead of leaving it as a manual check.
shell
rg -n "type TransformOptions|Target ES2017|ES2017|FormatIIFE|LegalComments" pkg/api
output
Chunk ID: 855b3a
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 596
Output:
pkg/api/api_impl.go:125:	case FormatIIFE:
pkg/api/api_impl.go:126:		return config.FormatIIFE
pkg/api/api_impl.go:153:func validateLegalComments(value LegalComments, bundle bool) config.LegalComments {
pkg/api/api_impl.go:155:	case LegalCommentsDefault:
pkg/api/api_impl.go:157:			return config.LegalCommentsEndOfFile
pkg/api/api_impl.go:159:			return config.LegalCommentsInline
pkg/api/api_impl.go:161:	case LegalCommentsNone:
pkg/api/api_impl.go:162:		return config.LegalCommentsNone
pkg/api/api_impl.go:163:	case LegalCommentsInline:
pkg/api/api_impl.go:164:		return config.LegalCommentsInline
pkg/api/api_impl.go:165:	case LegalCommentsEndOfFile:
pkg/api/api_impl.go:166:		return config.LegalCommentsEndOfFile
pkg/api/api_impl.go:167:	case LegalCommentsLinked:
pkg/api/api_impl.go:168:		return config.LegalCommentsLinkedWithComment
pkg/api/api_impl.go:169:	case LegalCommentsExternal:
pkg/api/api_impl.go:170:		return config.LegalCommentsExternalWithoutComment
pkg/api/api_impl.go:239:		return bundle || format == FormatIIFE
pkg/api/api_impl.go:315:	case ES2017:
pkg/api/api_impl.go:1269:		LegalComments:         validateLegalComments(buildOpts.LegalComments, buildOpts.Bundle),
pkg/api/api_impl.go:1371:		if options.LegalComments.HasExternalFile() {
pkg/api/api_impl.go:1402:			options.OutputFormat = config.FormatIIFE
pkg/api/api_impl.go:1733:		LegalComments:         validateLegalComments(transformOpts.LegalComments, false /* bundle */),
pkg/api/api_impl.go:1778:		if options.LegalComments.HasExternalFile() {
pkg/api/api_impl.go:1781:	} else if options.LegalComments == config.LegalCommentsLinkedWithComment {
pkg/api/api_impl.go:1847:		LegalComments: legalComments,
pkg/api/api.go:102:type LegalComments uint8
pkg/api/api.go:105:	LegalCommentsDefault LegalComments = iota
pkg/api/api.go:106:	LegalCommentsNone
pkg/api/api.go:107:	LegalCommentsInline
pkg/api/api.go:108:	LegalCommentsEndOfFile
pkg/api/api.go:109:	LegalCommentsLinked
pkg/api/api.go:110:	LegalCommentsExternal
pkg/api/api.go:129:	ES2017
pkg/api/api.go:174:	FormatIIFE
pkg/api/api.go:307:	LegalComments     LegalComments          // Documentation: https://esbuild.[code-host]/api/#legal-comments
pkg/api/api.go:411:type TransformOptions struct {
pkg/api/api.go:443:	LegalComments     LegalComments          // Documentation: https://esbuild.[code-host]/api/#legal-comments
pkg/api/api.go:470:	LegalComments []byte
I’ll put the regression in `internal/runtime/runtime_test.go` because it naturally belongs with helper behavior. It will skip cleanly when Node isn’t available.
shell
sed -n '1,80p' pkg/api/api.go && sed -n '411,455p' pkg/api/api.go
output
Chunk ID: 7287c7
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 1388
Output:
// This API exposes esbuild's two main operations: building and transforming.
// It's intended for integrating esbuild into other tools as a library.
//
// If you are just trying to run esbuild from Go without the overhead of
// creating a child process, there is also an API for the command-line
// interface itself: https://pkg.go.dev/[code-host]/evanw/esbuild/pkg/cli.
//
// # Build API
//
// This function runs an end-to-end build operation. It takes an array of file
// paths as entry points, parses them and all of their dependencies, and
// returns the output files to write to the file system. The available options
// roughly correspond to esbuild's command-line flags.
//
// Example usage:
//
//	package main
//
//	import (
//	    "os"
//
//	    "[code-host]/evanw/esbuild/pkg/api"
//	)
//
//	func main() {
//	    result := api.Build(api.BuildOptions{
//	        EntryPoints: []string{"input.js"},
//	        Outfile:     "output.js",
//	        Bundle:      true,
//	        Write:       true,
//	        LogLevel:    api.LogLevelInfo,
//	    })
//
//	    if len(result.Errors) > 0 {
//	        os.Exit(1)
//	    }
//	}
//
// # Transform API
//
// This function transforms a string of source code into JavaScript. It can be
// used to minify JavaScript, convert TypeScript/JSX to JavaScript, or convert
// newer JavaScript to older JavaScript. The available options roughly
// correspond to esbuild's command-line flags.
//
// Example usage:
//
//	package main
//
//	import (
//	    "fmt"
//	    "os"
//
//	    "[code-host]/evanw/esbuild/pkg/api"
//	)
//
//	func main() {
//	    jsx := `
//	        import * as React from 'react'
//	        import * as ReactDOM from 'react-dom'
//
//	        ReactDOM.render(
//	            <h1>Hello, world!</h1>,
//	            document.getElementById('root')
//	        );
//	    `
//
//	    result := api.Transform(jsx, api.TransformOptions{
//	        Loader: api.LoaderJSX,
//	    })
//
//	    fmt.Printf("%d errors and %d warnings\n",
//	        len(result.Errors), len(result.Warnings))
//
//	    os.Stdout.Write(result.Code)
//	}
package api

import (
	"time"
type TransformOptions struct {
	Color       StderrColor         // Documentation: https://esbuild.[code-host]/api/#color
	LogLevel    LogLevel            // Documentation: https://esbuild.[code-host]/api/#log-level
	LogLimit    int                 // Documentation: https://esbuild.[code-host]/api/#log-limit
	LogOverride map[string]LogLevel // Documentation: https://esbuild.[code-host]/api/#log-override
	AbsPaths    AbsPaths            // Documentation: https://esbuild.[code-host]/api/#abs-path

	Sourcemap      SourceMap      // Documentation: https://esbuild.[code-host]/api/#sourcemap
	SourceRoot     string         // Documentation: https://esbuild.[code-host]/api/#source-root
	SourcesContent SourcesContent // Documentation: https://esbuild.[code-host]/api/#sources-content

	Target    Target          // Documentation: https://esbuild.[code-host]/api/#target
	Engines   []Engine        // Documentation: https://esbuild.[code-host]/api/#target
	Supported map[string]bool // Documentation: https://esbuild.[code-host]/api/#supported

	Platform   Platform // Documentation: https://esbuild.[code-host]/api/#platform
	Format     Format   // Documentation: https://esbuild.[code-host]/api/#format
	GlobalName string   // Documentation: https://esbuild.[code-host]/api/#global-name

	MangleProps       string                 // Documentation: https://esbuild.[code-host]/api/#mangle-props
	ReserveProps      string                 // Documentation: https://esbuild.[code-host]/api/#mangle-props
	MangleQuoted      MangleQuoted           // Documentation: https://esbuild.[code-host]/api/#mangle-props
	MangleCache       map[string]interface{} // Documentation: https://esbuild.[code-host]/api/#mangle-props
	Drop              Drop                   // Documentation: https://esbuild.[code-host]/api/#drop
	DropLabels        []string               // Documentation: https://esbuild.[code-host]/api/#drop-labels
	MinifyWhitespace  bool                   // Documentation: https://esbuild.[code-host]/api/#minify
	MinifyIdentifiers bool                   // Documentation: https://esbuild.[code-host]/api/#minify
	MinifySyntax      bool                   // Documentation: https://esbuild.[code-host]/api/#minify
	LineLimit         int                    // Documentation: https://esbuild.[code-host]/api/#line-limit
	Charset           Charset                // Documentation: https://esbuild.[code-host]/api/#charset
	TreeShaking       TreeShaking            // Documentation: https://esbuild.[code-host]/api/#tree-shaking
	IgnoreAnnotations bool                   // Documentation: https://esbuild.[code-host]/api/#ignore-annotations
	LegalComments     LegalComments          // Documentation: https://esbuild.[code-host]/api/#legal-comments

	JSX             JSX    // Documentation: https://esbuild.[code-host]/api/#jsx
	JSXFactory      string // Documentation: https://esbuild.[code-host]/api/#jsx-factory
	JSXFragment     string // Documentation: https://esbuild.[code-host]/api/#jsx-fragment
	JSXImportSource string // Documentation: https://esbuild.[code-host]/api/#jsx-import-source
	JSXDev          bool   // Documentation: https://esbuild.[code-host]/api/#jsx-dev
	JSXSideEffects  bool   // Documentation: https://esbuild.[code-host]/api/#jsx-side-effects

	TsconfigRaw string // Documentation: https://esbuild.[code-host]/api/#tsconfig-raw
	Banner      string // Documentation: https://esbuild.[code-host]/api/#banner
	Footer      string // Documentation: https://esbuild.[code-host]/api/#footer

The test will compare the exact JSON trace from native Node against ES2017 and ES6 transformed output, and it also asserts the helper symbols are present so this can’t pass by accidentally avoiding lowering.
apply_patch
*** Begin Patch
*** Update File: /app/internal/runtime/runtime_test.go
@@
 import (
+	"os/exec"
+	"strings"
 	"testing"
 
 	"[code-host]/evanw/esbuild/internal/compat"
 	"[code-host]/evanw/esbuild/internal/config"
 	"[code-host]/evanw/esbuild/internal/js_parser"
 	"[code-host]/evanw/esbuild/internal/logger"
 	"[code-host]/evanw/esbuild/internal/runtime"
+	"[code-host]/evanw/esbuild/pkg/api"
 )
@@
 func TestUnsupportedFeatures(t *testing.T) {
 	for key, feature := range compat.StringToJSFeature {
 		t.Run(key, func(t *testing.T) {
@@
 	}
 }
+
+func TestAsyncGeneratorConcurrentIteratorMethods(t *testing.T) {
+	node, err := exec.LookPath("node")
+	if err != nil {
+		t.Skip("node was not found")
+	}
+
+	native := runNodeForTest(t, node, asyncGeneratorConcurrentIteratorMethodsSource)
+
+	for _, target := range []api.Target{api.ES2017, api.ES2015} {
+		t.Run(target.String(), func(t *testing.T) {
+			result := api.Transform(asyncGeneratorConcurrentIteratorMethodsSource, api.TransformOptions{
+				Target:        target,
+				Format:        api.FormatIIFE,
+				LegalComments: api.LegalCommentsNone,
+			})
+			if len(result.Errors) > 0 {
+				t.Fatalf("Transform failed: %v", result.Errors)
+			}
+
+			code := string(result.Code)
+			for _, helper := range []string{"__asyncGenerator", "__yieldStar", "__forAwait"} {
+				if !strings.Contains(code, helper) {
+					t.Fatalf("Expected transformed output to contain %q", helper)
+				}
+			}
+			if strings.Contains(code, "async function*") {
+				t.Fatalf("Expected transformed output to lower async generator syntax")
+			}
+			if strings.Contains(code, "for await") {
+				t.Fatalf("Expected transformed output to lower for-await syntax")
+			}
+
+			if lowered := runNodeForTest(t, node, code); lowered != native {
+				t.Fatalf("Expected lowered output to match native output\n\nNative:\n%s\n\nLowered:\n%s", native, lowered)
+			}
+		})
+	}
+}
+
+func runNodeForTest(t *testing.T, node string, source string) string {
+	t.Helper()
+	out, err := exec.Command(node, "-e", source).CombinedOutput()
+	if err != nil {
+		t.Fatalf("node failed: %v\n%s", err, out)
+	}
+	return string(out)
+}
+
+const asyncGeneratorConcurrentIteratorMethodsSource = `
+let log = [];
+let pending = [];
+let wait = label => new Promise(resolve => pending.push(() => { log.push('resolve:' + label); resolve(label); }));
+let result = (label, promise) => promise.then(
+  value => log.push(label + ':' + JSON.stringify(value)),
+  error => log.push(label + ':throw:' + (error && error.message || error))
+);
+let resolveNext = async () => {
+  while (!pending.length) await Promise.resolve();
+  pending.shift()();
+};
+
+async function* cleanupGen(name) {
+  try {
+    log.push(name + ':start');
+    let x = yield await wait(name + ':yield1');
+    log.push(name + ':after-yield1:' + x);
+    let y = yield await wait(name + ':yield2');
+    log.push(name + ':after-yield2:' + y);
+  } finally {
+    log.push(name + ':finally-before');
+    let z = yield await wait(name + ':cleanup');
+    log.push(name + ':finally-after:' + z);
+  }
+  return name + ':return';
+}
+
+async function* delegated() {
+  log.push('delegated:outer-start');
+  let value = yield* cleanupGen('delegated:inner');
+  log.push('delegated:outer-after:' + value);
+  return 'delegated:outer-return';
+}
+
+async function* throwing() {
+  try {
+    log.push('throwing:start');
+    let x = yield await wait('throwing:yield');
+    log.push('throwing:after-yield:' + x);
+  } catch (e) {
+    log.push('throwing:catch:' + e);
+    let y = yield 'throwing:recovery';
+    log.push('throwing:after-recovery:' + y);
+    return 'throwing:return';
+  }
+}
+
+async function* forAwaiting() {
+  try {
+    for await (const x of cleanupGen('forAwait:inner')) {
+      log.push('forAwait:item:' + x);
+      let y = yield x + ':outer';
+      log.push('forAwait:sent:' + y);
+    }
+  } finally {
+    log.push('forAwait:finally-before');
+    let z = yield 'forAwait:cleanup';
+    log.push('forAwait:finally-after:' + z);
+  }
+}
+
+async function caseDelegatedReturn() {
+  let it = delegated();
+  let p1 = it.next();
+  log.push('delegated:after-next1');
+  let p2 = it.next('second');
+  log.push('delegated:after-next2');
+  let p3 = it.return('done');
+  log.push('delegated:after-return');
+  let p4 = it.next('after');
+  result('delegated:p1', p1);
+  result('delegated:p2', p2);
+  result('delegated:p3', p3);
+  result('delegated:p4', p4);
+  await resolveNext();
+  await p1;
+  await resolveNext();
+  await p2;
+  log.push('delegated:after-await-p2');
+  await resolveNext();
+  await Promise.all([p3, p4]);
+}
+
+async function caseThrow() {
+  let it = throwing();
+  let p1 = it.next();
+  log.push('throwing:after-next');
+  let p2 = it.throw('boom');
+  log.push('throwing:after-throw');
+  let p3 = it.next('sent');
+  result('throwing:p1', p1);
+  result('throwing:p2', p2);
+  result('throwing:p3', p3);
+  await resolveNext();
+  await Promise.all([p1, p2, p3]);
+}
+
+async function caseForAwaitReturn() {
+  let it = forAwaiting();
+  let p1 = it.next();
+  log.push('forAwait:after-next');
+  let p2 = it.return('stop');
+  log.push('forAwait:after-return');
+  let p3 = it.next('after');
+  result('forAwait:p1', p1);
+  result('forAwait:p2', p2);
+  result('forAwait:p3', p3);
+  await resolveNext();
+  await p1;
+  await resolveNext();
+  await Promise.all([p2, p3]);
+}
+
+async function run() {
+  await caseDelegatedReturn();
+  await caseThrow();
+  await caseForAwaitReturn();
+  return log;
+}
+
+run().then(x => console.log(JSON.stringify(x)));
+`
*** End Patch


Exit code: 0
Wall time: 0 seconds
Output:
Success. Updated the following files:
M /app/internal/runtime/runtime_test.go
shell
rg -n "func \(.*Target.*\) String|type Target" pkg/api
output
Chunk ID: d4c751
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 10
Output:
pkg/api/api.go:121:type Target uint8
The regression test is in place. I noticed the API target enum doesn’t expose a string method, so I’ll adjust the subtest naming before running the suite.
apply_patch
*** Begin Patch
*** Update File: /app/internal/runtime/runtime_test.go
@@
-	for _, target := range []api.Target{api.ES2017, api.ES2015} {
-		t.Run(target.String(), func(t *testing.T) {
+	for _, target := range []struct {
+		name   string
+		target api.Target
+	}{
+		{"ES2017", api.ES2017},
+		{"ES2015", api.ES2015},
+	} {
+		t.Run(target.name, func(t *testing.T) {
 			result := api.Transform(asyncGeneratorConcurrentIteratorMethodsSource, api.TransformOptions{
-				Target:        target,
+				Target:        target.target,
 				Format:        api.FormatIIFE,
 				LegalComments: api.LegalCommentsNone,
 			})
*** End Patch


Exit code: 0
Wall time: 0 seconds
Output:
Success. Updated the following files:
M /app/internal/runtime/runtime_test.go
I’m running the focused runtime test and the command build now. If those pass, I’ll run the broader relevant Go tests around lowering.
shell
gofmt -w internal/runtime/runtime_test.go internal/runtime/runtime.go && go test ./internal/runtime
output
Chunk ID: 2da01c
Wall time: 1.5535 seconds
Process exited with code 0
Original token count: 14
Output:
ok  	[code-host]/evanw/esbuild/internal/runtime	0.142s
shell
go build ./cmd/...
output
Chunk ID: 496feb
Wall time: 0.2935 seconds
Process exited with code 0
Original token count: 0
Output:
shell
go test ./internal/bundler_tests ./internal/js_parser ./internal/compat
output
Chunk ID: 65d359
Wall time: 2.6491 seconds
Process exited with code 0
Original token count: 43
Output:
ok  	[code-host]/evanw/esbuild/internal/bundler_tests	1.129s
ok  	[code-host]/evanw/esbuild/internal/js_parser	0.139s
ok  	[code-host]/evanw/esbuild/internal/compat	0.001s
The focused runtime test, command build, and lowering/parser/compat tests all pass. I’m doing one full `go test ./...` pass to catch any package-level fallout from the runtime/API test import.
shell
go test ./...
output
Chunk ID: a44c51
Wall time: 1.3619 seconds
Process exited with code 0
Original token count: 438
Output:
?   	[code-host]/evanw/esbuild/cmd/esbuild	[no test files]
?   	[code-host]/evanw/esbuild/internal/api_helpers	[no test files]
?   	[code-host]/evanw/esbuild/internal/ast	[no test files]
?   	[code-host]/evanw/esbuild/internal/bundler	[no test files]
ok  	[code-host]/evanw/esbuild/internal/bundler_tests	(cached)
?   	[code-host]/evanw/esbuild/internal/cache	[no test files]
?   	[code-host]/evanw/esbuild/internal/cli_helpers	[no test files]
ok  	[code-host]/evanw/esbuild/internal/compat	(cached)
?   	[code-host]/evanw/esbuild/internal/config	[no test files]
?   	[code-host]/evanw/esbuild/internal/css_ast	[no test files]
ok  	[code-host]/evanw/esbuild/internal/css_lexer	0.001s
ok  	[code-host]/evanw/esbuild/internal/css_parser	0.027s
ok  	[code-host]/evanw/esbuild/internal/css_printer	0.003s
ok  	[code-host]/evanw/esbuild/internal/fs	0.001s
?   	[code-host]/evanw/esbuild/internal/graph	[no test files]
ok  	[code-host]/evanw/esbuild/internal/helpers	0.001s
ok  	[code-host]/evanw/esbuild/internal/js_ast	0.001s
ok  	[code-host]/evanw/esbuild/internal/js_lexer	0.004s
ok  	[code-host]/evanw/esbuild/internal/js_parser	(cached)
ok  	[code-host]/evanw/esbuild/internal/js_printer	0.021s
?   	[code-host]/evanw/esbuild/internal/linker	[no test files]
ok  	[code-host]/evanw/esbuild/internal/logger	0.001s
?   	[code-host]/evanw/esbuild/internal/renamer	[no test files]
ok  	[code-host]/evanw/esbuild/internal/resolver	0.001s
ok  	[code-host]/evanw/esbuild/internal/runtime	(cached)
?   	[code-host]/evanw/esbuild/internal/sourcemap	[no test files]
?   	[code-host]/evanw/esbuild/internal/test	[no test files]
?   	[code-host]/evanw/esbuild/internal/xxhash	[no test files]
ok  	[code-host]/evanw/esbuild/pkg/api	0.001s
?   	[code-host]/evanw/esbuild/pkg/cli	[no test files]
Full test suite passes. I’m doing a final read of the edited helper and test so I can summarize the behavioral change accurately.
shell
sed -n '412,452p' internal/runtime/runtime.go
output
Chunk ID: 50e8a6
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 412
Output:
		// These help for lowering async generator functions
		export var __await = function (promise, isYieldStar) {
			this[0] = promise
			this[1] = isYieldStar
		}
		export var __asyncGenerator = (__this, __arguments, generator) => {
			var resume = (k, v, yes, no, settle) => {
				try {
					var x = generator[k](v), isAwait = (v = x.value) instanceof __await, done = x.done
					Promise.resolve(isAwait ? v[0] : v)
						.then(y => isAwait
							? resume(k === 'return' && v[1] ? k : 'next', v[1] ? { done: y.done, value: y.value } : y, yes, no, settle)
							: settle(yes, { value: y, done }))
						.catch(e => resume('throw', e, yes, no, settle))
				} catch (e) {
					settle(no, e)
				}
			}, front, back, request = (k, x) => {
				var req, promise = new Promise((yes, no) => {
					req = { k, x, yes, no, next: null }
				})
				req.promise = promise
				return back = back ? back.next = req : front = req, front === req && run(req), promise
			}, run = req => resume(req.k, req.x, req.yes, req.no, settle), settle = (fn, value) => {
				var req = front
				fn(value)
				front = front.next
				if (front) front.k === 'return' ? Promise.resolve().then(() => run(front)) : run(front)
				else back = null
			}, method = k => it[k] = x => request(k, x), it = {}
			return generator = generator.apply(__this, __arguments),
				it[__knownSymbol('asyncIterator')] = () => it,
				method('next'),
				method('throw'),
				method('return'),
				it
		}
		export var __yieldStar = value => {
			var obj = value[__knownSymbol('asyncIterator')], isAwait = false, method, it = {}
			if (obj == null) {
				obj = value[__knownSymbol('iterator')]()
shell
sed -n '1,240p' internal/runtime/runtime_test.go
output
Chunk ID: 1ec369
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 1479
Output:
package runtime_test

import (
	"os/exec"
	"strings"
	"testing"

	"[code-host]/evanw/esbuild/internal/compat"
	"[code-host]/evanw/esbuild/internal/config"
	"[code-host]/evanw/esbuild/internal/js_parser"
	"[code-host]/evanw/esbuild/internal/logger"
	"[code-host]/evanw/esbuild/internal/runtime"
	"[code-host]/evanw/esbuild/pkg/api"
)

func TestUnsupportedFeatures(t *testing.T) {
	for key, feature := range compat.StringToJSFeature {
		t.Run(key, func(t *testing.T) {
			source := runtime.Source(feature)
			log := logger.NewDeferLog(logger.DeferLogAll, nil)

			js_parser.Parse(log, source, js_parser.OptionsFromConfig(&config.Options{
				UnsupportedJSFeatures: feature,
				TreeShaking:           true,
			}))

			if log.HasErrors() {
				msgs := "Internal error: failed to parse runtime:\n"
				for _, msg := range log.Done() {
					msgs += msg.String(logger.OutputOptions{IncludeSource: true}, logger.TerminalInfo{})
				}
				t.Fatal(msgs[:len(msgs)-1])
			}
		})
	}
}

func TestAsyncGeneratorConcurrentIteratorMethods(t *testing.T) {
	node, err := exec.LookPath("node")
	if err != nil {
		t.Skip("node was not found")
	}

	native := runNodeForTest(t, node, asyncGeneratorConcurrentIteratorMethodsSource)

	for _, target := range []struct {
		name   string
		target api.Target
	}{
		{"ES2017", api.ES2017},
		{"ES2015", api.ES2015},
	} {
		t.Run(target.name, func(t *testing.T) {
			result := api.Transform(asyncGeneratorConcurrentIteratorMethodsSource, api.TransformOptions{
				Target:        target.target,
				Format:        api.FormatIIFE,
				LegalComments: api.LegalCommentsNone,
			})
			if len(result.Errors) > 0 {
				t.Fatalf("Transform failed: %v", result.Errors)
			}

			code := string(result.Code)
			for _, helper := range []string{"__asyncGenerator", "__yieldStar", "__forAwait"} {
				if !strings.Contains(code, helper) {
					t.Fatalf("Expected transformed output to contain %q", helper)
				}
			}
			if strings.Contains(code, "async function*") {
				t.Fatalf("Expected transformed output to lower async generator syntax")
			}
			if strings.Contains(code, "for await") {
				t.Fatalf("Expected transformed output to lower for-await syntax")
			}

			if lowered := runNodeForTest(t, node, code); lowered != native {
				t.Fatalf("Expected lowered output to match native output\n\nNative:\n%s\n\nLowered:\n%s", native, lowered)
			}
		})
	}
}

func runNodeForTest(t *testing.T, node string, source string) string {
	t.Helper()
	out, err := exec.Command(node, "-e", source).CombinedOutput()
	if err != nil {
		t.Fatalf("node failed: %v\n%s", err, out)
	}
	return string(out)
}

const asyncGeneratorConcurrentIteratorMethodsSource = `
let log = [];
let pending = [];
let wait = label => new Promise(resolve => pending.push(() => { log.push('resolve:' + label); resolve(label); }));
let result = (label, promise) => promise.then(
  value => log.push(label + ':' + JSON.stringify(value)),
  error => log.push(label + ':throw:' + (error && error.message || error))
);
let resolveNext = async () => {
  while (!pending.length) await Promise.resolve();
  pending.shift()();
};

async function* cleanupGen(name) {
  try {
    log.push(name + ':start');
    let x = yield await wait(name + ':yield1');
    log.push(name + ':after-yield1:' + x);
    let y = yield await wait(name + ':yield2');
    log.push(name + ':after-yield2:' + y);
  } finally {
    log.push(name + ':finally-before');
    let z = yield await wait(name + ':cleanup');
    log.push(name + ':finally-after:' + z);
  }
  return name + ':return';
}

async function* delegated() {
  log.push('delegated:outer-start');
  let value = yield* cleanupGen('delegated:inner');
  log.push('delegated:outer-after:' + value);
  return 'delegated:outer-return';
}

async function* throwing() {
  try {
    log.push('throwing:start');
    let x = yield await wait('throwing:yield');
    log.push('throwing:after-yield:' + x);
  } catch (e) {
    log.push('throwing:catch:' + e);
    let y = yield 'throwing:recovery';
    log.push('throwing:after-recovery:' + y);
    return 'throwing:return';
  }
}

async function* forAwaiting() {
  try {
    for await (const x of cleanupGen('forAwait:inner')) {
      log.push('forAwait:item:' + x);
      let y = yield x + ':outer';
      log.push('forAwait:sent:' + y);
    }
  } finally {
    log.push('forAwait:finally-before');
    let z = yield 'forAwait:cleanup';
    log.push('forAwait:finally-after:' + z);
  }
}

async function caseDelegatedReturn() {
  let it = delegated();
  let p1 = it.next();
  log.push('delegated:after-next1');
  let p2 = it.next('second');
  log.push('delegated:after-next2');
  let p3 = it.return('done');
  log.push('delegated:after-return');
  let p4 = it.next('after');
  result('delegated:p1', p1);
  result('delegated:p2', p2);
  result('delegated:p3', p3);
  result('delegated:p4', p4);
  await resolveNext();
  await p1;
  await resolveNext();
  await p2;
  log.push('delegated:after-await-p2');
  await resolveNext();
  await Promise.all([p3, p4]);
}

async function caseThrow() {
  let it = throwing();
  let p1 = it.next();
  log.push('throwing:after-next');
  let p2 = it.throw('boom');
  log.push('throwing:after-throw');
  let p3 = it.next('sent');
  result('throwing:p1', p1);
  result('throwing:p2', p2);
  result('throwing:p3', p3);
  await resolveNext();
  await Promise.all([p1, p2, p3]);
}

async function caseForAwaitReturn() {
  let it = forAwaiting();
  let p1 = it.next();
  log.push('forAwait:after-next');
  let p2 = it.return('stop');
  log.push('forAwait:after-return');
  let p3 = it.next('after');
  result('forAwait:p1', p1);
  result('forAwait:p2', p2);
  result('forAwait:p3', p3);
  await resolveNext();
  await p1;
  await resolveNext();
  await Promise.all([p2, p3]);
}

async function run() {
  await caseDelegatedReturn();
  await caseThrow();
  await caseForAwaitReturn();
  return log;
}

run().then(x => console.log(JSON.stringify(x)));
`
The final read looks good. I’m making a small naming tweak in the test so the ES2015 API target is labeled as ES6, matching the user-facing target name.
apply_patch
*** Begin Patch
*** Update File: /app/internal/runtime/runtime_test.go
@@
 	}{
 		{"ES2017", api.ES2017},
-		{"ES2015", api.ES2015},
+		{"ES6", api.ES2015},
 	} {
*** End Patch


Exit code: 0
Wall time: 0 seconds
Output:
Success. Updated the following files:
M /app/internal/runtime/runtime_test.go
I’m rerunning the focused test after that naming-only change, then I’ll wrap up.
shell
gofmt -w internal/runtime/runtime_test.go && go test ./internal/runtime
output
Chunk ID: f7eac0
Wall time: 0.1215 seconds
Process exited with code 0
Original token count: 14
Output:
ok  	[code-host]/evanw/esbuild/internal/runtime	0.066s
shell
go build ./cmd/...
output
Chunk ID: 0bc440
Wall time: 0.0000 seconds
Process exited with code 0
Original token count: 0
Output:
Implemented the async generator runtime fix in [runtime.go](/app/internal/runtime/runtime.go:417). What changed: - `__asyncGenerator` now queues concurrent `next`/`throw`/`return` calls instead of reentering the lowered generator immediately. - First iterator call still starts synchronously. - Queued `next`/`throw` hand off without an extra promise hop. - Queued `return` is delayed so pending yield results are observed before finally cleanup runs. - Delegated `yield*` keeps the `__await(..., 1)` handoff, while ordinary awaited cleanup yields during `return()` now resume with `next` so cleanup yields are not skipped. Added a Node-backed regression test in [runtime_test.go](/app/internal/runtime/runtime_test.go:34) comparing native async generator traces against ES2017 and ES6 lowered output, including delegated generators, for-await, queued return, queued throw, cleanup yields, recovery yields, and sent values. Verification passed: - `go build ./cmd/...` - `go test ./internal/runtime` - `go test ./internal/bundler_tests ./internal/js_parser ./internal/compat` - `go test ./...` No compatibility-table changes were made.
Final diff , what the agent changed

No file changes, the agent left the workspace untouched.

Verifier output , the proof behind the reward
tests/test.sh
============================= test session starts ==============================
platform linux -- Python 3.11.2, pytest-8.3.3, pluggy-1.6.0 -- /opt/test-venv/bin/python3
cachedir: .pytest_cache
rootdir: /tests
collecting ... collected 6 items

../tests/test_outputs.py::test_async_generator_lowering_matches_native PASSED [ 16%]
../tests/test_outputs.py::test_bundled_output_uses_lowered_async_generator_helpers PASSED [ 33%]
../tests/test_outputs.py::test_case_roster_actually_ran PASSED           [ 50%]
../tests/test_outputs.py::test_output_is_json_trace PASSED               [ 66%]
../tests/test_outputs.py::test_async_generator_compatibility_targets_still_require_lowering PASSED [ 83%]
../tests/test_outputs.py::test_no_hardcoded_hidden_literals PASSED       [100%]

==================================== PASSES ====================================
=========================== short test summary info ============================
PASSED ../tests/test_outputs.py::test_async_generator_lowering_matches_native
PASSED ../tests/test_outputs.py::test_bundled_output_uses_lowered_async_generator_helpers
PASSED ../tests/test_outputs.py::test_case_roster_actually_ran
PASSED ../tests/test_outputs.py::test_output_is_json_trace
PASSED ../tests/test_outputs.py::test_async_generator_compatibility_targets_still_require_lowering
PASSED ../tests/test_outputs.py::test_no_hardcoded_hidden_literals
============================== 6 passed in 3.26s ===============================

Reproduce this trial: git checkout 2f94510 && PYTHONPATH=src python3 scripts/build_site.py , then open trial/trial_ab11db9bd6d34506. Re-running the agent live requires EVAL_PLATFORM_ENABLE_OAUTH_SMOKE=1 and is non-deterministic.

Trial trial_ab11db9bd6d34506 · verifier authoritative; classifier explanatory.