From 457abd6e2f9aa10a6879ecd6ea361ae6243ecd59 Mon Sep 17 00:00:00 2001 From: T3rm1at0r <41843582+T3rm1at0r@users.noreply.github.com> Date: Fri, 17 Jul 2026 00:11:20 -0700 Subject: [PATCH 1/4] gtk: Defer browse popover teardown and fill Windows still crashes in gtk-4 with c0000005 after the earlier sidebar reconcile fix. Report.log faults at a new gtk offset while Browse-all is in play. Do not popdown/unparent the browse popover from inside row-activated, and do not build the full ListBox before the popover is mapped. Also keep the Browse-all action off the sessions ListBox signal stack, and lower the visible row cap. --- LumaGtk/Sources/LumaGtk/MainWindow.swift | 11 ++++- .../LumaGtk/SidebarBrowserPopover.swift | 48 +++++++++++++++---- 2 files changed, 48 insertions(+), 11 deletions(-) diff --git a/LumaGtk/Sources/LumaGtk/MainWindow.swift b/LumaGtk/Sources/LumaGtk/MainWindow.swift index 7b568807..d097387f 100644 --- a/LumaGtk/Sources/LumaGtk/MainWindow.swift +++ b/LumaGtk/Sources/LumaGtk/MainWindow.swift @@ -3062,7 +3062,16 @@ final class MainWindow: InstrumentUIHost { } private func activateGroupChild(sessionID: UUID, group: SessionSidebarGroup, key: String) { - groupChildActions[groupChildActionKey(sessionID: sessionID, group: group, key: key)]?() + let actionKey = groupChildActionKey(sessionID: sessionID, group: group, key: key) + // Browse-all opens a popover; keep that off the ListBox signal stack. + if key == "browse" { + Task { @MainActor [weak self] in + await Task.yield() + self?.groupChildActions[actionKey]?() + } + return + } + groupChildActions[actionKey]?() } private func toggleGroupExpansion(sessionID: UUID, group: SessionSidebarGroup) { diff --git a/LumaGtk/Sources/LumaGtk/SidebarBrowserPopover.swift b/LumaGtk/Sources/LumaGtk/SidebarBrowserPopover.swift index 10a278cf..cf152222 100644 --- a/LumaGtk/Sources/LumaGtk/SidebarBrowserPopover.swift +++ b/LumaGtk/Sources/LumaGtk/SidebarBrowserPopover.swift @@ -26,8 +26,11 @@ final class SidebarBrowserPopover { private var query: String = "" private var filterTask: Task? private var refreshGeneration: UInt = 0 + private var isChoosing = false - private static var visibleRowLimit: Int { 250 } + // Cap first paint so Windows GTK is not forced to allocate a huge ListBox + // while the popover is still mapping. + private static var visibleRowLimit: Int { 150 } init( items: [Item], @@ -73,7 +76,7 @@ final class SidebarBrowserPopover { key.onKeyPressed { [weak self] _, keyval, _, _ in MainActor.assumeIsolated { if Int32(keyval) == Gdk.keyEscape { - self?.dismiss() + self?.scheduleDismiss() return true } return false @@ -101,7 +104,7 @@ final class SidebarBrowserPopover { MainActor.assumeIsolated { self?.chooseFirstMatch() } } searchEntry.onStopSearch { [weak self] _ in - MainActor.assumeIsolated { self?.dismiss() } + MainActor.assumeIsolated { self?.scheduleDismiss() } } column.append(child: searchEntry) @@ -119,7 +122,9 @@ final class SidebarBrowserPopover { let index = Int(row.index) guard index >= 0, index < self.entries.count else { return } if case .item(let item) = self.entries[index] { - self.choose(item) + // Defer dismiss/unparent until after row-activated finishes; + // tearing the popover down mid-emission faults inside GTK. + self.scheduleChoose(item) } } } @@ -132,9 +137,15 @@ final class SidebarBrowserPopover { self.popover = popover self.listBox = listBox - refreshList() + // Map the empty popover first, then fill rows on a later turn so the + // initial present is not competing with a large ListBox rebuild. popover.popup() _ = searchEntry.grabFocus() + Task { @MainActor [weak self] in + await Task.yield() + guard let self, self.popover != nil else { return } + self.refreshList() + } } private func scheduleRefresh() { @@ -261,18 +272,32 @@ final class SidebarBrowserPopover { private func chooseFirstMatch() { for entry in entries { if case .item(let item) = entry { - choose(item) + scheduleChoose(item) return } } } - private func choose(_ item: Item) { - dismiss() - onChoose(item) + private func scheduleChoose(_ item: Item) { + guard !isChoosing else { return } + isChoosing = true + Task { @MainActor [weak self] in + await Task.yield() + guard let self else { return } + self.dismiss() + self.onChoose(item) + } + } + + private func scheduleDismiss() { + Task { @MainActor [weak self] in + await Task.yield() + self?.dismiss() + } } private func dismiss() { + guard popover != nil else { return } popover?.popdown() cleanup() } @@ -281,7 +306,10 @@ final class SidebarBrowserPopover { filterTask?.cancel() filterTask = nil refreshGeneration &+= 1 - popover?.unparent() + isChoosing = false + if let popover { + popover.unparent() + } popover = nil listBox = nil retainer = nil From e0e172ebad8ca357510cf98582a5924018c25c01 Mon Sep 17 00:00:00 2001 From: T3rm1at0r <41843582+T3rm1at0r@users.noreply.github.com> Date: Fri, 17 Jul 2026 00:51:47 -0700 Subject: [PATCH 2/4] build: Allow Apple agent bundle without codesign Fork PR CI fails Generate agent bundle with exit 65 on macos/ios. Disable codesign for the AgentBundle xcodebuild step (same as the main Luma build) and add a shared AgentBundle scheme so clean checkouts can resolve -scheme AgentBundle. --- .github/workflows/build.yml | 8 +++ .../xcschemes/AgentBundle.xcscheme | 58 +++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 Luma.xcodeproj/xcshareddata/xcschemes/AgentBundle.xcscheme diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 28eedf67..da4add84 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -344,11 +344,15 @@ jobs: - name: Generate agent bundle run: | + # Fork PRs do not receive Apple signing secrets. Disable signing so + # LumaBundleCompiler still builds without a local codesign identity. xcodebuild \ -project Luma.xcodeproj \ -scheme AgentBundle \ -configuration Release \ -derivedDataPath build/.derived \ + CODE_SIGN_IDENTITY=- \ + CODE_SIGNING_ALLOWED=NO \ build - name: Build @@ -643,11 +647,15 @@ jobs: - name: Generate agent bundle run: | + # Fork PRs do not receive Apple signing secrets. Disable signing so + # LumaBundleCompiler still builds without a local codesign identity. xcodebuild \ -project Luma.xcodeproj \ -scheme AgentBundle \ -configuration Release \ -derivedDataPath build/.derived-ios \ + CODE_SIGN_IDENTITY=- \ + CODE_SIGNING_ALLOWED=NO \ build - name: Build (unsigned, iOS Simulator) diff --git a/Luma.xcodeproj/xcshareddata/xcschemes/AgentBundle.xcscheme b/Luma.xcodeproj/xcshareddata/xcschemes/AgentBundle.xcscheme new file mode 100644 index 00000000..b48e8aca --- /dev/null +++ b/Luma.xcodeproj/xcshareddata/xcschemes/AgentBundle.xcscheme @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + + + + + + From 68a3f7b2ab2de147f4099ca19aec6429e9a6ec35 Mon Sep 17 00:00:00 2001 From: T3rm1at0r <41843582+T3rm1at0r@users.noreply.github.com> Date: Sun, 19 Jul 2026 17:58:13 -0700 Subject: [PATCH 3/4] core: Update frida-swift PackageManager/Compiler APIs Apple CI fails Generate agent bundle because PackageInstallOptions and BuildOptions were removed from frida-swift. Pass the same settings as direct parameters on install()/build() instead. --- Sources/LumaBundleCompiler/main.swift | 21 +++++----- Sources/LumaCore/CompilerWorkspace.swift | 49 ++++++++++-------------- Sources/LumaCore/Engine.swift | 22 +++++------ 3 files changed, 39 insertions(+), 53 deletions(-) diff --git a/Sources/LumaBundleCompiler/main.swift b/Sources/LumaBundleCompiler/main.swift index a9b5ec2e..8645be4a 100644 --- a/Sources/LumaBundleCompiler/main.swift +++ b/Sources/LumaBundleCompiler/main.swift @@ -231,13 +231,12 @@ struct LumaBundleCompiler { fputs("[packages] installing: \(summary)\n", stderr) let pm = PackageManager() - let opts = PackageInstallOptions() - opts.projectRoot = stagingDir - opts.role = .runtime - opts.specs = packageSpecs do { - _ = try await pm.install(options: opts) + _ = try await pm.install( + specs: packageSpecs.isEmpty ? nil : packageSpecs, + projectRoot: stagingDir, + role: .runtime) } catch { fputs("[packages] frida install failed: \(error.localizedDescription)\n", stderr) fputs("[packages] falling back to npm\n", stderr) @@ -296,12 +295,6 @@ struct LumaBundleCompiler { } let compiler = Compiler() - let options = BuildOptions() - options.projectRoot = effectiveProjectRoot - options.sourceMaps = .omitted - if !externals.isEmpty { - options.externals = externals - } let eventsTask = Task { for await event in compiler.events { @@ -322,7 +315,11 @@ struct LumaBundleCompiler { compiled.reserveCapacity(entries.count) for entry in entries { - let bundle = try await compiler.build(entrypoint: entry.entrypoint, options: options) + let bundle = try await compiler.build( + entrypoint: entry.entrypoint, + externals: externals.isEmpty ? nil : externals, + projectRoot: effectiveProjectRoot, + sourceMaps: .omitted) let source: String switch entry.kind { diff --git a/Sources/LumaCore/CompilerWorkspace.swift b/Sources/LumaCore/CompilerWorkspace.swift index 72afaf11..a27dde22 100644 --- a/Sources/LumaCore/CompilerWorkspace.swift +++ b/Sources/LumaCore/CompilerWorkspace.swift @@ -54,20 +54,16 @@ public final class CompilerWorkspace { if packagesState.packageJSON != nil || packagesState.packageLockJSON != nil { try self.writeManifestsToDisk(from: packagesState, paths: paths) - let opts = PackageInstallOptions() - opts.projectRoot = paths.root.path - opts.role = .runtime - - _ = try await self.packageManager.install(options: opts) + _ = try await self.packageManager.install( + projectRoot: paths.root.path, + role: .runtime) } else if !packagesState.packages.isEmpty { let specs = packagesState.packages.map { "\($0.name)@\($0.version)" } - let opts = PackageInstallOptions() - opts.projectRoot = paths.root.path - opts.role = .runtime - opts.specs = specs - - _ = try await self.packageManager.install(options: opts) + _ = try await self.packageManager.install( + specs: specs, + projectRoot: paths.root.path, + role: .runtime) } self.workspaceRoot = paths.root @@ -117,12 +113,10 @@ public final class CompilerWorkspace { let spec = versionSpec.map { "\(name)@\($0)" } ?? name - let opts = PackageInstallOptions() - opts.projectRoot = paths.root.path - opts.role = .runtime - opts.specs = [spec] - - let result = try await packageManager.install(options: opts) + let result = try await packageManager.install( + specs: [spec], + projectRoot: paths.root.path, + role: .runtime) let manifests = try readManifestsFromDisk(paths: paths) packagesState.packageJSON = manifests.packageJSON @@ -171,12 +165,10 @@ public final class CompilerWorkspace { let specs = packagesState.packages.map { "\($0.name)@\($0.version)" } - let opts = PackageInstallOptions() - opts.projectRoot = paths.root.path - opts.role = .runtime - opts.specs = specs - - _ = try await self.packageManager.install(options: opts) + _ = try await self.packageManager.install( + specs: specs, + projectRoot: paths.root.path, + role: .runtime) let manifests = try self.readManifestsFromDisk(paths: paths) packagesState.packageJSON = manifests.packageJSON @@ -238,13 +230,12 @@ public final class CompilerWorkspace { """ try source.write(to: wrapperURL, atomically: true, encoding: .utf8) - let options = BuildOptions() - options.projectRoot = paths.root.path - options.sourceMaps = .omitted - options.compression = .terser - let bundle = try await withCompilerDiagnostics(label: "package \(package.name)") { compiler in - return try await compiler.build(entrypoint: wrapperRelPath, options: options) + return try await compiler.build( + entrypoint: wrapperRelPath, + projectRoot: paths.root.path, + sourceMaps: .omitted, + compression: .terser) } let modules = try ESMBundleParser.parse(bundle) diff --git a/Sources/LumaCore/Engine.swift b/Sources/LumaCore/Engine.swift index 1db1d317..a0d3f29f 100644 --- a/Sources/LumaCore/Engine.swift +++ b/Sources/LumaCore/Engine.swift @@ -4254,11 +4254,6 @@ public final class Engine { """ try entrySource.write(to: entryURL, atomically: true, encoding: .utf8) - let options = BuildOptions() - options.projectRoot = paths.root.path - options.sourceMaps = .omitted - options.compression = .terser - let hookID = id.uuidString let userPath = "TracerHooks/\(hookID).ts" let entryPath = "TracerHooks/\(hookID).entry.ts" @@ -4271,7 +4266,11 @@ public final class Engine { return path } ) { compiler in - try await compiler.build(entrypoint: entryRelPath, options: options) + try await compiler.build( + entrypoint: entryRelPath, + projectRoot: paths.root.path, + sourceMaps: .omitted, + compression: .terser) } let modules = try ESMBundleParser.parse(bundle) @@ -4514,11 +4513,6 @@ public final class Engine { let entryRelPath = "\(dirRelPath)/\(try CustomInstrumentFile.validateRelativePath(entrypoint))" - let options = BuildOptions() - options.projectRoot = paths.root.path - options.sourceMaps = .omitted - options.compression = .terser - let sourcePrefix = "\(dirRelPath)/" let bundle = try await compilerWorkspace.withCompilerDiagnostics( label: diagnosticLabel, @@ -4527,7 +4521,11 @@ public final class Engine { return String(path[range.upperBound...]) } ) { compiler in - try await compiler.build(entrypoint: entryRelPath, options: options) + try await compiler.build( + entrypoint: entryRelPath, + projectRoot: paths.root.path, + sourceMaps: .omitted, + compression: .terser) } let modules = try ESMBundleParser.parse(bundle) From 081afb62cafce6e06d4d909b4bef0965a0bbb5a1 Mon Sep 17 00:00:00 2001 From: T3rm1at0r <41843582+T3rm1at0r@users.noreply.github.com> Date: Sun, 26 Jul 2026 19:22:47 -0700 Subject: [PATCH 4/4] build: Pin frida-swift; restore compatible Frida API usage Apple CI was cloning tip-of-main frida-swift (new Generated API) while Linux/Windows used Package.resolved (old options: API). The API migration commit fixed one side and broke the other. Restore the known-good PackageInstallOptions/BuildOptions call sites and pin frida-swift to 467d0360 everywhere, including the Apple CI frida-swift checkout used with the local FridaCore.xcframework. --- .github/workflows/build.yml | 8 +++ .../xcshareddata/swiftpm/Package.resolved | 1 - Package.swift | 6 ++- Sources/LumaBundleCompiler/main.swift | 21 ++++---- Sources/LumaCore/CompilerWorkspace.swift | 49 +++++++++++-------- Sources/LumaCore/Engine.swift | 22 +++++---- 6 files changed, 66 insertions(+), 41 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index da4add84..9c41cc1b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -303,7 +303,11 @@ jobs: - name: Override frida-swift with local FridaCore.xcframework run: | + # Stay on the same frida-swift revision as Package.swift / + # Package.resolved. Cloning tip-of-main regenerates bindings that + # no longer match this tree. git clone https://github.com/frida/frida-swift.git $RUNNER_TEMP/frida-swift + git -C $RUNNER_TEMP/frida-swift checkout 467d0360c2cc8ae7db9444316656b4154d22213d cp -R $RUNNER_TEMP/FridaCore.xcframework $RUNNER_TEMP/frida-swift/ python3 - <<'PY' import os, re @@ -606,7 +610,11 @@ jobs: - name: Override frida-swift with local FridaCore.xcframework run: | + # Stay on the same frida-swift revision as Package.swift / + # Package.resolved. Cloning tip-of-main regenerates bindings that + # no longer match this tree. git clone https://github.com/frida/frida-swift.git $RUNNER_TEMP/frida-swift + git -C $RUNNER_TEMP/frida-swift checkout 467d0360c2cc8ae7db9444316656b4154d22213d cp -R $RUNNER_TEMP/FridaCore.xcframework $RUNNER_TEMP/frida-swift/ python3 - <<'PY' import os, re diff --git a/Luma.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Luma.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved index fd4adabb..7d3bf6f4 100644 --- a/Luma.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/Luma.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -6,7 +6,6 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/frida/frida-swift", "state" : { - "branch" : "main", "revision" : "467d0360c2cc8ae7db9444316656b4154d22213d" } }, diff --git a/Package.swift b/Package.swift index 35590897..108e48f1 100644 --- a/Package.swift +++ b/Package.swift @@ -60,7 +60,11 @@ let package = Package( .executable(name: "LumaBundleCompiler", targets: ["LumaBundleCompiler"]), ], dependencies: [ - .package(url: "https://github.com/frida/frida-swift", branch: "main"), + // Pin to the revision recorded in Package.resolved. Floating on + // branch main pulled a regenerated Frida API that does not match + // this tree (and Apple CI clones tip-of-main when injecting the + // local FridaCore.xcframework). + .package(url: "https://github.com/frida/frida-swift", revision: "467d0360c2cc8ae7db9444316656b4154d22213d"), .package(url: "https://github.com/apple/swift-crypto", .upToNextMajor(from: "3.0.0")), .package(url: "https://github.com/groue/GRDB.swift", .upToNextMajor(from: "7.0.0")), .package(url: "https://github.com/radareorg/SwiftyR2", branch: "main"), diff --git a/Sources/LumaBundleCompiler/main.swift b/Sources/LumaBundleCompiler/main.swift index 8645be4a..a9b5ec2e 100644 --- a/Sources/LumaBundleCompiler/main.swift +++ b/Sources/LumaBundleCompiler/main.swift @@ -231,12 +231,13 @@ struct LumaBundleCompiler { fputs("[packages] installing: \(summary)\n", stderr) let pm = PackageManager() + let opts = PackageInstallOptions() + opts.projectRoot = stagingDir + opts.role = .runtime + opts.specs = packageSpecs do { - _ = try await pm.install( - specs: packageSpecs.isEmpty ? nil : packageSpecs, - projectRoot: stagingDir, - role: .runtime) + _ = try await pm.install(options: opts) } catch { fputs("[packages] frida install failed: \(error.localizedDescription)\n", stderr) fputs("[packages] falling back to npm\n", stderr) @@ -295,6 +296,12 @@ struct LumaBundleCompiler { } let compiler = Compiler() + let options = BuildOptions() + options.projectRoot = effectiveProjectRoot + options.sourceMaps = .omitted + if !externals.isEmpty { + options.externals = externals + } let eventsTask = Task { for await event in compiler.events { @@ -315,11 +322,7 @@ struct LumaBundleCompiler { compiled.reserveCapacity(entries.count) for entry in entries { - let bundle = try await compiler.build( - entrypoint: entry.entrypoint, - externals: externals.isEmpty ? nil : externals, - projectRoot: effectiveProjectRoot, - sourceMaps: .omitted) + let bundle = try await compiler.build(entrypoint: entry.entrypoint, options: options) let source: String switch entry.kind { diff --git a/Sources/LumaCore/CompilerWorkspace.swift b/Sources/LumaCore/CompilerWorkspace.swift index a27dde22..72afaf11 100644 --- a/Sources/LumaCore/CompilerWorkspace.swift +++ b/Sources/LumaCore/CompilerWorkspace.swift @@ -54,16 +54,20 @@ public final class CompilerWorkspace { if packagesState.packageJSON != nil || packagesState.packageLockJSON != nil { try self.writeManifestsToDisk(from: packagesState, paths: paths) - _ = try await self.packageManager.install( - projectRoot: paths.root.path, - role: .runtime) + let opts = PackageInstallOptions() + opts.projectRoot = paths.root.path + opts.role = .runtime + + _ = try await self.packageManager.install(options: opts) } else if !packagesState.packages.isEmpty { let specs = packagesState.packages.map { "\($0.name)@\($0.version)" } - _ = try await self.packageManager.install( - specs: specs, - projectRoot: paths.root.path, - role: .runtime) + let opts = PackageInstallOptions() + opts.projectRoot = paths.root.path + opts.role = .runtime + opts.specs = specs + + _ = try await self.packageManager.install(options: opts) } self.workspaceRoot = paths.root @@ -113,10 +117,12 @@ public final class CompilerWorkspace { let spec = versionSpec.map { "\(name)@\($0)" } ?? name - let result = try await packageManager.install( - specs: [spec], - projectRoot: paths.root.path, - role: .runtime) + let opts = PackageInstallOptions() + opts.projectRoot = paths.root.path + opts.role = .runtime + opts.specs = [spec] + + let result = try await packageManager.install(options: opts) let manifests = try readManifestsFromDisk(paths: paths) packagesState.packageJSON = manifests.packageJSON @@ -165,10 +171,12 @@ public final class CompilerWorkspace { let specs = packagesState.packages.map { "\($0.name)@\($0.version)" } - _ = try await self.packageManager.install( - specs: specs, - projectRoot: paths.root.path, - role: .runtime) + let opts = PackageInstallOptions() + opts.projectRoot = paths.root.path + opts.role = .runtime + opts.specs = specs + + _ = try await self.packageManager.install(options: opts) let manifests = try self.readManifestsFromDisk(paths: paths) packagesState.packageJSON = manifests.packageJSON @@ -230,12 +238,13 @@ public final class CompilerWorkspace { """ try source.write(to: wrapperURL, atomically: true, encoding: .utf8) + let options = BuildOptions() + options.projectRoot = paths.root.path + options.sourceMaps = .omitted + options.compression = .terser + let bundle = try await withCompilerDiagnostics(label: "package \(package.name)") { compiler in - return try await compiler.build( - entrypoint: wrapperRelPath, - projectRoot: paths.root.path, - sourceMaps: .omitted, - compression: .terser) + return try await compiler.build(entrypoint: wrapperRelPath, options: options) } let modules = try ESMBundleParser.parse(bundle) diff --git a/Sources/LumaCore/Engine.swift b/Sources/LumaCore/Engine.swift index a0d3f29f..1db1d317 100644 --- a/Sources/LumaCore/Engine.swift +++ b/Sources/LumaCore/Engine.swift @@ -4254,6 +4254,11 @@ public final class Engine { """ try entrySource.write(to: entryURL, atomically: true, encoding: .utf8) + let options = BuildOptions() + options.projectRoot = paths.root.path + options.sourceMaps = .omitted + options.compression = .terser + let hookID = id.uuidString let userPath = "TracerHooks/\(hookID).ts" let entryPath = "TracerHooks/\(hookID).entry.ts" @@ -4266,11 +4271,7 @@ public final class Engine { return path } ) { compiler in - try await compiler.build( - entrypoint: entryRelPath, - projectRoot: paths.root.path, - sourceMaps: .omitted, - compression: .terser) + try await compiler.build(entrypoint: entryRelPath, options: options) } let modules = try ESMBundleParser.parse(bundle) @@ -4513,6 +4514,11 @@ public final class Engine { let entryRelPath = "\(dirRelPath)/\(try CustomInstrumentFile.validateRelativePath(entrypoint))" + let options = BuildOptions() + options.projectRoot = paths.root.path + options.sourceMaps = .omitted + options.compression = .terser + let sourcePrefix = "\(dirRelPath)/" let bundle = try await compilerWorkspace.withCompilerDiagnostics( label: diagnosticLabel, @@ -4521,11 +4527,7 @@ public final class Engine { return String(path[range.upperBound...]) } ) { compiler in - try await compiler.build( - entrypoint: entryRelPath, - projectRoot: paths.root.path, - sourceMaps: .omitted, - compression: .terser) + try await compiler.build(entrypoint: entryRelPath, options: options) } let modules = try ESMBundleParser.parse(bundle)